AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Virtual Piano
Thema durchsuchen
Ansicht
Themen-Optionen

Virtual Piano

Ein Thema von EWeiss · begonnen am 8. Mär 2011 · letzter Beitrag vom 13. Apr 2019
Antwort Antwort
Namenloser

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

AW: Virtual Piano

  Alt 2. Jul 2011, 17:28
Kann es sein, dass DieNoten die Länge 0 hat? Im ersten Fall wird der Zugriff noch durch das 100 Bytes lange Boolean-Array HalbTon „aufgefangen“, im zweiten Fall kommt jedoch nach DieNoten keine Deklaration mehr, und der Zugriff geht ins Nirwana (nicht alloziierter Speicher) → Zugriffsverletzung.

Edit: Schalte mal in den Compiler-Optionen die Bereichsprüfung ein.
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Virtual Piano

  Alt 2. Jul 2011, 18:50
Ok Fehler gefunden sehr merkwürdig.
Egal ob es Halbton, DieNoten oder NotenName ist
Es kann nicht kommplett auf die Variable/Array zugegeriffen werden.
Nur wenn davor genügend Speicher reserviert wurde, sei es durch eine Hilfsvariable, die keiner brauch. Ansonsten fehlt immer 'eine Adresse' vorsichtig Formuliert!

Keine Ahnung warum dies so passiert!!!

Dies ist mir nur aufgefallen, weil man das Array 'HalbTon' gar nicht benötigt! und ich entfernen wollte

EDIT:
Sobald 'DieNoten' in SplitNotes auftauchen kracht es!
nimmt man dies weg, muss mann auch NotenNamen wo anders hinsetzten!

ALLES MERKWÜRDIG!

hänge schon 3 Tage an diesem Phänomen.

Gruss alfold

Geändert von alfold ( 2. Jul 2011 um 19:08 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Virtual Piano

  Alt 2. Jul 2011, 19:10
Kann es sein, dass DieNoten die Länge 0 hat? Im ersten Fall wird der Zugriff noch durch das 100 Bytes lange Boolean-Array HalbTon „aufgefangen“, im zweiten Fall kommt jedoch nach DieNoten keine Deklaration mehr, und der Zugriff geht ins Nirwana (nicht alloziierter Speicher) → Zugriffsverletzung.

Edit: Schalte mal in den Compiler-Optionen die Bereichsprüfung ein.
NÖ die ist korrekt und wird mit 12 zurück geliefert.
Deklariere die
DieNoten: TSplitStrArray;
mal public dann dürfte die Reihenfolge keine Rolle mehr spielen.

Zitat:
Keine Ahnung warum dies so passiert!!!
Weil Privat und nicht public.. bzw.. weil ich aus einer Privaten Deklaration auf ein als Global definiertes Array zugreifen will
Das scheint sich nicht zu vertragen.

Zitat:
weil man das Array 'HalbTon' gar nicht benötigt! und ich entfernen wollte


gruss

Geändert von EWeiss ( 2. Jul 2011 um 19:21 Uhr)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Virtual Piano

  Alt 2. Jul 2011, 19:38
So habe DieNote entfernt und in Splitnotes ne local Variable dafür genommen.
Darauf hin musst ich NotenName noch wo anders hinsetzten sonst hat es da plötzlich geknallt.

Bereichsprüfung ist an hält ja auch an, an der Pos wo es knallt Fehlerhafte initialisierung! Warum auch immer!?

Zitat:
weil man das Array 'HalbTon' gar nicht benötigt! und ich entfernen wollte
Für was hast Du 'NotenName' damit geht es auch

@NamenLozer: Es kann immer nur auf das 1(0) array Element nicht zugegriffen werden bei Schreiben/lesen. Wenn alles in der Reihenfolge bleibt

Delphi-Quellcode:
 TMidiTracker = class
  private

    FHGrid: HWND;
    FWidth: integer;
    FHeight: integer;
    FTop: integer;
    FLeft: integer;
    Img: cardinal;
    dwStyle: DWORD;
    dwClass: PWideChar;
    IsInitialized: BOOL;
    FOffsetX: integer;
    FOffsetY: integer;

   //HalbTon: array[0..100] of Bool; <--das zuerst weggenommen knalls bei DIENOTEN

    //DieNoten: TSplitStrArray; <---das weggenommen peng bei NOTENNAME
    //NotenNamen: array[0..127] of string;

    DimmedCol: array[0..15] of COLORREF;
    IsDrum: array[0..15] of Bool;
    DrumNum: array[0..15] of integer;
    NotenNamen: array[0..127] of string;// jetzt hier hin gesetzt funct!??
auch der Versuch Public zu setzten je nach reihenfolge peng?

NORMAL IST DIES ABER NICHT

Gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Virtual Piano

  Alt 2. Jul 2011, 19:40
Kein ahnung was du machst.
Ich kann die reihenfolge setzen wie ich will da kracht nix.

Edit:
kann drehen wie ich will

Delphi-Quellcode:
    NotenNamen: array[0..127] of string;
    HalbTon: array[0..100] of Bool;
    DieNoten: TSplitStrArray;
gruss

Geändert von EWeiss ( 3. Jul 2011 um 00:21 Uhr)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Virtual Piano

  Alt 2. Jul 2011, 19:52
Delphi-Quellcode:
TMidiTracker = class
  private

    FHGrid: HWND;
    FWidth: integer;
    FHeight: integer;
    FTop: integer;
    FLeft: integer;
    Img: cardinal;
    dwStyle: DWORD;
    dwClass: PWideChar;
    IsInitialized: BOOL;
    FOffsetX: integer;
    FOffsetY: integer;

   //HalbTon: array[0..100] of Bool; <--das zuerst weggenommen knalls bei DIENOTEN

    //DieNoten: TSplitStrArray; <---das weggenommen peng bei NOTENNAME
    NotenNamen: array[0..127] of string;//<--wieder gesetzt!!!!!!

    DimmedCol: array[0..15] of COLORREF;
    IsDrum: array[0..15] of Bool;
    DrumNum: array[0..15] of integer;
    //NotenNamen: array[0..127] of string;// jetzt hier hin gesetzt funct!??
und peng! siehe Photo:
Das passiert ja währen der initialisierung!
Gruss
Miniaturansicht angehängter Grafiken
bereichpruefung.png  
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Virtual Piano

  Alt 2. Jul 2011, 19:57
Und kein Peng

Siehe oben angehängtes Foto.

PS:
Warum veränderst du jetzt alle Variablen Namen?

Wenn ich später da weiter Arbeiten will (möchte) finde ich keine
mir bekannte Function mehr.


gruss

Geändert von EWeiss ( 2. Jul 2011 um 20:00 Uhr)
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Virtual Piano

  Alt 2. Jul 2011, 21:29
Und kein Peng

Siehe oben angehängtes Foto.
Dann mach mal //HalbTon: array[0..100] of Bool; und dokumentiere mal halbton in Dragrid und PrintSidbar aus.
Soll ja nur zum Test sein, ob Du dann etwa in zeile 290 eine Fehlermeldung bekommst.

Obendrein sollst Du ja nicht von Deinem Rechner ausgehen.
Bei mir funct auch immer alles - aber wehe ich komm auf ein anderen Rechner. Sei es mit dem fertigen Prog oder mit den Quellcode, der mal überarbeitet werden soll

Egal, solange ich die original Reienfolge einhalte funct alles, aber wehe -siehe oben- . Dies gibt mir zu denken!!!!

Anbei:
Ich habe schon einiges vereinfachen können! Du hast manchmal unötiges gemacht.
Ich muss sowie so neue Proceduren schreiben. Die alten mach ich {} so
1. Grid[] wird dynamisch
2. werden die Daten so im Grid abgelegt wie die original MIDIFile
$0;$90;$76;$42;$97;$80,$00 als Beispiel
Somit kann man auch Akkorde in einem Track spielen, lautstärke für jede Note festlegen usw

Problem bei der ganzen Sache ist, das ich fast nichts nutzen kann von Dir, bis auf die Graphicroutinen und die muss ich auch anpassen

Wahrscheinlich ist es besser den MIDITRACKER gleich neu zu schreiben. Denn zur Zeit Doktore ich an zu vielen Stellen im jetztigen MidiTracker und dann kommt sowas raus siehe oben und such den Fehler. Der hat mir 3 Tage gekostet.
Und bleibt ein RÄÄÄÄTsel.

@NamenLozer:
Delphi-Quellcode:
 
{----------------in uGlobal.pas--------------}
type
  TSplitStrArray = array of string;
....
....
function Split(const Source, Delimiter: string): TSplitStrArray;
...
...

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;

{--------in uMidiTraker------------------------}
private
 DieNoten: TSplitStrArray;
...
...

procedure TMidiTracker.SplitNotes;
var
  IntA: integer;
  IntB: integer;
  IntC: integer;
  //mynoten: TSplitStrArray; <--war als test von mir

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;

end;
Problem ist solange alles in der Reihenfolge wie er es hat, funct es ja, aber wie oben beschrieben, sobald etwas nicht mehr in der Reihenfolge ist

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

geändert: peng
DieNoten: TSplitStrArray;
HalbTon: array[0..100] of Bool;
NotenNamen: array[0..127] of string;

Gruss alfold

Geändert von alfold ( 2. Jul 2011 um 21:31 Uhr)
  Mit Zitat antworten Zitat
Namenloser

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

AW: Virtual Piano

  Alt 2. Jul 2011, 21:08
Zitat:
Keine Ahnung warum dies so passiert!!!
Weil Privat und nicht public.. bzw.. weil ich aus einer Privaten Deklaration auf ein als Global definiertes Array zugreifen will
Das scheint sich nicht zu vertragen.
Aus einer privaten Deklaration auf ein globales Array zugreifen, sollte an sich funktionieren (ob es gutes Design ist, ist eine andere Frage). Man kann immer von niedrigeren Sichtbarkeitsstufen auf Elemente höherer Sichtbarkeitsstufe zugreifen. Nur umgekehrt geht es natürlich nicht, aber da meckert der Compiler schon rechtzeitig. Eine Zugriffsverletzung sollte auf keinen Fall auftreten können. Es muss an etwas anderem liegen.

Wie ist TSplitStrArray definiert? Und wie sieht Split() aus?
  Mit Zitat antworten Zitat
Antwort Antwort


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:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
Delphi-Forum.de - Array statisch/dynamisch oder TList fr Midi-Events This thread Refback 20. Sep 2011 15:59

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 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 by Thomas Breitkreuz