Pascal Programm stürzt ab

F.b

Lieutenant
Registriert
Feb. 2008
Beiträge
514
Moin,
ich und nen kumpel haben vor ca 2 wochen ein turbo pascal projekt gestartet (ja ich weiß, echt veraltet ;)). Jetzt haben wir ein problem, bei dem wir nicht mehr weiter wissen.
das ganze soll ein monopoly werden. die grafik und das würfeln haben wir schon. wenn jetzt aber zwischen 30 und 60 mal gewürfelt wurde, beginnt turbo pascal statt normaler schrift nur noch kryptische zeichen auszugeben und bricht 2 würfe weiter ohne fehlermeldung ab. compilerschalter für fehler haben wir schon ausprobiert, liefert trotzdem keinen fehler. jemand ne idee?
wer code braucht möge ihn bitte anfordern, 1800 zeilen code zu posten würde schwierig ;)
hier noch nen screenshot:
normal
kryptische zeichen
 
was meinst du mit nur ein zeichen? pufferüberläufe werden von tp auch normalerweise als fehler ausgegeben. und integer haben doch nen wertebereich von -32000 bis 32000
 
Der Debugger müsste euch aber eine Meldung geben, was passiert ist, wenn die Anwenung abgebrochen wird. Ansonsten ohne Quellcode ist es schlecht, da was zu finden.
Ich nehme aber mal an, dass sich da was grafisches verabschiedet. Die kryptischen Zeichen sind sicherlich Zeiger auf ein Speicherbereich, wo die Grafiken gespeichert sind. Die Schriftart ist ja nicht die im GPU gespeicherte Systemfont, sondern sind Grafiken.
 
was liese sich gegen das problem mit den zeigern machen?
 
achso, ne wir nutzen ja die standard-fonts von tp. wir müssen da nix mit grafiken machen ;)
 
Also von der Optik her würde ich behaupten, dass im "kryptischen" die Buchstaben lediglich übereinander liegen oder täuscht das nur?
Könntest du bitte mal den Code posten, der den Text schreibt?
 
procedure geld;
var
i : Word;
pr : String;
begin
settextstyle(2,0,4);
Str(strassen[1].preis,pr);
Outtextxy(435,460,'$'+pr);
Str(strassen[2].preis,pr);
Outtextxy(345,460,'$'+pr);
Str(strassen[3].preis,pr);
Outtextxy(258,460,'$'+pr);
Str(strassen[4].preis,pr);
Outtextxy(213,460,'$'+pr);
Str(strassen[5].preis,pr);
Outtextxy(125,460,'$'+pr);
Str(strassen[6].preis,pr);
Outtextxy(82,460,'$'+pr);
Str(strassen[7].preis,pr);
Outtextxy(25,373,'$'+pr);
Str(strassen[8].preis,pr);
Outtextxy(25,335,'$'+pr);
Str(strassen[9].preis,pr);
Outtextxy(25,300,'$'+pr);
Str(strassen[10].preis,pr);
Outtextxy(25,264,'$'+pr);
Str(strassen[11].preis,pr);
Outtextxy(0,226,'$'+pr);
Str(strassen[12].preis,pr);
Outtextxy(25,190,'$'+pr);
Str(strassen[13].preis,pr);
Outtextxy(25,116,'$'+pr);
Str(strassen[14].preis,pr);
Outtextxy(25,79,'$'+pr);
Str(strassen[15].preis,pr);
Outtextxy(82,5,'$'+pr);
Str(strassen[16].preis,pr);
Outtextxy(170,5,'$'+pr);
Str(strassen[17].preis,pr);
Outtextxy(214,5,'$'+pr);
Str(strassen[18].preis,pr);
Outtextxy(258,5,'$'+pr);
Str(strassen[19].preis,pr);
Outtextxy(302,5,'$'+pr);
Str(strassen[20].preis,pr);
Outtextxy(346,5,'$'+pr);
Str(strassen[22].preis,pr);
Outtextxy(434,5,'$'+pr);
Str(strassen[21].preis,pr);
Outtextxy(390,5,'$'+pr);
Str(strassen[28].preis,pr);
Outtextxy(490,373,'$'+pr);
Str(strassen[27].preis,pr);
Outtextxy(490,300,'$'+pr);
Str(strassen[26].preis,pr);
Outtextxy(517,226,'$'+pr);
Str(strassen[25].preis,pr);
Outtextxy(490,190,'$'+pr);
Str(strassen[24].preis,pr);
Outtextxy(490,116,'$'+pr);
Str(strassen[23].preis,pr);
Outtextxy(490,78,'$'+pr);
end;

strassen ist ein array[1..28] of strasse
 
(Oh man ich bin alt. Gerade mal die TP 7.0 Handbücher herausgeholt....)

Also: Sieht erstmal nicht falsch aus. Abgesehen davon, dass ich nicht verstehe, warum du SmallFont benutzt und dieses hochskalierst, statt eine Schrift in richtiger Größe zu nutzen. Aber das ist wohl eher egal.

Führe mal nach SetTextStyle die Funktion GraphResult durch:
PHP:
procedure geld;
 var  i : Word;
 pr : String;
 ErrorCode : Integer;
 begin
  settextstyle(2,0,4);
  ErrorCode := GraphResult;
  if ErrorCode <> grOk then
    { du hast ein problem}
    writeln(GraphErrorMsg(ErrorCode));
  end;
  Str(strassen[1].preis,pr);
....

EDIT: Am besten schreibst du den Code auch noch hinter einen deiner OutTextXY-Aufrufe.
 
Zuletzt bearbeitet:
Hey, der Programmierer-Kollege von F.b hier.
ghorst du bist unser Held :) Wir haben das ganze mal ausprobiert, und es lag tatsächlich daran, dass wir im gesamten Programm die Grafik zu oft initialisieren und dadurch einen Überlauf erzeugt haben.
Der Fehler wurde jetzt mit deiner Hilfe gefixt, und das Programm funktioniert wieder, heißt wir können endlich weiter am Spiel arbeiten.
Vielen Dank für die Hilfe ♥♥
 
also wenn ~28 Mal im Grunde das exakt selbe gemacht wird dann würde sich da auch eine Schleife anbieten...
Die Koordinaten müssten dann halt auch noch in ein Array wandern (evtl einen Record oder eben gleich ne Klasse [in TP7 Object] nehmen und dann mit dem Wert zusammenfassen...
 
dann müssten wir die werte noch in nen array schreiben, dass bringt dann auch nix;)
 
Naja außer leserlicher und wartbarerer Code ... aber sowas wird überbewertet, ich weiß...

warum symbolische Konstanten nehmen, wenn man auch numerische nehmen kann...

strassen ist ein array von was? bestimmt irgendein record... da könntet ihr doch die preis-positionen einfügen noch...
 
Strassen ist ein array von einem record. Dieses ist allerdings schon ellenlang und die kompletten daten darin sind in einer Datei abgespeichert. Theoretisch könnten wir es in ein array schreiben, aber das ist uns zu viel aufwand ^^

Ich hab allerdings noch eine andere Frage:
Und zwar, wenn wir die compilierte .exe Datei des Spiels ausführen, unter Windows 2000 oder XP (ist auf unseren Schulrechnern drauf), läuft diese verdammt langsam, die Grafik braucht wirklich unangenehm lange um sich aufzubauen. Unter Windows 7 lässt sie sich garnicht ausführen aufgrund mangelnder Vollbildunterstützung.
Die einzige (uns bekannte) Möglichkeit, das Spiel also 'flüssig' laufen zu lassen, ist, es unter DosBOX auszuführen. Kann man daran etwas ändern, oder ist das eine Tatsache mit der man leben muss?
 
Ein Anfang wäre es ja schon mal. immer nur das zu zeichnen, was gezeichnet werden muss... sinnvoll wäre vielleicht eine Prozedur "drawFeld" die ein Feld neuzeichnet, wenn sich da was geändert hat (Figur runter bewegt, etwas gebaut, ...). Wie oft wird denn die Prozedur 'geld' aufgerufen beispielsweise?
 
Jedesmal wenn wir das Spielfeld zeichnen lassen. Wir müssen es leider öfters mal zeichnen lassen, da sich die Figuren sonst nicht richtig setzen lassen. ( Man wird immer ihre alten Positionen sehen :/ )
 
Ja schon, aber man könnte ja beispielsweise wie gesagt eine Prozedur drawFeld machen, die nur ein einzelnes Feld neuzeichnet... es muss ja nicht immer alles neu gezeichnet werden, sondern normal nur die Felder, die sich geändert haben...

Und gerade dann würde es sich anbieten auch die Koordinaten der darzustellenden Dinge im Record (oder in einem eigenen Record) mit abzulegen...
 
das problem daran wäre nur, dass wir den alten code quasi nochmal schreiben müssten für eigentlich nur marginale verbesserungen, und das ist uns zuviel aufwand
 
Ach so, ich wusste noch nicht, dass einmal geschriebener Code in Stein gemeisselt ist... da hab ich wohl ne falsche Vorstellung zum Thema Programmieren...

Aber stimmt schon, es ist wirklich ein großes Problem, schlechten Code wegzuwerfen und besseren zu entwickeln... und sorry, dass ich den Eindruck vermittelt habe, dass es alleine aus Leistungsgründen gemacht werden sollte. Das ist nämlich falsch.

Es ist damit der Code besser wird. Warum ist es denn ein Problem? Weil der Code schlecht ist...
 
Zurück
Oben