komische fehlermeldungen beim compilieren :(



  • da fehlen so

    }
    


  • @Dharma:

    Schreib mal den gesamten Code hier hinein und die Fehlermeldungen, ich glaub,dass mehr Fehler drinnen sind, als geglaubt.

    Bin mir jetzt nicht sicher, ob man als Parameter, wie hier zu sehen:

    int vecmax(int vec[leng]);
    

    ein Array mit einer nicht bestimmten Größe schreiben kann.

    Daniel



  • Das, was als erstes ins Auge springt, ist folgende Formulierung:

    int leng;
    int vec[leng];
    

    Das wird so nicht funktionieren, da der erste Ausdruck int leng; (es müsste im übrigen length heißen) lediglich eine Speicherstelle reserviert. Diese hat aber noch keinen definierten Wert. Im zweiten Ausdruck versuchst du, ein Array mit einer (wie angemerkt) undefinierten Größe zu definieren. Wenn das nicht eine Warnung vom Compiler erzeugt, dann hast du mindestens beim Aufruf des Programmes irgendwann schwere Probleme.

    rand();
    

    Diese Funktion ist in der Headerdatei cstdlib definiert, welche du vorher einbinden musst. Lies dir aber noch mal die Anleitungen zu Zufallszahlen durch, um rand etc. richtig anzuwenden.

    Ach, und die Einrückungen sind schwer merkwürdig 😉

    Grüße...

    Heiko



  • @daniel
    das ist der gesamt code
    und das sind auch alle fehlermeldungen - die doppelten hab ich nicht reingeschrieben.

    @bwbg

    ich glaube auch, dass es an der von dir genannten formulierung liegt. aber selbst, wenn ich leng einen festen wert zuweise, funktioniert es nicht.
    leng hab ich deswegen verwendet, weil mein prof auf der uni auch mal ein beispiel damit hatte...und ich wollte eben bei seinen formulierungen bleiben.

    wg rand()
    wir hatten letzte woche ein beispiel, in dem wir zwei vektoren mit zufallszahlen füllen sollten. haben dies auf die gleiche art und weise getan wie ich jetzt...und es hat funktioniert. habe auch keine datei eingebunden oder so.

    und leng wird doch dann durch die eingabe ein wert zugewiesen....und....ich verstehs nicht - versteh auch nicht, warum er vor meinen << beistriche oder strichpunkte will.... 🙄

    und die einrückungen macht der editor. hab mir heut dev-c++ runtergeladen...hab schon gehört, dass das nicht gut ist...

    naja....hat noch irgendwer irgendwelche vorschläge....:(



  • Dein Problem ist primär, dass du die Größe des Arrays bereits festlegen willst, BEVOR der Benutzer eine Eingabe vorgenommen hat.

    Dynamische Arrays sollten nicht (meine Auffassung) auf dem Stack(1) definiert werden, sondern auf dem Heap(2) (sofern vorhanden).

    Des weiteren habe ich dir ein "leeres" Programm geschrieben (da ich gerade eine Kaffeepause habe), woran du dich bei der Strukturierung deines Problems orientieren kannst:

    // Arrays mit dynamischer Größe anlegen
    
    /*
        Programmablauf:
    
            I. Eingabe:
                1. Anfrage an den Benutzer, wie groß das Array werden soll.
    
            II. Verarbeitung:
                1. Array mit der entsprechenden Größe anlegen.
                2. Array mit Zufallszahlen füllen.
                3. Das Array nach der größten Zahl durchsuchen.
    
            III. Ausgabe:
                1. Länge des Arrays ausgeben
                2. Größte Zahl ausgeben.
    */
    
    // *** Prototypen
    size_t askLength();
        // Anfrage an den Benutzer ausgeben und Arraygroesse zurueck-
        //  geben.
    
    void fillRandom(unsigned int* array, size_t array_length);
        // Füllt das übergebene Array ('array') mit Zufallszahlen.
        //  Die Größe/Länge des Arrays ('array_length') muss dabei
        //  exakt angegeben werden.
    
    unsigned int getMaximum(unsigned int* array, size_t array_length);
        // Ermittelt den größten Wert im Array ('array').
        //  Die Größe/Länge des Arrays ('array_length') muss dabei
        //  exakt angegeben werden.
    
    void printResult(size_t array_length, unsigned int maximum);
        // Gibt das Ergebnis der Verarbeitung auf der Standardausgabe aus.
    
    // *** Programmeinsprungpunkt
    int main(int argc, char** args)
        {
            size_t length;
            unsigned int* array;
                // Hier wird lediglich ein Zeiger auf ein uint-array
                //  definiert, welcher einen undefinierten (!) Wert
                //  besitzt. Das Array existiert hier noch nicht!
    
            // I.1. :
            length = askLength();
    
            // II.1. :
            array = new unsigned int[length];
                // Mit new allozierter Speicher muss nach der Verwendung
                //  wieder freigegeben werden, damit keiner Speicherlecks
                //  entstehen!
                //  (Erst ab diesem Punkt existiert das Array konkret.)
    
            // II.2. :
            fillRandom(array, length);
    
            // II.3. :
            unsigned int maximum = getMaximum(array, length);
    
            // III.1. + 2. :
            printResult(length, maximum);
    
            // Allozierten Speicher wieder freigeben:
            delete[] array;
    
            return 0;
        }
    

    Lässt sich ohne die Funktionsdefinitionen und einigen Header-Dateien natürlich nicht übersetzen 😉

    Dies ist übrigens auch mit DevC++ geschrieben worden - zu Hause nutze ich gcc (g++) von der Kommandozeile aus.

    Im übrigen solltest du dir auf jeden Fall noch einmal anlesen, was es mit Arrays(3) und Zeigern(4) auf sich hat. Ein Einblick in die dynamische Speicherreservierung (zur Laufzeit)(5) schadet auch nicht.

    Das sollte für den Anfang genug an Lesestoff sein und dich ein Weilchen beschäftigen.

    Grüße...

    Heiko

    ---
    Fußnoten / Quellenverweise:
    (1): http://de.wikipedia.org/wiki/Stapelspeicher
    (2): http://de.wikipedia.org/wiki/Dynamischer_Speicher
    (3): http://tutorial.schornboeck.net/arrays.htm
    (4): http://tutorial.schornboeck.net/zeiger.htm
    (5): http://tutorial.schornboeck.net/dyn_speicher.htm



  • wow...danke heiko 🙂

    wwerd mich gleich dransetzen.
    auf der uni haben wir auch g++.....muss mir aber erst ein linux besorgen...

    danke jedenfalls für deine mühe, zeit und hilfe 😘

    ld Dharma....und ich werd dir sicher mein ergebnis zeigen 😃



  • so - mir reichst jetzt 😡 ...ich geh jetzt rüber auf die uni in den computerraum. der compiler meldet mir fehler - das kann gar nicht sein. er lässt nichtmal eine ganz normale for-schleife zu....und selbst, wenn ich ein bsp von unserem prof abtippe, meldet er mir fehler....



  • so...

    ich weiß auch nicht. habs jetzt zwar - und es funktioniert...ich weiß aber nicht wirklich, was ich jetzt anders gemacht hab. vor allem nimmt er mein programm von zu hause auch nicht - bekomme die gleichen fehler.
    hab dann versucht das alte auszubessern - aber es bringt nix 🙄

    habs jetzt so gelöst:

    #include <iostream>
    using namespace std;
    
    // Globale Variable
    
    const int length = 10;
    
    // Prototyp
    
    int calc_max(int vect[length]);
    
    int main() {
    
        int vec[length];
        int max;
    
        for (int i = 0; i < length; i++) {
    	vec[i] = rand();
    
    	cout << "Vektorelement "<< i << "= " << vec[i] << endl;
    
        }
    
    // Maximum im Vektor
    
        cout << "Maximum ist " << calc_max(vec) << endl;
    
        return 1;
    
    }
        int calc_max(int vect[length]) {
    
    	int merk = 0;
    	for (int i = 0; i < length; i++) {
    	    if (vect[i] > merk) merk = vect[i];
    
    	}
    
    	return merk;
    
        }
    

    @heiko
    danke für die links. habs mir durchgelesen. es ist so, dass wir erst 3 vorlesungseinheiten hatten - und ich schätze, wir müssen das bsp lösen, mit dem was wir schon gelernt haben.
    danke für deine hilfe.

    so - und jetzt mach ich bsp nr. 3 - hoffentlich 😛 😃

    lg
    Dharma



  • Dharma schrieb:

    ich weiß auch nicht. habs jetzt zwar - und es funktioniert...ich weiß aber nicht wirklich, was ich jetzt anders gemacht hab.

    das "const int length = 10;" iast für den Compiler schon ein entscheidender Unterschied 😉 (da die Variable konstant ist, kann er sie problemlos als Array-Größe verwenden)



  • das hatte ich auch vorher ausprobiert.

    was aber überhaupt nicht verstehe ist, dass er << usw nicht zulässt...
    und auch als ich fehler in meinem alten programm (in einem davon 🙄 ) meldete er noch seltsame fehler.

    aber jetzt ists ja egal - habs ja geschafft...

    und das dritte beispiel ging ohne probleme 😃

    danke für eure hilfe!!!


Anmelden zum Antworten