Hallo Bernhard,
Ich benötige den Übertrag einer Variable in ‚c‘, da ich wie
bereits erwähnt in einer Funktion einen char-Wert (und auch
einen struct) aus einer SQL-Tabelle auslese. Da ich in der
nächsten Funktion von den ausgelesenen Werten des char
(genauso wie des struct, deswegen der Pointer) Gebrauch mache,
würde ich wohl eher die Pointerlösung bevorzugen müssen.
Doch was müßte ich ändern, wenn der char-Wert nicht '4’
sondern beispielsweise ‚Uebertrag‘ beinhaltet.
*x = ‚Uebertrag‘; // !!!
Hi Matthias.
Okay, wenn ich dich richtig verstehe, dann musst du einen String übergeben. Wenn Du das in C machen willst, und nicht in C++, dann hast Du gleich einen ganzen Sack von Schwierigkeiten am Hals.
Ein String in C ist einfach ein Zeiger auf char. Deklaration: ‚char *str;‘ Das ‚*‘ gehört zur Variable, nicht zum Typnamen. Würdest du ‚char* str1, str2‘ schreiben, wäre nur ‚str1‘ ein Zeiger, ‚str2‘ ein char.
Guck mal im Internet in irgendwelchen C/C++ Tutorials was ein Zeiger ist. Hier nur soviel: Wenn Du ‚char *str;‘ schreibst, dann weiß Dein Compiler, dass in str die Adresse des Beginns eines Speicherbereichs liegt. Und er weiß, dass in diesem Speicherbereich char-Werte hintereinander abgelegt sind. Das ist leider auch alles. Er weiß nicht, wie viele dort abgelegt sind, oder ob die Adresse überhaupt auf einen reservierten Speicherbereich verweist. Darum mußt Du dich kümmern.
Die Konvention für C-Strings ist, dass das Ende des Strings durch das Nullterminierungszeichen ‚\0‘ angezeigt wird.
Die erste Entscheidung, die du treffen mußt, ist, ob du das Ergebnis aus deiner SQL-Abfrage flach kopieren kannst, oder ob du es tief kopieren mußt. Ich nehme mal an, dass deine SQL-Abfrage einen C-String zurückliefert.
Flaches Kopieren:
char *sql_uebergabe, *sql_result;
sql_ubergabe = sql_result;
// sql_uebergabe verweist jetzt auf denselben Speicherbereich wie sql_result. Nicht der String, sondern die Adresse des Strings wurde kopiert!
Tiefes Kopieren:
#include „string.h“;
strcpy (sql_uebergabe, sql_result);
// Der String sql_result wird in den Speicherbereich kopiert, auf den sql_uebergabe verweist. Du hast jetzt zwei Strings, einen in sql_uebergabe, einen in sql_result. Nullterminierungszeichen wird von stcpy(char*, char*) mitkopiert.
Alles klar?
Die zweite Schwierigkeit ist, dass du vielleicht nicht weißt, wie lang der String ist. Wenn Du die maximale Länge kennst, dann wäre das gut.
Kennst du die maximale Länge dann deklarierst du einfach ein Array:
char sql[Länge des Strings + 1]; // + 1 für das Nullterminierungszeichen
sql ist damit automatisch vom Typ char*. Und sql verweist auf einen Speicherbereich für den ein Bereich im Umfang von [Länge des Strings + 1] reserviert wurde.
Wenn du auf ein Element des Arrays zugreifst, z.B. ‚sql[2]‘, dann übersetzt der Compiler das in ‚*(sql + 2)‘.
Wie gesagt, informier Dich im Intenet über Zeiger.
Kennst Du die maximale Länge nicht, dann mußt Du den Speicherbereich auf den ‚sql‘ verweist, dynamisch reservieren.
Dafür gibt es in C die Funktionen malloc() und free(), in C++ die Operatoren new und delete.
char *sql;
sql = (char*) malloc(‚Länge des Strings + 1‘ * sizeof(char));
Die Funktion malloc reserviert einen Speicherbereich mit der Größe, die ihr übergeben wird. Angenommen dein String ist 20 Zeichen lang, dann schreibst Du:
malloc(21 * sizeof(char));
sizeof() liefert die Größe eines Typs zurück. Bei char ist sie 1. Du könntest also auch schreiben: malloc(21). Ist aber nicht zu empfehlen.
Malloc übergibt eien void-Zeiger auf die Adresse des Speicherbereichs, den sie reserviert hat. Deswegen mußt du diesen Zeiger in einen Zeiger auf char umwandeln. Daher das ‚(char*) malloc(…)‘
Mit ‚free(sql)‘ gibtst Du den Speicherbereich dann frei, wenn Du ihn nicht mehr brauchst.
Übrigens in beiden Fällen sieht die Funktionsschnittstelle von test() gleich aus:
void test(char c, char* sql);
Aber Vorsicht! Zeiger sind nicht einfach zu handhaben. Nimm Dir ruhig die Zeit, im Internet oder in einem Buch zu stöbern. Es lohnt sich.
Gruß,
Bernhard.
P.S.:
*x = ‚Ubertrag‘; // funktioniert nicht!
Wenn Dein Compiler das überhaupt schlucken sollte, dann steht in *char
nur ‚U‘.
Besser:
*x = „Uebertrag“; // aber nicht vergessen, vorher Speicher reservieren.