tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
301
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Nadriel Nadriel ist offline Mitglied Bronze
    Registriert seit
    Jul 2010
    Ort
    Villach (Kärnten)
    Beiträge
    33
    Moin zusammen,

    ich habe folgendes Problem.
    Ich hab hier den Code:

    Eine Funktion zum Allokieren:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    int*alloc1DIntArray(const unsigned int count)
    {
        int*ptr;
     
        ptr=(int*)malloc(count*sizeof(int));
        if(ptr!=NULL)
            return ptr;
        return NULL;
    }

    Danach noch eine Funktion:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    
    void prog(int*y,int*u,int*v,int size)
    {
        void prog(int*y,int*u,int*v,int size)
    {
        int*r=NULL,*g=NULL,*b=NULL,*rNew=NULL,*gNew=NULL,*bNew=NULL,*bit=NULL,
            *dom=NULL,*pos=NULL,*varCheckPos=NULL;
        float*verh,sum=0;
        FILE*fp;
        
        r=alloc1DIntArray(size);
        g=alloc1DIntArray(size);
        b=alloc1DIntArray(size);
        rNew=alloc1DIntArray(3);
        gNew=alloc1DIntArray(3);
        bNew=alloc1DIntArray(3);
        bit=alloc1DIntArray(64);
        dom=alloc1DIntArray(3);
        pos=alloc1DIntArray(3);
        varCheckPos=alloc1DIntArray(3);
        verh=alloc1DFloatArray(3);
        
        int y2=0,u2=0,v2=0,z=0,y3=0,u3=0,v3=0,cDurchlauf=0;
        double y4=0.000000,u4=0.000000,v4=0.000000;
     
        for(int i=0;i<64;i++)
        {
            bit[i]=0;
        }
     
        for(int i=0;i<3;i++)
        {
            dom[i]=0;
            pos[i]=0;
            varCheckPos[i]=0;
            verh[i]=0;
        }
        
        
        for(int i=0;i<size;i++)
        {
            v4 = v[i] * 1.000000;
            y4 = y[i] * 1.000000;
            u4 = u[i] * 1.000000;
     
            y2=y4+(1.4075*(v4-128.000000));
            y3=(int)y2;
            r[i]=y3;
     
            u2=y4-((0.3455*(u4-128.000000))-(0.7169*(v4-128.000000)));
            u3=(int)u2;
            g[i]=u3;
            
            v2=y4+(1.7790*(u4-128.000000));
            v3=(int)v2;
            b[i]=v3;
            
            z=((r[i]>>6)<<(4))|((g[i]>>6)<<(2))|(b[i]>>6);
            //printf("Y:%d U:%d V:%d\nZ:%d\nR:%d G:%d B:%d\nyy:%d uu:%d vv:%d\nyyy:%lf uuu:%lf vvv:%lf\n--------------------\n",y[i],u[i],v[i],z,y2,u2,v2,y[i] * 1.0,u[i] * 1.0,v[i] * 1.0); 
            bit[z]++;
            
        }
     
        dom[0]=bit[0];
        varCheckPos[0]++;
        
        for(int i=0;i<64;i++)
        {
            
            if(bit[i]>dom[0])
            {
                dom[2]=dom[1];
                dom[1]=dom[0];
                dom[0]=bit[i];
                varCheckPos[0]++;
                varCheckPos[1]++;
                varCheckPos[2]++;
            }
            else if(bit[i]>dom[1])
            {
                dom[1]=bit[i];
                varCheckPos[1]++;
            }
            else if(bit[i]>dom[2])
            {
                dom[2]=bit[i];
                varCheckPos[2]++;
            }
            for(int j=0;j<3;j++)
            {
                if(varCheckPos[j]>0)
                {
                    pos[j]=i;
                    varCheckPos[j]=0;
                }
            }
        }
        
        fp=fopen("c:\\test.txt","w+");
        
        for(int i=0;i<3;i++)
        {
            sum+=dom[i];
            rNew[i]=((pos[i]>>(4))&0x03)<<6;
            gNew[i]=((pos[i]>>(2))&0x03)<<6;
            bNew[i]=(pos[i]&0x03)<<6;
        }
        
        for(int i=0;i<3;i++)
        {
            verh[i]=dom[i]/sum;
            printf("%d\n",pos[i]);
            fprintf(fp,"%d\t%d\t%d\t%d\t%d\n",dom[i],(verh[i]*100),rNew[i],gNew[i],bNew[i]);
        }
        fclose(fp);
        free(r);
        free(g);
        free(b);
        free(rNew);
        free(gNew);
        free(bNew);
        free(bit);
        free(dom);
        free(pos);
        free(varCheckPos);
        free(verh);
    }
    Mein Problem ist, dass in rNew[0] und in gNew[0] ein default value drin steht oder was auch immer das ist, habe keine Ahnung woher das kommt: 1078525952. Normalerweise müsste 0 drin stehen, funktioniert bei bNew[0] und auch bei allen anderen Werten einwandfrei...

    Jemand eine Ahnung?

    MfG Nadriel

    EDIT: Hier noch der Code zum Main:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    int main()
    {
        int*y=NULL;
        y=alloc1DIntArray(640*480);
        int*u=NULL;
        u=alloc1DIntArray(640*480);
        int*v=NULL;
        v=alloc1DIntArray(640*480);
     
        for(int i=0;i<(640*480);i++)
        {
            y[i] = 82;
            u[i] = 90;
            v[i] = 240;
        }
        
        prog(y,u,v,(640*480));
        getchar();
        
        free(y);
        free(u);
        free(v);
    }
    Geändert von Nadriel (27.07.10 um 20:28 Uhr)
     

  2. #2
    Nadriel Nadriel ist offline Mitglied Bronze
    Registriert seit
    Jul 2010
    Ort
    Villach (Kärnten)
    Beiträge
    33
    So hier nochmal der gesamte Code, dann is es glaub ich übersichtlicher:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    
    #include<stdio.h> 
    #include<stdlib.h>
    int*alloc1DIntArray(const unsigned int count)
    {
        int*ptr;
     
        ptr=(int*)malloc(count*sizeof(int));
        if(ptr!=NULL)
            return ptr;
        return NULL;
    }
    float*alloc1DFloatArray(const unsigned int count)
    {
        float*ptr;
     
        ptr=(float*)malloc(count*sizeof(float));
     
        if(ptr!=NULL)
            return ptr;
        return NULL;
    }
    void prog(int*y,int*u,int*v,int size)
    {
        int*r=NULL,*g=NULL,*b=NULL,*rNew=NULL,*gNew=NULL,*bNew=NULL,*bit=NULL,
            *dom=NULL,*pos=NULL,*varCheckPos=NULL;
        float*verh,sum=0;
        FILE*fp;
        
        r=alloc1DIntArray(size);
        g=alloc1DIntArray(size);
        b=alloc1DIntArray(size);
        rNew=alloc1DIntArray(3);
        gNew=alloc1DIntArray(3);
        bNew=alloc1DIntArray(3);
        bit=alloc1DIntArray(64);
        dom=alloc1DIntArray(3);
        pos=alloc1DIntArray(3);
        varCheckPos=alloc1DIntArray(3);
        verh=alloc1DFloatArray(3);
        
        int y2=0,u2=0,v2=0,z=0,y3=0,u3=0,v3=0,cDurchlauf=0;
        double y4=0.000000,u4=0.000000,v4=0.000000;
     
        for(int i=0;i<64;i++)
        {
            bit[i]=0;
        }
     
        for(int i=0;i<3;i++)
        {
            rNew[i]=0;
            gNew[i]=0;
            bNew[i]=0;
            dom[i]=0;
            pos[i]=0;
            varCheckPos[i]=0;
            verh[i]=0;
        }
        
        
        for(int i=0;i<size;i++)
        {
            v4 = v[i] * 1.000000;
            y4 = y[i] * 1.000000;
            u4 = u[i] * 1.000000;
     
            y2=y4+(1.4075*(v4-128.000000));
            y3=(int)y2;
            r[i]=y3;
     
            u2=y4-((0.3455*(u4-128.000000))-(0.7169*(v4-128.000000)));
            u3=(int)u2;
            g[i]=u3;
            
            v2=y4+(1.7790*(u4-128.000000));
            v3=(int)v2;
            b[i]=v3;
            
            z=((r[i]>>6)<<(4))|((g[i]>>6)<<(2))|(b[i]>>6);
            //printf("Y:%d U:%d V:%d\nZ:%d\nR:%d G:%d B:%d\nyy:%d uu:%d vv:%d\nyyy:%lf uuu:%lf vvv:%lf\n--------------------\n",y[i],u[i],v[i],z,y2,u2,v2,y[i] * 1.0,u[i] * 1.0,v[i] * 1.0); 
            bit[z]++;
            
        }
     
        dom[0]=bit[0];
        varCheckPos[0]++;
        
        for(int i=0;i<64;i++)
        {
            
            if(bit[i]>dom[0])
            {
                dom[2]=dom[1];
                dom[1]=dom[0];
                dom[0]=bit[i];
                varCheckPos[0]++;
                varCheckPos[1]++;
                varCheckPos[2]++;
            }
            else if(bit[i]>dom[1])
            {
                dom[1]=bit[i];
                varCheckPos[1]++;
            }
            else if(bit[i]>dom[2])
            {
                dom[2]=bit[i];
                varCheckPos[2]++;
            }
            for(int j=0;j<3;j++)
            {
                if(varCheckPos[j]>0)
                {
                    pos[j]=i;
                    varCheckPos[j]=0;
                }
            }
        }
        
        fp=fopen("c:\\test.txt","w+");
        
        for(int i=0;i<3;i++)
        {
            sum+=dom[i];
            rNew[i]=((pos[i]>>(4))&0x03)<<6;
            gNew[i]=((pos[i]>>(2))&0x03)<<6;
            bNew[i]=(pos[i]&0x03)<<6;
        }
        
        for(int i=0;i<3;i++)
        {
            verh[i]=dom[i]/sum;
            printf("%d\n",pos[i]);
            fprintf(fp,"%d\t%d\t%d\t%d\t%d\n",dom[i],(verh[i]*100),rNew[i],gNew[i],bNew[i]);
        }
        fclose(fp);
        free(r);
        free(g);
        free(b);
        free(rNew);
        free(gNew);
        free(bNew);
        free(bit);
        free(dom);
        free(pos);
        free(varCheckPos);
        free(verh);
    }
     
    int main()
    {
        int*y=NULL;
        y=alloc1DIntArray(640*480);
        int*u=NULL;
        u=alloc1DIntArray(640*480);
        int*v=NULL;
        v=alloc1DIntArray(640*480);
     
        for(int i=0;i<(640*480);i++)
        {
            y[i] = 82;
            u[i] = 90;
            v[i] = 240;
        }
        
        prog(y,u,v,(640*480));
        getchar();
        
        free(y);
        free(u);
        free(v);
    }
    Geändert von Nadriel (27.07.10 um 20:26 Uhr)
     

  3. #3
    Nadriel Nadriel ist offline Mitglied Bronze
    Registriert seit
    Jul 2010
    Ort
    Villach (Kärnten)
    Beiträge
    33
    So nochmal ich: wenn ich im main
    Code :
    1
    2
    3
    
    y[i]=16;
    u[i]=128;
    v[i]=128;
    ändere, dann müsste 0 drinstehen, hab mich nur mit den Werten vertan

    Gruß Nadriel
     

  4. #4
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    malloc alloziert lediglich Speicher, initialisiert wird nichts. Was da drin steht ist einfach Zufall. Du musst die Werte manuell initialisieren.
     

  5. #5
    Nadriel Nadriel ist offline Mitglied Bronze
    Registriert seit
    Jul 2010
    Ort
    Villach (Kärnten)
    Beiträge
    33
    hab ich bereits, es ist noch immer dasselbe wie vorher.

    gruß Nadriel
     

  6. #6
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Na ja
    Code c:
    1
    2
    3
    
            rNew[i]=((pos[i]>>(4))&0x03)<<6;
            gNew[i]=((pos[i]>>(2))&0x03)<<6;
            bNew[i]=(pos[i]&0x03)<<6;

    Offensichtlich ist das für pos[0] nicht alles 0. Rechne es einfach von Hand mal durch und vergleiche dann mit dem Debugger Schritt für Schritt wo du eine Abweichung findest. Diesen ganzen Code wird sich wohl kaum jemand so ganz durchsehen
     

  7. #7
    Nadriel Nadriel ist offline Mitglied Bronze
    Registriert seit
    Jul 2010
    Ort
    Villach (Kärnten)
    Beiträge
    33
    Hallo,
    muss aber so sein, da ich ja weiter oben mit:
    Code :
    1
    2
    3
    4
    
    for(int i=0;i<3;i++)
        {
            pos[i]=0;
        }
    initialisere...

    gruß Nadriel
     

  8. #8
    Nadriel Nadriel ist offline Mitglied Bronze
    Registriert seit
    Jul 2010
    Ort
    Villach (Kärnten)
    Beiträge
    33
    Hab den Fehler gefunden, es steht nur in der Datei falsch drin, aber wenn ich in der Konsole ausgib stimmt's, weiß jemand woran das liegen könnte? Hab ich beim fprintf() etwas falsch gemacht?

    gruß Nadriel
     

  9. #9
    Nadriel Nadriel ist offline Mitglied Bronze
    Registriert seit
    Jul 2010
    Ort
    Villach (Kärnten)
    Beiträge
    33
    Ganz einfacher Fehler:
    Code :
    1
    
    fprintf(fp,"%d\t%d\t%d\t%d\t%d\n",dom[i],(verh[i]*100),rNew[i],gNew[i],bNew[i]);
    ersetzen durch:
    Code :
    1
    
    fprintf(fp,"%d\t%f\t%d\t%d\t%d\n",dom[i],(verh[i]*100),rNew[i],gNew[i],bNew[i]);

     

  10. #10
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.774
    Blog-Einträge
    5
    Zitat Zitat von Cromon Beitrag anzeigen
    malloc alloziert lediglich Speicher, initialisiert wird nichts. Was da drin steht ist einfach Zufall. Du musst die Werte manuell initialisieren.
    Ergänzend hierzu: mit calloc kann man automatisch den reservierten Speicherbereich mit Nullbits initialisieren lassen. Für Fließkommatypen ist das allerdings nicht portabel (ein 0.0 muss nicht unbedingt ausschließlich aus Nullbits bestehen).

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

Ähnliche Themen

  1. Vergleich mit Javascript, falscher Wert wird wiedergegeben
    Von Gunah im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 12.06.09, 19:23
  2. Antworten: 0
    Letzter Beitrag: 23.02.09, 13:46
  3. Antworten: 5
    Letzter Beitrag: 01.03.08, 17:00
  4. [MySQL] Falscher Wert COUNT()
    Von boykottke im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 19.02.08, 00:45
  5. Antworten: 4
    Letzter Beitrag: 21.05.05, 12:46

Stichworte