ISO C++ forbids assignment of arrays ???



  • Tach

    Wir müssen nun zum Semesterabschluss in Informatik als Maschinenbauer ein Programm schreiben (bis diesen Freitag...wenn also einer eine Dose mitleid hat...) mit dem man eine Bundesligaliste aus einer Datei auslesen, sortiert angucken, editieren (Spiel eingeben) und wieder in eine Datei abspeichern kann. Wir ihr euch sicher denken könnte, klappt der Scheiß aber bei mir nicht, und zwar kommt obengenannter Fehler in folgendem Quelltextschnipsel vor, in den Zeilen nach dem "if":

    struct vereinsliste
    {
           char name[18][256],punkte[18][256],tore[18][256],mtore[18][256];
           int zpunkte[18], ztore[18], zmtore[18];
    };
    
    struct zeile
    {
           char aname[256],apunkte[256],atore[256],amtore[256];
           int azpunkte, aztore, azmtore;
    };
    
    bool operator < (const zeile &v1 , const zeile &v2)
    {
         int c,diff1, diff2;
         if (v2.azpunkte>v1.azpunkte) return false;
         diff1=(v1.aztore-v1.azmtore);
         diff2=(v2.aztore-v2.azmtore);
         if (diff2>diff1) return false;
         if (v2.atore>v2.atore) return false;
         if ( c = strcmp(v1.aname,v2.aname)) return (c<0)?true:false;
    }
    
    void sortieren(vereinsliste &vliste)
    {
         int i=0,k=0;
         zeile puffer;
         while (i<18)
         {
               k=i+1;
               while (k<18)
               {
    
                     if ((vliste[i])<(vliste2[i]))
                     {
    
                         puffer=vliste[i];
                         vliste[i]=vliste[k];
                         vliste[k]=puffer;
    
                          }
                     k++;
               }
               i++;
         }
    }
    

    Jetzt versteh ich nich, warum man keine Arrays kopieren kann. In einem früheren Programm mussten wir matritzenmultiplikationen programmieren, und da konnte man auch Float-Arrays einer Variable in eine andere Variable gleichen Typs kopieren. nun dachte ich, dass es vielleicht daran liegt, dass "puffer" vom Typ struct zeile ist und vliste vom Typ struct Vereinsliste und habe mal gleiche Typen draus gemacht und folgendes geschrieben: puffer[1]=vliste[1];
    das ging auch nicht.
    Liegt das nun daran, dass ich Zeiger und Speicheradressen und so von den char-arrays durcheinandermehre?



  • Hab wohl das gleiche Problem: Wie initiert (definiert?) man eine statische Variable?

    Habs an vielen Stellen auf viele Weisen versucht, aber zuletzt kriege ich vom Linker viele Fehlermeldungen von den Programmstellen, die Bezug auf ein statische Variable nehmen: "undefinied reference to <variable>".

    class Bsp {
      static int count;
    public:
      static void initClass() {count=0;}
             void doSomething() {..; count++;} 
    };
    
    int main (int argc, char** argv) { 
      Bsp::initClass();
      Bsp A;
      A.doSomething();
    }
    

    Vielen Dank für Hilfe im vorraus!



  • @Bratwurst: Arrays können nicht so einfach per = einander zugewiesen werden (structs, die ein Array enthalten, interessanterweise schon). Da mußt du vermutlich jedes Element einzeln einander zuweisen (alternativ geht auch memcpy() oder std::copy()). Oder du überdenkst nochmal dein Design - in deinem Beispiel könntest du die vielen einzelnen Arrays in der vereinsliste-Klasse zusammenfassen zu einem einzigen zeile daten[18]; .

    @gorgoyle: Eine statische Klassenvariable muß noch gesondert definiert werden (die Nennung in der Klassendefinition gilt nur als Deklaration):

    class Bsp
    {
      static int count;
    public:
      ...
    };
    
    int Bsp::count;//Hier ist die Definition - optional kannst du die Variable hier auch initialisieren
    


  • Nein, du ahst ein ganz anderes Problem, aber gehen wir mal der Reihe nach vor.

    Rostbratwurst: Was du dort versuchst ist sowieso ziemlicher Blödsinn, gelinde gesagt.
    Du versuchst eine Struktur als Array zu reinterpretieren. Was du machen kannst ist folgendes:

    struct zeile
    {
           char aname[256],apunkte[256],atore[256],amtore[256];
           int azpunkte, aztore, azmtore;
    };
    
    bool operator < (const zeile &v1 , const zeile &v2)
    {
         int c,diff1, diff2;
         if (v2.azpunkte>v1.azpunkte) return false;
         diff1=(v1.aztore-v1.azmtore);
         diff2=(v2.aztore-v2.azmtore);
         if (diff2>diff1) return false;
         if (v2.atore>v2.atore) return false;
         if ( c = strcmp(v1.aname,v2.aname)) return (c<0)?true:false;
    }
    
    void sortieren(zeile *vliste)
    {
      int i=0,k=0;
      zeile* puffer;
      while (i<18)
      {
        k=i+1;
        while (k<18)
        {
          if ((*vliste[i])<(*vliste2[i])) //was du hiermit bezweckst musst du allerdings selber hinbiegen :p
          {
            puffer = vliste[i];
            vliste[i] = vliste[k];
            vliste[k] = puffer;
    
          }
          k++;
        }
        i++;
      }
    }
    
    int main()
    {
      zeile* vereine;
      vereine = new zeile[18];
      sortieren(vereine);
    }
    

    Ich hab ehrlich gesagt keine Ahnung, woher das vliste2 kommen soll :o

    gorgoyle:
    Statische Variablen werden zur Compilezeit außerhalb der Klassendeklaration definiert. Sprich:

    class Foo
    {
      static int bar;
    };
    
    int Foo::bar = 0;
    


  • Wenn ich die Variable unterhalb der Klasse definiere weint mir der Compiler etwas von "multiple definitions" vor, wenn ich es unterlasse, daß sie garnicht definiert wurde .. hüh oder hott?

    Ich hab vll. ein unterschiedliches Verständnis von den Begriffen:
    Declaration: Erklären: <name> ist eine Variable vom Type type
    Definition: Zuweisen: a=b;
    Initialization: Erstmalige Definition eines Anfangszustandes a=0;
    Liege ich da richtig?

    Die problematischen statischen Variablen sind allesamt Primitive, also bool, int und char*.

    /*edit*/ Ich mußte die Declaration im cpp-File untebringen, weil sonst .. multiple Declarose



  • Declaration: Erklären dass es eine Variable/Funktion/Klasse/Methode gibt.
    Definition: Erstellen der Variable/Funktion/Methode.
    Initialization: Zuweisung eines Wertes bei Definition.
    Assignment: Zuweisung eines Wertes nach Definition/Initialization.

    /*edit*/ Ich mußte die Declaration im cpp-File untebringen, weil sonst .. multiple Declarose

    Korrekt. Denn eine Definition darf nur einmal im gesamten Programm vorkommen. Eine Deklaration muss hingegen in jeder Übersetzungseinheit (grob: cpp-File, meist über include eines h-File) wo die Variable/... benutzt wird vorkommen. Mit der Deklaration (in der Klasse) sagst Du dem Compiler "es gibt sie", mit der Definition sagst Du gewissermassen "und in dieser Übersetzungseinheit ist der Speicher dafür".

    BTW: Thread kapern und Thema wechseln ist nicht nett 😉



  • Sorry MyLord! Ich dachte mein Problem wäre "Thread"-Konform und wollte keinen weiteren aufmachen 🙂



  • Jo Leude vielen Dank für eure Hilfe!!!

    @viande: das vliste2 is auch ein Fehler von mir, das war dann die Dummheit, die mich um Mitternacht übermannte. Das soll natürlich auch vliste1 heißen. Das mit dem vliste1[i]<vliste1[k] ham wir so ähnlich in der Vorlesung gehabt, und laut unserm Dr. Professor soll das auch funzen, habs auch in den Programmen der Komilitonen gesehn.

    Wenn ich das jetz richtig verstanden hab, könnte ich eine komplette variable struct mit vielen Arrays in eine andere variable vom selben Typ kopieren, aber die einzelnen Arrays nich? Hm. Ich glaub ich hab aber eine Idee, wie ich es vielleicht auch anders machen könnte. Hoffentlich klappt das bis morgen. Wenn nicht...inzwischen hab ich eh genug Punkte zusammen um zu bestehen, aber das sollte ja eigentlich nicht das Ziel sein. Und mein Stil is sowas überhaupt nicht.

    Nochmals danke an euch. Ich probier das vom viande gleich mal aus!

    update: Ich habs so 1:1 vom Viande übernommen und nu meckert der bei der if-Bedingung wieder rum (no match for 'operator*' in '**((+(((unsigned int)i) * 1036u)) + vliste)' .
    Ich will einfach die beiden zeilen (vliste1[i] und vliste1[k] ) übergeben, und der soll dann je nach kriterium da true oder false zurückgeben. Vielleicht geht das ja, wenn ich die einzelnen elemente immer vergleiche. Wird sicher einfacher sein. Hoff ich mal.


Anmelden zum Antworten