komische Ausgabe obwohl Funktion identisch



  • Hi Leute,
    vielleicht kann mir einer von euch sagen, warum beim ersten Beispiel zum Schluss der Ausgabe, so eine riesen Zahl generiert wird und warum? Was bedeutet sie? (steht bei new array). An sich ist beides gleich, nur das einmal die Funktion ausgelagert ist und zum anderen innerhalb der main steht.

    #include <iostream>
    
    using namespace std;
    
    int values[10]={23,11,67,3,9,0,28,30,21,15};
    int temp;
    int sort_a()
        {
    
                    for (int i=0;i<10;i++)
                    {
                      for(int j=i+1;j<10;j++)
                        {
                            if(values[i]>values[j])
                                {
                                   temp=values[i];
                                   values[i]=values[j];
                                   values[j]=temp;
                                }
                        }
                        cout<<values[i]<<" | ";
                    }
    
        }
    
    int main()
    {
        cout <<"old array: ";
        for(int i=0;i<10;i++)
        {
          cout<<values[i]<<" | ";
        }
    
        cout << "\nnew array: ";
        cout <<  sort_a();
    
    }
    

    Und dieser hier

    #include <iostream>
    
    using namespace std;
    
    int values[10]={23,11,67,3,9,0,28,30,21,15};
    int temp;
    /*int sort_a()
        {
    
                    for (int i=0;i<10;i++)
                    {
                      for(int j=i+1;j<10;j++)
                        {
                            if(values[i]>values[j])
                                {
                                   temp=values[i];
                                   values[i]=values[j];
                                   values[j]=temp;
                                }
                        }
                        cout<<values[i]<<" | ";
                    }
    
        }
    */
    
    int main()
    {
        cout <<"old array: ";
        for(int i=0;i<10;i++)
        {
          cout<<values[i]<<" | ";
        }
    
        cout << "\nnew array: ";
                        for (int i=0;i<10;i++)
                    {
                      for(int j=i+1;j<10;j++)
                        {
                            if(values[i]>values[j])
                                {
                                   temp=values[i];
                                   values[i]=values[j];
                                   values[j]=temp;
                                }
                        }
                        cout<<values[i]<<" | ";
                    }
    
    }
    


  • Deine Sort Funktion hat kein return value, was soll denn da überhaupt zurückgegeben werden?



  • sie sortiert den array.



  • saveit schrieb:

    sie sortiert den array.

    eigentlich soll er das nur sortieren, es klappt in beiden beispielen nur das beim ersten Beipiel, eine Zahlenfolge nach dem lettzen Wert generiert wird(4855776), würde gerne wissen warum?



  • saveit schrieb:

    es klappt in beiden beispielen nur das beim ersten Beipiel, eine Zahlenfolge nach dem lettzen Wert generiert wird(4855776), würde gerne wissen warum?

    Weil du den Rückgabewert von sort_a ausgibst.



  • wie kann man das umgehen?



  • Was deine Funktion machen soll ist soweit klar. Sie sortiert ein globales Array. Das ist vom Stil her schon unschön, aber hier ja nicht der Punkt.

    Eine Funktion mit der Deklaration

    int something();
    

    gibt ein Integer (Ganzzahlentyp) zurück, mit hilfe des Schlüsselwortes return. Das machst du aber in deiner Funktion nicht. Damit erzeugst du undefiniertes Verhalten. Je nach Compiler solltest du dazu auch eine Warnung bekommen!

    Ich würde dir empfehlen, dir nochmal das Kapitel über Funktionen / Methoden in deinem C++ Buch / Tutorial durchzuarbeiten.



  • saveit schrieb:

    wie kann man das umgehen?

    void sort_a()
    {
    ...
    }
    
    int main()
    ...
    
        cout << "\nnew array: ";
        sort_a();
    


  • Schlangenmensch schrieb:

    Was deine Funktion machen soll ist soweit klar. Sie sortiert ein globales Array. Das ist vom Stil her schon unschön, aber hier ja nicht der Punkt.

    Eine Funktion mit der Deklaration

    int something();
    

    gibt ein Integer (Ganzzahlentyp) zurück, mit hilfe des Schlüsselwortes return. Das machst du aber in deiner Funktion nicht. Damit erzeugst du undefiniertes Verhalten. Je nach Compiler solltest du dazu auch eine Warnung bekommen!

    Ich würde dir empfehlen, dir nochmal das Kapitel über Funktionen / Methoden in deinem C++ Buch / Tutorial durchzuarbeiten.

    Was wäre denn ein schöner Stil? Der Compiler gibt mir tatsächlich eine Warnung aus. Bloß kann ich damit derzeitig noch nichts anfangen. Werde deinen Rat befolgen und schauen was dort so im Kapitel steht.



  • Bei mir wird der Code gar nicht erst kompiliert.

    Um die globalen Variablen zu vermeiden, gibst du der Funktion einfach den Array mit und den Integer temp kannst du einfach in die Funktion packen, da der außerhalb dieser nicht benötigt wird.
    Also:

    void sort_a(int *values);
    

    und den Array schreibst du als lokale Variable in die main-Funktion.
    Bei dem Funktionsaufruf darfst du dann allerdings nicht die Funktion ausgeben, du musst einfach nur den Funktionsnamen mit den Parametern verwenden. Als Parameter nimmst einen Zeiger auf das erste Element des Arrays, der identisch mit dem Namen des Arrays ist.

    Den schöneren Stil hat bereits manni66 gepostet.



  • Pointer kommen leider erst im nächsten Kapitel. Muss mich erst mit den Übungsaufgaben rumschlagen. Leider gibt es dafür auch keine Lösungen.



  • saveit schrieb:

    Pointer kommen leider erst im nächsten Kapitel. Muss mich erst mit den Übungsaufgaben rumschlagen. Leider gibt es dafür auch keine Lösungen.

    leider kann man das geschriebenen als Gast nich editieren, nun denn, was bedeutet schöner Stil?



  • saveit schrieb:

    saveit schrieb:

    Pointer kommen leider erst im nächsten Kapitel. Muss mich erst mit den Übungsaufgaben rumschlagen. Leider gibt es dafür auch keine Lösungen.

    leider kann man das geschriebenen als Gast nich editieren, nun denn, was bedeutet schöner Stil?

    gerade gesehen.^^


  • Mod

    Skylac06 schrieb:

    Also:

    void sort_a(int *values);
    

    Dann auch bitte gleich noch mit irgendeiner Art Größeninformation. Kann ja nicht sein, dass man sonst später nur Felder mit genau 10 Elementen sortieren kann. Also entweder die Größe angeben, oder flexibler Anfang und Ende:

    void sort_a(int *begin, int *end)
    


  • So sieht er jetzt aus. Wurde alles beachtet was ihr geschrieben habt?

    #include <iostream>
    
    using namespace std;
    
    void sort_a(int *values)
        {
    
           int temp;
    
                    for (int i=0;i<10;i++)
                    {
                      for(int j=i+1;j<10;j++)
                        {
                            if(values[i]>values[j])
                                {
                                   temp=values[i];
                                   values[i]=values[j];
                                   values[j]=temp;
                                }
                        }
                        cout<<values[i]<<" | ";
                    }
    
        }
    
    int main()
    {
        int values[10]={23,11,67,3,9,0,28,30,21,15};
        cout <<"old array: ";
        for(int i=0;i<10;i++)
        {
          cout<<values[i]<<" | ";
        }
    
        cout << "\nnew array: ";
          sort_a(values);
    
    }
    


  • Ich habe mich versehen.
    Schlangenmensch meinte mit schönem Stil, dass globale Variablen, also Variablen, die nicht innerhalb einer Funktion deklariert werden, zu vermeiden sind.
    In deinem Fall kannst du zum Beispiel einfach die Variable temp in die Funktion sort_a() packen.
    Den Array kannst du nur in die main-Funktion packen, wenn du bereits Parameter gelernt hast.
    Ein (eindimensionaler) Array wird immer über den Arraynamen übergeben. Dieser entspricht &array[0]. Das kommt dann aber sicher im nächsten Kapitel.

    Außerdem solltest du dir vielleicht kleinere Abstände beim Einrücken angewöhnen und allgemein einen einheitlichen Schreibstil.

    Edit: fast.
    Die main-Funktion hat auch einen Rückgabewert. Deshalb muss auch die einen Wert zurückliefern, das ist normalerweise 0.
    Also einfach ein

    return 0;
    

    Als letzte Anweisung in die main-Funktion schreiben.
    Außerdem noch das Einrücken und dann sollte es passen.
    Ich persönlich habe es zudem noch immer lieber, wenn die Funktionsdefinition erst unterhalb der main-Funktion stattfindet, aber das ist vermutlich Geschmackssache (?).



  • Deshalb muss auch die einen Wert zurückliefern, das ist normalerweise 0.
    Also einfach ein
    return 0;

    no need. stört nur



  • unskilled schrieb:

    Deshalb muss auch die einen Wert zurückliefern, das ist normalerweise 0.
    Also einfach ein
    return 0;

    no need. stört nur

    Dann habe ich das falsch gelernt. Danke für die Korrektur. 🙂
    Aber sollte man dann nicht auch eher eine void main() benutzen?



  • Soweit habe ich hoffentlich alles übernommen Skylac06?

    void sort_a(int *begin, int *end)

    wie würde man das hier einbauen? habs probiert aber anscheinend falsch.

    #include <iostream>
    
    using namespace std;
    
    void sort_a(int *values)
        {
        int temp;
        for (int i=0;i<10;i++)
            {
            for(int j=i+1;j<10;j++)
                {
                if(values[i]>values[j])
                    {
                    temp=values[i];
                    values[i]=values[j];
                    values[j]=temp;
                    }
                }
            cout<<values[i]<<" | ";
            }
        }
    
    int main()
    {
        int values[10]={23,11,67,3,9,0,28,30,21,15};
        cout <<"old array: ";
        for(int i=0;i<10;i++)
            {
            cout<<values[i]<<" | ";
            }
        cout << "\nnew array: ";
        sort_a(values);
          return 0;
    
    }
    


  • Wie ich gerade selbst erst erfahren habe kannst du auch das return 0 weglassen. 🙄
    Falsch ist es aber nicht. 😉

    Du sollst einen Zeiger auf das erste Element des Arrays und einen auf das letzte übergeben, oder?
    Wie hast du das denn bisher versucht?


Log in to reply