Frage zu Arrays mit dynamischer Größe (C / C++)



  • Hallo,

    ich habe eine Frage, und zwar habe ich ein Programm, welches zwei Bilder lädt.

    int array_breite = Bild1.width - Bild2.width;
    int array_hoehe = Bild1.height - Bild2.height;
    int testarray[array_breite][array_hoehe]
    

    Bild2 ist immer kleiner als Bild1, somit sind beide Ausdrücke >0

    ... so würde ich es gerne machen, mein Compiler schluckts aber nicht...

    Fehler 1 error C2057: Konstanter Ausdruck erwartet c:\Users\Documents\Visual Studio 2008\Projects\OpenCV_Cuda_TEMP\OpenCV_Cuda_TEMP\main.cpp 37
    Fehler 3 error C2057: Konstanter Ausdruck erwartet c:\Users\Documents\Visual Studio 2008\Projects\OpenCV_Cuda_TEMP\OpenCV_Cuda_TEMP\main.cpp 37
    Fehler 5 error C2087: 'testarray': Feldindex fehlt c:\Users\Documents\Visual Studio 2008\Projects\OpenCV_Cuda_TEMP\OpenCV_Cuda_TEMP\main.cpp 37
    Fehler 6 error C2133: 'testarray': Unbekannte Größe c:\Users\Documents\Visual Studio 2008\Projects\OpenCV_Cuda_TEMP\OpenCV_Cuda_TEMP\main.cpp 37
    Fehler 2 error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich. c:\Users\Documents\Visual Studio 2008\Projects\OpenCV_Cuda_TEMP\OpenCV_Cuda_TEMP\main.cpp 37
    Fehler 4 error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich. c:\Users\Documents\Visual Studio 2008\Projects\OpenCV_Cuda_TEMP\OpenCV_Cuda_TEMP\main.cpp 37

    Wieso nicht und wie kann ichs lkösen?

    DANKE

    Ich nutze den Compiler ovn Visual Studio 2008.



  • Nimm std::vector<..>.
    Simon


  • Mod

    Die Größen von Arrays müssen zur Compilezeit feststehen. Nimm dynamische Container wie std::vector. Das ist ohnehin keine so gute Idee megabyteweise Bilddaten auf den Stack zu legen, von daher hat dynamische Speicherverwaltung gleich zwei Vorteile bei deinem Problem.



  • Höhe und Breite müssen bereits zur Compile-time bekannt sein und dürfen somit keine Variablen sein. Statt des dynamische Arrays würde ich dir aber die Verwendung von std::vector empfehlen, da er sich selbständig um die Aufräumarbeiten kümmert:

    #include <vector>
    
    int array_breite = Bild1.width - Bild2.width;
    int array_hoehe = Bild1.height - Bild2.height;
    std::vector<int> BildDaten( array_breite * array_hoehe );
    

    Du musst dich jetzt nur noch um die Umrechnung von linearen Indizes auf 2D Indizes und umgekehrt kümmern.



  • okok, vielen Dank an euch alle, tolles Forum hier - hilfsbereit und nett..

    Eine Frage habe ich allerdings noch: Ist das ein C oder ein C++ Thema?? Ich hab grad in meinem C++ Buch nachgeschaut (c++ von a bis z), hab aber nix zu dem Thema gefunden bzw. nur eien Verweis auf Arrays?
    Wenn jmd nen guten Link griffbereit hat, immer her damit.
    Danke!


  • Mod

    SchwanAL schrieb:

    okok, vielen Dank an euch alle, tolles Forum hier - hilfsbereit und nett..

    Eine Frage habe ich allerdings noch: Ist das ein C oder ein C++ Thema?? Ich hab grad in meinem C++ Buch nachgeschaut (c++ von a bis z), hab aber nix zu dem Thema gefunden bzw. nur eien Verweis auf Arrays?
    Wenn jmd nen guten Link griffbereit hat, immer her damit.
    Danke!

    Das ist ein C++-Thema, aber "C++ von A bis Z" gilt nicht als ein C++-Buch, sondern als Bockmist der sofort entsorgt gehört.



  • Lol ok... dann meine (hoffentlich) allerletzte Frage.. was für Literatur (deutsprachige bevorzugt) empfliehlst Du? Will nicht mit jedem Pfurzproblem das Forum beschäfigen 😉



  • SchwanAL schrieb:

    Eine Frage habe ich allerdings noch: Ist das ein C oder ein C++ Thema??

    In C++ müssen Arrays compilezeitkonstante Größe haben. Deswegen fliegt die C2133, wenn Du sowas in C++ machst.

    C hingegen kann VLAs. http://en.wikipedia.org/wiki/Variable-length_array

    Soviel zu Sinnhaftigkeit mit einem C/C++-Buch einen Sprachenmischmasch zu lernen. hihihi.



  • SchwanAL schrieb:

    Lol ok... dann meine (hoffentlich) allerletzte Frage.. was für Literatur (deutsprachige bevorzugt) empfliehlst Du? Will nicht mit jedem Pfurzproblem das Forum beschäfigen 😉

    Zu empfehlende Literatur: http://www.c-plusplus.net/forum/251551


Anmelden zum Antworten