ERLEDIGT
NEIN
NEIN
ANTWORTEN
9
9
ZUGRIFFE
301
301
EMPFEHLEN
-
27.07.10 19:51 #1
- 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:
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...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); }
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)
-
27.07.10 20:06 #2
- 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)
-
27.07.10 20:10 #3
- Registriert seit
- Jul 2010
- Ort
- Villach (Kärnten)
- Beiträge
- 33
So nochmal ich: wenn ich im main
ändere, dann müsste 0 drinstehen, hab mich nur mit den Werten vertanCode :1 2 3
y[i]=16; u[i]=128; v[i]=128;

Gruß Nadriel
-
malloc alloziert lediglich Speicher, initialisiert wird nichts. Was da drin steht ist einfach Zufall. Du musst die Werte manuell initialisieren.
-
27.07.10 21:13 #5
- Registriert seit
- Jul 2010
- Ort
- Villach (Kärnten)
- Beiträge
- 33
hab ich bereits, es ist noch immer dasselbe wie vorher.
gruß Nadriel
-
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
-
28.07.10 09:52 #7
- Registriert seit
- Jul 2010
- Ort
- Villach (Kärnten)
- Beiträge
- 33
Hallo,
muss aber so sein, da ich ja weiter oben mit:
initialisere...Code :1 2 3 4
for(int i=0;i<3;i++) { pos[i]=0; }
gruß Nadriel
-
28.07.10 10:29 #8
- 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
-
28.07.10 10:45 #9
- Registriert seit
- Jul 2010
- Ort
- Villach (Kärnten)
- Beiträge
- 33
Ganz einfacher Fehler:
ersetzen durch: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]);
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]);
-
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
-
Vergleich mit Javascript, falscher Wert wird wiedergegeben
Von Gunah im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 12.06.09, 19:23 -
DFS als Replication in einer Domain Falscher Wert für das eingegebene Kennwort
Von -Shark- im Forum Microsoft WindowsAntworten: 0Letzter Beitrag: 23.02.09, 13:46 -
Bei einem mysql-update wird falscher Wert in der DB gespeichert
Von Schind im Forum PHPAntworten: 5Letzter Beitrag: 01.03.08, 17:00 -
[MySQL] Falscher Wert COUNT()
Von boykottke im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 19.02.08, 00:45 -
Fehler in Blätterfunktion - Falscher Wert
Von qsrs im Forum PHPAntworten: 4Letzter Beitrag: 21.05.05, 12:46





Zitieren


Login





