Types Problem, ich dreh durch...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Mr Hopp

Betreff: Types Problem, ich dreh durch...

BeitragMo, Dez 12, 2005 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ich hab nun wirklich genug Erfahrung mit Types um mich zu wundern und zu schämen, wie das sein kann, folgender Code zum laden einer Datei in einen Array:

Code: [AUSKLAPPEN]
i=1

While ReadFile("Lieder\"+WgPfad$+"Stimme"+i+".txt") <> 0
Lesen = ReadFile("Lieder\"+WgPfad$+"Stimme"+i+".txt")

Lied\Stimme = Last TStimme
Lied\Stimme = New TStimme
Lied\Stimmanzahl = Lied\Stimmanzahl + 1

While Not Eof(Lesen)

Lied\Stimme.TStimme\XNote.TNote = Last TNote
Lied\Stimme.TStimme\XNote.TNote = New TNote

Lied\Stimme.TStimme\Noten_ges = Lied\Stimme.TStimme\Noten_ges + 1
Lied\Stimme.TStimme\aktuelle_n = Lied\Stimme.TStimme\aktuelle_n + 1

Lied\Stimme.TStimme\XNote.TNote\Oktave = ReadByte(Lesen)
Lied\Stimme.TStimme\XNote.TNote\Hoehe = ReadByte(Lesen)
Lied\Stimme.TStimme\XNote.TNote\Laenge = ReadByte(Lesen)
Lied\Stimme.TStimme\XNote.TNote\Besonderheiten = ReadByte(Lesen)
Lied\Stimme.TStimme\XNote.TNote\Laut = ReadByte(Lesen)
Lied\Stimme.TStimme\XNote.TNote\Note_x = ReadByte(Lesen)
Lied\Stimme.TStimme\XNote.TNote\Note_y = ReadByte(Lesen)

Wend
CloseFile(Lesen)

i=i+1

Wend


Wer's für nötig hällt, die Schablonen:

Code: [AUSKLAPPEN]
Type TLied
   Field Stimme.TStimme
   Field Stimmanzahl
   Field aktuelle_s
End Type

Type TStimme
   Field XNote.TNote
   Field Noten_ges
   Field aktuelle_n
   Field lautstaerke
   Field tsp_punkt
   Field tw_punkt
End Type

Type TNote
   Field Oktave
      Field Hoehe
   Field Laenge
   Field Besonderheiten
    Field Laut
   Field Note_x
   Field Note_y
   Field notenlaenge
End Type


Nun hab ich mir nen minicode geproggt, um zu prüfen, wo die Daten so hinfließen (nach 3 Tagen Fehlersuche), das Lied soll 2 Stimmen haben, doch die zweite wird seltsamerweise vor die erste geladen, trotz LAST. Ich denke zwar nicht, das deswegen dieses komplexe Programm streikt, aber probieren kann man's ja Very Happy
 

CodeMaster

BeitragMo, Dez 12, 2005 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
[edit] Sekunde, ich hab Schwachsinn geschrieben.

[edit2] So. Ich weiß nicht, inwiefern das dein Problem beeinflussen wird, aber ich habe folgende Verbesserungsvorschläge:

1. Du brauchst nicht ständig "Lied\Stimme.TStimme\XNote.TNote\Oktave = ReadByte(Lesen)" schreiben, "Lied\Stimme\XNote\Oktave = ReadByte(Lesen)" reicht völlig aus.

2. Code: [AUSKLAPPEN]
Lied\Stimme = Last TStimme
Lied\Stimme = New TStimme
ist sinnlos. Dir ist bewusst, dass du pro Type-Eintrag jeweils nur eine Instanz eines weiteren Types speichern kannst? Bei Types handelt es sich nicht um Linkedlists. Konkret heißt das: Du hast nur eine TLied-Instanz, nur eine TStimme-Instanz und nur eine TNote-Instanz, welche du ständig überschreibst. Types kann man als globale, undimensionierte Arrays ansehen, d.h. es gibt einen Array von Lied-Types, einen Array von Stimme-Types und einen Array von TNote-Types. Sie zu verschachteln ist so einfach nicht möglich. Es werden zwar mehrere Stimmen-Instanzen erzeugt in deiner Schleife, aber in deiner Lied-Instanz wird unter dem Eintrag Stimme immer nur die aktuelle Instanz gespeichert.
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102
 

Mr Hopp

BeitragDi, Dez 13, 2005 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
also, das mit den umständlichen Type-Namen ist mir bekannt, das ist ein alter Code, den ich erst vor kurzen wieder aufgenommen habe, aber was meinst du mit nur einer Instanz??? Ich meine, mein Testlied klappt ja auch einstimmig (13 Noten).
 

CodeMaster

BeitragDi, Dez 13, 2005 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, dann jetzt eine kleine Lektion Grundwissen Types:

Wenn du ein Type definierst, definierst du damit im Hintergrund gleichzeitig einen Stack, auf den deine Type-Instanzen gelegt werden. Dieser Stack ist global und kann in jeder Unterfunktion abgerufen werden. Das heißt, egal wo du eine neue Type-Instanz (a.TTest = new TTest) erstellst, diese Instanz landet auf dem globalen TTest-Stack. Du kannst Types untereinander nicht einfach so verschachteln. Wenn du also in einem Type TTestA einen Link zu einem anderen Type definierst (Type TTestA : Field Blub.TTestB : End Type), kannst du darin genau eine Instanz von TTestB speichern (a.TTestA = new TTestA : a\Blub = new TTestB). Bei diesem Aufruf wurde eine neue Instanz von TTestB erstellt und in den TTestB-Stack gelegt. Gleichzeitig wurde in a\Blub das Offset auf dieses Objekt gesetzt.
Wenn du jetzt innerhalb einer Schleife unter a\Blub mehrere Instanzen von TTestB erstellst, wird immer nur das aktuelle Objekt unter a\Blub gepointert. Nichtsdestotrotz befinden sich auf dem TTestB-Stack alle deine in der Schleife erstellten TTestB-Objekte. Das gleiche passiert, wenn du in einer anderen TTestA-Instanz ein neues TTestB-Objekt speichern möchtest.
Ich glaube, vielen Type-Neulingen ist nicht klar, dass bei X.TClass X nur ein Pointer auf eine TClass-Instanz ist und dass egal bei welchem "new TClass"-Aufruf der TClass-Stack um ein TClass-Objekt erweitert wird.

[edit] Formatfehler behoben.
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102
  • Zuletzt bearbeitet von CodeMaster am Di, Dez 13, 2005 17:26, insgesamt einmal bearbeitet
 

Mr Hopp

BeitragDi, Dez 13, 2005 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
ok...klingt kompiliziert...aber dennoch, Noten durchspielen klappt ja, nur eben Stimmen tauschen nicht, da verstehe ich den Hintergrund nicht ganz...wie würde man denn dann einen solchen Code proggen??? Ich weis......Umstrukturieren *nicht schon wieder!!!*
 

Dreamora

BeitragDi, Dez 13, 2005 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, wenn du nicht vor dem Schreiben über seine Struktur sinnierst, wird es dir wohl noch häufiger passieren, dass du umstrukturieren musst ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Mr Hopp

BeitragDi, Dez 13, 2005 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
das Problem ist, es gibt kein anständiges Type-Tutorial, ich hab ja vorstellungen einer Struktur (die dann jewals nach meinem Wissenstand auch funktionieren müssten)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group