Zeiger springt ??
-
Hallo !
Gibt es eine Möglichkeit zu kontrollieren zu welchen Adressen ein Pointer zeigt und eine Vergleichsmöglichkeit um zu sehen obs dieselbe Ad innerhalb eines Arrays ist zu der man hin will? Egal was ich mache, immer bekomme ich statt einem gefilterten Bild eine Überlagerung von versetzten Teilen des Bildes.
DANKE !
-
ghostwhisperer schrieb:
Gibt es eine Möglichkeit zu kontrollieren zu welchen Adressen ein Pointer zeigt
Eine Pointer-Variable ist auch nur eine integrale Variable, deren Wert (die Adresse) du ausgeben (printf, cout, MessageBox, ...) oder im Debugger überprüfen kannst. Und rechnen kann man damit natürlich auch. Wenn du z.B. wissen willst, auf welchen Pixel in einem Bildpuffer du gerade zeigst, kannst du die Differenz zwischen deinem Pointer und der Startadresse des Bildpuffers (Arrays) bilden und das Ergebnis eventuell noch durch die Bytes pro Pixel teilen.
ghostwhisperer schrieb:
und eine Vergleichsmöglichkeit um zu sehen obs dieselbe Ad innerhalb eines Arrays ist zu der man hin will?
Na ja, klar, solange du weißt, wo du im Array hinwillst...
-
Hi und danke!
Ich hab die adressen mal umgerechnet zu unsigned int und mit der Definition index=xhöhe+y verglichen und das ganze als assert eingebracht.
Demnach gibts gar keinen Fehler....
Ich hab auch ein Assert das prüft ob der index zwischen 0 und höhebreite bleibt. Auch hier kein Fehler.
Trotzdem wird das Bild falsch angezeigt. Alle 1/3 Höhe und Breite überlagert sich der Bildinhalt wenn ich versuche einen 3*3 Gaussfilter zu benutzen.
Mach ich nur die Umwandlung bild->array und zurück stimmt alles..
-
Ich weiss einfach nicht weiter. Die klasseninterne Zuordnung von Indizes ist in Ordnung.. Liegt es etwa an der Übergabe?
static bool prefiltering_gauss(DOUBLEARRAY_OFIMAGE &gaussfilter,double gaussnorm,DOUBLEARRAY_OFIMAGE &filteredImage, DOUBLEARRAY_OFIMAGE &Image, int Width, int Height) { double maxval=128; double minval=128; double values[9]; double sum =0; double value=0; double weight=0; int xj=0; int yk=0; for (int dx = 1; dx < (Width-1); dx++) { for (int dy = 1; dy < (Height-1); dy++) { /*for (int j = -1; j < 2; j++) { for (int k = -1; k < 2; k++) { xj= dx+j; yk =dy+k; //int n=(dx+j)*(Height)+(dy+k); value = Image.getv(xj,yk); weight = gaussfilter.getv(j+1,k + 1); sum += value*weight; } }*/ for(int i=0;i<9;i++) { values[i]=0; } xj = dx-1; yk = dy-1; values[0]=Image.getv(xj,yk)* gaussfilter.getv(0,0); xj = dx-1; yk = dy-0; values[1]=Image.getv(xj,yk)* gaussfilter.getv(0,1); xj = dx-1; yk = dy+1; values[2]=Image.getv(xj,yk)* gaussfilter.getv(0,2); xj = dx; yk = dy-1; values[3]=Image.getv(xj,yk)* gaussfilter.getv(1,0); xj = dx; yk = dy; values[4]=Image.getv(xj,yk)* gaussfilter.getv(1,1); xj = dx; yk = dy+1; values[5]=Image.getv(xj,yk)* gaussfilter.getv(1,2); xj = dx+1; yk = dy-1; values[6]=Image.getv(xj,yk)* gaussfilter.getv(2,0); xj = dx+1; yk = dy; values[7]=Image.getv(xj,yk)* gaussfilter.getv(2,1); xj = dx+1; yk = dy+1; values[8]=Image.getv(xj,yk)* gaussfilter.getv(2,2); for(int i=0;i<9;i++) { sum = sum+values[i]; } sum = sum /gaussnorm; filteredImage.setv(dx,dy,sum); //filteredImage[dx][dy] = Image[dx][dy]*1; if (sum < minval) minval = sum; if (sum > maxval) maxval = sum; sum =0; } } if (maxval == minval) { maxval = 255; minval = 0; } filteredImage.maxval=maxval; filteredImage.minval=minval; return true; }
-
Ich denke, da wird dir nichts weiter übrig bleiben, als mal schrittweise durch den Code zu steppen (Debugger!) und die ganze Rechnerei selbst zu überprüfen. Wenn du weißt, wohin ein berechneter Wert geschrieben werden soll, kannst du mit dem Debugger ja recht einfach überprüfen, ob das auch so passiert, wie gedacht.
-
_matze schrieb:
Ich denke, da wird dir nichts weiter übrig bleiben, als mal schrittweise durch den Code zu steppen (Debugger!) und die ganze Rechnerei selbst zu überprüfen. Wenn du weißt, wohin ein berechneter Wert geschrieben werden soll, kannst du mit dem Debugger ja recht einfach überprüfen, ob das auch so passiert, wie gedacht.
Habsch doch schon
Die Asserts hab ich nur als Gimmick für später übernommen. Ich bin den Code schon mehrfach durchgegangen per debugger.