Problem !!!



  • Hallo,
    ich sitze hier gerade vor diesem Code und komme nicht weiter :

    #include <iostream>
    using namespace std;
    
    struct test {
      int ar[10];
    } test2, test1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    int a;
    int i = 0;
    int b;
    
    void test( struct test& p );
    
    int main(void){
      test( test1 );
    
    }
    
    void test( struct test& p){
    for(a=0; a<10; a=a+1){
      p.ar[i]=test2.ar[i];
      i=i+1;
    }
    i=0;
    for(b=0; b<10; b=b+1){
      cout << p.ar[i] << '\n';
      i=i+1;
    }
    }
    

    GCC spukt folgendes aus :

    new.cpp:6:48: warning: missing braces around initializer for ‘int [10]’
    /tmp/cctoNmQW.o: In function test(test&)': new.cpp:(.text+0xa3): undefined reference tostd::cout'
    new.cpp:(.text+0xa8): undefined reference to std::basic\_ostream<char, std::char\_traits<char> >::operator<<(int)' new.cpp:(.text+0xb5): undefined reference tostd::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char)'
    /tmp/cctoNmQW.o: In function \_\_static\_initialization\_and\_destruction_0(int, int)': new.cpp:(.text+0x10c): undefined reference tostd::ios_base::Init::Init()'
    new.cpp:(.text+0x111): undefined reference to `std::ios_base::Init::~Init()'
    collect2: ld returned 1 exit status

    Kann mir vielleicht jemand helfen? 😕


  • Mod

    Kann's sein, dass du den "gcc" und nicht dessen C++-Frontend "g++" benutzt hast? gcc erkennt zwar an der Dateiendung die Sprache und kann's daher compilieren, aber im anschließenden Linkvorgang wird die C++-Standardbibliothek nicht dazu gelinkt. Das kann man zwar auch von Hand machen, aber einfacher ist es, von vornherein g++ zu benutzen.



  • So ein sch*** Fehler ...
    Ja jetzt klappt es.
    Danke 😃 😃



  • Ein paar Kleinigkeiten:
    - Halte deine Variablen möglichst lokal. Das ist in deinem Code nicht gegeben. Es gibt keinen Grund die Variablen a, b, und i global zu halten.
    - In der ersten for-Schleife ist das i überflüssig. Dafür kannst du genauso a nehmen.
    - Üblicherweise schreibt man in C**++** nicht a = a + 1; sondern a++;
    - Dem Array des p-Konstruktes weist du Werte von test2 zu, die es nicht gibt.



  • [Rewind] schrieb:

    - Üblicherweise schreibt man in C**++** nicht a = a + 1; sondern a++;

    Wenn schon dann ++a.
    a++ ist nur was für Anfänger.



  • Ja, beim erhöhen des Werts um 1 - sonst sollte sich der "nächste" mal mit += vertraut machen.
    🕶



  • pedant_for_fun schrieb:

    [Rewind] schrieb:

    - Üblicherweise schreibt man in C**++** nicht a = a + 1; sondern a++;

    Wenn schon dann ++a.
    a++ ist nur was für Anfänger.

    Ach ja ?



  • *HUST* bitte nicht von Thema ablenken *HUST*

    duck und weg



  • pedant_for_fun schrieb:

    Wenn schon dann ++a.
    a++ ist nur was für Anfänger.

    Eher genau umgekehrt: deine starre Sichtweise ist nur was für Anfänger.



  • Oder wohl eher die eines Anfängers.



  • hustbaer schrieb:

    pedant_for_fun schrieb:

    Wenn schon dann ++a.
    a++ ist nur was für Anfänger.

    Eher genau umgekehrt: deine starre Sichtweise ist nur was für Anfänger.

    Dont feed the troll.



  • pedant_for_fun hat aber schon Recht. Auch wenn es bei int keine Rolle spielen mag, würde ich mir die Präfix-Version angewöhnen, es sei denn man braucht die Semantik der Postfix-Version.

    Und Hacker, kannst du mit dem Spam aufhören?



  • Nexus schrieb:

    pedant_for_fun hat aber schon Recht. Auch wenn es bei int keine Rolle spielen mag, würde ich mir die Präfix-Version angewöhnen, es sei denn man braucht die Semantik der Postfix-Version.

    Und Hacker, kannst du mit dem Spam aufhören?

    Ah, ja. Sry. 😕



  • Nexus schrieb:

    pedant_for_fun hat aber schon Recht. Auch wenn es bei int keine Rolle spielen mag, würde ich mir die Präfix-Version angewöhnen, es sei denn man braucht die Semantik der Postfix-Version.

    Und Hacker, kannst du mit dem Spam aufhören?

    Wieso denn ? Einschübe und andere, gewichtige Stil-Sachen sind verständlich, aber ob ++i oder i++ ... das juckt doch niemanden. Situationsabhängig benutzen und ansonsten nach Vorlieben, würde ich sagen.



  • Ich empfehle, generell ++i zu bevorzugen.



  • Wieso denn ? 😕

    foo();
    i++;
    foo();

    foo();
    ++i;
    foo();

    Soll der operator am zeilenanfang nun schöner sein, oder wie ?



  • cvcv schrieb:

    Wieso denn ? 😕

    foo();
    i++;
    foo();

    foo();
    ++i;
    foo();

    Soll der operator am zeilenanfang nun schöner sein, oder wie ?

    Hier kenne ich den Typ von i nicht udn muß annehmen, daß ++i performanter als i++ ist, weil ++i nur eine Referenz auf das erhöhte Objekt zurückgeben muß, während i++ eine Kopie des alten Wertes herauskopieren muß und sich zwischendurch merken muß.

    Weil ich nicht nachdenken will, ob i gerade ein einegbauter Typ ist oder eine Langzahlklasse oder ein stl-Iterator oder ein anderer (nicht billig zu kopierender) Iterator, schreibe ich einfach immer ++i. Außer, ich will echt den Rückgabewert von i++ benutzen, um eine lokale Variable zu sparen.



  • Auch wenn mein Vorschlag die mit dem Postfix verbundene Problematik der Zwischenschritte und des temporären Objekts nicht explizit berücksichtigt, beschränkt er sich nicht auf den Postfix, sondern verweist generell auf die Schreibweise.



  • Ja gut, wie du selber schon andeutest ist das bei eingebauten typen wayne, kein Geschwindigkeitsverlust.
    Bei eigenen typen ist das was anderes.



  • cvcv schrieb:

    Ja gut, wie du selber schon andeutest ist das bei eingebauten typen wayne, kein Geschwindigkeitsverlust.
    Bei eigenen typen ist das was anderes.

    Du kannst auch konsistent sein und immer ++i verwenden, wenn es dir nur auf den Seiteneffekt ankommt. So musst du keine Fälle unterscheiden und bist auf der sicheren Seite.


Anmelden zum Antworten