malloc-Problem
-
Hi zusammen!
Ich hab hier 2 Funktionen geschrieben die den Phasenwinkel und den Betrag von komplexen Zahlen ausrechnet als Übung zu Pointern.
Mein Problem wird in den Comments gezeigt:
double* c_abs(complex *c_pointer, int* len)//c_pointer ist ein Zeiger auf die Struktur complex(double real und double imag) darin dann die verschiedenen Werte gespeichet sind. len ist halt die Länge des Files { double* abs=NULL; double* betrag=NULL; int x=0; abs=(double *)malloc(sizeof(abs)* *len);// hier wird NULL zurückgegeben. Warum? Unten funktionierts doch auch. if(abs != NULL) { betrag=abs; for(x=0; x<*len; x++) { *betrag=sqrt((c_pointer->real*c_pointer->real)+(c_pointer->imag*c_pointer->imag)); betrag++; c_pointer++; } } else { printf("Memory Allocation failure!"); } return(abs); } double* c_phase(complex *c_pointer, int* len) { double* phase=NULL; double* winkel=NULL; int x=0; phase=(double *)malloc(sizeof(phase)* *len);//hier wird void* bzw. wegen das double*-casts double* zurückgegeben. if(phase != NULL) { winkel=phase; for(x=0; x<*len; x++) { *winkel=atan(c_pointer->imag/c_pointer->real); winkel++; c_pointer++; } } else { printf("Memory Allocation Failure!"); } return(phase); }
mfg guest123
-
Dann geh doch mal mit dem Debugger durch und guck dir an, ob die Variablen auch die Werte haben, die sie haben sollten.
abs=(double *)malloc(sizeof(abs)* *len);
Das sizeof(abs) ist schon einmal sehr ungewöhnlich und bestimmt nicht, was du möchtest. Unten machst du das gleiche. Da sind bestimmt noch mehr Fehler drin.
-
Warum gibst du überhaupt einen Pointer zurück?
Und schau dir mal die Funktion atan2() an.
Die hat auch bei π/2 (90°) kein Problem
-
DirkB schrieb:
Warum gibst du überhaupt einen Pointer zurück?
Und schau dir mal die Funktion atan2() an.
Die hat auch bei π/2 (90°) kein ProblemDanke für den Tipp mit atan2.
Zum Pointer:
Naja um ihn im Hauptprogramm zu verwenden...
Ich habe jetzt statt double* void geschrieben, und wenn ich "Starte ohne Debugging" mache, dann kommt ein Fenster(Win7) "'nameofprogram'.exe kann nicht geöffnet werden".
Also muss man doch zurückgeben...
-
guest123 schrieb:
"'nameofprogram'.exe kann nicht geöffnet werden".
Das heißt oftmals, dass die EXE vom vorigen Versuch noch läuft und gelockt ist.
(Taskmanager -> Exe killen)
Du kompilierst offensichtlich als C++ und nicht als C, denn nur in C++ braucht man diesen malloc-Cast überhaupt.
Benenne deine .cpp Datei in .c um und schmeiße das ganze malloc Cast-Zeugs raus.
Dann kannst du dich um deine eigentlichen Probleme kümmern.
-
guest123 schrieb:
Zum Pointer:
Naja um ihn im Hauptprogramm zu verwenden...Schon mal an ein einfaches double gedacht? Ohne Pointer?
-
Vergiss den vorherigen Beitrag
-
guest123 schrieb:
Hi zusammen!
Ich hab hier 2 Funktionen geschrieben die den Phasenwinkel und den Betrag von komplexen Zahlen ausrechnet als Übung zu Pointern.
Mein Problem wird in den Comments gezeigt:
abs=(double *)malloc(sizeof(abs)* *len);// hier wird NULL zurückgegeben.
mfg guest123
Könnte sein, daß Dein Problem ein Bufferoverflow ist?
sizeof(abs) ist auf 32 bit systemen 4. Du schreibst aber *len doubles hinein. Auf 'nem 64 bit System mag das funktionieren. Auf 'nem 32 bit System klappt das nicht.mfg Martin
-
Danke euch! In sizof() gehört natürlich "double" reingeschrieben und mal* des länge des files... auf jedenfall funktionierts.
DirkB schrieb:
Vergiss den vorherigen Beitrag
Wie gesagt, ich will nur mit Pointern rumspielen, reine Übungssache :D.
-
#include <stdio.h> #include <stdlib.h> void c_read_file(char filename[], int len, double* pointer); void c_read_file(char filename[], int len, double* pointer)//len ist die länge des files... pro zeile ist ein double enthalten { FILE* inFile = NULL; //double* pointer = NULL; //double* pointer=NULL; inFile=fopen(filename,"r"); if(inFile != NULL) { pointer=malloc(sizeof(double)* len); if(pointer != NULL) { //pointer1=pointer; while(!feof(inFile)) { fscanf(inFile,"%lf",pointer); pointer++; } } else { printf("Memory Allocation Failure"); } fclose(inFile); } else { printf("The File %s could not be opened"); } } int main() { char filename[100]="werte.txt"; double pointer; int x=0; int len=4;//funktion für bestimmen der laenge wird später geschrieben.... c_read_file(filename,len,&pointer); for(x=0; x<len; x++) { printf("%f",pointer); pointer++; } free(pointer); return(0); }
Naja wenn man ein Unterprogramm hat wo man mehrere Zahlen in verschiedenen Speicherstellen einliest auf das dann nur ein Zeiter zeigt(in dem Fall "pointer"), muss man ja eigentlich "pointer" zurückgeben, da man ja free() nicht nutzen kann --> Fehler bei free:
error C2172: 'free': Übergebener Parameter ist kein ZeigerKann man das anders lösen oder muss ich den Zeiger zurückgeben?
Gruß
-
Durch das
pointer++;
veränderst du ja den Wert des Zeigers.
Du musst dir den Wert fürfree()
merken.Bei
printf("The File %s could not be opened");
fehlt auch noch was
Beachte auch unbedingt die Compiler Warnungen.
-
guest123 schrieb:
Kann man das anders lösen oder muss ich den Zeiger zurückgeben?
Das musst du sogar anders lösen. Das ist totaler Mist, so wie es jetzt ist. Beschäftige dich nochmal mit den Grundlagen von Arrays und Zeigern, dann noch mit den Grundlagen manueller Speicherverwaltung. Lass dich vielleicht von der Standardbibliothek inspirieren, wie die das z.B. die Funktion fgets macht, die etwas ähnliches tut wie deine Funktion.
DirkB schrieb:
Durch das
pointer++;
veränderst du ja den Wert des Zeigers.
Du musst dir den Wert fürfree()
merken.Nein, es ist viel schlimmer. Guck mal, von welchem Typ pointer ist. Und was mit dem Zeiger passiert, dem die malloc-Adresse zugewiesen wird. Der Threadersteller hat die Grundlagen von dem was er tut nicht verstanden.