[Delphi] TLabel.Caption veranderen geeft error

Pagina: 1
Acties:

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Ik ben bezig met het maken van een programma waarin ik bijhoud welke Divx-films ik heb. Die films zet ik in een 'array of record'. Ik heb ook een

'Statistics'-scherm, waarop ik een aantal dingen bijhoud, zoals bijvoorbeeld de gemiddelde lengte van een titel, en ook de letter die het vaakst voorkomt in

alle titels. Om dat te kunnen doen moet ik eerst bepalen hoevaak iedere letter voorkomt:
code:
1
2
3
4
5
6
7
8
9
var CharArray: Array['A'..'Z'] of Integer;
    a, MostUsed, LeastUsed: Char;

  //Character Counting
  for a:='A' to 'Z' do
    CharArray[a]:=0;
  for i:=1 to NumberOfMovies do
    for j:=1 to Length(DivxArray[NumberOfMovies].Title) do
    CharArray[Upcase(DivxArray[i].Title[j])]:=CharArray[Upcase(DivxArray[i].Title[j])]+1;

Dan, om te bepalen welke letter het vaakst voorkomt:
code:
1
2
3
4
5
6
  //Most Used Character
  MostUsed:='A';
  for a:='A' to 'Z' do
    if CharArray[a]>CharArray[MostUsed] then
    MostUsed:=a;
  labelMostUsedCharacter.Caption:=MostUsed+' ('+IntToStr(CharArray[MostUsed])+')';

Ik zet de gevonden waarde dus in de Caption van labelMostUsedCharacter. Werkt ook gewoon. Tot zover werkt het allemaal nog goed.

Maar dan!

Ik wil ook bepalen welke letter het minst vaak voorkomt. Deze code daarvoor:
code:
1
2
3
4
5
6
  //Least Used Character
  LeastUsed:='A';
  for a:='A' to 'Z' do
    if CharArray[a]>CharArray[LeastUsed] then
    LeastUsed:=a;
  labelLeastUsedCharacter.Caption:=LeastUsed+' ('+IntToStr(CharArray[LeastUsed])+')';

En hier loopt ie vast ! Getuige deze screenshot:

Afbeeldingslocatie: http://www.endoria.net/upload/index.php/2214482127

Ik heb gevonden dat het probleem ligt bij het moment, waar ik de Caption van labelLeastUsedCharacter instel (in dat laatste stukje code). Maar

ik krijg niet gevonden wat het is dat de error genereert. Als ik zeg:

labelLeastUsedCharacter.Caption:='Test';

dan werkt het wel gewoon. Weet iemand misschien wat ik niet goed doe ?

Mother, will they like this song?


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:42
Een access violation wil zeggen dat je een stuk geheugen uitleest of naar een stuk geheugen wilt schrijven dat niet gealloceerd is.

Je probleem zal liggen bij uw for-loop. Daar ga je uw array gaan doorlopen en wellicht zul je buiten de bounds van uw array gaan.

Als je eens de documentatie doorneemt, zul je zien dat je een array moet subscripten dmv een Integer waarde. Jij doet dat met een karakter-waarde.
Wat er gebeurt is dus hetvolgende: uw Index die van het type char is, wordt gecast naar een Integer waarde. Die Integer waarde zal dus hoger zijn dan de max. grens van uw array en er wordt een stuk geheugen gelezen/geschreven dat niet meer gereserveerd is.
Ik vind het al vreemd dat dat geen compiler errors geeft

Edit: Dat zal toch het probleem niet zijn, want ik zie dat je uw array gedefinieerd hebt van 'A' tot 'Z'. (Vind ik toch niet heel slim, maarja).

Kijk eens mbhv de debugger welke variable er niet gealloceerd is.

https://fgheysels.github.io/


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Als dat het probleem zou zijn, waarom werkt het dan wel bij Most Used Character, en niet bij Least Used Character ... ik denk zelf niet dat het daaraan ligt, je zegt zal al, dat zou wel een compiler-error geven. Wat betreft het casten van een Integer waarde vanaf een Char, dat moet ook gewoon werken, want datzelfde zou dan gebeuren met de index van de array.

Mother, will they like this song?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op dinsdag 30 april 2002 15:58 schreef TheLunatic het volgende:
Als dat het probleem zou zijn, waarom werkt het dan wel bij Most Used Character, en niet bij Least Used Character ... ik denk zelf niet dat het daaraan ligt, je zegt zal al, dat zou wel een compiler-error geven. Wat betreft het casten van een Integer waarde vanaf een Char, dat moet ook gewoon werken, want datzelfde zou dan gebeuren met de index van de array.
Ik denk dat er ergens iets structureel nat gaat in je algo dat puur DB-afhankelijk is: je least-used-code is namelijk zo exact hetzelfde als je most-used-code dat je zelfs de vergelijking verkeerdom hebt meegepaste... het lijkt er dus op dat je een structurele fout hebt die puur per ongeluk pas daar optreedt. Jammer genoeg is m'n Delphi niet goed genoeg om die fout hierin te ontdekken, alhoewel ik eveneens grote bezwaren heb tegen de manier waarop je die array gebruikt (een array met alleen de elementen 65 t/m 91 is vragen om problemen).

Enige mogelijkheid die ik zo snel kan zien is dat je botweg vergeten bent het component labelLeastUsedCharacter aan te maken (dat geeft exact dit resultaat) maar dat lijkt me onwaarschijnlijk.

Professionele website nodig?


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Topicstarter
Curry684: Het copy-en-paste probleem wat in de 1e post te zien is, is niet zo in de code terug te vinden (gelukkig), dat heb ik even snel gedaan omdat ik de code had verwijderd omdat ik em wou herschrijven.

Wat betreft de error, die is nu weg, ik heb de array ['A'..'Z'] vervangen door [65..90], en met Ord() en Chr() gewerkt.

Opgelost dus!

Mother, will they like this song?


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:42
Waarom niet van 1 tem 26 en daar dan 64 bij optellen?

https://fgheysels.github.io/


  • MisterE
  • Registratie: April 2002
  • Laatst online: 21:28
waarom gebruik je geen pointer naar de structuur, dit geeft je de mogelijkheid makkelijk 'records' er tussen uit te halen , en heeft als voordeel dat je pas geheugen reserveerd wanneer je het nodig hebt...
Pagina: 1