[deplhi] Fout zonder fout melding?

Pagina: 1
Acties:

  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Ik heb een functie gemaakt om de naam uit het geheugen te lezen, als ik er stap voor stap door heen ga vult hij alles correct, maar bij de laatste regel, Result:=... crasht hij. Ik zou niet weten waarom, zonder error. Gewoon een "freeze" van de PC
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function StaffNaam(mempos: longint): string;
{ PRE : mempos is place in memory to load
  POST : Return name
  effect : load name from memory pos
}
var
  p1, p2: pointer;
  dummy, boolres: longint;
  names1, names2, names3 : NamesStruct;
  staff: StaffStruct;
  s: string;
begin
  p1 := addr(staff);
  p2 := addr(dummy);
  // load club memory into Record
  boolres := readprocessmemory(cmphandle,mempos,p1,sizeof(StaffStruct),p2);
  p1 := addr(names1);
  p2 := addr(dummy);
  // load club memory into Record
  boolres := readprocessmemory(cmphandle,staff.FirstName,p1,sizeof(StaffStruct),p2);
  if (staff.CommonName>0) then
  begin
    p1 := addr(names2);
    p2 := addr(dummy);
    // load club memory into Record
    boolres := readprocessmemory(cmphandle,staff.CommonName,p1,sizeof(StaffStruct),p2);
  end;
  p1 := addr(names3);
  p2 := addr(dummy);
  // load club memory into Record
  boolres := readprocessmemory(cmphandle,staff.SecondName,p1,sizeof(StaffStruct),p2);
  Result:=names1.Name+' '+names2.Name+' '+names3.Name;
end;

En voor mensen die dit misschien herkennen, dit is code om een spel CM te editten.

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


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

curry684

left part of the evil twins

Ik weet niet of je bij Delphi ook CodeGuard krijgt, maar ik zou die ff aanzetten, die springt ertussen met duidelijke hints als je zwaar foute grappen uithaalt.

Professionele website nodig?


  • Fatamorgana
  • Registratie: Augustus 2001
  • Laatst online: 07-08 04:17

Fatamorgana

Fietsen is gezond.

De variabele 'Result' komt zomaar uit het niets vallen? Staat ie ergens gedeclareerd en zo ja, is het type goed?

(Heb nog nooit Delphi geprogged dus ik gok maar wat)

  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Defenitie:
Zowel de Functie naam, in dit geval StaffName als Result kun je gebruiken om het resultaat van de functie in te zetten. Dus de type van Result is altijd juist voor de uitgang van de functie.

Vergelijkbaar met return in c++

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


  • FastWallie
  • Registratie: September 2001
  • Laatst online: 25-11-2024
HE,

als dit lekkerlijk je code is moet eens naar dit kijken, je bent een plussie vergeten.

p2 := addr(dummy);
// load club memory into Record
boolres := readprocessmemory(cmphandle,staff.SecondName,p1,sizeof(StaffStruct),p2);
Result:=names1.Name+' '+names2.Name+' ' :Z names3.Name;

http://www.jawal.nl


  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Sorry + vergeten in deze code, maar emm, nee dat is de fout niet, hij lijkt niet uit de functie te willen gaan.

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


  • FastWallie
  • Registratie: September 2001
  • Laatst online: 25-11-2024
Dan ben ik lost,

Hetgeen jij hir wilt gaat mij boven de pet

http://www.jawal.nl


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 22-09 20:51

Delphi32

Heading for the gates of Eden

if (staff.CommonName>0) then
begin
p1 := addr(names2);
p2 := addr(dummy);
// load club memory into Record
boolres := readprocessmemory(cmphandle,staff.CommonName,p1,sizeof(StaffStruct),p2);
end;
Wordt deze code ook daadwerkelijk uitgevoerd? Ik bedoel, heb je situaties waarin staff.CommonName > 0 is?
Als niet dan kun je voor rare verrassingen komen te staan :)

Wat ook nog kan helpen om de boel te debuggen is de laatste regel te vervangen door

Result := Names1.Name;
Result := Result + Names2.Name;
Result := Result + Names3.Name;

Dan kun je iig uitvinden waar exact het probleem zich voordoet.

Ik leef met je mee :+

Verwijderd

Gewoon even een breakpointje zetten en kijken wat er in de name1.name etc zit, daar zijn die dingen immers voor.. :)

Je kunt dan ook door de code steppen. Ik heb het vermoeden dat hij niet vastloopt maar vast komt te zitten in een recursieve loop.

Kan het zijn dat hij niet hier crashed maar in de functie waarvanuit hij aangeroepen is? Hoe roep je dit hele zooitje aan?

Oh ja, post ook eens de definitie van die namestuct

  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Defenitie namestruct:
code:
1
2
3
4
5
type packed record
  name: array[1..50] of char;
  id: longint;
  junk: longint;
end;

Oke, ik heb stap voor stap door gelopen, hij vult de names1 names2 en names3 goed.

Hij kan toch niet in recursive loop komen met het gelijk stellen van strings?

[extra]
Zou het misschien helpen als ik een apparte functie maak om namen te laden? Oke, tuurlijk is dat beter coderen, maar als dit al niet werkt... lijkt me sterk dat dat dan wel werkt.
[/extra]

Nogmaals bedankt voor kijken allemaal.

Vandaag zal ik zelf niet veel doen want heb om 11.35 knie operatie.

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002


Verwijderd

Een string is niet hetzelfde als een array of char. Ik neem aan dat er in het array of char een 0-terminated string komt te staan. Een echte Delphi-string bevat (o.a.) nog lengte-informatie. Misschien dat het daar fout gaat. Ik weet niet of Delphi zo slim is dat hij een array of char converteert naar een string zodra je er + operaties mee gaat uitvoeren.

Om een array of char te kopieren naar een stringvariabele moet je het volgende doen:
code:
1
2
3
4
5
6
7
var a: array [1..50] of char;
  s: string;
begin
  SetLength(s, Length(a));  // maak genoeg ruimte voor kopie
  StrCopy(PChar(s), a);     // kopieer a naar s
  SetLength(s, StrLen(s));  // update lengte-informatie
end;

Zie ook de Delphi-help over PChar's en strings.

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

curry684

left part of the evil twins

Op vrijdag 14 september 2001 09:10 schreef Parcye het volgende:
Defenitie namestruct:
code:
1
2
3
4
5
type packed record
  name: array[1..50] of char;
  id: longint;
  junk: longint;
end;
Erm inderdaad ik zou die name ff vervangen door AnsiString, want wat je nu in die laatste regel doet is een pointeroptelling denk ik (lijkt me sterk dat Delphi dat afvangt).

Die laatste regel stelt botweg de optelling van 3 geheugenpointers plus 2 keer 32 (ascii value van spatie). Die zwaar illegale pointer ram je vervolgens in een AnsiString... wat een zware access violation is daar je geen exceptions afvangt.

Ik kan het fout hebben natuurlijk, ben zelf C++ coder en weet geen kut van Delphi buiten VCL. Overigens geeft een C++ compiler hier ENORME warnings op, heb je alle mogelijke warnings wel enabled staan?

Professionele website nodig?


  • Parcye
  • Registratie: Maart 2001
  • Laatst online: 24-08-2017
Ik heb een oplossing gevonden, denk ik :-)

Daar in het ziekenhuis liggend, kwam het. Die Functie bevat 3 keer de zelfde routine, dus zet in een apparte functie. Die ik 3 keer aan roep, en bingo het werkt. Maar oke, oplossing maar geen antwoord op waarom het niet werkte.

"Als je het kan bedenken, kan het gemaakt worden" Parcye - 14 januari 2002

Pagina: 1