AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Debugger Krise

Ein Thema von EWeiss · begonnen am 9. Mai 2011 · letzter Beitrag vom 10. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

AW: Debugger Krise

  Alt 10. Mai 2011, 00:40
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?!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Debugger Krise

  Alt 10. Mai 2011, 00:45
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?!
Das ist mein Problem!

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:
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;
gruss

Geändert von EWeiss (11. Jul 2019 um 15:39 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Debugger Krise

  Alt 10. Mai 2011, 01:11
Ist eh keiner Online...

also hier die records..
Wenn da nichts ist weiss ich auch nicht mehr.

Delphi-Quellcode:
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;
Bei IntA = 3 gibt er mir ne note von 60 anstelle von 65..
Und so geht es weiter.
Das kann es doch nicht sein.

gruss

Geändert von EWeiss (10. Mai 2011 um 04:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
427 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Debugger Krise

  Alt 10. Mai 2011, 05:56
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Debugger Krise

  Alt 10. Mai 2011, 06:03
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
Ohne bekomme ich den Fehler !
[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..
byte(FileInfo.MIDINotes[IntA])].NoteNo

Das ist auch seltsam warum er diese Meldung ausgibt
Zitat:
'Integer' und 'Dynamic array'
Es wird ein byte zurückgeliefert und nirgends steht was von Interger


gruss

Geändert von EWeiss (10. Mai 2011 um 06:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Debugger Krise

  Alt 10. Mai 2011, 06:13
Hallo EWeiss
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.!
Hast du die Optimierung an oder aus? Und hast du nach dem "Umschalten" komplett neu erzeugt?

Gruß und guten morgen,

Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Debugger Krise

  Alt 10. Mai 2011, 06:18
Hallo EWeiss
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.!
Hast du die Optimierung an oder aus? Und hast du nach dem "Umschalten" komplett neu erzeugt?

Gruß und guten morgen,

Chris
Guten Morgen

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
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#8

AW: Debugger Krise

  Alt 10. Mai 2011, 07:06
Der Code unleserlich und kaum wartbar, weil u.a das DRY-Prinzip verletzt wurde.

Der 2.Index wird wiederholt kompliziert ermittelt und ist, wie Du ja weißt, falsch

Delphi-Quellcode:
midiNote := byte(FileInfo.MIDINotes[IntA]); // falsch
midiNote := FileInfo.MIDINotes[EinIndex,NocheinIndex].NoteNo; // bessser
Du solltest dich mit den Grundlagen robuster Programmierung befassen (DRY, KISS, Refactoring).

PS: Natürlich zeigt dir Delphi etwas an. Du "errechnest" ja einen Index (eigentlich beschneidest Du einen Pointer) und dann ist der Index eben irgendwas zwischen 0 und 255. Da steht dann irgendwo etwas...

Wenn dein Grid die Midinoten 1:1 anzeigen soll, dann funktioniert vielleicht das hier (falls ich den Code richtig verstanden habe).
Delphi-Quellcode:
Function TMidiTracker.EncodeMidiNote (midiNote : TMIDINote) : Integer;
begin
  Result := -1;
  if midiNote.NoteNo > 0 then
    if midiNote.Length = 12 then
      Result := (127 - midiNote.NoteNo) + basenote
    else if midiNote.Length > 12 then
      Result := 1000 + (127 - midiNote.NoteNo + basenote)
    else
      Result := midiNote.NoteNo
  else
    Result := -1;
end;

procedure TMidiTracker.ImpMidiFile(MidiFile: Widestring);
var
  FileInfo: TMIDIFileInfo;
  IntI: Integer;
  IntA: Integer;
  midiNote : TMIDINote;

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
      midiNote := FileInfo.MIDINotes[IntI,IntA];
      Grid[IntI - 1, IntA] := EncodeMidiNote(midiNote);
      InstGrid[IntI - 1, IntA] := midiNote.Instrument;
    end;
  end;
  DrawGrid(self.Handle);
end;
Das Bild hängt schief.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Debugger Krise

  Alt 10. Mai 2011, 07:11
Danke für deine Hilfe werde mir das mal genau anschauen.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#10

AW: Debugger Krise

  Alt 10. Mai 2011, 07:14
Noch ein Tipp: um Arrays komplett zu durchlaufen empfiehlt es sich, die Funktionen Low() und High() zu verwenden, da man damit niemals über die Arraygrenzen hinaus zugreift. Dabei spielt es keine Rolle, ob es sich um ein dynamisches, statisches oder offenes Array handelt und ob es 0-indiziert ist oder nicht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:58 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