c++ und dyn. Arrays



  • Hallo

    ich schreibe gerade ein programm in c++ zum testen. Da ich mich in c++ einarbeiten möchte, mal weg von den anderen sprachen.

    da lese ich eine datei aus. in der date stehen werte die in ein array sollen. am anfang der datei, also der erste wert sagt aus wieviele werte es in der datei gibt.

    mein problem ist nun das ich wenn ich den ersten wert (anzahl andere werte) auslese und mit hilfe des wertes ein array (z.B. int ary[ausgelsener_wert]) erstellen möchte, funktioniert das nicht, da der compiler einen konstanten wert haben möchte. (E2313 Konstantenausdruck erforderlich)

    wie mache ich das dann? gibt es in c++ wie in allen anderen sprachen auch eine möglichkeit einfach an ein array ein wert anzuhängen (a la "Push")?

    hier mal meine funktion die die datei ausliest:

    bool datei(){
       ifstream infile;
       infile.open("daten.dat");
    
       int a=0;
    
       if (!infile){
           return false;
       }else{
          infile >> a;
    
          int daten[a][3];
    
          for(int i=0;i<a;i++){
             infile >> daten[i][0];
             infile >> daten[i][1];
             infile >> daten[i][2];
          }
    
       }
       return true;
    }
    


  • Hallo

    ja das gibt es, und zwar mit dem Typ std::vector.

    bis bald
    akari



  • Nein, in C++ geht das so nicht (C99 hat VLA's, die so ähnlich funktionieren sollen), aber dafür hast du in C++ Containerklassen, die mitwachsen können.

    (wirf mal einen Blick ins Magazin für eine ausführlichere Beschreibung)



  • Entweder nimmst du die Containerklassen, die CStoll und akari beschrieben haben. Oder du legst das Feld halt dynamisch zur Laufzeit fest (Ich denke, so wolltest du es ursprünglich machen):

    m1cha schrieb:

    bool datei(){
       ifstream infile;
       infile.open("daten.dat");
    
       int a=0;
    
       if (!infile){
           return false;
       }else{
          infile >> a;
    
          // dynamisches Anlegen eines Arrays
          int **daten = new int(a);
          for(int i=0; i<a; i++)
          {
              *daten[i] = new int(3);
          }
    
          for(int i=0;i<a;i++){
             infile >> daten[i][0];
             infile >> daten[i][1];
             infile >> daten[i][2];
          }
    
       }
       return true;
    }
    


  • Danke für die schnelle antwort. auf welches magazin?

    könnte ihr mir nicht mal auf die schnelle etwas kleines schreiben, was in meinen fall funktioniert.

    ich lerne am besten aus aus dem Quellcode und dem probieren (Autodidakt).

    gruss m1cha



  • danke DarthZiu

    genau das habe ich gesucht.

    gruss m1cha



  • m1cha schrieb:

    Danke für die schnelle antwort. auf welches magazin?

    Ziemlich weit unten im Forum gibt es das Magazin (ist sicher noch mehr dort, was für dich interessant sein könnte)

    @DarthZiu: Wenn schon, dann solltest du es richtig schreiben:

    int** daten = new int*[a]
    for(int i=0;i<a;++i)
      daten[i] = new int[3];
    
    ...
    
    //ganz am Ende
    for(int i=0;i<a;++i)
      delete[] daten[i];
    delete[] daten;
    

    (aber die STL-Container sind imho einfacher zu handhaben)



  • CStoll schrieb:

    //ganz am Ende
    for(int i=0;i<a;++i)
      delete[] daten[i];
    delete[] daten;
    

    Uiuiui, ich vergess es immer wieder. Danke für den Hinweis 👍


Anmelden zum Antworten