![]() |
Debugger Krise
Delphi und meine wenigkeit mögen sich bald nicht mehr.
Wie aknn es sein das ein wert von 0 ausgegeben wird obwohl ersichtlich dieser einen von 62 hat ?
Delphi-Quellcode:
IntI = 1 und IntA = 0
if FileInfo.MIDINotes[IntI, byte(FileInfo.MIDINotes[IntA])].NoteNo = 0 then
Grid[IntI - 1, IntA] := -1; Result:= 60; // Richtig IntI = 1 und IntA = 1 Result:= 0 ??? Man kann sehr deutlich sehen das hier der wert 62 steht. Wichtig! Auf das angehängte Bild schauen. gruss |
AW: Debugger Krise
Ich kenne nur ein Phenomän, wenn Delphi die for-Schleife optimiert und der Debugger nicht darauf achtet. Wobei lediglich die Darstellung falsch ist, intern aber alles korrekt abläuft.
Sehe ich das schon richtig, dass die Zeile unter dem if ausgeführt wird, ob wohl 62 nicht gleich 0 ist?! |
AW: Debugger Krise
Zitat:
Noch zwei pics da kann man sehen das beide IntI und IntA den wert 1 haben. Wenn du oben dann vergleichst wirst du sehen das er trotzdem die Note löscht obwohl vorhanden. Was soll ich denn jetzt machen.. grrrr Optimierung habe ich ausgeschaltet alle DCU's glöscht und komplett neu Kompiliert. Damit ich die Values verfolgen kann. EDIT: Hab es mal mit Packed Record versucht.. bringt auch nix. Hier ist die Funktion vielleicht gibt es da ein problem denke aber nicht!
Delphi-Quellcode:
gruss
procedure TMidiTracker.ImpMidiFile(MidiFile: Widestring);
var FileInfo: TMIDIFileInfo; IntI: Integer; IntA: Integer; begin if not ReadMIDIFile(MidiFile, FileInfo) then begin MessageBox(Self.Handle, 'Not a valid MIDI file.', 'Confirm', MB_OK); exit; end; for IntI := 1 to FileInfo.Tracks do begin for IntA := 0 to FileInfo.NoteCounter[IntI] -1 do begin if FileInfo.MIDINotes[IntI, byte(FileInfo.MIDINotes[IntA])].NoteNo = 0 then Grid[IntI - 1, IntA] := -1; if FileInfo.MIDINotes[IntI, (byte(FileInfo.MIDINotes[IntA]))].NoteNo > 0 then begin if FileInfo.MIDINotes[IntI, (byte(FileInfo.MIDINotes[IntA]))].Length = 12 then Grid[(IntI - 1), IntA] := (127 - FileInfo.MIDINotes[IntI, (byte(FileInfo.MIDINotes[IntA]))].NoteNo) + basenote; if FileInfo.MIDINotes[IntI, byte(FileInfo.MIDINotes[IntA])].Length > 12 then Grid[(IntI - 1), IntA] := 1000 + (127 - FileInfo.MIDINotes[IntI, (byte(FileInfo.MIDINotes[IntA]))].NoteNo + basenote); end; InstGrid[(IntI - 1), IntA] := FileInfo.MIDINotes[IntI, (byte(FileInfo.MIDINotes[IntA]))].Instrument; end; end; DrawGrid(self.Handle); end; |
AW: Debugger Krise
Ist eh keiner Online...
also hier die records.. Wenn da nichts ist weiss ich auch nicht mehr.
Delphi-Quellcode:
Bei IntA = 3 gibt er mir ne note von 60 anstelle von 65..
type
TMIDINote = record StartTime: DWORD; // Start time of note in ticks Length: Word; // Length of note in ticks (Length / Ticks : 1 => 1/4 note, 2 => 1/2 note...) NoteNo: byte; // Note # Instrument: byte; Velocity: byte; end; TMIDIFileInfo = record FileSize: Int64; { File size (bytes) } Format: Word; {0: single-track, 1: multiple tracks, synchronous, 2: multiple tracks, asynchronous} Tracks: Word; TrackNames: array[1..MaxTracks] of AnsiString; TickUnit: Word; {0: Ticks per quarter note, 1: Ticks per second} Ticks: Word; {Ticks per quarter note or Ticks per second} Marker: AnsiString; Copyright: AnsiString; Channels: byte; PlayTime: single; NoteCounter: array[1..MaxChannels] of Word; // The number of note per channel DrumChannel: array[1..MaxChannels] of Boolean; // True if it's a drum channel MIDINotes: array[1..MaxChannels] of array of TMIDINote; // The data of MIDI notes per channel end; Und so geht es weiter. Das kann es doch nicht sein. gruss |
AW: Debugger Krise
Was soll denn byte(FileInfo.MIDINotes[IntA]) sein? Du machst doch hier einen Byte-Cast eines Arrays. Bist Du sicher, daß das so in Ordnung ist?
Grüße, Uli |
AW: Debugger Krise
Zitat:
[DCC Fehler] uMidiTracker.pas(451): E2010 Inkompatible Typen: 'Integer' und 'Dynamic array' NoteNo gibt ein byte zurück. bei low kommen nicht die richtigen Daten genau so wenig bei high. Und wenn du schaust sieht das so aus..
Delphi-Quellcode:
byte(FileInfo.MIDINotes[IntA])].NoteNo
Das ist auch seltsam warum er diese Meldung ausgibt Zitat:
gruss |
AW: Debugger Krise
Hallo EWeiss
Zitat:
Gruß und guten morgen, Chris |
AW: Debugger Krise
Zitat:
Ich habe die Optimierung aus. Vorher habe ich alle DCU's gelöscht bevor ich diese ausgeschaltet habe. Danach komplett neu erzeugt. Jetzt arbeite ich ja mit D2009 und mein Kumpel hat hier eine TTntFileStream deklariert über die ich aber nicht verfüge. Wäre es möglich das hier der Wurm begraben liegt? function GetDelta(const {$IFNDEF UNICODE} F: TTntFileStream {$ELSE} F: TFileStream{$ENDIF}; var Len: word): DWORD; Da ich ja Unicode verwende sollte er eigentlich diesen FileStream verwenden. Und wenn wo bekomme ich die her? Hab da nichts gefunden beim googel. gruss |
AW: Debugger Krise
Hallo,
ich glaube das was ULIK versucht hat klar zu machen ist, dass du oft diesen Code hier hast:
Delphi-Quellcode:
.
byte(FileInfo.MIDINotes[IntA])
Wenn man deiner Record-Deklaration vertrauen darf, dann ist aber MIDINotes ein
Delphi-Quellcode:
(hier ja ohne s). Wenn du dieses Record auf ein Byte "reduzierst", dann siehst du wahrscheinlich nur das erste Byte von TMIDINote.
array[..] of array of TMIDINote
Gruß, Chris |
AW: Debugger Krise
Zitat:
Eine Idee? Denn wie du gelesen hast Zitat:
bekomme ich einen Fehler! Bei low Irrationale werte und bei high stürzt die Anwendung ab. EDIT: Schau mal oben im Thread "Bild 3" dann kannst du sehen was ich vom Debugger geliefert bekomme Und die werte stimmen alle werden aber falsch übergeben/ausgelesen vom Compiler. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 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