Hallo Forum
folgendes Problem: ich möchte ein dynamisches, lokales Array (ibuf)
innerhalb einer anderen Funktion allozieren und das "gefüllte" Array
dann zurückgeben. So wie im Code unten geht es nicht, denn innerhalb von
main ist der Speicher wohl nicht alloziert. Aber wie macht man das?
Danke für die Antworten
>int ReadData(char *inputfile, int *ibuf)
muss
int ReadData(char *inputfile, int **ibuf)
Wenn Du etwas zurückgeben willst, brauchst Du einen
Ptr.
Wenn Du einen Ptr zurückgene willst, deshalb eine
Ptr auf einen Ptr.
Den Puffer hast du korrekt allokiert, aber du gibst den Pointer nicht
zurueck an den Aufrufer. Die Zuweisung, die du in ReadData machst, ist
nur lokal gueltig. Du musst entweder eine Referenz auf einen Zeiger
uebergeben, oder einen Zeiger auf den Zeiger:
int ReadData(char *inputfile, int &*ibuf)
{
...
ibuf = ...
...
}
int ReadData(char *inputfile, int **ibuf)
{
...
*ibuf = ...
...
}
Malte Ibs schrieb:> *ibuf = (int *)malloc(n*sizeof(int));
Du solltest niemals den Rückgabewert von malloc casten.
- Der von malloc gelieferte type void* wird vom C-Compiler problemfrei
implizit in jeden anderen Pointer-Type konvertert.
- Jeder Cast kann Fehler verdecken, die ohne Cast vom Compiler durch ein
Diagnostic Message angezeigt worden wäre.
Beispiel:
Malte Ibs schrieb:> *ibuf = (int *)malloc(n*sizeof(int));
Und vielleicht solltest Du auch noch den Rückgabewert von malloc prüfen,
bevor Du ihn blindlings benutzt. Da kann schon auch mal NULL zurück
gegeben werden.
Hallo,
noch mal vielen Dank für die Lösung meines Problems und die Tips.
Nun möchte ich das ganze mit einem zweidimensionalen Array machen (falls
das ähnlich elegant geht). Ich kriegs aber nicht hin. Hier ist die
"Arbeitsversion" des Codes mit Fragezeichen überall dort, wo ich nicht
weiterkomme.
Malte Ibs schrieb:> Hallo,>> noch mal vielen Dank für die Lösung meines Problems und die Tips.>> Nun möchte ich das ganze mit einem zweidimensionalen Array machen (falls> das ähnlich elegant geht).
Geht es nicht. Es gibt da mehrere Möglichkeiten, so etwas zu erreichen,
aber elegant ist das alles nicht. Du hast aber mit einem Array aus
Pointern einen guten Ansatz gewählt.
int ReadData(char *inputfile, int ***ibuf, int *ny)
> {> FILE *stream_in;> int i, nx, ny1;>> stream_in = fopen(inputfile, "rb");> fread(&nx, sizeof(int), 1, stream_in);> fread(&ny1, sizeof(int), 1, stream_in);> *ny = ny1;>
*ibuf = malloc(nx * sizeof(int*));
> for (i=0; i<nx; i++){
(*ibuf)[i] = malloc(ny1 * sizeof(int));
> }>> for (i=0; i<nx; i++){
fread((*ibuf)[i], sizeof(int), ny1, stream_in);
> }> fclose(stream_in);> return(nx);
return ist übrigens keine Funktion. Da braucht man keine Klammern:
return nx;
> }>> int main()> {> int i, j, nx, ny, **ibuf;>
nx = ReadData("test.bin", &ibuf, &ny);
>> for (i=0; i<nx; i++){> for (j=0; j<ny; j++){> printf("%d ", ibuf[i][j]);> }> printf("\n");> }>> for (i=0; i<nx; i++){> free(ibuf[i]);> }> free(ibuf);>> return(0);> }