Array out of Scope



  • Hallo,

    Ich hab eine Frage zu folgendem Problem. Ich möchte eine Funktion definieren, die einen Array mit Integern einmal füllt (ImageArray) und anschließend als Argument für eine weitere Funktion (ShowImage) verwendet, welche in einer while Schleife immer wieder abgerufen werden soll.

    Ich wollte dazu einen Array (ImageArray) nutzen. Wenn ich diesen Array innerhalb der if Abfrage verwendet, werden die Werte vernünftig gefüllt, jedoch befindet sich der Array dann innerhalb der if Schleife und er wird als nicht definiert von der ShowImage Funktion angegeben, wenn ich den Array außerhalb der if Schleife habe, wird er zwar von der Funktion gefunden, aber die Werte werden nicht richtig übertragen .... 🙄

    Hat jemand vielleicht eine einfache und effiziente Lösung zu dem Problem parat? Mag sein, dass es sich dabei um eine Anfängerfrage handelt, aber ich komm einfach nicht auf eine befriedigende Lösung! 😉

    Hier der Code:

    Lösung 1

    static bool run_once = false;
    unsigned int ImageArray[repeat_amount]; // Geht nicht, Werte werden nicht in diesen Array korrekt übertragen
    
    if (!run_once)
    {
    
    for (int x = 0; x < repeat_amount; x++)
    {
    ImageArray[x] = positionX + LoadedImage.GetWidth();
    positionX = ImageArray[x];  
    }
    
    run_once = true;
    }
    
    for (int x = 0; x < repeat_amount; x++)
    {
    ShowImage(gameWindow, ImageArray[x], positionY);
    }
    

    Lösung 2

    static bool run_once = false;
    
    if (!run_once)
    {
    unsigned int ImageArray[repeat_amount]; // Werte werden übertragen, 
    // Array jedoch nicht definiert für ShowImage
    for (int x = 0; x < repeat_amount; x++)
    {
    ImageArray[x] = positionX + LoadedImage.GetWidth();
    positionX = ImageArray[x];  
    }
    
    run_once = true;
    }
    
    for (int x = 0; x < repeat_amount; x++)
    {
    ShowImage(gameWindow, ImageArray[x], positionY);
    }
    


  • Vielleicht solltest du das Array auch static machen. So wird das jedenfalls nichts, da du das Array nur beim ersten Durchlauf initialisierst und bei späteren Läufen mit uninitialisierten Werten arbeitest.



  • Bashar schrieb:

    Vielleicht solltest du das Array auch static machen. So wird das jedenfalls nichts, da du das Array nur beim ersten Durchlauf initialisierst und bei späteren Läufen mit uninitialisierten Werten arbeitest.

    Danke für die hilfreiche Antwort 😉 wenn ich den Array jedoch Static mache dann gibt der Compiler einen Error, dass der Array nicht konstant wäre...

    Ich habe jetzt einen dynamischen Pointer verwendet, was auch funktioniert, aber jetzt weiß ich nicht wo ich den pointer wieder löschen kann, um Speicherlecks zu vermeiden 😕

    Er muss ja verfügbar sein, solange das Programm läuft. Wo lösche ich den Pointer am Besten und auf welche Weise? 😞 Ich habe mehrere Dateien bzw. verschiedene Funktionen, in denen das Programm beendet werden kann.

    static bool run_once = false;
            static int *arraySize = new int [repeat_amount];
            static int *bufferArraySize = &arraySize[0];
            *arraySize = -5;
             arraySize++;
    
                if (!run_once)
                {
                for (int x = 1; x < repeat_amount + 1; x++, arraySize++)
                {
                    *arraySize = positionX + LoadedImage.GetWidth();
                    positionX = *arraySize;
                }
                run_once = true;
                }
    
                arraySize = bufferArraySize;
    
                for (int x = 0; x < repeat_amount; x++, arraySize++)
                        ShowImage(gameWindow, *arraySize, positionY);
    
                arraySize = bufferArraySize;
    
                delete [] arraySize; // geht nicht, da der Pointer ja noch verwendet wird bis Programmende
    


  • Verwende statt new[] und delete[] STL-Container wie std::vector . Dann klärt sich auch gerade die Frage bezüglich Löschen.



  • Cheerful Coder schrieb:

    Danke für die hilfreiche Antwort 😉 wenn ich den Array jedoch Static mache dann gibt der Compiler einen Error, dass der Array nicht konstant wäre...

    Unwahrscheinlich. Er wird wohl eher sagen, dass repeat_amount nicht konstant ist. In dem Fall ist aber dein ursprüngliches Programm auch nicht korrekt bzw. standard-konform, da Array-Größen immer konstant sein müssen. Nichtkonstante Arraygrößen sind eine Spracherweiterung im GCC.


Log in to reply