PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Inhalt einer Datenstruktur in Funktion ändern und außerhalb auslesen



mrasp
22-05-2003, 14:17
Hallo.

Ich möchte einer Funktion zwei Pointer auf eine Datenstruktur übergeben. Der Inhalt dieser Datenstruktur soll in der Funktion verändert werden. Dabei werden wohl zwangsweise die Speicheradressen der Datenstrukturen geändert. Vom Hauptprogramm aus möchte ich dann auf die in der Funktion geänderten Datenstrukturen zugreifen.

Wenn man den unten abgedruckten C-Quellcode mit dem gcc übersetzt, bekommt man eine Fehlermeldung, mit dem g++ lässt er sich compilieren und das Programm läuft auch so wie es soll. Wie kann ich die Funktionalität mit reinem C und dem gcc erreichen?

Danke für eure Vorschläge.

Martin



/*
* Dateiname: test.c
*
* Funktionsweise:
* In main() wird für die Zeichenketten text und fehler Speicher
* allokiert und mit Zeichen gefüllt. Dann wird die Funktion RunTest
* aufgerufen, die die beiden Zeichenketten verändern soll. In main()
* sollen dann die in der Funktion RunTest geänderten Daten angezeigt
* werden.
*
* Compilieren: gcc -o test test.c (geht nicht)
* g++ -o test test.c (funktioniert fehlerlos)
*/

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int RunTest(int param, char *&output, char *&errmsg)
{
printf("RunTest(): output: %p %s\n", output, output);
printf("RunTest(): errmsg: %p %s\n", errmsg, errmsg);

output = (char *)realloc(output, 20);
errmsg = (char *)realloc(errmsg, 33);

strcpy(output, "In RunTest geändert");
strcpy(errmsg, "Fehler: Benutzer nicht gefunden!");

printf("RunTest(): output: %p %s\n", output, output);
printf("RunTest(): errmsg: %p %s\n", errmsg, errmsg);

return(1);
}

int main(int argc, char *argv[])
{
char *text;
char *fehler;
unsigned int erg = 0;

text = (char *)malloc(11);
fehler = (char *)malloc(1);

strcpy(text, "name;pfad;");
strcpy(fehler, "");

printf("main(): text: %p %s\n", text, text);
printf("main(): fehler: %p %s\n", fehler, fehler);

erg = RunTest(2, text, fehler);

printf("main(): Ergebnis von RunTest(): %d\n", erg);
printf("main(): text: %p %s\n", text, text);
printf("main(): fehler: %p %s\n", fehler, fehler);

free(text);
free(fehler);

return(0);
}


EDIT by anda_skoa: ich war mal so frei code tags einzufügen

anda_skoa
22-05-2003, 15:41
Das realloc erzeugt einen neuen Pointer.

Du musst die Parameter als char** deklarieren und bei der Übergabe die Adresse des Pointers ermitteln, und dort reinschreiben.

Wenn es nur ein Parameter wäre, der In/Out benutzt wird, hätte ich einen Lösungmit Returnwert vorgeschlagen.

Ciao,
_

mrasp
22-05-2003, 17:14
Hallo anda_skoa.

Danke für deine Antwort. Hat auf anhieb geklappt. Der Vollständigkeit halber hier das funktionierende Programm (für die Nachwelt).

Zu compilieren mit "gcc -Wall -O2 -o test test.c".

Martin



#include <stdio.h>
#include <malloc.h>
#include <string.h>

int RunTest(int param, char **output, char **errmsg)
{
printf("RunTest(): output: %p %s\n", *output, *output);
printf("RunTest(): errmsg: %p %s\n", *errmsg, *errmsg);

*output = realloc(*output, 20);
*errmsg = realloc(*errmsg, 33);

strcpy(*output, "In RunTest geändert");
strcpy(*errmsg, "Fehler: Benutzer nicht gefunden!");

printf("RunTest(): output: %p %s\n", *output, *output);
printf("RunTest(): errmsg: %p %s\n", *errmsg, *errmsg);

return(1);
}


int main(int argc, char *argv[])
{
char *text;
char *fehler;
unsigned int erg = 0;

text = (char *)malloc(11);
fehler = (char *)malloc(1);

strcpy(text, "name;pfad;");
strcpy(fehler, "");

printf("main(): text: %p %s\n", text, text);
printf("main(): fehler: %p %s\n", fehler, fehler);

erg = RunTest(2, &text, &fehler);

printf("main(): Ergebnis von RunTest(): %d\n", erg);
printf("main(): text: %p %s\n", text, text);
printf("main(): fehler: %p %s\n", fehler, fehler);

free(text);
free(fehler);

return(0);
}