Zeiger auf Maximum



  • @Dai
    Dein ursprünglicher Code war ja schon fast korrekt, bis auf die fehlende Indirektion.

    float* max(float* array[], size_t n)
    {
        assert(n != 0); // <cassert>
        float* tmp = array[0];
        for (size_t i = 1; i < n; ++i)
        {
            if (*array[i] > *tmp) // wichtig: kein Adress-Operator sondern eine Indirektion
                tmp = array[i];
        }
        return tmp;
    }
    


  • groovemaster schrieb:

    @Dai
    Dein ursprünglicher Code war ja schon fast korrekt, bis auf die fehlende Indirektion.

    float* max(float* array[], size_t n)
    {
        assert(n != 0); // <cassert>
        float* tmp = array[0];
        for (size_t i = 1; i < n; ++i)
        {
            if (*array[i] > *tmp) // wichtig: kein Adress-Operator sondern eine Indirektion
                tmp = array[i];
        }
        return tmp;
    }
    

    Das musste ja passieren 🙂 Nun danke ich Euch erstmal für eure Mühe, aber ich versteh immer weniger *g* was ist denn nun das hier ?

    assert(n != 0); // <cassert>
    

    Und für was steht denn nun das n wegen dem ich unsicher wurde...



  • Das n steht für die Anzahl der Elemente deines Arrays. Und die "assert"-Anweisung dient der Überprüfung, dass dein Array nicht aus 0 Elementen besteht.



  • Spitze ! genau das habe ich gebraucht (blödes n *g* ) vielen vielen Dank euch allen



  • Ich hab hier doch nochmal ein paar Fragen. Der Operator in der for-Schleife stimmt der so ++i oder gehört der doch i++. Denn mit ++i wird der Ausdruck doch vor der Verwendung inkrementiert oder ist das in dem Fall egal. Dann der Variablentyp size_t welcher ja das Ergebnis von einer sizeof Anweisung ist könnte man in dem Fall doch auch int i machen ? Zum Schluß überleg ich mir gerade ob die Funktion float* max überhaupt ein Zeiger sein muss ob da nicht auch float max(...) reichen würde. Falls nein wieso muss die Funktion auch ein Zeiger sein ?

    float* max(float* array[], size_t n) 
    { 
        assert(n != 0); // <cassert> 
        float* tmp = array[0]; 
        for (size_t i = 1; i < n; ++i) 
        { 
            if (*array[i] > *tmp) // wichtig: kein Adress-Operator sondern eine Indirektion 
                tmp = array[i]; 
        } 
        return tmp; 
    }
    


  • Dai schrieb:

    Der Operator in der for-Schleife stimmt der so ++i oder gehört der doch i++. Denn mit ++i wird der Ausdruck doch vor der Verwendung inkrementiert oder ist das in dem Fall egal.

    In dem Fall ist es egal, da du den Wert des Ausdrucks nicht verwendest. Aber ++i ist häufig (zumindest bei eigenen Typen) schneller als i++.

    Dann der Variablentyp size_t welcher ja das Ergebnis von einer sizeof Anweisung ist könnte man in dem Fall doch auch int i machen ?

    size_t ist ein vorzeichenloser Ganzzahltyp - ob der wirklich gefahrlos in int umgewandelt werden kann, hängt vom Compiler ab (wenn, dann eher in unsigned int)

    Zum Schluß überleg ich mir gerade ob die Funktion float* max überhaupt ein Zeiger sein muss ob da nicht auch float max(...) reichen würde. Falls nein wieso muss die Funktion auch ein Zeiger sein ?

    Wenn dich nur der Wert deines Maximums interessiert, reicht ein float. Wenn dir auch wichtig ist, wo im Array dieses Maximum steht, benötigst du den Zeiger.



  • Ich hab mir das nochmal angeschaut, bin mir nun aber immer noch nicht sicher welche der Lösungen nun richtig ist: Kann mir da bitte jemand helfen

    if( array[ i ] > *tmp )
             tmp = &array[ i ];
    

    oder

    if (*array[i] > *tmp) // wichtig: kein Adress-Operator sondern eine Indirektion
                tmp = array[i];
    


  • Die erste Variante dürfte richtig sein (denk nochmal nach, was du tun willst, und vergleiche das mit deinen Ansätzen):

    tmp = &array[ i ];
    

    tmp bekommt die Adresse des i'ten Elements

    tmp = array[i];
    

    tmp bekommt den Inhalt des i'ten Elements



  • Also laut Vorgabe ...die einen Zeiger auf das Maximum der darin enthaltenen Werte zurückgibt.



  • Die if-Abfragen die sind ja auch beide unterschiedlich. Da stimmt dann wohl auch die 1. oder ?

    if( array[ i ] > *tmp )
    


  • Dai schrieb:

    Ich hab mir das nochmal angeschaut, bin mir nun aber immer noch nicht sicher welche der Lösungen nun richtig ist:

    Beides ist für den jeweiligen Code korrekt, aber nur Version 2 für die Aufgabenstellung.

    Schreiben Sie eine Funktion max, der ein Array von n Zeigern auf float-Variablen übergeben wird

    float* max(float array[], size_t n)
    {
        assert(n != 0); // <cassert>
        float* tmp = &array[0];
        for (size_t i = 1; i < n; ++i)
        {
            if (array[i] > *tmp) // wichtig: kein Adress-Operator sondern eine Indirektion
                tmp = &array[i];
        }
        return tmp;
    }
    

    Dies wäre eine typische Implementierung, das Problem ist nur, sie passt nicht zur Aufgabenstellung. Deshalb ist folgende Lösung korrekt.

    float* max(float* array[], size_t n)
    {
        assert(n != 0); // <cassert>
        float* tmp = array[0];
        for (size_t i = 1; i < n; ++i)
        {
            if (*array[i] > *tmp) // wichtig: kein Adress-Operator sondern eine Indirektion
                tmp = array[i];
        }
        return tmp;
    }
    

Anmelden zum Antworten