Pointer



  • Alles funktioniert nur bei der Funktion f bekomme ich eine Kompilerfehlermeldung.

    Fehler E2093 w.cpp 9: 'operator*' ist im Typ 'vector<int,allocator<int> >' f³r A
    rgumente desselben Typs nicht implementiert in Funktion f(vector<int,allocator<i
    nt> > 😉

    Aber ich kann mit der Meldung nichts Anfangen ...

    #include <iostream>
    #include <fstream>
    #include <vector>
    using namespace std;
    
    void f ( vector<int> * dat )
    {
    	cout<<"vector: " << *dat[0] << endl;
    }
    
    void ar ( int *var[] )
    {
    	cout<<"ar: " << *var[0]<<endl;
    }
    
    void T ( int **p ) 
    {
    
    	cout<<"**p: " << **p<<endl;
    }
    
    int main(int argc, char*argv[])
    {
    
    cout<<"argv[0]: " <<argv[0]<<endl;
    
    vector<int>dd;
    dd.push_back(8);
    f ( &dd  );
    
    int e = 20;
    int *q = &e;
    
    T ( &q );
    ar(&q);
    
    return 0;
    }
    


  • _ptr** schrieb:

    Aber ich kann mit der Meldung nichts Anfangen ...

    *dat[0] heißt *(dat[0]). Jetzt besser?



  • Nein ... ich kriegs noch immer nicht hin. -.-



  • Du stolperst darüber, dass es zwei Reihenfolgen der Auswertung gibt, aber nicht diejenige, die Du denkst genommen wird (Operator-Precedence)

    void f ( vector<int> * dat )
    {
      cout<<"vector: " << *dat[0] << endl;  // zwei Operatoren: operator* und operator[], welcher wird zuerst ausgewertet?
      // a) [] vor *, also *(dat[0]):
      //    dat[0] ist vector<int>, was ist dann *(dat[0])?
      // b) * vor [], also (*dat)[0]:
      //    *dat ist auch vector<int>, was ist dann (*dat)[0]?
    }
    

    Du musst explizit klammern.



  • Möchtest du explizit die Anwendung von Pointern testen? Oder gibt es einen anderen guten Grund, dass du den vector nicht als Referenz übergibst?



  • Precedence schrieb:

    // was ist dann *(dat[0])?
    // (dat[0]) ist vector<int> ??
    // b) * vor [], also (dat)[0]:
    // *dat ist auch vector<int>, was ist dann (*dat)[0]? vector<int>
    ??

    So gehts jetzt jedenfalls -> (*dat)[0]

    @daddy_felix
    Ich bin nur etwas am Üben was Pointer angeht.



  • _ptr** schrieb:

    Precedence schrieb:

    // was ist dann *(dat[0])?
    // (dat[0]) ist vector<int> ??
    // b) * vor [], also (dat)[0]:
    // *dat ist auch vector<int>, was ist dann (*dat)[0]? vector<int>
    ??

    1. ist das Ergebnis von vector<int>::operator*(vector<int>)
      (nicht implementiert) -> Der Compilerfehler vom Anfang. d.h. so hat es Dein Compiler ohne Klammerung aufgefasst.
    2. ist das Ergebnis von vector<int>::operator[](vector<int>::size_type) Aha! ein int&...

    Durch die ganzen Typen ist das jetzt ein wenig unverständlich.
    Schau Dir eine Auflistung der Operator-Präzedenz in C++ an. Überzeug Dich, dass [] eher ausgewertet wird als * . Dann wird Dir auch klar, warum Du so klammern musst (*dat)[0].

    hth


Anmelden zum Antworten