Vektor Max und Adresseangabe



  • Auch bei Fließkommazahlen kann man das erste Element nehmen. Dann sollte man aber nicht vergessen, index auch auf 0 zu setzen.



  • Danke nochmals für die vielen Vorschläge/Anregungen!
    Nochmal zu meinem Problem:
    Also es geht darum, aus einem Vektor (heißt: VZ), den ich erzeugt habe, das Maximum und den Index dazu zu bestimmen. Dabei besteht mein Vektor VZ nur aus Integern. Außerdem wollte ich das ganze mit Pointern machen, damit ich Platz sparen und um es auch zu lernen, Pointer zu verwenden. Folgendes habe ich nun erstellt.

    int VZ={1,2,5,3};
    int maxWert=0;
    int index=0;
    
    void f1(int *vektor,int *size,int *maxWert,int *index) {
        for(int i=0;i<size;++i) {
            if(VZ[i]>maxWert) {
                maxWert = VZ[i];
                index = i;
            }
        }
    }
    

    -> Kopfzeile korrigiert, Vektor VZ

    Könntet ihr vor allem die Pointer durchschauen, da ich mir bei diesen nicht sicher bin, ob diese richtig gesetzt sind.

    Ist das so korrekt?

    Gruß Joe



  • Danke nochmals für die vielen Vorschläge/Anregungen!
    Nochmal zu meinem Problem:
    Also es geht darum, aus einem Vektor (heißt: VZ), den ich erzeugt habe, das Maximum und den Index dazu zu bestimmen. Dabei besteht mein Vektor VZ nur aus Integern. Außerdem wollte ich das ganze mit Pointern machen, damit ich Platz sparen und um es auch zu lernen, Pointer zu verwenden. Folgendes habe ich nun erstellt.

    int VZ={1,2,5,3};
    int maxWert=0;
    int index=0;
    
    void f1(int *vektor,int *size,int *maxWert,int *index) {
        for(int i=0;i<size;++i) {
            if(vektor[i]>maxWert) {
                maxWert = vektor[i];
                index = i;
            }
        }
    }
    

    -> Kopfzeile korrigiert, Vektor VZ

    Könntet ihr vor allem die Pointer durchschauen, da ich mir bei diesen nicht sicher bin, ob diese richtig gesetzt sind.

    Ist das so korrekt?

    Gruß Joe



  • size muss kein Pointer sein. Du kannst wie schon erwähnt maxWert und index vor dem Schleifenaufruf auf das erste Element setzen und dann in der Schleife mit dem zweiten fortfahren. Wichtig wird dann eine größenüberprüfung, aber deine Funktion tut schon was sie soll. Wenn du die zeiger dereferenzierst.



  • int VZ={1,2,5,3};
    int maxWert=0;
    int index=0;
    
    void f1(int *vektor,int size,int *maxWert,int *index) { // size braucht kein Pointer sein
    
        *maxWert = vektor[0];
        *index = 0; 
    
        for(int i=0;i<size;++i) {      // Achtung size ist kein Pointer             
           if(vektor[i]>*maxWert) {    // * nicht vergessen
                *maxWert = vektor[i];  // * nicht vergessen
                *index = i;            // * nicht vergessen
            }
        }
    }
    

    Du schreibst ja *int maxWert. Mit dem * ist maxwert ein int ohne ist es der Pointer.



  • - size sollte kein Pointer sein, einfach int. Denn du willst nichts zurückschreiben, du willst nur die Elemente-Anzahl an die Funktion übergeben. Hierfür reicht eine Übergabe by-value.

    - maxWert wird in der Funktion gar nicht initialisiert! Das ist böse. Es steht dann irgendwas an der Stelle im Speicher, und dein Ergebnis geht u.U. böse schief. Initialisiere maxWert doch mit dem ersten Array-Element, wie schon vorgeschlagen wurde.

    - Wenn du mit dem Wert vergleichen willst, auf den der Zeiger maxWert zeigt, musst du auch entsprechend notieren. Also so:

    if(vektor[i]>*maxWert) {  //das Sternchen dereferenziert den Zeiger, somit wird vektor[i] mit dem verglichen, auf das maxWert zeigt
    

    - Dasselbe gilt für die nächste Zeile. Wenn du der Variablen, auf die der Zeiger maxWert zeigt, einen Wert zuweisen willst, musst du wieder so notieren:

    *maxWert = vektor[i];
    

    - Bei der nächsten Zeile ist es wieder dasselbe für den Zeiger index.



  • Ach so!
    Ich dachte, wenn ich maxWert ausserhalb der Funktion declariere, dann reicht es aus.
    Damit ich nicht durcheinanderkomme, habe ich die Namen etwas verändert.
    Nun nochmal das ganze!

    int VZ={1,2,5,3};
    int maxWert1=0;
    int index1=0;
    int size1=20;
    
    //Nun will ich die oben declarierten Werte als Poniter übergeben, und zwar alle.
    void f1(int *vektor,*size,*maxWert,*index) {
    
        //*maxWert = vektor[0];  //wird nicht mehr benötigt, da maxWert als Pointer übergeben
        //*index = 0;   //wird nicht mehr benötigt, da index als Pointer übergeben
    
        for(int i=0;i<size;++i) {      // Achtung size ist kein Pointer            
           if(vektor[i]>*maxWert) {    // * nicht vergessen
                *maxWert = vektor[i];  // * nicht vergessen
                *index = i;            // * nicht vergessen
            }
        }
    }
    

    Wieso muss ich in der Kopfzeile bei Vektor "int" davorschreiben, bei den einzelnen Variablen jedoch nicht? Von der Syntax ist mir das nicht ganz klar.
    Ist meine Funktion nun in Ordnung?

    Gruß Joe



  • Meine Güte! DirkB`s Code war vollkommen korrekt. Warum kommentierst du die zuweisung aus? Warum ist size immernoch ein Pointer? Warum verwendest du nun void*?



  • joe1234 schrieb:

    Ach so!
    Ich dachte, wenn ich maxWert ausserhalb der Funktion declariere, dann reicht es aus.

    Damit würdest du die Funktion davon abhängig machen, dass der Aufrufer auch bloß alle Variablen initialisiert, die er übergibt. Und davon kann man nicht ausgehen, wenn es sich um By-Reference-Variablen handelt - also Variablen, die als Rückgabe gedacht sind und in der Funktion gesetzt werden. Nein, nein, so machen wir das nicht! 😉 Außerdem wurde ja schon gesagt, warum es viel besser ist, maxWert nicht mit 0, sondern mit dem Wert des ersten Array-Elements zu versehen (wenn im Array nur negative Werte sind, bekommst du sonst das Ergebnis, dass 0 der höchste Wert im Array ist). Wenn man dir schon zeigt, wie es total absolut super-richtig ist, solltest du das auch übernehmen und nicht auskommentieren. 💡

    joe1234 schrieb:

    Wieso muss ich in der Kopfzeile bei Vektor "int" davorschreiben, bei den einzelnen Variablen jedoch nicht? Von der Syntax ist mir das nicht ganz klar.
    Ist meine Funktion nun in Ordnung?

    Nö, geht überhaupt nicht. Wie kommst du denn darauf, dass das geht??

    Hier stimmt etwas noch nicht:

    joe1234 schrieb:

    void f1(int *vektor,int *size,int *maxWert,int *index) {
    

    Siehst du es? size sollte kein Pointer sein! Hatten wir auch schon gesagt. Also weg mit dem Sternchen. Dann sollte es passen. Wie rufst du die Funktion nun auf? Zeig den Code doch bitte mal.



  • Wenn die Werte falsch initialisert werden kann alles mögliche berechnet werden.
    Das Zitat dazu wäre:

    garbage in > garbage out

    Solch Unaufmerksamkeiten sind mit der Grund für so viele Sicherheitsupdates.

    Oder drastischer

    Eine beschi.... Annahme ist der Beginn einer jeden Katastrophe.

    😃



  • Danke nochmals für eure Hilfe! Das hat mich, als Neuling, aufjedenfall weitergebracht, vor allem die Sache mit den Pointern!

    Den gesamten Code würde ich hier lieber nicht posten, der ist sehr lang.
    Es geht eigentlich darum, dass ich mit dem XPLAIN-Board von Atmel erst eine Messung durchführe und dann eine Berechnung.
    Das tut aber hier nichts zur Sache, den die Überschrift lautet ja ganz anders.
    Wer dennoch den kompletten Code haben will, einfach schreiben. Ich stelle diesen gerne auf rapidshare.com, oder so, zur Verfügung.

    DANKE SCHÖN AN ALLE!

    Gruß Joe


Anmelden zum Antworten