1. #1
    Newbie
    Dabei seit
    Jul 2012
    Beiträge
    4

    [C] Übergabe eines Strings einer Funktion in eine andere Funktion

    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?

  2. Anzeige
    Logge dich ein, um diese Anzeige nicht zu sehen.
  3. #2
    Lt. Commander
    Dabei seit
    Okt 2009
    Beiträge
    1.108

    [C] AW: Übergabe eines Strings einer Funktion in eine andere Funktion

    Steht createCardID im Quelltext vor createCardChar? Wenn ja, dann musst du die Reihenfolge vertauschen oder eine forward-Deklaration einfügen.
    Beware the software rot, my son!
    The faults that bite, the jobs that thrash!
    Beware the broken pipe, and shun
    The frumious system crash!

  4. #3
    Newbie
    Ersteller dieses Themas

    Dabei seit
    Jul 2012
    Beiträge
    4

    [C] AW: Übergabe eines Strings einer Funktion in eine andere Funktion

    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?

  5. #4
    Lieutenant
    Dabei seit
    Sep 2009
    Beiträge
    568

    [C] AW: Übergabe eines Strings einer Funktion in eine andere Funktion

    Weil die Funktion sonst nicht bekannt ist (deshalb die implizite Deklaration).

    Ist C wirklich so aufgebaut? Erinnert mich an alte Turbo Pascal Zeiten.

  6. #5
    Newbie
    Ersteller dieses Themas

    Dabei seit
    Jul 2012
    Beiträge
    4

    [C] AW: Übergabe eines Strings einer Funktion in eine andere Funktion

    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ß.

  7. #6
    Fleet Admiral
    Dabei seit
    Mai 2010
    Beiträge
    19.156

    [C] AW: Übergabe eines Strings einer Funktion in eine andere Funktion

    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.
    Geändert von Holt (13.07.2012 um 13:45 Uhr)
    Macht eure Augen auf um zu sehen, sonst braucht ihr sie um zu weinen.
    Medienkompetenz heißt auch: Nachrichten nach ihrer Vertrauenswürdigkeit selbst zu bewerten, denn im Internet kann jeder Idiot schreiben und man muß alle Informationen selbst bewerten! In den Massenmedien dürfen nur reiche Idioten schreiben! Wer ein kritischer Mensch ist, der wird auch die Medien kritisch nutzen, bei den anderen ist Hopfen und Malz verloren. Also: Nichts glauben, selbst prüfen und selbst denken!

  8. #7
    Newbie
    Ersteller dieses Themas

    Dabei seit
    Jul 2012
    Beiträge
    4

    [C] AW: Übergabe eines Strings einer Funktion in eine andere Funktion

    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?

  9. #8
    Lt. Commander
    Dabei seit
    Okt 2009
    Beiträge
    1.108

    [C] AW: Übergabe eines Strings einer Funktion in eine andere Funktion

    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() {
        // ...
    }
    Beware the software rot, my son!
    The faults that bite, the jobs that thrash!
    Beware the broken pipe, and shun
    The frumious system crash!

  10. #9
    Fleet Admiral
    Dabei seit
    Mai 2010
    Beiträge
    19.156

    [C] AW: Übergabe eines Strings einer Funktion in eine andere Funktion

    Zitat Zitat von Sunnyharry Beitrag anzeigen
    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.
    Zitat Zitat von Sunnyharry Beitrag anzeigen
    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.
    Zitat Zitat von Sunnyharry Beitrag anzeigen
    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.
    Macht eure Augen auf um zu sehen, sonst braucht ihr sie um zu weinen.
    Medienkompetenz heißt auch: Nachrichten nach ihrer Vertrauenswürdigkeit selbst zu bewerten, denn im Internet kann jeder Idiot schreiben und man muß alle Informationen selbst bewerten! In den Massenmedien dürfen nur reiche Idioten schreiben! Wer ein kritischer Mensch ist, der wird auch die Medien kritisch nutzen, bei den anderen ist Hopfen und Malz verloren. Also: Nichts glauben, selbst prüfen und selbst denken!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •