amiga-news 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 :dance3:

[ - 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:
Original von Der_Wanderer:
Oha. Danke. Das wusste ich nicht.
Man hat also so eine Art "End"-Node.

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.
.