Hilfe... plötzlich kein "Zugriff" mehr auf Array



  • Hallo zusammen...
    Ich musste kürzlich von Java auf C umsteigen für ein größeres Projekt... das Projekt ist mittlerweile eigentlich "Feauture complete", aber ab und zu geht es im Speicher noch irgendwie drunter und drüber... Mit dem Thema Speicher tu ich mich halt noch schwer, weil man das bei Java alles geschenkt bekommt.

    Ich hab gleich zu Beginn des Programms ein zweidimensionales dynamisches Feld erzeugt mit malloc... so weit so gut... das klappt auch... aber an einer Stelle kann ich plötzlich nicht mehr drauf zugreifen... wenn ich z. b. lesend auf array[2][0] oder ein anderes Element zugreife hält das Programm einfach an der Stelle an... Da keine Ausgabe erscheint, habe ich keine Ahnung, was da los ist... Ich hab den Speicher bestimmt nicht vorher freigegeben... Ich hab leider grad absolut keine Ahnung wo ich suchen soll... Hat vllt. jemand ne Idee was die Ursache sein kann? Danke.



  • Ohne Code ist das natürlich schwer zu sagen. Zeig mal her (bzw. wenn es zu viel ist, bastele ein Minimalbeispiel zusammen, das den Fehler enthält).



  • _matze schrieb:

    Ohne Code ist das natürlich schwer zu sagen. Zeig mal her (bzw. wenn es zu viel ist, bastele ein Minimalbeispiel zusammen, das den Fehler enthält).

    Es ist ein riesen Code und ich kann kein Minibeispiel zusammenbasteln, da es nicht reproduzierbar ist... es tritt nur bei einigen Testfällen auf.



  • Was heißt denn "das Programm hält an"? Kriegst du eine Fehlermeldung? Wenn ja, welche? Hast du das Programm mal als Debug-Version erstellt und dir per Debugger die Variableninhalte im Fehlerfall angesehen? Bei Fehlern, die man nicht versteht, sollte man den Debugger bemühen.


  • Mod

    Newbie001 schrieb:

    Es ist ein riesen Code und ich kann kein Minibeispiel zusammenbasteln, da es nicht reproduzierbar ist... es tritt nur bei einigen Testfällen auf.

    Aber wenn es bei bestimmten Testfällen auftritt, dann bei diesen doch reproduzierbar? Falls ja, dann ist ein Minimalbeispiel doch einfach zu erstellen.

    Es gibt auch viele Möglichkeiten, das Programm automatisiert prüfen zu lassen. Setz das Compilerwarnniveau auf Maximum. Sofern du nicht durch sinnlose Casts die Prüfungen des Typensystems ausgehebelt haben solltest, können dir schon viele mögliche Fehlerquellen genannt werden (Warnungen solltest du so ernst nehmen wie Compilerfehler). Bei schwer zu reproduzierbaren Laufzeitfehlern (trotz warnungsfreier Compilierung) gibt es auch Programme, die automatisch die Richtigkeit vieler Speicherzugriffe überprüfen können, unter Linux zum Beispiel mit valgrind. Das hilft sehr gut bei solchen Fehlern, wie du sie beschreibst und auch hier solltest du alle Meldungen wie Fehler behandeln.
    Falls diese automatisierten Maßnahmen nichts gebracht haben sollten, dann ist es Zeit für den Debugger. Du sagst "das Programm hält einfach an". Das deutet auf eine Endlosschleife hin. Also mal im Debugger laden, warten bis das Programm anhält und dann gucken, wo es hängt. Vielleicht ein Logikfehler. Vielleicht ein Fehler, wo du über ein Array hinaus schreibst und eine Zählvariable überschreibst, so dass eine Schleife nie abbricht. Ohne mehr Information deinerseits kann das so ziemlich alles sein.

    Und das war der 5-Minuten-Crashkurs, wie man Fehler sucht und findet. 😃



  • Newbie001 schrieb:

    Mit dem Thema Speicher tu ich mich halt noch schwer, weil man das bei Java alles geschenkt bekommt.

    Ja genau, das unterscheidet einen Java-Entwickler von seinem C-Kollegen: ohne weitere Kenntnisse einfach mal üppig Speicher belegen/verschwenden. Die (in C geschriebene) JVM nebst GC wirds schon richten.

    Newbie001 schrieb:

    Ich hab gleich zu Beginn des Programms ein zweidimensionales dynamisches Feld erzeugt mit malloc

    Man kann mit malloc kein zweidimensionales dynamisches Feld erzeugen, nur einen zusammenhängenden Speicherblock, den man als zweidimensionales Feld von Elementen gleichen Typs interpretieren kann, und genau daran wird es wohl liegen.
    Du kommst mit deinen Index-Paaren durcheinander und greifst effektiv auf nicht definierten Speicher (außerhalb des zuvor definierten Speicherblocks) zu und bekommst manchmal Fehler: klassisch bei undefinierten Verhalten.
    Sei froh, dass du diese Fehler bekommst, sie zeigen nur mangelndes Design/Überblick auf.
    Versuche irgendwie, deine Indexe zu testen/protokollieren und den "Überlauf" festzustellen.


Log in to reply