1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Array Grösse Mit Integer Variable definieren

Dieses Thema im Forum "OS X-Developer" wurde erstellt von helix, 13.06.06.

  1. helix

    helix Gast

    Hi Leute
    Wie Kann man ein Array mit einer Grösse aus einer Integer Variable definieren?
    Ich habe das so Versucht:
    Code:
    int size;
    std::cin>>size;
    int array[size];
    
    Das geht aber nicht, der computer sagt: "constant expression required" (oder so ähnlich;) )
    Weiss jemand Hilfe?
    EDIT: Programmiersprache ist c++

    MfG
    helix
     
  2. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    Ein C-Array muss eine feste, zum Compilierzeitpunkt bekannte Größe haben. Da müsstest Du auf Pointer umsteigen und den Speicherbereich zur Laufzeit anfordern. Oder (da Du eh schon mit C++ arbeitest) Du verwendest die Containerklassen aus der STL:
    Code:
    #include <vector>
    ...
    std::vector<int>::size_type size;
    std::cin >> size;
    std::vector<int> v(size);
    Zugriff auf Elemente syntaktisch wie bei C-Arrays.
     
    #2 quarx, 13.06.06
    Zuletzt bearbeitet: 14.06.06
  3. Gubbie

    Gubbie Damasonrenette

    Dabei seit:
    02.01.05
    Beiträge:
    485
    ich habe keine Ahnung von C, aber wie wärs, wenn du das Array einfach gross genug dimensionierst und nur die benötigten Felder nutzt?
     
  4. helix

    helix Gast

    Jo, das hat auch der Informatiklehrer gesagt, als ich ihm die Frage gestellt habe. Ist aber nicht besonders elegant oder? ;). Ich muss ihm die Sache mit vector mal unter die Nase reiben... ;).

    MfG
    helix
     
  5. Gubbie

    Gubbie Damasonrenette

    Dabei seit:
    02.01.05
    Beiträge:
    485
    ja, habe ich mir schon gedacht, dass dir das nicht gefällt. Das ist auch wirklich unsauber. Aber ich habe wie gesagt nix mit C zu tun ( zum glück :p ),
     
  6. helix

    helix Gast

    wieso denn zum glück?
     
  7. MatzeLoCal

    MatzeLoCal Rheinischer Bohnapfel

    Dabei seit:
    05.01.04
    Beiträge:
    2.421
    Wie wäres es mit einer Liste? Ok, du kannst nicht unbedingt wahlfrei zugreifen, aber vll brauchst du das garnicht.

    Das mit einem "sehr grossen, fix definierten Array" würde ich sein lassen.
    1. verschwendest Du Resourcen
    2. ist das ein potentieller Fehlerherd zur Laufzeit. Wer garantiert Dir, dass die Arraygrösse NIE erreicht wird?
     
  8. helix

    helix Gast

    Also eigentlich ist das Problem mit den vectoren super gelöst! :-D. Und die Sache mit dem "sehr grossen, fix definierten Array" stammt von meinem Lehrer... :p
    MfG
    helix
     
  9. MatzeLoCal

    MatzeLoCal Rheinischer Bohnapfel

    Dabei seit:
    05.01.04
    Beiträge:
    2.421
    Oh sorry, hab ich überlesen

    Dann richte ihm doch mal aus, dass er bitte NIE von ihm geschriebene Software verteilen soll...... boha.. Lehrer ey...:mad:
     
  10. helix

    helix Gast

    Soweit kommst (hoffentlich) nicht :p. Und: der Informatikunterricht ist sowieso nicht für viel; alles auf Windows ausgelegt o_O.

    MfG
    helix
     
  11. Trapper

    Trapper Boskop

    Dabei seit:
    12.05.05
    Beiträge:
    213
    Für Felder, deren Größe erst zur Laufzeit bekannt ist existiert in C++ der new-Operator. Der relevante Codeausschnitt für dein Beispiel sieht so aus:
    Code:
    int size;
    int* myArray;
    
    std::cin >> size;
    myArray = new int[size];
    
     
  12. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    ... nicht zu vergessen ein
    Code:
    delete [] myArray;
    zum Schluß... ;)
     
    #12 quarx, 13.06.06
    Zuletzt bearbeitet: 16.06.06
    Trapper gefällt das.
  13. Trapper

    Trapper Boskop

    Dabei seit:
    12.05.05
    Beiträge:
    213
    @quarx: Da hast du vollkommen recht, das sollte unbedingt noch erwähnt werden! Danke für den Hinweis. Ich hab wohl schon zu lange Java programmiert :)
     
  14. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Das Beispiel ist leider auch falsch. malloc & Co. und der new Operator erwarten ein Argument von Typ size_t. size_t ist auf einem UNIX niemals von Typ int, es ist entweder unsigned int (ILP32, 32Bit UNIX Umgebung) oder unsigned long (LP64, 64Bit UNIX Umgebung).

    Code:
    include <stddef.h>
    size_t size = 0;
    
    std::cin >> size;
    
    int* const myArray = new int[size];
    
    delete[] myArray;
    
    Das Herumreiten auf diesen Feinheiten ist wichtig, da man durch die falsche Verwendung von int anstelle des richtigen size_t die Kompatiblität mit dem 64Bit Modus versaut. size_t ist immer vom passenden Typ, daher besteht keinerlei Notwendigkeit in so einem Kontext nach den Typ int zu verwenden wie dies zu K&R Zeiten mal der Fall war.

    Allerdings sollte man gerade als Anfänger auf die Lösung via Zeiger Speicher anzufordern dankend verzichten und statt dessen lieber std::vector<T> verwenden.

    Korrektur: Richtiges delete[] eingesetzt
     
    #14 tjp, 14.06.06
    Zuletzt bearbeitet: 16.06.06
    quarx gefällt das.
  15. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    Da Du size_t ansprichst: die STL-Container std::vector<T> (und das in diesem Thread vielleicht ebenfalls interessante std::valarray<T>) benutzen meistens auch size_t als Indextyp (genauer: std::vector<T>::size_type). Sollte ich vielleicht in meinem Beispiel oben updaten... ;)
     
    #15 quarx, 14.06.06
    Zuletzt bearbeitet: 14.06.06
  16. Trapper

    Trapper Boskop

    Dabei seit:
    12.05.05
    Beiträge:
    213
    Nun ja, das sieht Bjarne Stroustrup (der Erfinder von C++) in seinem Buch wohl etwas anders :innocent:
     
  17. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    Seitenangabe (mit Auflagennummer)?
     
  18. Trapper

    Trapper Boskop

    Dabei seit:
    12.05.05
    Beiträge:
    213
    4. aktualisierte Auflage, deutsche Übersetzung, Seite 138.
    Auszug:
    Code:
    void f(int n) {
      vector<int>* p = new vector<int>(n);
      int* q = new int[n];
    ...
    
    Sieht mir beide Male sehr nach einem Datentyp int als Größenangabe aus.
     
    quarx gefällt das.
  19. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    In der Tat, hast Recht. In meinem Stroustrup auch. Böser Schnitzer, Bjarne! :mad: :-D
     
  20. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Einige Teile des Buches sind nicht wirklich auf dem neusten Stand. Das Buch wurde zwar überarbeitet, aber vieles erinnert noch an die älteren Auflagen. Eine vollständige Neubearbeitung des Buches wäre nicht schlecht. Vielleicht wird das der Fall sein, wenn die nächste Version der ISO-Norm verabschiedet ist.
     

Diese Seite empfehlen