PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Und wieder C-Strings... (Rückgabe von char**)


Gast
2006-06-16, 12:05:25
Hi!
Ich spiele gerade etwas mit RPC herum. Eine Serverfunktion gibt ein char* zurück, mit RPC (was ich nach Tutorial lerne) muss aber ein Zeiger auf den Return-Wert zurückgegeben werden, ergo, die RPC-Server-Funktion hat einen char** zurückzugeben.

char **function(char **file, struct svc_req *req) {
static char result_str[1000] = "\0";
[...]
return result_str; // return &result_str; --- ist auch nicht korrekt, siehe unten


Die Funktion liest etwas aus einer Datei und schreibt den Inhalt in result_str, welcher am Ende zurückgegeben werden soll.

Der langen Rede kurzer Sinn: Ich habe mal wieder keine Ahnung, wie ich die return-Anweisung zu formulieren habe. Beide Alternativen, die mir logisch erscheinen (siehe oben), führen zu dieser Fehlermeldung: "warning: return from incompatible pointer type".

Gast
2006-06-16, 12:09:48
Gast[/POST]']führen zu dieser Fehlermeldung: "warning: return from incompatible pointer type".Bzw Warning, aber ich möchte das Programm auch Warning-frei haben.

Gast
2006-06-16, 13:12:52
&result_string ist das gleiche wie nur result_string und vom Typ char*, und das ist inkompatible zu char**. Mit char** kann man Stringlisten darstellen, du hast nur ein String.

Gast
2006-06-16, 13:46:32
char **function(char **file, struct svc_req *req) {
static char result_str[1000] = "\0";
static char* result_ptr = result_str;
return &result_ptr;
}

Trap
2006-06-16, 14:24:44
Gast[/POST]']char **function(char **file, struct svc_req *req) {
static char result_str[1000] = "\0";
static char* result_ptr = result_str;
return &result_ptr;
}
Das ist bösartig. Jemand dabei zu helfen sich selbst ins Knie zu schießen...

Gast
2006-06-16, 14:38:50
Wüso? Ist doch beides static. Wenn er einen Pointer auf einen char*-Pointer zurückgeben muss und dabei beides statisch in der Funktion hat wie solls denn anders gehen?

Trap
2006-06-16, 14:47:13
Zeiger auf static variablen innerhalb einer Funktion zurückgeben ist extrem hässlich und kann ziemlich blöde Bugs ergeben.

Zum Beispiel:
strcmp(*function(x,y),*function(a,b))...

Gast
2006-06-16, 15:01:39
Ja mei. So ist C halt, man muss wissen was man tut :devil:

Threadstarter-Gast
2006-06-16, 15:49:32
Ist die Lösung vom anderen Gast denn korrekt und funktioniert? Ich versteh davon zuwenig, um das beurteilen zu können...

Trap
2006-06-16, 16:05:36
Du hast nicht gesagt wie sich deine Funktion verhalten soll, wie soll ich dann sagen ob sie korrekt ist?

Technisch gesehen funktioniert sie.

Gast
2006-06-16, 21:53:24
Trap[/POST]']Du hast nicht gesagt wie sich deine Funktion verhalten soll, wie soll ich dann sagen ob sie korrekt ist?

Technisch gesehen funktioniert sie.Naja, wenn sie "technisch funktioniert", dann beantwortet das doch die Frage. :o

del_4901
2006-06-16, 21:56:59
es ist kein guter Stil IMHO

Trap
2006-06-16, 22:27:40
Gast[/POST]']Naja, wenn sie "technisch funktioniert", dann beantwortet das doch die Frage. :o
Eigentlich nicht. Die Funktion ist gültiger C-Code mit definierter Bedeutung, das meine ich mit ich mit "funktioniert technisch gesehen".

Korrekt ist sie wenn sie das macht was du willst. Willst du, dass
void x(char** a,char ** b) {/*irgendwas*/};
wenn man so aufruft
x(function(e,f),function(g,h));
2 verschiedene Daten in den Argumenten oder 2 mal die gleichen Daten in den Argumenten bekommt?

Gast
2006-06-18, 09:21:34
Um die Übergabe-Parameter geht es mir eigentlich gar nicht, sondern nur um den Rückgabewert.
char** funktion(int, int) oder char** (char, double) -- völlig egal

Die RPC-Funktion muss aber zwingend einen Zeiger auf den zurückgegebenen Wert liefern (könnte dann zB auch *int sein), hier ist es zufällig ein char*, der zurückgebenen werden soll. Also "im Ganzen" ein char**.

Xmas
2006-06-18, 14:41:38
Gast[/POST]']Um die Übergabe-Parameter geht es mir eigentlich gar nicht, sondern nur um den Rückgabewert.
Und Trap geht es auch nur darum ob die Funktion immer denselben Pointer zurückgeben soll und damit bei jedem Aufruf alle vorherigen Resultate ungültig macht. Du redest von RPC – welches RPC-Framework verwendest du? Bei RPC muss der String ja auf jeden Fall kopiert werden, daher sollte es eigentlich keine Probleme geben wenn das RPC-Framework weiß dass es sich um einen String handelt.

Gast
2006-06-18, 17:22:02
Xmas[/POST]']Und Trap geht es auch nur darum ob die Funktion immer denselben Pointer zurückgeben soll und damit bei jedem Aufruf alle vorherigen Resultate ungültig macht.Die RPC-Funktion bekommt einen Dateinamen und gibt den Inhalt der (kleinen Text-) Datei als String bzw char* zurück.
Erneute Aufrufe mit verschiedenen übergebenen Dateinnamen sollen natürlich auch immer den neuen Inhalt zurückgeben.

Du redest von RPC – welches RPC-Framework verwendest du? Bei RPC muss der String ja auf jeden Fall kopiert werden, daher sollte es eigentlich keine Probleme geben wenn das RPC-Framework weiß dass es sich um einen String handelt.Äh, keine Ahnung.
Ich habe Suse 10.0 und benutze das vorhandene 'rpcgen', um aus .x-Dateien die Header- und C-Files (Client, Server, XDR) generieren zu lassen.