Frage memcpy()
-
Hallo an allen nochmals,
ich habe nun folgendes Problem: Ich habe einen Algorithmus der etwaas mit einem Bild tut.Das Bild ist als mit eine Struktur definiert!Ich übergeben nun einen Zeiger dieser Struktur an einer Funktion plus 2 Variablen(Werten) mit der sie arbeiten soll.Da aber dieser Algorithmus dass Ergebnisbild nicht irgendwo neu abspeichert habe ich das Problem dass er mein originales Bild ändert(er speichert das Ergebnisbild automatisch in dem original)Deswegen will ich einen extra Zeiger(auf das Bild) mit übergeben so dass er dass Egebnisbild aufnimmt!Hier unten ist der "alte" Algorithmus und der neue.Es läuft alles ok aber wenn ich das Ergebnisbild(struct *Out) aufmache ist schwarz oder weiss also alles überschrieben (falsches Ergebnis).Kann mir jemand helfen wo das Fehler sein kann?Ist es in memcpy oder soltte ich das ganze anders machen(ich meine das Original Bild beibehalten und das Bearbeiten des Bildes in einem neuen Bild(Out) speichern.Hat jemand eine Idee?
Hier sind die ALgiorithmen:struct Image { //# of Rows in Image = dx int Rows; // # of columns in image =dy int Cols; // Pointer to image data unsigned char *Data; //type of image unsigned char Type; };
alte:
void Gamma(struct Image *In,float VAR,int ALPHA)
Genau wie unten nur statt In->Data,Cols,Rows
ist Out->Data,Rows,Cols und ohne das in // ,,,, //unten
neue:void Gamma(struct Image *In,float VAR,int ALPHA,struct Image *Out) { int NOISE1,i,x,y; float Rx,Ry,NOISE,A,IMAGE1,theta; //Hier wird das Original vor der Bearbeitung kopiert Out->Cols=In->Cols; Out->Rows=In->Rows; if(!(Out->Data=(unsigned char*)malloc(Out->Rows*Out->Cols))) { perror("malloc"); exit(1); } memcpy(Out->Data,In->Data,sizeof(Out->Rows*Out->Cols)); //Bis Hier A=(float)sqrt((double)VAR/(double)ALPHA)/2; for(y=0; y<Out->Rows; y++) for(x=0; x<Out->Cols; x++) { IMAGE1=0.0; for(i=1; i<=ALPHA; i++) { NOISE=(float)sqrt(-2*A*log(1.0-(float)rand()/32767.1)); theta=(float)(rand()*1.9175345E-4 -3.14159265); Rx=(float)(NOISE*cos(theta)); Ry=(float)(NOISE*sin(theta)); NOISE=Rx*Rx+Ry*Ry; IMAGE1=IMAGE1+NOISE; } NOISE1=(int)(IMAGE1 +.5); if(NOISE1<255) NOISE1=255; *(Out->Data+x+(long)y*Out->Cols)=(unsigned char)NOISE1; } }
Edit by AJ: CPP-Tags eingefügt.
-
Hallo,
zunächst einmal würde ich das Herstellen einer Kopie vom Original nicht in der Funktion Gamma machen, warum soll Gamma auch für das Kopieren verantwortlich sein? Stelle die Kopie also vor dem Funktionsaufruf her, und ändere nichts an Gamma.
zum Fehler:
warum verwendest du sizeof hier?:
memcpy(Out->Data, In->Data, sizeof(Out->Rows*Out->Cols));
nur um den size_t-Typ zu erzwingen? Nein, das ist falsch, casten sollte man (wenn man nicht Rows und Cols auch als size_t deklarieren kann):
memcpy(Out->Data, In->Data, (size_t) (Out->Rows*Out->Cols) );
sollte den Job erledigen. Also einfach vor dem Aufruf von Gamma eine Sicherung machen:
struct Image* In; struct Image* Out; /* In bekommt jetzt irgendwo seine Bild-Daten ...*/ /* Kopie in Out erstellen */ /* structs kann man einfach einander zuweisen, der Data-Zeiger wird dann ja mit malloc auf einen neuen Wert gesetzt */ *Out = *In; if(!(Out->Data = malloc(Out->Rows*Out->Cols))) { perror("malloc"); exit(1); } memcpy(Out->Data, In->Data, (size_t) (Out->Rows*Out->Cols) ); /* jetzt Gamma aufrufen, mit In */ Gamma(In, 200 , 300) ; /* In wurde geändert, in Out verbleibt das Original */
vielleicht löst das memcpy schon das Problem mit dem "zerstörten" Bild.
oben siehst du auch, wie viel lesbarer es ist, wenn du deinen Code mit den C/C++-Code-Tags (der nette Button unter dem
) versiehst, also das nächste Mal zu Gunsten der Lesbarkeit deines Codes die Tags verwenden.
MfG
-
kleiner Nachtrag:
natürlich muß vor der Zuweisung
*Out = *In;
dafür gesorgt sein, daß Out auf ein gültiges struct Image zeigt.
MfG
-
Erstmals danke fuer deine Hilfe,
aber du sagst dass In wird verändert und im Out bleibt das Original!
Ich will aber dass in In das Original bleibt und in Out das Ergebnis(Gamma) haben !
Eine zweite IDee habe ich geschrieben,kannst du mi deine Meinung sagen?
Hier ist der Codevoid Gaussian(struct Image *In, float VAR,float MEAN,struct Image *Out)
{
int x,y;
float NOISE,theta;
unsigned char *tmp;//Zeiger auf Outif(!(Out->Data=(unsigned char*)malloc(Out->Rows*Out->Cols)))
{
perror("malloc");
exit(1);
}for(y=0; y<In->Rows; y++)
for(x=0; x<In->Cols; x++)
{
NOISE=(float)sqrt(-2*VAR*log(1.0-(float)rand()/32767.1));
theta=(float)(rand()1.9175345E-4-3.14159265);
NOISE=(float)(NOISEcos(theta));
NOISE=NOISE+MEAN;
if(NOISE>255)
NOISE=255;
if(NOISE<0)
NOISE=0;tmp=(unsigned char*)malloc(sizeof(unsigned char*));
tmp=Out->Data+x+(long)y*Out->Cols;
*tmp=(unsigned char)(NOISE +.5);}
}