AGB  ·  Datenschutz  ·  Impressum  







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

Debugger Krise

Ein Thema von EWeiss · begonnen am 10. Mai 2011 · letzter Beitrag vom 10. Mai 2011
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Debugger Krise

  Alt 10. Mai 2011, 07:40
Ohne zu wissen, wie ReadMIDIFile die Struktur füllt ... mit ist aufgefallen, dass in guter alter Delphi-Manier
Delphi-Quellcode:
    for IntA := 0 to FileInfo.NoteCounter[IntI] -1 do
    begin
durchlaufen wird, aber
Delphi-Quellcode:
  for IntI := 1 to FileInfo.Tracks do
  begin
. Wenn das
Delphi-Quellcode:
  for IntI := 0 to FileInfo.Tracks-1 do
  begin
heissen sollte, dann schaust Du immer auf die falsche Note. Bzw beim letzten Schleifendurchlauf kracht's dann.

Aber wie auch immer ...
Was soll ich denn jetzt machen.. grrrr
ruhig bleiben und erstmal davon ausgehen, dass man den Fehler selbst gemacht hat.

Was, wenn Du den Code sicherst und dann wegwirfst und langsam nochmal alles von vorne machst?
Nr.1 Delphi-Tool: [F7]

Geändert von ConnorMcLeod (10. Mai 2011 um 07:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

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

AW: Debugger Krise

  Alt 10. Mai 2011, 07:41
Hallo EWeiss,

ich kann natürlich nicht die Semantik Deines Codes kennen - also das wie und warum soll es funktionieren. Da bin ich nicht im Code und vor allem im Problem drinne.

Ich würde aber mal Tippen, dass du eher schreiben müßtest FileInfo.MIDINotes[IntA].NoteN o übergeben. Aber wie gesagt, ich kenne die Logik nicht, bzw. das Ziel nicht.

Es kann ja genauso gut sein, dass du nur IntA brauchst, da du ja durch alle Tracks durch gehst (IntI) und in jedem Track durch alle Noten (IntA). Passend zu dem Aufbau des Records ist bei MIDINotes die erste Stelle der Track / Channel und die zweite Stelle die Note -> FileInfo.MIDINotes[IntI, IntA] liefert dir TMIDINote Nummer IntA von Track / Channel IntI.
Davon betrachtest du ja meist die NoteNo

Gruß, 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
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#13

AW: Debugger Krise

  Alt 10. Mai 2011, 07:43
Aber die Meldung sagt doch schon das da was falsch ist!
Der Typ ist ein dynamisches Array aber ein Integer wird wohl erwartet? Also hast du es dir einfach gemacht und das dynamische Array auf ein Byte gecastet.
Aber wäre es nicht richtiger auf die Werte des dynamischen Arrays zu zugreifen als das Array selbst (welches ja nur ein Pointer ist) auf ein Byte zu casten?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

AW: Debugger Krise

  Alt 10. Mai 2011, 07:49
Delphi-Quellcode:
  for IntI := 1 to FileInfo.Tracks do
  begin
Die Schleife ist schon richtig
array[1..MaxChannels] Channels sind die tracks..

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: Debugger Krise

  Alt 10. Mai 2011, 07:52
Aber die Meldung sagt doch schon das da was falsch ist!
Der Typ ist ein dynamisches Array aber ein Integer wird wohl erwartet? Also hast du es dir einfach gemacht und das dynamische Array auf ein Byte gecastet.
Aber wäre es nicht richtiger auf die Werte des dynamischen Arrays zu zugreifen als das Array selbst (welches ja nur ein Pointer ist) auf ein Byte zu casten?
Es sieht so aus das ich etwas falsch mache.
Es ist aber doch seltsam das der Tooltip mir andere werte anzeigt die
exakt stimmen nur nicht richtig ausgewertet werden.

Ich habe es auch schon als Integer versucht ist das selbe problem bzw.. auch hier stürzt
die Anwendung ab.

gruss
  Mit Zitat antworten Zitat
FredlFesl

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

AW: Debugger Krise

  Alt 10. Mai 2011, 08: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
 
#17

AW: Debugger Krise

  Alt 10. Mai 2011, 08: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.624 Beiträge
 
Delphi 12 Athens
 
#18

AW: Debugger Krise

  Alt 10. Mai 2011, 08: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
EWeiss
(Gast)

n/a Beiträge
 
#19

AW: Debugger Krise

  Alt 10. Mai 2011, 08:31
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.
Mache ich eigentlich auch nicht anders.
Aber in dem Beispiel hat es fortwährend gekracht.
Warum weiss ich ja jetzt.

Da ich nicht gern kopiere hier meine version die läuft jetzt.
Danke nochmal.

Delphi-Quellcode:
procedure TMidiTracker.ImpMidiFile(MidiFile: Widestring);
var
  FileInfo: TMIDIFileInfo;
  MidiNote: TMIDINote;
  IntI: Integer;
  IntA: Integer;
  Tempo: byte;

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.Channels do
  begin
    for IntA := 0 to FileInfo.NoteCounter[IntI] -1 do
    begin
      MidiNote := FileInfo.MIDINotes[IntI, IntA];
      if MidiNote.NoteNo = 0 then
        Grid[IntI - 1, IntA] := -1;

      if MidiNote.NoteNo > 0 then
      begin

        if MidiNote.Length = 12 then
          Grid[(IntI - 1), IntA] := (127 - MidiNote.NoteNo) + basenote;

        if MidiNote.Length > 12 then
          Grid[(IntI - 1), IntA] := 1000 + (127 - MidiNote.NoteNo + basenote);
      end;

      InstGrid[(IntI - 1), IntA] := MidiNote.Instrument;
    end;
  end;
  DrawGrid(self.Handle);

  // Spielgeschwindigkeit auf default wert setzen
  Tempo := MidiNote.Velocity;
  SKAERO_SetKnobValue(SKAERO_GetMainItem(MainHandle, ID_KNOB_SPEED),
    Tempo);
  SKAERO_SetCTLText(SKAERO_GetMainItem(MainHandle, ID_SPEEDVALLABEL),
    WideString(IntToStr(Tempo)));

end;
gruss

Geändert von EWeiss (10. Mai 2011 um 11:02 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 17:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz