Array mit externer Konstante ???



  • Hallo,

    mich bringt heute ein einfacher Array zur Verzeiflung 😞

    Was funktioniert ist natürlich:

    const laenge = 5;
    int array[laenge];
    

    Ich scrheibe eine MFC-Anwendung, die aus mehreren Threads besteht und wo ich an verschiedenen Stellen einn Array gleicher Größe benötige.
    In einer cpp-Datei steht also:

    extern const laenge=5;
    

    In einer anderen:

    extern const laenge;
    int array[laenge] //FEHLER!!!
    

    Das klappt nicht: Meldung: "Konstanter Audruck erwartet"

    Was im übrigen z.B. auch nicht geht ist folgendes:

    int laenge = 5;
    int array[(const int)laenge];
    

    Das versteh ich auch nicht. Es erscheint dieselbe Fehlermeldung. Wieso kann man keine Variable auf const casten???

    Plattform: Visual Studio 6

    Gruß,
    RungeZipperer



  • const laenge = 5;
    

    Fehlt da nicht der Typ?

    extern const laenge=5;
    

    Was ist das?

    extern const laenge;
    int array[laenge] //FEHLER!!!
    

    Das klappt nicht: Meldung: "Konstanter Audruck erwartet"

    Könnte daran liegen, dass er einen konstanten Ausdruck etwartet. Der Compiler kennt werte, die in anderen Modulen stehen aber doch gar nicht.

    Was im übrigen z.B. auch nicht geht ist folgendes:

    int laenge = 5;
    int array[(const int)laenge];
    

    Das versteh ich auch nicht.

    Wieso:

    // Header etc. selber denken
    int main ()
    {
       int x;
       cin >> x;
    
       int feld [(const int)x]; // geht nicht, manno :(
    }
    


  • Fehlt da nicht der Typ?

    Nein.

    [...]Könnte daran liegen, dass er einen konstanten Ausdruck etwartet.

    Prima, solche Antworten helfen mir enorm.

    Wieso:
    C/C++ Code:
    // Header etc. selber denken
    int main ()
    {
    int x;
    cin >> x;

    int feld [(const int)x]; // geht nicht, manno 😞
    }

    Super, bist ne echte Hilfe!!!



  • 1. Doch da Fehlt der Typ! Automatische Typherleitung gibt es in C++ nur bei Templatefunktionen und implizite Annahme von int gibt es auch schon lange nicht mehr.
    2. Was willst du? Er beschreibt dir genau, was du falsch machst. Du darfst nur zur Compilezeit feststehende Konstanten verwenden. Das machst du aber nicht. Was soll ich da bitte noch erleutern.
    3. Habe ich dir lediglich versucht zu demonstrieren, das der Cast totaler quatsch ist. Wenn etwas nicht zur Complezeit feststeht, steht es nicht zur Compilezeit fest. Daran ändert auch ein Cast nichts. Ich hätte schon erwartet, dass du ein wenig mitdenkst.

    /edit: Tippfehler korrigiert



  • Hi!

    @RungeZipperer:
    1.
    Hast du mal Pascal programmiert? Das du:

    const laenge=5;
    

    schreibst kommt nämlich aus Pascal, zumindest kenne ich es von dort und in Pascal wird bei Konstanten kein Typ angegeben. Das ist in C++ aber anders, dort musst du einen Typ angeben:

    const int laenge = 5;
    

    Wenn du das zur Kompilierzeit haben willst mit der Größenfestlegung musst du das mit Anforderung von Speicher machen:

    int x;
    cin >> x;
    char *carray = new char[x];
    delete[] carray;
    

    Code-Hacker



  • 1. Doch da Fehlt der Typ! Automatische Typherleitung gibt es in C++ nur bei Templatefunktionen und implizite Annahme von int gibt es auch schon lange nicht mehr

    Das wird mir jetzt zu blöd. Das kompiliert der ohne Probleme. Probier es aus!!!

    2. Was willst du. Er beschreibt dir genau, was du falsch machst. Du darfst nur Zur Compilezeit feststehende Konstanten verwenden. Das machst du aber nicht. Was soll ich da bitte noch erleutern.

    Aha. Und ist "external const" etwa kein konstanter Ausdruck???

    3. habe ich dir lediglich versucht zu demonstrieren, das der Cast totaler quatsch ist. Wenn etwas nicht zur Complezeit feststeht, steht es nicht zur Compilezeit fest. Daran ändert auch ein Cast nichts. [...]

    Wo ist das Problem? Der Compiler soll eben einen Array konstanter Länge anlegen genau mit der Länge, die gerade die Variable "laenge" hat!!!

    Ich hätte schon erwartet, das du ein wenig mitdenkst.

    OK, "oberlehrerhaft" kann ich auch! Versuch mal, ab und zu das "das" mit 2 "s" zu schreiben, zumindest dann, wenn es sich nicht um einen Relativsatz handelt!



  • Hi!

    Mit dieser Freundlichkeit kommste hier aber nicht weit. Achja, wenn die größe der Variable schon feststeht zur Kompilierzeit, dann kannste folgendes machen (was du wohl auch wolltest):

    const int LAENGE=5;
    char carray[LAENGE];
    

    Das war es an Hilfe meinerseits....

    Code-Hacker



  • Wenn es ein Relativsatz wäre, hätte ihn Helium richtig geschrieben!

    Zu deinem Problem hat Helium schon in seinem ersten Posting alles gesagt. Lese es am Besten noch mal durch und denke darüber nach.



  • Das wird mir jetzt zu blöd. Das kompiliert der ohne Probleme. Probier es aus!!!

    Damit ich dir die genaue Fehlermeldung sagen kann, mach ich das doch glatt:
    "ISO C++ forbids declaration of `x' with no type"
    Zufrieden?

    Wo ist das Problem? Der Compiler soll eben einen Array konstanter Länge anlegen genau mit der Länge, die gerade die Variable "laenge" hat!!!

    Schonmal über dynamisches Allokieren nachgedacht? Dann kannst du Ausdrücke, die erst zur Laufzeit fesstehen verwenden.

    OK, "oberlehrerhaft" kann ich auch! Versuch mal, ab und zu das "das" mit 2 "s" zu schreiben, zumindest dann, wenn es sich nicht um einen Relativsatz handelt!

    OK, werde ich korrigieren.



  • Klar kann man einen "int" in "const int" umwandeln, aber const reicht eben nicht. "Zur Kompilierungszeit konstant" ist ein Konzept, das man in C++ nicht ausdrücken kann. Man kann im Prinzip nur alles, was man direkt in die [] schreiben könnte, auch erst als Definition einer integralen Konstante verwenden und diese dann einsetzen, solange die Konstante in der entsprechenden Übersetzungseinheit (vermutlich durch ein #include) definiert wurde. So würde ich die Regel mal kurz umschreiben 😉



  • Das mit dem Relativsatz nehm ich zurück, da hab ich doch grad das "nicht" übersehen...



  • RungeZipperer schrieb:

    1. Doch da Fehlt der Typ! Automatische Typherleitung gibt es in C++ nur bei Templatefunktionen und implizite Annahme von int gibt es auch schon lange nicht mehr

    Das wird mir jetzt zu blöd. Das kompiliert der ohne Probleme. Probier es aus!!!

    Nur weil "er" das compiliert heißt das nicht, dass es sich hierbei um korrektes C++ handelt. Vielmehr bedeutet das, dass dein Compiler hier eine compilerspezifische Erweiterung verwendet.

    Ansonsten möchte ich dich dringend bitten, deinen Ton zu ändern.



  • Ansonsten möchte ich dich dringend bitten, deinen Ton zu ändern.

    Das schlägt dem Fass ja den Boden aus!!! WER hat denn hier mit schlechtem Ton begonnen???

    Ich doch wohl nicht oder!?

    Wenn ich schreibe "Konstanter Ausdruck erwartet" und als Antwort kommt dann "Wahrscheinlich erwartet der Compiler einen konstanten Ausdruck", fühle ich mich angemacht. Lesen kann ich nämlich noch. Das ist doch ein völlig überflüssiger Satz gewesen.

    Außerdem habe ich mich nur Helium gegenüber gewehrt und nicht die ganze Welt angegriffen. Also halt bitte den Ball flach.

    Und wenn ich nicht so viel Ahnung habe, ist es doch wohl einleuchtend, dass mich das erste Antwortposting keinen Schritt weiter gebracht hat.

    Im übrigen hat sich das Problem erledigt. Man nehme Präprozessordirektive und schon ist die Welt (wieder) in Ordnung 🙂



  • Aha. Und ist "external const" etwa kein konstanter Ausdruck???

    Konstanter Ausdruck = at compile time bekannt
    compile time != link time

    Wenn du:

    extern const int a;
    int b[a];
    

    schreibst dann sag mir doch was a ist? Der Linker kennts aber der Compiler nicht. extern const ist const im C Sinne, das heist eine Variable die at runtime nicht verändert werden soll (Kann aber mit Hilfe von Casts). Bei

    const int a=6;
    

    Wird es nach dem Compilen gar kein Variable mehr geben (mit einigen Ausnahmen in denen es nicht anders möglich ist.) Sieh es als #define an das den Scoperegeln unterliegt und auch in jeden Module, wie inline Funktionen, definirt werden muss.

    Das schlägt dem Fass ja den Boden aus!!! WER hat denn hier mit schlechtem Ton begonnen???

    Ich doch wohl nicht oder!?

    Na dann ließ den Topic doch noch mal durch. Ach und nur so nebenbei eigentliche ist es in deinem Interesse den Ton nicht eskaliren zu lassen da es deine Frage ist.

    Wenn ich schreibe "Konstanter Ausdruck erwartet" und als Antwort kommt dann "Wahrscheinlich erwartet der Compiler einen konstanten Ausdruck", fühle ich mich angemacht. Lesen kann ich nämlich noch. Das ist doch ein völlig überflüssiger Satz gewesen.

    Ja was soll man dann anders machen als Deutsch reden? Compiler geben oft merkwürdige Fehlermeldungen aus, aber diese ist eindeutig.
    Konstanter Ausdruck != Konstante Variable
    (naja Konstante Variable ist auch irgendwie ein Widerspruch 🙄 )



  • RungeZipperer schrieb:

    Man nehme Präprozessordirektive und schon ist die Welt (wieder) in Ordnung 🙂

    Und nicht mehr typsicher.

    Wenn Du die Hinweise die Dir gegeben wurden befolgt hättest dann wüsstest Du dass es ein "const int test = 5;" oä auch getan hätte, Du kannst eben nicht einfach schreiben "const test = irgendwas" und hoffen dass Dein Compiler den korrekten Datentyp errät.



  • Hallo!
    Das arbeitet nitch mit Visual C, und auch mit keinem standarten C++ Compiler weil Compiler bei der Compile-Zeit Array-Groesse wissen muss! Aber dass geht mit C99 und mit GCC (g++).
    Wenn du dynamishe Array mit Visual C braucht du kannst das Folgende benutzen:

    1. new
    2. vector, links (STL)
    3. alloca funktion (das Vorteil ist dass es Speicher im Stack allockiert und du es nicht freine soll)
      z.B:
      [CPP]
      void f(int size)
      {
      int * k = alloca (sizeof(int)* size);
      ... // keine free hier!!!
      }


  • Nimm enum, und du bist die Probleme los:

    enum { laenge = 5 }; //Kann - anders als const int - auch in Headerdatei stehen!!!
    int array[laenge];  //In Quellcodedatei
    


  • Krösus schrieb:

    [cpp]enum { laenge = 5 }; //Kann - anders als const int - auch in Headerdatei stehen!!!

    Das wäre mir neu.
    Warum darf ich const int nicht in eine Headerdatei schreiben?



  • itman schrieb:

    Das arbeitet nitch mit Visual C, und auch mit keinem standarten C++ Compiler weil Compiler bei der Compile-Zeit Array-Groesse wissen muss!

    Weiß er doch. Bist Du übrigens sicher dass das nicht legal ist? Comeau schluckt das auch ohne zu meckern...

    1. new
    2. vector, links (STL)
    3. alloca funktion (das Vorteil ist dass es Speicher im Stack allockiert und du es nicht freine soll)

    Die diversen Standardcontainer sind natürlich eine feine Sache, aber von der Verwendung von alloca würde ich in C++ absehen - ist außerdem doch nicht standardisiert, oder?



  • nman schrieb:

    itman schrieb:

    Das arbeitet nitch mit Visual C, und auch mit keinem standarten C++ Compiler weil Compiler bei der Compile-Zeit Array-Groesse wissen muss!

    Weiß er doch. Bist Du übrigens sicher dass das nicht legal ist? Comeau schluckt das auch ohne zu meckern...

    1. new
    2. vector, links (STL)
    3. alloca funktion (das Vorteil ist dass es Speicher im Stack allockiert und du es nicht freine soll)

    Die diversen Standardcontainer sind natürlich eine feine Sache, aber von der Verwendung von alloca würde ich in C++ absehen - ist außerdem doch nicht standardisiert, oder?

    Uuups, jetz bin ich nicht sicher. Standard vordert die Array-Groesse constant-expression zu sein, aber denn sa ich keinen Wiederspruch wenn ein Funktion-parameter als const deklariert ist, z.B:

    void f(const int size) {
     int arr[size];
    }
    

    ... und ueber alloca: na ja das ist gar kein best Variante (und nicht standard-conform dabei)


Anmelden zum Antworten