Types Problem, ich dreh durch...
Übersicht

Mr HoppBetreff: Types Problem, ich dreh durch... |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
CodeMaster |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
[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
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.
Lied\Stimme = New TStimme |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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) | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group