[Delphi] Programma werkt maar 1 keer

Pagina: 1
Acties:

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 21:36
Ik zit hier al enkele dagen op te studeren, maar ik kom er niet uit. Ik ben bezig met een programma om een OziExplorer track in te laden en te bewerken. Hiertoe heb ik wat units van een ander programma waar ik mee bezig ben bijelkaar geplukt om "even" snel een cmdline-tool te maken.
Op de hoofd ".pas" na, komen alle andere .pas allemaal uit een ander programma van mij en functioneren daar goed.

Maar nu komt het gekke.
De eerste keer dat ik het programma in de IDE start, werkt het foutloos, denk ik. Waarom "denk ik"? Omdat het programma tot nu toe alleen maar inleest en nog niets bewerkt. Dus evt. uitvoer heb ik niet.
De tweede keer en alle volgende keren dat ik het programma in de IDE start, crasht het programma zonder ook maar melding als hij voor de eerste keer regel 29 passeert:
Delphi:
27
28
29
30
function TWaypointList.Add(AObject: TPointWGS84): Integer;
begin
  Result := inherited Add(AObject);
end;


Als ik het programma zelf start op de DOS-prompt, dan verschijnt de volgende melding:
code:
1
2
Exception EAccessViolation in module OziTrack.exe at 00010B2B.
Access violation at address 00410B2B in module 'OziTrack.exe'. Read of address 7DDB750F.


Ik weet niet meer waar ik het moet zoeken. Heb voor de zekerheid updatepack 1,2 & 3 voor delphi 9 maar geïnstalleerd, maar het probleem blijft.

Ik weet dat het niet de bedoeling om hier zomaar wat code te droppen, toch doe ik het... Zou iemand deze code kunnen compileren en kijken of hetzelfde effect optreedt, of dat het aan mijn pc ligt? Vooral het feit dat de IDE pas de 2e maal crasht en dan niets meldt verbaast me.

De complete sourcecode is ge-rar-t maar 12k. Er zit een test-inputbestand bij, waar het programma de 1e keer geheel doorheen loopt, maar de 2e keer op crasht.

Om het programma te starten is de volgende cmd-line parameter vereist: "split test.plt"

Sourcecode

Zou iemand me kunnen vertellen wat er fout gaat?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ik denk dat je best zelf de code kan debuggen. Zet eens een breakpoint op die regel 29 en kijk naar de callstack. Is die TWaypointList wel gecreerd voordat de Add method wordt aangeroepen? Neem de debugger in de inherited Add en kijk of dat wat mis gaat.

We adore chaos because we like to restore order - M.C. Escher


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 21:36
LordLarry schreef op zondag 31 juli 2005 @ 00:27:
Ik denk dat je best zelf de code kan debuggen. Zet eens een breakpoint op die regel 29 en kijk naar de callstack. Is die TWaypointList wel gecreerd voordat de Add method wordt aangeroepen? Neem de debugger in de inherited Add en kijk of dat wat mis gaat.
Dat heb ik de afgelopen dagen ook gedaan. De eerste keer dat ik het programma start in de IDE, doet het programma het perfect (met de testfile voert hij die regel 29 bijna 250 maal uit). En de 2e keer binnen de IDE levert de "Step into..." F7 helemaal niets op, de IDE springt er gewoon al de 1e keer uit. Binnen Delphi alle Exceptions zichtbaar gemaakt.

Het is momenteel nogal tijdrovend, de gehele IDE opnieuw opstarten, waarna alles weer werkt als verwacht.

  • sds
  • Registratie: Juni 2002
  • Laatst online: 07-03 21:27

sds

Je moet de TWaypointList creëren die je aan LeesPLT meegeeft (wat LordLarry ook zei).
Het is wel vreemd om te zien dat hij er inderdaad de eerste run helemaal niet moeilijk over doet dat die lijst niet bestaat.

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 21:36
Dat is toch in LeesPLT opgelost?
Delphi:
61
  if not assigned(Gelezen) then Gelezen:=TWaypointList.Create(True);

  • sds
  • Registratie: Juni 2002
  • Laatst online: 07-03 21:27

sds

In dat geval... Je moet de TWaypointList creëren of initialiseren naar nil.

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 21:36
Door 'm netjes op NIL te stellen, werkt 't weer feilloos. Gelukkig.

Klopt, ik zie het nu ook in de help staan:
If you don't explicitly initialize a global variable, the compiler initializes it to 0. Local variables, in contrast, cannot be initialized in their declarations and their contents are undefined until a value is assigned to them.
Terwijl ik er altijd vanuit ging dat een variabele als 0 of NILL begint. Maar dat geldt dus alleen voor de globalen. Alleen stom dat de IDE er op klapt. Zou volgens mij niet mogen.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Het zou ook best tijdrovend (voor de CPU) zijn als bij iedere miniscule functie de variabelen geinitialiseerd moeten worden. Stel dat je een array van een paar 100 KB hebt... dat "duurt" wel een poosje.

Maar, je krijgt bij gebruik van ongeinitialiseerde variabelen toch gewoon een compiler warning :?

日本!🎌


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 21:36
_Thanatos_ schreef op zondag 31 juli 2005 @ 14:32:
Maar, je krijgt bij gebruik van ongeinitialiseerde variabelen toch gewoon een compiler warning :?
Nee, nooit gekregen... moet je die warning soms expliciet aanzetten? Want op een paar paden na heb ik bijna de standaardinstellingen.
Pagina: 1