Funktionen... (Fehlermeldung)



  • Du musst einfach dran denken, dass Bezeichner (Funktionen, Variablen, Typen...) zum Zeitpunkt der Verwendung bekannt, also deklariert sein müssen. Die Fehlermeldung sagt eigentlich genau aus, wo das Problem liegt.



  • Ja, stimmt. Hatte es mir eigentlich auch gedacht..
    Ich hielt mich aber an das Beispiel unseres
    Professors, welches irgendwie einwandfrei lief,
    obwohl die Reihenfolge der Deklarationen auch
    komisch war.

    int main(void) // Hauptprogramm
    {
    int a,b;
    long l;
    a=3;
    b=4;
    l = flaeche_berechnen(a,b);
    cout << "Das Ergebnis der Berechnung ist: " << l << endl << endl;
    system("pause");
    return 0;
    } // Ende Hauptprogramm
    long flaeche_berechnen (int a_lokal,int b_lokal)
    {
    long ergebnis;
    ergebnis= static_cast<long>(a_lokal*b_lokal);
    // Berechnung der Fläche um Umwandlung des Variablentyps von int (a_lokal*b_lokal)
    // nach <long>
    // static_cast<gewünschter Typ>(umzuwandelnder Typ ) ist der Befehl für
    // Typumwandlungen
    return ergebnis; // Zurückgabe des Ergebnisses an den audrufenden Programmteil
    } // Ende Funktion flaeche_berechnen
    


  • So sollte das aber ebenfalls einen Fehler geben. Bist du sicher, dass er da keinen Header included hat?



  • Tatsächlich..
    Bist echt ein Experte.. Seh's jetzt erst.
    Er included
    *long int flaeche_berechnen (int a_lokal, int b_lokal);
    *und anschließend folgen
    15 Zeilen Kommentar, wodurch ich den Header völlig
    aus den Augen verlor.

    Damit kann ich's jetzt vollkommen nachvollziehen.
    Ich wünsche dir alles Gute, drakon.



  • Mikrofon schrieb:

    Damit kann ich's jetzt vollkommen nachvollziehen.
    Ich wünsche dir alles Gute, drakon.

    Danke, gleichfalls. 🙂



  • Ich hoffe, dass Nexus dies sieht, bevor er
    offline geht...

    Kann ich in einer Funktion ein Feld(?) übegeben lassen?

    z.B. wenn in einer Funktion 6 Werte verarbeitet werden
    sollen.. Kann ich da folgendes eingeben?

    void funktion(int x[5]);
    

    Oder umgekehrt beim Aufrufen der Funktion?:

    funktion (z[5]);
    


  • Mikrofon schrieb:

    Ich hoffe, dass Nexus dies sieht, bevor er
    offline geht...

    Keine Angst, ich bleib schon noch kurz. 🙂

    Arrays können nicht an Funktionen übergeben werden. Was man aber tun kann, ist Zeiger oder Referenzen auf sie zu übergeben.

    Folgende Funktionsdeklarationen sind identisch, es wird jedes Mal ein Zeiger auf int übergeben. Die Grösseninformation in den eckigen Klammern wird dabei ignoriert.

    void Function(int* Array);
    void Function(int Array[]);
    void Function(int Array[357]);
    

    Deshalb solltest du die Grösse explizit übergeben (wenn du es nicht mit Templates und Referenzen machst). Du kannst also Folgendes haben:

    void Function(int* Array, unsigned int Size)
    {
        for (unsigned int i = 0; i < Size; ++i)
            std::cout << Array[i] << " ";
    }
    
    int main()
    {
        const unsigned int ArraySize = 7; // Arraygrösse als Konstante anlegen
        int Array[ArraySize] = {1, 4, 3, 0, 8, 5, 6};
    
        Function(Array, ArraySize);
    }
    

    Du siehst also, man braucht beim Aufruf nur Array zu schreiben. Man übergibt aber wie gesagt nicht das Array selber. Wenn man Array schreibt, wird das Array implizit in einen Zeiger auf das erste Element konvertiert. Was man übergibt, ist also dieser Zeiger.

    Aber statt Arrays kann man auch STL-Container nutzen, dann ist z.B. auch die Grössenübergabe überflüssig. Zudem wird einem da die Speicherverwaltung abgenommen und man kann dynamische Arrays verwalten (zur Laufzeit Elemente anhängen, etc.).



  • Auf dich kann man zählen.. 😉
    Hattest wie immer recht! Läuft jetzt..



  • Nun übertreibs nicht. So unfehlbar bin ich bei weitem nicht... 😉

    Aber gut, dass es dir geholfen hat. 🙂



  • Also vorhin konnte ich immer zwischendurch
    prüfen etc. und es lief auch... nur jetzt
    gibt's zwar beim Kompilieren keine Meldung,
    dafür gibt es einen Absturz des "Dos-Fensters"
    nach der ersten Eingabe.. 😕
    Sowas ist das erste mal (nach ca. 100 kleineren
    Progs).
    Hab die letzten Änderungen, die ich vornahm rück-
    gängig gemacht, jedoch ohne Erfolg. Das Ding läuft
    nicht mehr..

    PS: Die Funktion 'gross' ist noch nicht fertig.

    //Titel
    #include <iostream>
    using namespace std;
    void gross(int* Array, int size, int &superb);
    
    int main(void)
    {
    int i, big, max;
    int* feld;
    big=6;
    
          for (i=1; i<=6; i++)
          {
          cout << "\nBitte " << i <<". Zahl von 6 eingeben: ";
          cin >> feld[i-1];
          }
    
    gross(feld, big, max);
    
    cout << endl << "Die groesste Zahl, die eingegeben wurde lautet: " << max << "\n\n\n";
    
    system("Pause");
    return 0 ;
    } // Hauptprogramm
    
      void gross(int* Array, int size, int &superb)
      {
      int j, hilf;
      hilf=0;
    
          for(j=6; j>=1 ;j--)
          {
          cout << "\n" << Array[size-j]; //Kontrolle via Ausgabe
          }
    
       superb=hilf;     
    
       }
    


  • Hallo, mit

    int* feld;
    

    legst du nur einen Zeiger auf int an, kein Array. Der Zeiger ist zudem noch uninitialisiert, zeigt also irgendwo hin. Um dafür Platz zu reservieren, könntest du beispielsweise new benutzen.

    Aber in deinem Falle geht es eher um Arrays. Leg also ein solches an, das genügend gross ist, sodass alle Elemente Platz haben.

    int feld[6];
    


  • 👍 👍 👍 👍 👍 👍
    Vielen Dank nochmals!
    Ich hoffe, dass meine Klausur gut verläuft..

    Dann lade ich dich und drakon zum Essen ein..
    Hoffe, ihr wohnt in der Nähe, sodass ich ein
    gutes Restaurant kenne, welches nicht allzu
    weit weg von euch ist.



  • Hmm, das könnte schwierig werden, drakon und ich wohnen beide in der Schweiz. 😉

    Aber mir reicht es, dass ich dir helfen konnte. Es gibt übrigens sehr wenige Leute, die so viel Dankbarkeit zeigen wie du. Das schätze ich sehr, oft hört man gar nichts oder teilweise sogar blöde Kommentare.

    Viel Glück bei deiner Klausur. 🙂



  • Nexus schrieb:

    Viel Glück bei deiner Klausur. 🙂

    Merci.. Dir auch 'viel Glück' bei allem, was
    du dir vornimmst. Möge Gott dir helfen.

    Okay, mit der Schweiz hatte ich nicht gerechnet.
    Dann muss ich mir was anderes überlegen 😉
    Zeit hab ich ja noch.. Zur Klausur sind's noch 2 Wochen.

    Zurück zu C++.. Wenn ich bis dahin Probleme hab',
    melde ich mich... falls du gestattest.

    Schönen Abend noch bzw. Gute Nacht!



  • Mikrofon schrieb:

    Merci.. Dir auch 'viel Glück' bei allem, was
    du dir vornimmst. Möge Gott dir helfen.

    Vielen Dank. 🙂

    Mikrofon schrieb:

    Zurück zu C++.. Wenn ich bis dahin Probleme hab',
    melde ich mich... falls du gestattest.

    Sicher, ja. Ich bin relativ oft hier im Forum, und es gibt ja auch sonst sehr viele Leute, die dir bei Problemen helfen können. 😉

    Ich wünsche dir auch eine gute Nacht, machs gut.



  • Nabend allerseits...

    Kriege in den Array keine Werte
    eingelesen...

    //Titel
    
    #include <iostream>
    using namespace std;
    void einlesen(int* feld, int poly);
    
    int main()
    {
    int p;
    cout << "\nGrad des Polynoms eingeben: ";
    cin >> p;
    cout << "\n\n";
    int Array[p];
    
    einlesen(Array,p);
    
    system("Pause");
    return 0;
    }
    
    void einlesen(int* &feld, int poly)
    {
    int i;
    
         for (i=1; i<=poly; i++)
         {
         cout << "Bitte " << i << ". Wert von " << poly << "eingeben :";
         cin >> feld[i-1];
         }     
    
    }
    

    Es wird nicht kompiliert.
    Ein Fehler in einer bestimmten Zeile
    des Quellcodes liegt nicht vor.
    Die Fehlermeldung lautet:

    [Linker error] undefined reference to `einlesen(int*, int)'
    ld returned 1 exit status

    Wenn ich unten das &-Zeichen vor 'feld' entferne, klappt's.
    Ich möchte aber, dass die eingegeben Werte an's Haupt-
    programm zurückgeliefert werden..

    PS:
    Wenn ich in die Zeile 5 statt feld
    -> &feld
    eingebe (und unten das & unten auch stehen lasse,
    gibt es eine andere Fehlermeldung (Zeile 15):

    15 invalid initialization of non-const reference of type 'int*&' from a temporary of type 'int*'



  • Du brauchst das & bei der Funktionsdefinition nicht, die Werte werden auch so zurückgeliefert. Das & nach dem zeiger brauchst du nur, wenn du den Zeiger selbst in der Funktion verändern willst.
    Ansonsten: Die Funktionsdefinition muss immer mit der deklaration übereinstimmen, sonst bekommst du eben Linkerfehler.



  • DANKE, BRAUNSTEIN....

    Nun zu Struct (Strukturen) 😉

    Quellcode-Ausschnitt:

    .
    .
    .
    cout << "\nKonto 1:\n\n"
            "Bitte Hausnamen eingeben: ";
    getline(cin, kunde1.name);
    cin >> kunde1.konto;
    cout << "\nBitte Kontostand eingeben: ";
    cin >> kunde1.geld;
    
    cout << "\n\n\nKonto 2:\n\n"
            "Bitte Hausnamen eingeben: ";
    getline(cin, kunde2.name); // <<<<<<<<<-------------- 
    cout << "\nBitte Vornamen eingeben: ";
    getline(cin, kunde2.vorname);
    cout << "\nBitte Adresse eingeben: ";
    getline(cin, kunde2.adresse);
    cout << "\nBitte Kontonummer eingeben: ";
    cin >> kunde2.konto;
    cout << "\nBitte Kontostand eingeben: ";
    cin >> kunde2.geld;
    .
    .
    .
    .
    

    Die markierte Eingabe wird übersprungen..
    Alle anderen Einlese-Befehle sind ok.
    In einem anderen Programm hatte ich das
    gleiche Problem. Manchmal wird der Befehl
    getline(cin, x) nicht ausgeführt..

    Was mache ich falsch? Einer unserer Fachleute
    wird es bestimmt wissen...



  • Du solltest nicht unformatierte ( std::getline() ) mit formatierter ( operator>> ) Eingabe vermischen.

    Siehe dazu diesen Thread, besonders 7H3 N4C3Rs Beitrag auf der zweiten Seite.


Anmelden zum Antworten