ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > PubScreenNode auswerten... | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
11.12.2007, 15:39 Uhr Der_Wanderer Posts: 1229 Nutzer |
Frage, warum funktioniert das nicht? "pubscreen.s" enthält den Namen des gewünschten Screens. Wenn er existiert, soll "found=True" fesetzt werden, ansonsten False. Der "Peek.s" Befehl extrahiert aus dem Pointer einen 0-terminierten String. Mein Prog fielgt um die Ohren mit einem Illegal Byte-Read. code:; check if the pubscreen exists, or open on frontmost screen found.l = False *psn.PubScreenNode = LockPubScreenList_() If *psn While *psn If *psnpsn_Nodeln_Name ; Die nächste Zeile geht nicht...warum nur? If pubscreen.s = Peek.s(*psnpsn_Nodeln_Name) Then found=True End If *psn = *psnpsn_Nodeln_Succ Wend UnlockPubScreenList_ End If -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
11.12.2007, 15:57 Uhr tboeckel Posts: 124 Nutzer |
@Der_Wanderer: Mach aus code:While *psn ein code:While *psnpsn_Nodeln_Succ Dann sollte es gehen. Du läufst über das Ende der Liste hinaus. [ - Antworten - Zitieren - Direktlink - ] |
11.12.2007, 16:25 Uhr Der_Wanderer Posts: 1229 Nutzer |
Nein, ich laufe nicht drüber hinaus. Die schleife läuft so lange bis *psn ein NULL Pointer wird. Es kann durchaus eine Node geben, bei der ln_Succ=NULL ist, nämlich die letzte. Die soll aber auch ausgewertet werden. -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
11.12.2007, 16:38 Uhr RhoSigma Posts: 67 Nutzer |
Was'n das fuern Basic-Dialekt (AmiBlitz ??) Naja, ln_Name ist jedenfals ein Langwort-Pointer, versuchs' mal mit peekl.s, falls es solche Unterscheidungen von der verwendeten Sprache ueberhaupt gemacht werden [ - Antworten - Zitieren - Direktlink - ] |
11.12.2007, 17:02 Uhr Der_Wanderer Posts: 1229 Nutzer |
Das ist Amiblitz, ja. Dort wird zwischen verschiedenen Pointer Typen nicht unterschieden. Das Peek.s ist schon richtig so. -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
11.12.2007, 18:01 Uhr kev Posts: 56 Nutzer |
Schaut euch mal den Aufbau einer Execliste an und er werdet wissen, wieso das nicht gehen kann. [ - Antworten - Zitieren - Direktlink - ] |
11.12.2007, 18:41 Uhr Der_Wanderer Posts: 1229 Nutzer |
@kev Wenn du schon so schlau bist, wäre es toll wenn du es uns Unwissenden auch verraten würdest. Ich glotze jetzt seit 5min auf die Node structure und mir fällt nichts auf, was ich oben falsch gemacht hätte. BTW, die Dereferenzierung in Amiblitz ist systaktisch anders als bei C. Also *psn ist immer der Pointer auf die Node. Und *psnNode wäre immer noch der Pointer auf die Node. Und *psnNodeln_Name ist der Pointer auf den Null-terminierten String. Daran liegt es nicht, falls du das vermutest. -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ Dieser Beitrag wurde von Der_Wanderer am 11.12.2007 um 18:49 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
11.12.2007, 18:49 Uhr kev Posts: 56 Nutzer |
Die Liste ist selber ein Teil der Liste (wird als Node eingehangen), daher ist die Lösung von tboeckel korrekt. Bilder gibt's im RKRM. EDIT: Aus <exec/lists.h> /* * Initialize a list header */ #define NEWLIST(x) { (x).lh_Head = (struct Node *) &(x).lh_Tail; (x).lh_Tail = NULL; (x).lh_TailPred = (struct Node *) &(x).lh_Head; } [ Dieser Beitrag wurde von kev am 11.12.2007 um 18:52 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
11.12.2007, 19:00 Uhr Der_Wanderer Posts: 1229 Nutzer |
Habe es auch gerade gesehen. Der Code müsste also eigentlich so heissen, oder?code:--; check if the pubscreen exists, or open on frontmost screen found.l = False *psl.List = LockPubScreenList_() If *psl ; did we get a list ? *psn.PubScreenNode = *psllh_Head While *psn If *psnpsn_Nodeln_Name If pubscreen.s = Peek.s(*psnpsn_Nodeln_Name) Then found=True End If *psn = *psnpsn_Nodeln_Succ Wend UnlockPubScreenList_ End If Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
11.12.2007, 22:26 Uhr Georg Posts: 107 Nutzer |
@Der_Wanderer: Nein. Ein Node ist gültig (also ein "echter" Eintrag in der Liste) wenn ln_Succ (ist dann gleichzeitig auch für ln_Pred so) ungleich NULL ist. Wenn z. B. in ner Liste genau ein Item/Eintrag drin ist, dann hat - der erste Node beim Durchgehen der Liste ln_Succ ungleich NULL, - der zweite Node ln_Succ = NULL, weil er kein echter Node ist sondern Teil der List Struktur und kennzeichnend für das Ende der Liste. Wenn die Liste genau zwei Items/Einträge hat, dann hat - der erste Node beim Durchgehen der Liste ln_Succ ungleich NULL, - der zweite Node beim Durchgehen der Liste ln_Succ ungleich NULL, - der dritte Node ln_Succ = NULL, weil er kein echter Node ist sondern Teil der List Struktur und kennzeichnend für das Ende der Liste. Wenn die Liste leer ist (also keine Items/Einträge enthält) dann hat die Liste trotzdem immer noch ein lh_Head der nicht NULL ist, sondern auf nen Node zeigt. Dieser Node hat dann aber natürlich ein ln_Succ das NULL ist und somit bedeutet das es kein echter Eintrag ist, sondern das Ende der Liste bedeutet. In C sieht geht man die Einträge einer Liste dann z. B. so durch: C code:node = list->lh_Head; while (node->ln_Succ) { [...] node = node->ln_Succ; } Bei pubscreens etwa so (google -> dopus4 source): C code:if((pubscreenlist = LockPubScreenList())) { pubscreen = (struct PubScreenNode *)pubscreenlist->lh_Head; while(pubscreen->psn_Node.ln_Succ) { if(Stricmp(pubscreen->psn_Node.ln_Name, "Workbench") != 0 && Strnicmp(pubscreen->psn_Node.ln_Name, "DOPUS.", 6) != 0 && pubscreen->psn_Screen->Width >= 640 && pubscreen->psn_Screen->Height >= 480 && pubscreen->psn_Screen->RastPort.BitMap->Depth > 1) { sprintf(namebuf, "%s:%s", pubscreen->psn_Node.ln_Name, cfg_string[STR_SCREEN_MODE_USE]); count += addscreenmode(namebuf, 640, 480, pubscreen->psn_Screen->Width, pubscreen->psn_Screen->Height, pubscreen->psn_Screen->Width, pubscreen->psn_Screen->Height, pubscreen->psn_Screen->RastPort.BitMap->Depth, MODE_PUBLICSCREENUSE); } pubscreen = (struct PubScreenNode *)pubscreen->psn_Node.ln_Succ; } UnlockPubScreenList(); } Man kann sich die Sache auch durch Makros erleichtern z. B.: C code:#define ForeachNode(list, node) for ( node = (void *)(((struct List *)(list))->lh_Head); ((struct Node *)(node))->ln_Succ; node = (void *)(((struct Node *)(node))->ln_Succ) ) [...] ForeachNode(list, node) { printf("%sn", node->ln_Name); } [ - Antworten - Zitieren - Direktlink - ] |
11.12.2007, 23:05 Uhr Der_Wanderer Posts: 1229 Nutzer |
Oha. Danke. Das wusste ich nicht. Man hat also so eine Art "End"-Node. -- Thilo Köhler, Author von: HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr... Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
12.12.2007, 16:58 Uhr Holger Posts: 8116 Nutzer |
Zitat:Das gilt für den Beginn (wenn man z.B. rückwärts iteriert) genauso. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > PubScreenNode auswerten... | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |