Release-Version + Portabilität



  • Hallo,

    Ich habe in den letzten Wochen aus Spass an einem Spiel programmiert.
    Es benutzt SDL (Simple Direct Medialayer) als grundlage und ist in C++ mit Visual Studio 2010 Ultimate (von MSDNAA) erstellt.
    Doch inzwischen ist es eigentlich so weit, dass ich auch eine Version veröffentlichen wollte.
    Nach ein paar kleineren Problemen hatte ich dann auch eine ReleaseVersion kompiliert, welche auf einem anderen PC (meinem Win32Bit-Netbook) problemlos lief.

    Wie es schien war das jedoch der Einzelfall, auf 2 anderen Rechner hängt sich das Programm immer wieder auf.

    Also hab ich mit einigen Sachen rumgespielt und hab schließlich auch den genauen "Problemcodeabschnitt gefunden", nähmlich genau da, an dem ich dynamisch ein recht großes 2dimensionales Array definiere:

    #define MAX_X 1024
    #define MAX_Y 768
    char **Matrix;
    Matrix = new char*[MAX_X];
    for(int i = 0;i <MAX_X; i++){
    		Matrix[i]= new char[MAX_Y];
    		for(int j=0; j<=MAX_Y; j++)
    				Matrix[i][j] = (char)0;		
    }
    

    Nun bin ich mir aber auch nicht sicher, ob das jetzt nur genau an dieser Stelle liegt, oder ob ich einfach grundsätzlich mehr beachten muss.

    Was muss eigentlich alles vorhanden sein, dass das Programm bzw. Spiel auf anderen Systemen läuft? Bisher hab ich einfach nur die exe + die benötigten dll von SDL mitgeliefert.
    Aber muss dazu auch das .NET Framework und/oder C++ Runtime installiert sein?

    Ich hoffe mal das ihr mir auf diese Fragen antworten könnt. 🙂
    Auch gegen eine Anleitung/Tutorial zum Thema Release wäre ich nicht abgeneigt. Aber da hab ich nicht so wirklich passende Dinge gefunden.



  • Also...ich würde x sagen, daß es nicht an den Code-Abschnitt liegt, aber vielleicht im Umgebungsbereich dieser Funktion...Der Gesammtspeicher beträgt: 1024*768 Bytes und das sind gerade x: 768 KB, das ist "Kinder-Kack", das überschreitet keine Speichergrenzen...Ich glaube Dein Fehler liegt woanders. Wenn Dein Programm noch andere Runtimes benötigen würde, würde es erst gar nicht starten. Tutorials zum Thema: Releases, kenn' ich auch nicht. Ich denke x Dein Fehler liegt irgendwo im Code...Bibelspruch: "Wer suchet, der findet". Nicht so viel nordischen Gottheiten nachsinnen, sondern auch x die Bibel lesen... 😉


  • Mod

    for(int j=0; j<=MAX_Y; j++)
    

    Es darf nicht <= heißen, sondern <! Der Array hat MAX_Y Elemente Du beschreibst aber von 0 bis einschließlich MAX_Y, dasist dann ein Element zu weit...



  • Exhumed schrieb:

    Bibelspruch: "Wer suchet, der findet". Nicht so viel nordischen Gottheiten nachsinnen, sondern auch x die Bibel lesen... 😉

    Sag mal, geht's noch? Und was soll überhaupt dieses "x" immer wenn du "mal" schreiben willst? Schwachsinnig.



  • Da muss ich GN Recht geben. Lass das mit dem 'x'! Das will doch keiner lesen... 😃



  • @Martin Richter: Vielen Dank! Sehr gut beobachtet, das ist eine Speicherschutzverletzung und auch die Ursache für den Abstutz des Programms.
    Interessanterweise lief das Programm mit diesem Fehler allerdings im Windows XP(SP2)-Kompatibilitätsmodus 😉

    Dennoch hätte ich noch zwei kleine Fragen, welche mein Thema betreffen:

    1. Wie kannn ich Visual Studio dazu zu bringen, mir diesen Fehler als Warnung zu zeigen (lief über 1 Woche ohne das kleinste Anzeichen)?

    2. Auf allen PCs, auf denen ich das Spiel ausprobiert habe, habe ich jetzt halt immer C++ Runtime etc. installiert, da ich dort das Problem vermutet hatte.
    Jetzt bin ich natürlich so schlau wie vorher, ob das nötig ist oder nicht!
    Kann mir das jemand beantworten? Braucht ein "normales" in Visual Studio in C++ programmiertes Programm die C++ Runtime installiert?



  • Fenrir schrieb:

    1. Wie kannn ich Visual Studio dazu zu bringen, mir diesen Fehler als Warnung zu zeigen (lief über 1 Woche ohne das kleinste Anzeichen)?

    Das kann der Compiler im allgemeinen Fall gar nicht erkennen, das kann erst zur Laufzeit geprüft werden.

    Wenn du so etwas brauchst, dann benutze eine Sprache, die das automatisch macht, wie Java oder C#.
    Oder benutzt std::vector (das solltest du sowieso tun), der hat eine Methode (std::vector::at), die eine Bereichsprüfung macht.


Log in to reply