AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein haben wir schon Ostern ? - wer findet den Fehler ?

haben wir schon Ostern ? - wer findet den Fehler ?

Ein Thema von paule32.jk · begonnen am 21. Okt 2023 · letzter Beitrag vom 1. Nov 2023
Antwort Antwort
Kas Ob.

Registriert seit: 3. Sep 2023
436 Beiträge
 
#1

AW: haben wir schon Ostern ? - wer findet den Fehler ?

  Alt 21. Okt 2023, 17:26
I can't imagine the amount of time you are wasting of clicking enter on messages from ShowMessage, do yourself a favor and use some logging method.

The file you are loading, where did it come from ?
What is its format ?
If it is yours or not, check data aligning for that TInstruction record, you might need to declare that record as packed, just make sure it is the same size with the same padding.

You have potential problem with "p" you are starting it with -1 then using p, p+1 so this an AV waiting for you when things will start work and you need more than 4.

Not sure about your question to be honest, but sizeof(Instructions[p]) should never change and it is constant, so double checking it with p+1 is useless.
Kas
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: haben wir schon Ostern ? - wer findet den Fehler ?

  Alt 21. Okt 2023, 18:04
@paule: Bitte versuche, Deinen Themen aussagekräftige Titel zu geben. Und eingrenzen musst du den Fehler schon selbst – es ist nicht Sinn und Zweck dieses Forums, einfach einen Haufen Code kommentarlos rein zu werfen mit der Bitte, einen Fehler zu finden. Im Kern wirst du dich schon selbst damit befassen müssen.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: haben wir schon Ostern ? - wer findet den Fehler ?

  Alt 21. Okt 2023, 18:29
@Daniel, okay. Nächste mal will ich versuchen, besser zu werden.

Aber wie schon geschrieben:
- das auslesen der Größe ist kein Problem
- habe nun "packed record" und die Datei test.bin ist nur noch 42 Byte groß
- im Designer wie auch zur Laufzeit bekomme ich eine AV, und der Debugger Stack im Designer zeigt mir nicht die richtigen Werte für:

var op: TInstruction;
op := Instruction[0].f;

an.
ich bekomme dann eine AV, und der Debugger springt dann an.
Und dort ist dann auch die Stelle, wo ich festsitze - wie ich schon schrieb, bei:

var op : TOpCode;
op := Instruction[p].f;

@kas ob:
The file is created by the source code, you can see it in this Post.
I called it 'test.source.bin' at:
LexScanner('test.source.pas');

- test.source.pas is the script source file
- in source code, i change the .pas Extension with .bin:
s := ChangeFileExt(filename,'.bin');

where "filename" is: 'test.source.pas'.
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet

Geändert von paule32.jk (21. Okt 2023 um 18:33 Uhr)
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
482 Beiträge
 
#4

AW: haben wir schon Ostern ? - wer findet den Fehler ?

  Alt 21. Okt 2023, 20:00
ich bekomme dann eine AV, und der Debugger springt dann an.
Und dort ist dann auch die Stelle, wo ich festsitze - wie ich schon schrieb, bei:

var op : TOpCode;
op := Instruction[p].f;
Lese bitte den Umgang mit dynamischen Arrays in der Hilfe nach:
Delphi-Quellcode:
type
  TOpCode = (ocLit, ocOpr, ocLod, ocSto, ocCal, ocInt, ocJmp, ocJpc, ocWri);
  TInstruction = record
    f: TOpCode; // command
    l: Byte; // level
    a: Integer; // address
  end;
  PInstruction = ^TInstruction;

  TInstructions = array of TInstruction;

var
  ins: PInstruction;
  insArr: TInstructions;
begin
  SetLength(insArr, 2);
  insArr[0].f := ocLit;
  insArr[1].f := ocJmp;
  for var i: Integer := Low(insArr) to High(insArr) do
    ShowMessage(Format('OpCode: %s', [System.TypInfo.GetEnumName(TypeInfo(TOpCode), Ord(insArr[i].f))]));

  for var i: Integer := 0 to Length(insArr) - 1 do
  begin
    ins := @insArr[i];
    ShowMessage(Format('OpCode: %s', [System.TypInfo.GetEnumName(TypeInfo(TOpCode), Ord(ins.f))]));
  end;
Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: haben wir schon Ostern ? - wer findet den Fehler ?

  Alt 21. Okt 2023, 21:26
@mytbo: wenn ich mich an Deinen Code halte:


showmessage('size 2: ' + inttostr(sizeof(instructions))); // hier erhalte ich: 4
SetLength(insArr, 2);
insArr[0].f := Lit;
insArr[1].f := Jmp;
ins := @Instructions[0]; // hier knallts

...
var
FSize: Integer;
FileStream: TFileStream;

FileStream := TFileStream.Create('test.bin', fmOpenRead);
SetLength(Instructions,FSize div sizeof(TInstruction));
FileStream.Read(Instructions, FileStream.Size); // length: 24
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
482 Beiträge
 
#6

AW: haben wir schon Ostern ? - wer findet den Fehler ?

  Alt 21. Okt 2023, 22:04
Du verwendest verschiedene Techniken. Dann musst du so schreiben:
Delphi-Quellcode:
type
  TOpCode = (ocLit, ocOpr, ocLod, ocSto, ocCal, ocInt, ocJmp, ocJpc, ocWri);
  TInstruction = record
    f: TOpCode; // command
    l: Byte; // level
    a: Integer; // address
  end;
  PInstruction = ^TInstruction;

  TInstructions = array of PInstruction;

var
  ins: PInstruction;
  insArr: TInstructions;
begin
  SetLength(insArr, 2);

  GetMem(ins, SizeOf(TInstruction));
  insArr[0] := ins;
  ins.f := ocLit;

  GetMem(ins, SizeOf(TInstruction));
  insArr[1] := ins;
  ins.f := ocJmp;

  for var i: Integer := Low(insArr) to High(insArr) do
    ShowMessage(Format('OpCode: %s', [System.TypInfo.GetEnumName(TypeInfo(TOpCode), Ord(insArr[i].f))]));

  for var i: Integer := Length(insArr) - 1 downto 0 do
    FreeMem(insArr[i]);
Alternativ so:
Delphi-Quellcode:
var
  ins: PInstruction;
  insArr: TInstructions;
  insBufferSize: Integer;
begin
  SetLength(insArr, 2);

  insBufferSize := SizeOf(TInstruction) * Length(insArr);
  GetMem(ins, insBufferSize);
  insArr[0] := ins;
  ins.f := ocLit;

  Inc(ins);
  insArr[1] := ins;
  ins.f := ocJmp;

  for var i: Integer := Low(insArr) to High(insArr) do
    ShowMessage(Format('OpCode: %s', [System.TypInfo.GetEnumName(TypeInfo(TOpCode), Ord(insArr[i].f))]));

  FreeMem(insArr[0], insBufferSize);
Oder so wie in meinem letzten Post, aber du kannst es nicht beliebig mischen. Die Variante aus dem ersten Post wäre mein Favorit.

Bis bald...
Thomas

Geändert von mytbo (21. Okt 2023 um 22:10 Uhr) Grund: Tippfehler korrigiert
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.653 Beiträge
 
Delphi 12 Athens
 
#7

AW: haben wir schon Ostern ? - wer findet den Fehler ?

  Alt 21. Okt 2023, 22:54
Nur mal so.
Was würde ChatGPT dazu sagen?
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz