Vektor Max und Adresseangabe



  • Hallo,

    ich bin ein Neuling was C angeht und habe mal eine Frage:

    Ich habe einen Vektor x[1 2 5 3]. Nun würde ich gerne wissen, wie man in C die maximale Stelle, in diesem Fall die 5, und den Platz der 5, in diesem Fall an 3ter Stelle, ausgibt? Gibt es da schon was fertige Funktionen wie in MatLab???
    Ergebnis sollte also lauten: [Wert,Stelle] (oder auch als einzelne Variablen)
    Wäre nett, wenn mir hier einer helfen könnte. Bin echt am verzweifeln!! 😞

    Gruß Joe



  • ehm... so wie du das jetzt gepostet hast, hast du den index des vektors x auf 1253...

    generell:

    int feld[MAX]; // eindimensional
    int feld_[MAX][MAX]; // zweidimensional
    int _feld[MAX][MAX][MAX]; // dreidimensional
    

    und was brauchst du jetzt genau? was für ein feld hast du? willst du den gößten wert herausfinden? einfach sortieren...
    und durchs sortieren erhältst du auch den index dafür...



  • Du hast zu wenige Informationen geliefert, aber egal. Ich nehme jetzt mal an, dass dein Vektor ein Array vom Typ int ist und die Elemente 1,2,5 und 3 beinhaltet. Dann ginge es z.B. so (kannst du natürlich in eine schicke Funktion packen):

    int main() {
    	int vektor[]={1,2,5,3};
    	int maxWert=0;
    	int index=0;
    	for(int i=0;i<sizeof(vektor)/sizeof(vektor[0]);++i) {  //die sizeof-Geschichte ist nur zum Bestimmen der Anzahl der Elemente des Arrays. Wenn du die anderweitig gespeichert hast, setze deinen Wert einfach stattdessen hier ein.
    		if(vektor[i]>maxWert) {
    			maxWert=vektor[i];
    			index=i;
    		}
    	}
    	printf("Höchster Wert: %d an Stelle %d (nullbasiert).",maxWert,index);
    }
    

    EDIT: Wenn du immer noch Schwierigkeiten hast, kannst du ja mal ein wenig Code posten. Dann könnte man genauer darauf eingehen.



  • [cpp]int vector[] = {1,2,5,3};
    
    int stelle = 0, wert = 0;
    for(int i = 0; i < sizeof(arr)/sizeof(int); ++i)
    {
      if(vector[i] > wert)
      {
        wert = vector[i];
        stelle = i;
       }
    }
    printf ("Groesster Wert: %i an Stelle: %i \n", &wert, &stelle);
    

    [/cpp]



  • Meinst du Vektor mathematisch oder in C
    (Die Arrays heisse in C Vektoren.)

    Wie ist denn den x definiert?



  • Ich danke euch für die vielen Antworten! 🙂
    Wie ich das sehen, muss ich eine For-Schleife laufen lassen. -> Ich dachte einfach, dass es schon eine fertige Funktion gibt.
    Die Antworten von Array und Matze sind schon das, was ich wollte. 🙂 👍

    Die Bedinung der for-Schleife verstehe ich nicht ganz (den mittleren Teil). Wieso macht ihr beide hier eine Division?

    Kann ich die Funktion so schreiben?

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

    Gruß Joe



  • sizeof(array)/sizeof(array[0]) berechnet die Länge des Arrays zum Zeitpunkt des Erstellen der Exe. mit sizeof(array) bekommst du die Länge * Größe Datentyp, weshalb dieser wieder durch die Größe des Datentyps mit array[0] geteilt wird.



  • joe1234 schrieb:

    Kann ich die Funktion so schreiben?

    Wieso hat denn maxWert einen anderen Typ (double) als die Elemente deines Arrays (int)? Der sollte schon übereinstimmen.

    EDIT: Ach ja, das Bestimmen der Elemente per sizeof wird in der Funktion nicht mehr klappen. Du hast dann nur einen Zeiger auf dein Array, und sizeof wird immer die Größe des Zeigers liefern, bei int wahrscheinlich 4. In solchen Fällen musst du die Länge des Arrays mit an die Funktion übergeben.



  • Du hast

    void f1(int *vektor[],double *maxWert,int *index) {
    

    Bei vektor brauchst du entweder int vektor[] oder *int vektor

    int *vektor[] ist ein Feld von Pointern auf int.



  • Ok, fassen wir mal alle Kritikpunkte zusammen und schauen uns an, wie der Funktionskopf aussehen könnte:

    void f1(int vektor[],int size,int *maxWert,int *index) {  //size ist die Anzahl der Elemente des Arrays, die du übergeben musst
    

    Einen sinnvollen, sprechenden Funktionsnamen solltest du auch noch vergeben. f1 ist nicht so toll. Nun schau mal, ob du die Funktion ans Laufen kriegst. 🙂



  • Der maximale Wert sollte nicht mit 0 initialisiert werden. Zumindest nicht bei einer Funktion für vorzeichenbehaftete Integer. Es bietet sich an, den maximalen Wert mit dem ersten Element des Vektors zu initialisieren. Bei Fließkommazahlen sollte man sich Gedanken machen wie man NaN behandelt.



  • 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.

    😃


Anmelden zum Antworten