Struct lässt sich keine Werte zuweisen



  • Hallo,

    Das Array ist sogar sehr groß, für meine Begriffe zu groß, aber das sollte eigentlich eine Exception auslösen.
    Zumindest sollte man prüfen ob die Erzeugung eines derartigen Arrays gut geht.



  • freshman schrieb:

    tu ir mal einen Gefallen und füge diese Zeilen in dein Hauptprogramm ein und sage mir was auf Konsole ausgegeben wird.

    Map m("main.map",textures_sur,32,32,800,480,1);         
    std::cout << m.map_data[0][0].tilecode << std::endl;
    

    So würde es doch auf dem Stack landen und wahrscheinlich einen Stack-Overflow auslösen, außerdem ist map_data private.



  • beim compile geht noch alles gut, aber beim ausführen geht es in die Knie (und zwar in der stack checking routine)
    @master..: ja, hast schon recht. Fehler ist mir unterlaufen, weil ich schnell eine eigene source benutzt habe zum Ausprobieren:

    struct B{
      int i;
      char c;
    };
    class A{
     public:
      struct B tab[8000][8000];//struct ist übrigens überflüßig da C++ ;-)
      A(int j, char d){
        tab[0][0].i = j; 
        tab[0][0].c = d;
      };
    };
    
    int main(void){ 
      try{
        A a(1,'a');
        cout << a.tab[0][0].i << " " << a.tab[0][0].c << endl;
      }
      catch(...){//geht schon vor catch-Block in die Hose
        std::cerr << "shit!" << std::endl;
      }
      return 0;
    }
    


  • freshman schrieb:

    beim compile geht noch alles gut, aber beim ausführen geht es in die Knie (und zwar in der stack checking routine)

    Ich hab es auch kompiliert und es gab bei mir keine Probleme auch nicht beim Zuweisen der Variable, also muss der Wurm irgendwo anders stecken 🙂
    Außerdem hat er ja gepostet, wie er die Klasseninstanz erzeugt hat und zwar NICHT auf dem Stack, also ist von der Seite alles OK



  • @Tom: du mußt map_data im Konstruktor von Map dynamisch allokieren und Objekt kannste' einfach auf'm Stack anlegen, dann funktioniert es alles wunderbar!
    nicht vergessen den Destruktor anzupassen!

    class Map
    {
     private:
      MapTile ** map_data;
      //...
     public:
      Map(string name,SDL_Surface *texturesurface,int texture_x,int texture_y,int texture_pic_x,int texture_pic_y,int initpart){
        map_data = new MapTile*[MAP_SIZE_X];
        for(int x=0; x<MAP_SIZE_X ; x++){
          map_data[x] = new MapTile[MAP_SIZE_Y];
        }
        //...
        map_data[0][0].tilecode = 5;
      }
      //...
    };
    


  • Wieso willst du ihm unbedingt deine Lösung andrehen mit der Klasse auf dem Stack? Das macht man doch normalerweise nicht. Außerdem ging es doch darum, dass er ein Problem mit dem Setzen von tilecode hat und nichts mit deinem Stackproblem. Er hat ja die Klasse auch auf dem Heap erstellt und somit ist auch das große Array dort.



  • hey, immer locker; ich sagte, daß er das machen kann, muß er ja nicht. Natürlich kann er dasselbe auch au'm Heap: no prob!
    Entscheidend ist doch meine Aussage, daß, wenn er im Konstruktor auch dynamisch allokiert, alles funktioniert! so what!?!



  • freshman schrieb:

    hey, immer locker; ich sagte, daß er das machen kann, muß er ja nicht. Natürlich kann er dasselbe auch au'm Heap: no prob!
    [...] so what!?!

    Na klar, in beiden Fällen funktioniert es einwandfrei, aber bringt ja nichts, jetzt übereifrig vom Thema abzuweichen. Fakt ist, dass am Quelltext alles OK war und auch funktionieren würde und wir auf mehr Quelltext angewiesen sind, um sein Problem nachvollziehen zu können 😉



  • Was braucht ihr denn noch an Quelltext ? ich kann euch alles schicken oder reinposten wenn ihr wollt. Das mit dem Stack will ich eigentlich schon vermeiden, das Programm läuft auch astrein und stürzt nicht ab. Nur lässt sich nichts reinschreiben. Schreibt mal was ihr noch braucht , dann kann ich euch das Morgen wenn ich in der Arbeit wieder an dem Rechner bin reinschreiben. Ausserdem hatte ich schon mal ein so dickes Array und das hat super funktioniert. Hab 512 MB Ram, da sollte er schon mit Klarkommen.



  • Tom555 schrieb:

    Was braucht ihr denn noch an Quelltext ? ich kann euch alles schicken oder reinposten wenn ihr wollt. Das mit dem Stack will ich eigentlich schon vermeiden, das Programm läuft auch astrein und stürzt nicht ab. Nur lässt sich nichts reinschreiben. Schreibt mal was ihr noch braucht , dann kann ich euch das Morgen wenn ich in der Arbeit wieder an dem Rechner bin reinschreiben. Ausserdem hatte ich schon mal ein so dickes Array und das hat super funktioniert. Hab 512 MB Ram, da sollte er schon mit Klarkommen.

    Naja, der gepostete Quelltext scheint keine Fehler zu erhalten, ich habe ihn zum Ausräumen möglicher Zweifel auch selbst mal kompiliert und nicht die gleichen Probleme erfahren, von denen du berichtet hast. Demnach müsste der Fehler ja irgendwo anders liegen. Die Arraygröße sollte in der Tat keine Rolle spielen, da kleine Engpässe ja durch Swapspeicher ausgeglichen werden.



  • masterofx32 schrieb:

    ...Na klar, in beiden Fällen funktioniert es einwandfrei...

    stimmt ja; was habe ich denn da gestern compiliert? bei mir ist es nämlich abgebrochen (s.o.). Oh man, ich glaube ich habe zu viel vor der Kiste gesessen 🕶 sry



  • Der Restliche Quelltext hat aber irgendwie gar nix mit der Klasse Map zu tun, ich wüsst jetzt nicht was ich euch noch geben sollte, vielleicht die MAIN. Vielleicht hat der DEV C++ von Bloodshed irgendwo nen Bug ?



  • Tom555 schrieb:

    Der Restliche Quelltext hat aber irgendwie gar nix mit der Klasse Map zu tun, ich wüsst jetzt nicht was ich euch noch geben sollte, vielleicht die MAIN. Vielleicht hat der DEV C++ von Bloodshed irgendwo nen Bug ?

    Sinnvoll wäre es, eine vollständige Version des Codes zu sehen, der den Fehler (tilecode=0) hervorbringt.



  • Tom555 schrieb:

    Map *MainMap = new Map("main.map",textures_sur,32,32,800,480,1);
    

    Schreibe dir doch schnell einen Getter, um sofort nach Anlegen map_data[0][0].tilecode von MainMap auszugeben.
    Dann siehst du, daß beim Konstruktor alles in Ordnung ist. Außerdem guck dir doch mal im Debug an, wann sich map_data[0][0].tilecode von 5 auf 0 ändert; dann hast du doch die Ursache lokalisiert?!?



  • Ich habs gefunden, das glaubt man ja nicht.

    if (map_data[k+start_x][i+start_y].tilecode = 0)
                   {
                      map_data[k+start_x][i+start_y].tilecode = default_part;
                   }
    

    Hatte da beim if ein = zu wenig drinn, dann hat er alles überschrieben. Müsste da ncht eigentlich eine Fehlermeldung kommen ?



  • ich glaub' es nicht! Aber das kann jedem passieren 😉

    Tom555 schrieb:

    Müsste da ncht eigentlich eine Fehlermeldung kommen ?

    wieso? bei der Selektion wird die Zuweisung betrachtet und da diese korrekt ausgeführt wird, stellt dieser Ausdruck einen wahren Wert dar *lol*



  • So ein billiger Fehler, der hat mich jetzt 2 Tage auf Trab gehalten. Nach sowas hab ich gar nicht geschaut. 😡



  • Es hätte aber eine Warnung kommen müssen.
    MinGW bringt z.Bsp.
    warning: suggest parentheses around assignment used as truth value
    oder Borland (BCB5)
    warning: possible incorrect assignment

    Falls diese Warnung bei dir abgeschaltet ist würde ich sie wieder einschalten.

    Ciao



  • Ja das hatte ich auch noch irgendwo im Hinbterkopf, das da normalerweise wenigstens ne Warning kommt. Die scheint der DEV C++ aber anscheinend zu unterdrücken. Mal schauen wo man das wieder einschaltet.

    Danke für eure Hilfe



  • freshman schrieb:

    wieso? bei der Selektion wird die Zuweisung betrachtet und da diese korrekt ausgeführt wird, stellt dieser Ausdruck einen wahren Wert dar *lol*

    Der Wahrheitswert einer Zuweisung ergibt sich nicht aus einer "korrekten Ausführung", sondern aus der Umwandlung des Zuweisungsergebnisses nach bool. In diesem Fall ist der Ausdruck in der if-Anweisung vermutlich false, weil 0 zugewiesen wird (wenn tilecode nicht einen ungewöhnlichen operator bool hat).


Anmelden zum Antworten