Thema: Virtual Piano

Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#298

AW: Virtual Piano

  Alt 2. Jul 2011, 20:51
Hmm, seh da jetzt nichts, was eine AV auslösen könnte. Ich hab mal ein kleines Testprojekt gebastelt:
Delphi-Quellcode:
program miditrackerav;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TSplitStrArray = array of string;

function Split(const Source, Delimiter: string): TSplitStrArray;
var
  spCount: integer;
  spPos: integer;
  spLength: integer;
  sTemp: string;
  aSplit: TSplitStrArray;

begin
  sTemp := Source;
  spCount := 0;
  spLength := Length(Delimiter) - 1;
  repeat
    spPos := Pos(Delimiter, sTemp);
    if spPos = 0 then
      break
    else
    begin
      Inc(spCount);
      SetLength(aSplit, spCount);
      aSplit[spCount - 1] := Copy(sTemp, 1, spPos - 1);
      Delete(sTemp, 1, spPos + spLength);
    end;

  until False;
  if Length(sTemp) > 0 then
  begin
    Inc(spCount);
    SetLength(aSplit, spCount);
    aSplit[spCount - 1] := sTemp;
  end;

  Result := aSplit;
end;

type
  TMidiTracker = class
  private
    procedure SplitNotes;
  public
    procedure TestSplitNotes;
  end;

var
// Original:
// HalbTon: array[0..100] of Boolean;
// DieNoten: TSplitStrArray;
// NotenNamen: array[0..127] of string;

// Geändert (bei dir AV, bei mir nicht):
  DieNoten: TSplitStrArray;
  HalbTon: array[0..100] of Boolean;
  NotenNamen: array[0..127] of string;

procedure TMidiTracker.SplitNotes;
var
  IntA: integer;
  IntB: integer;
  IntC: integer;
  i: integer;
begin
  DieNoten := Split('C,C#,D,D#,E,F,F#,G,G#,A,A#,B', ',');
  for IntA := 0 to 11 do
  begin
    for IntB := 0 to 11 do
    begin
      IntC := IntA * 12 + IntB;
      if IntC < 128 then
        NotenNamen[127 - IntC] := IntToStr(IntA) + DieNoten[IntB];
    end;
  end;
  // Zum Test ausgeben, um zu gucken, ob auch alles ok ist
  for i := low(DieNoten) to high(DieNoten) do
    writeln(DieNoten[i]);
end;

procedure TMidiTracker.TestSplitNotes;
begin
  SplitNotes;
end;

var
  MidiTracker: TMidiTracker;

begin
  MidiTracker := TMidiTracker.Create;
  MidiTracker.TestSplitNotes;
  HalbTon[3] := True; // Verhindern, dass Compiler die Variable wegoptimiert
  readln;
end.
Egal, wie man die Variablen anordnet, es kommt zu keiner AV. Das Problem muss woanders liegen.

Kann es eventuell sein, dass das Objekt zu dem Zeitpunkt, wo die private Methode aufgerufen wird, bereits zerstört wurde? Ich würde mal einen Haltepunkt auf den Destructor setzen.
  Mit Zitat antworten Zitat