Array



  • Hey Leute.
    Könnt ihr einmal den Quellcode durschauen und sagen ob alles richtig ist?
    Insbesondere diese Zeile:

    okey[3]=test(okey);
    
    //---------------------------------------------------------------------------
    
    #include <iostream>
    #include <conio>
    
    using namespace std;
    //---------------------------------------------------------------------------
    
    int test (int okey[3]){
        okey[0]=1;
        okey[1]=2;
        okey[2]=3;
        okey[3]=4;
    
        return okey[3];
    }
    
    //---------------------------------------------------------------------------
    
    int main(){
    int okey[3];
    
        okey[3]=test(okey);
    
        getch();
        cout << okey[0] << "\n";
        cout << okey[1] << "\n";
        cout << okey[2] << "\n";
        cout << okey[3] << "\n";
    
        getch();
        return 0;
    }
    //---------------------------------------------------------------------------
    

    Gruß

    ps: Es funktioniert alles, nur als Überprüfung.



  • Gast3182 schrieb:

    ps: Es funktioniert alles, nur als Überprüfung.

    Nope, da ist so gut wie alles falsch.



  • Aber wieso funktioniert es den?..



  • //---------------------------------------------------------------------------
    
    #include <iostream>
    #include <conio>    // kein Standard-Header, 
    //von "conio" hab ich überhaupt noch nie gehört, es gibt eine nicht-standard conio.h
    
    using namespace std;
    //---------------------------------------------------------------------------
    
    int test (int okey[3]){
        okey[0]=1;
        okey[1]=2;
        okey[2]=3;
        okey[3]=4;  // leicht irreführend, 
        //deklariere okey lieber als okey[], okey[4] oder *okey
    
        return okey[3];
    }
    
    //---------------------------------------------------------------------------
    
    int main(){
    int okey[3];  // das Array ist zu klein, test beschreibt 4 Elemente
    
        okey[3]=test(okey);
    [...]
    

    Was soll der Sinn der Zeile okey[3] = test(okey); sein? test gibt doch okey[3] zurück, also ist das im Prinzip nichts anderes als

    test(okey);
    okey[3] = okey[3];
    

    Wem's gefällt...



  • Gast3182 schrieb:

    Aber wieso funktioniert es den?..

    Weil der Compiler glücklicherweise deinen Fehler ausmerzt. Du deklarierst einen Array mit Größe 3, verwendest aber 4 Felder (beachte, dass Array Indizes bei 0 beginnen).



  • Danke für die schnelle Antwort 😃
    Habe trodzdem noch ein paar Fragen dazu.
    1.

    okey[0]=1;
        okey[1]=2;
        okey[2]=3;
        okey[3]=4;  // leicht irreführend,
        //deklariere okey lieber als okey[], okey[4] oder *okey
    

    Wie meinst du das? Es sollte jedzt nichts ernstes sein, sondern nur ein Test den ich bin gerade neu mit Array angefangen.

    int okey[3];  // das Array ist zu klein, test beschreibt 4 Elemente
    

    Ich dachte Array fangen bei 0 an also wenn ich

    okey[3]
    

    habe hat er 4 stk. unzwar

    okey[0],okey[1],okey[2],okey[3]
    

    , oder nicht?

    okey[3]=test(okey);
    

    An der stelle war ich mir nicht so sicher denn ich dachte ich müsste es so übergeben

    okey[3]=test(okey[3]);
    

    .

    Du schriebst "#include <conio> // kein Standard-Header," .. Also mein C++ Lehrer meinte das so und hat uns das genauso beigebracht. Er meinte wir sollten die beiden immer oben stehen haben.



  • Gast3182 schrieb:

    Habe trodzdem noch ein paar Fragen dazu.
    1.

    okey[0]=1;
        okey[1]=2;
        okey[2]=3;
        okey[3]=4;  // leicht irreführend,
        //deklariere okey lieber als okey[], okey[4] oder *okey
    

    Wie meinst du das?

    Im Funktionskopf steht int okey[3] . Die 3 ist an der Stelle absolut bedeutungslos, weil Array-Parameter dasselbe wie Zeiger sind. Der einzige Sinn ist möglicherweise, dem menschlichen Leser an der Stelle zu sagen, dass das Array 3 Elemente hat. Deins hat aber 4, die Funktion benutzt auch 4 Elemente, also sollte man das korrigieren.

    int okey[3];  // das Array ist zu klein, test beschreibt 4 Elemente
    

    Ich dachte Array fangen bei 0 an

    Tun sie auch. Dein Array hat 3 Elemente: 0, 1 und 2.

    okey[3]=test(okey);
    

    An der stelle war ich mir nicht so sicher denn ich dachte ich müsste es so übergeben

    okey[3]=test(okey[3]);
    

    .

    Willst du das Array okey oder das Element 3 übergeben? Frage beantwortet, hoffe ich.

    Du schriebst "#include <conio> // kein Standard-Header," .. Also mein C++ Lehrer meinte das so und hat uns das genauso beigebracht. Er meinte wir sollten die beiden immer oben stehen haben.

    Schön. Ich hab alles gesagt, was es dazu zu sagen gibt.



  • Youka schrieb:

    Gast3182 schrieb:

    Aber wieso funktioniert es den?..

    Weil der Compiler glücklicherweise deinen Fehler ausmerzt. Du deklarierst einen Array mit Größe 3, verwendest aber 4 Felder (beachte, dass Array Indizes bei 0 beginnen).

    Der Compiler merzt nichts aus. Das Programm schreibt tatsächlich über das Array hinaus, an der Stelle im Speicher steht aber anscheinend (zufällig) nichts weltbewegendes, so dass das nichts ausmacht.



  • Okey danke.
    Nun ist alles klar.

    Ich habe den Compiler "Borland C++" ist der mist?



  • Gast3182 schrieb:

    Ich habe den Compiler "Borland C++" ist der mist?

    Ja.
    Aber kein Compiler schützt dich vor out-of-range Array Zugriffen.



  • Gast3182 schrieb:

    Okey danke.
    Nun ist alles klar.

    Ich habe den Compiler "Borland C++" ist der mist?

    Wieso soll der Mist sein?
    Weil der Compiler keinen Fehler gemeldet hat?



  • Auch, und wenn ich in compilen lasse braucht er ca. 1min, auch wenn ich nur 1ne Zeile geändert habe bei 20 Zeilen Code....



  • Da meldet kein C-Compiler einen Fehler, sondern "nur" eine Warnung.
    Du solltest den Warn-Level also hoch setzen (alle Warnungen an) und die Warnungen auch wie Fehler behandeln. (Es gibt auch extra Compileroptionen dafür).

    Es ist egal wieviel Zeilen du änderst. Die Datei wird jedesmal komplett neu übersetzt.

    Du kannst unnötige includes weglassen.



  • Danke Dirk! :D, suche noch den Button,
    aber mein Problem ist dabei ich habe ein Code der ist z.B. 50 Zeilen lang den macht der in ca 3sec. Und ein anderen mit 50 Zeilen in einer Minute.
    Außerdem ist die Einrückung ungleichmäßig..
    Ich hatte mir schon überlegt mir einen neuen zu suchen.
    Habt ihr einen guten im Kopf den ihr mir empfehlen könntet?
    Er sollte eine Freeware sein.


Anmelden zum Antworten