C Übergabe eines Strings einer Funktion in eine andere Funktion

Sunnyharry

Newbie
Registriert
Juli 2012
Beiträge
4
Hallo Leute
Ich habe erst vor kurzen mit C angefangen und habe probleme damit. Das Problem tritt auf, wenn ich versuche aus einer Funktion einen String an eine andere Funktion zu übergeben. Ich beschreib am besten mein Problem indem ich euch den Code zeige.

Ich habe zwei Funktionen. Die eine ist die Funktion, die den String empfangen soll.
Code:
void createCardChar(char* testcardID) {

int key = atoi(testcardID);

int keyN=key%10000/1000;
int keyO=key%1000/100;
int keyS=key%100/10;
int keyW=key%10;

//(Unwichtiger Code der mit dem Problem nichts zu tun hat)
}

Die zweite Funktion kriegt argv und kopiert den String von argv[3] in einen neuen String "startKeyy"
Code:
void createCardID(int cardNumber, char *argv[]){

int currentCardNumber=0;
int i=0;
int countToFour=0;
   
   size_t laengeC;
	laengeC = strlen(argv[3]);
	char startKeyy [laengeC] ;
	strcpy(startKeyy,argv[3]);

/* (Unwichtiger Code der mit dem Problem nichts zu tun hat.Druckt einfach nur den
String "StartKeyy" aus.) */


Nun würde ich gerne in der Funktion createCardID folgendes machen.
Code:
        char cardID[4];
	cardID[0]= startKeyy[0];
	cardID[1]= startKeyy[1];
	cardID[2]= startKeyy[2];
	cardID[3]= startKeyy[3];
	createCardChar(cardID);

Wenn ich nun den letzten Teil als Probe in die main-Funktion packe, funktioniert alles wunderbar. Wenn ich es aber wie gewollt in die createCardID-Funktion rein kopiere, macht er mir Probleme.

Die Konsole gibt mir folgenden Fehler aus:
Code:
Building file: ../src/projekt.c
Invoking: GCC C Compiler
gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/projekt.d" -MT"src/projekt.d" -o "src/projekt.o" "../src/projekt.c"
../src/projekt.c: In Funktion »createCardID«:
../src/projekt.c:128:2: Warnung: Implizite Deklaration der Funktion »createCardChar« [-Wimplicit-function-declaration]
../src/projekt.c: Auf höchster Ebene:
../src/projekt.c:349:6: Warnung: In Konflikt stehende Typen für »createCardChar« [standardmäßig aktiviert]
../src/projekt.c:128:2: Anmerkung: Vorherige implizite Deklaration von »createCardChar« war hier
Finished building: ../src/projekt.c
 
Building target: projekt
Invoking: GCC C Linker
gcc  -o "projekt"  ./src/projekt.o   
Finished building target: projekt
 

**** Build Finished ****

In Eclipse werden folgende Zeilen Rot markiert mit folgenden Nachrichten:
Code:
[COLOR="Red"]createCardChar(cardID);[/COLOR]
Anmerkung: Vorherige implizite Deklaration von »createCardChar« war hier		
Warnung: Implizite Deklaration der Funktion »createCardChar« [-Wimplicit-function-declaration]

[COLOR="Red"]void createCardChar(char* testcardID) {
[/COLOR]Warnung: In Konflikt stehende Typen für »createCardChar« [standardmäßig aktiviert]	carcassonnev1.c

Ich hoffe ich habe mein Problem genau genug erklärt. Habt ihr vielleicht ne Idee, was ich falsch mache?
 
Steht createCardID im Quelltext vor createCardChar? Wenn ja, dann musst du die Reihenfolge vertauschen oder eine forward-Deklaration einfügen.
 
Ja createCardID steht vor createCardChar.
createCardID soll ja mir ja zufällige ID´s generieren. Diese ID´s soll er dann als String an createCardChar übergeben der dann eine grafische Darstellung der Karten macht.
Warum sollte ich dann createCardID nach CreateCardChar schreiben?
 
Weil die Funktion sonst nicht bekannt ist (deshalb die implizite Deklaration).

Ist C wirklich so aufgebaut? Erinnert mich an alte Turbo Pascal Zeiten.
 
Ok. Vertauschen hat funktioniert. Dachte, dass die Funktion createCardChar bekannt wird, da sie ja beim Aufruf erstellt wird. Was müsste man machen wenn man das mit forward-Deklaration lösen würde. Damit ich das für die Zukunft weiß.
 
Das ist aber Grundlagen C Programmierung:
Du erstellst eine Headerdatei in der die Funktionsaufrufe dekalriert werden, sie in der c Daten sind und includes diese am Anfang der c Datein. Die Headerdatei sind dann so aus:

Code:
void createCardChar(char* testcardID);
void createCardID(int cardNumber, char *argv[]);

Damit kannst Du die Funktionen in beliebiger Reihenfolge in der c Datei anlegen und von überall aufrufen, denn der Compiler weiß dann, dass es so eine Funktion gibt. Sollte sie fehlen, schmeisst der Linker hinterher eine unresolved referenz als Fehlermeldung.
 
Zuletzt bearbeitet:
Versteh ich das richtig, dass ich einfach nur am Anfang nach den includes bzw Globalen Variablen einfach nur den Header der Funktion schreiben und mit ";" abschließen?
Erstellt er dann die Funktionen bevor sie aufgerufen werden?

Du schreibst, dass ich die Funktionsaufrufe in einer extra Datei deklarieren soll und sie dann includen soll. Leider dürfen wir bei dem Projekt keine extra Datein erstellen. Der komplette Quellcode MUSS in einer Datei sein. Wie wird es dann in dem Falll gemacht? Einfach nur
Code:
 void createCardChar(char* testcardID);
    void createCardID(int cardNumber, char *argv[]);
am Anfang unter den includes schreiben?
 
Im Prinzip ja, wobei du nur die hinten stehende Funktion forward deklarieren musst:

Code:
void B();  // forward-Deklaration

void A() {
    // ...
    B();  // würde ohne die forward-Deklaration fehlschlagen
    // ...
}

void B() {
    // ...
}
 
Sunnyharry schrieb:
Versteh ich das richtig, dass ich einfach nur am Anfang nach den includes bzw Globalen Variablen einfach nur den Header der Funktion schreiben und mit ";" abschließen?
Richtig, so geht eine Forward Declaration.
Sunnyharry schrieb:
Erstellt er dann die Funktionen bevor sie aufgerufen werden?
Nein, ich habe doch geschrieben, dass damit der Compiler nur weiß, dass es diese Funktion gibt. Schau mal in den include Dateien vom System, die Du sowieso nutzt. Die sehen alle ganuso aus. Die Funktion musst Du natürlich dann irgendwo schreiben, da sie dem Linker sonst fehlt, kannst sie aber ab der Forward Declaration verwenden, weil der Compiler sie dann schon kennt.
Sunnyharry schrieb:
Du schreibst, dass ich die Funktionsaufrufe in einer extra Datei deklarieren soll und sie dann includen soll. Leider dürfen wir bei dem Projekt keine extra Datein erstellen.
Das ist schlechter Stil, da man die Funktionen gewöhnlich immer in einer Header Datei deklariert, damit man sie auch von anderen Progammteilen aus aufrufen kann. Aber wenn ihr das nicht sollt, dann mache es eben oben in der Datei. Ich frage mich nur, welcher Hirni euch da C beibringt, wenn er das nicht mehr erklärt und euch schlechten Stil angewöhnt.
 
Zurück
Oben