ubuntuusers.de

[C++] storage size of x isn't constant

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Nilres

Anmeldungsdatum:
7. Dezember 2006

Beiträge: 371

Hallo ☺

Ich hab nen kleines Problem. Ich möchte ein Array in einer funktion "static" deklariern (Richtiger ausdruck?).

Problem ist das sieht dann so aus:

static char treffer[treffer_zahl][255];

Da sagt mir der kompilier dann:

error: storage size of 'treffer' isn't constant

Anscheinend kommt er nicht damit klar dass, das Array unterschiedlich viele Elemente haben kann?!

Wie kann ich das trozdem lösen?

mfg nils

leonidas666

Anmeldungsdatum:
10. April 2008

Beiträge: 421

Wenn du ein Array anlegst, muss die Anzahl der Elemente schon zur Compile-Zeit feststehen. Dein Problem ist also, dass du versuchst, die Anzahl der Elemente mit der Variable treffer_zahl einzustellen.
Ein Dynamisches Array kannst du mit malloc, new, oder z.B. mit einer der Container-Klassen aus der STL erstellen (das wäre wohl die "richtige" Lösung).

Nedyar

Anmeldungsdatum:
28. September 2007

Beiträge: Zähle...

Mit einem neuern GCC Kompiler kann man das auch übersetzen, die haben eine Erweiterung die so was erlaubt. Ich kann aber nur davon abraten so was zubenutzen. Das ist noch ein Relikt aus C. in C++ gibt es für sowas Containerklassen. Die findest du in der Standardbibliothek für C++.
http://www.cppreference.com/
Damit kann man auch die von leonidas666 angesprochenen dynamischen Sachen leichter implementieren.

phst

Anmeldungsdatum:
24. Juni 2007

Beiträge: 527

Hallo,

wenn du tatsächlich C++ benutzen willst, verwende einfach keine C-Array, sondern die vernünftigen C++-Klassen:

vector<string> treffer;

(ich vermute, das char[255]-Array soll eigentlich ein String sein)

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

In ISO-C++ gibt es keine Variable Length Arrays (VLAs). In C99 gibt es die, aber nur bei lokalen Arrays, die nicht "static" deklariert wurden. Der GNU-Compiler unterstützt dieses Verhalten auch für C++, aber es ist wie gesagt nicht ISO-konform. Insgesamt würde ich mich den Vorpostern anschließen und sagen, dass std::vector und std::string hier wohl die angemessenste Lösung darstellen.

Nilres

(Themenstarter)

Anmeldungsdatum:
7. Dezember 2006

Beiträge: 371

Danke Leute 😀

String wäre sicherlich richtiger aber ich muss teilweise auf bestimmte zeichen inerhalb dieser Kette zugreifen deswegen denke ich das es so leichter ist. Habe jetzt folgendes geschrieben:

    char **treffer = new char*[treffer_zahl];
    for(unsigned int i = 0;i<treffer_zahl;i++) {
      treffer[i] = new char[255];
    }

Noch verbesserungsvorschläge?

mfg nils

BadBoy

Avatar von BadBoy

Anmeldungsdatum:
25. Oktober 2007

Beiträge: 479

auch die string-Klasse besitzt den Operator [], bzw. die Methode at()
damit kannste dann auch auf jedes Zeichen zugreifen und bist dabei auf der sichereren Seite (du brauchst dir keine Gedanken über nen Buffer Overflow machen)

Nilres

(Themenstarter)

Anmeldungsdatum:
7. Dezember 2006

Beiträge: 371

Oh Danke das wusste ich garnicht klingt interissant muss ich mir auf jedenfall mal angucken.

mfg nils

Antworten |