amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Tag-Listen, wie genau jetzt ?!?!? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

28.01.2003, 12:07 Uhr

westpdmkids
Posts: 168
Nutzer
Hi,

vielleicht ne doofe Frage :glow: , aber die Sache lässt mich doch an weiteren Programmieraufgaben scheitern, und zwar:
Kann mir jemand mal die Sache mit Tag-Listen mal ausführlicher erklären (Konzept/Anwendung/evtl Beispiel(e))?
Die RKMs sind ja nur in Englisch und im Guru-Buch sind die noch nicht drin :-(

Wär schön wenn mir da jemand helfen könnte.....

westpdmkids
--
Windows crashes to provide us with fresh air ...

[ - Antworten - Zitieren - Direktlink - ]

28.01.2003, 12:44 Uhr

thomas
Posts: 7718
Nutzer

Am besten geht das wohl am Vergleich OpenWindow() und OpenWindowTags()

Bei OpenWindow mußt du eine NewWindow-Struktur übergeben. Diese ist seit OS1.0 fest und nur sehr schwer durch neue Funktionen zu erweitern. Durch Taglisten wird die ganze Sache viel dynamischer. Taglisten sind sozusagen Schlüsselwortparameter, d.h. du übergibst nur die Werte, die dir wichtig sind und wenn neue Funktionen verfügbar sind, werden die halt durch neue Tags repräsentiert, ohne ältere Programme ändern zu müssen.

Beispiele:

alt:

struct NewWindow nw;
struct Window *win;

nw.LeftEdge = 10;
nw.TopEdge = 10;
nw.Width = 100;
nw.Height = 50;
/* u.s.w. */
win = OpenWindow (&nw);

neu:

struct Window *win;

win = OpenWindowTags (NULL,
WA_Left,10,
WA_Top,10,
WA_Width,100,
WA_Height,50,
/* u.s.w., falls nötig */
TAG_END);

oder:

struct TagItem tags[5];
struct Window *win;

tags[0].ti_Tag = WA_Left;
tags[0].ti_Data = 10;
tags[1].ti_Tag = WA_Top;
tags[1].ti_Data = 10;
tags[2].ti_Tag = WA_Width;
tags[2].ti_Data = 100;
tags[3].ti_Tag = WA_Height;
tags[3].ti_Data = 50;
tags[4].ti_Tag = TAG_END;

win = OpenWindowTagList (NULL,&tags[0]);

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

28.01.2003, 12:53 Uhr

westpdmkids
Posts: 168
Nutzer
Also, seh ich das richtig, das Tag-Listen im Groben eigentlich sone Art Kombination aus Struktur & Datenfelder darstellen, oder seh ich das da falsch ?
--
Windows crashes to provide us with fresh air ...

[ Dieser Beitrag wurde von westpdmkids am 28.01.2003 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

28.01.2003, 14:35 Uhr

thomas
Posts: 7718
Nutzer

Eine Taglist ist einfach eine Folge von Langworten (ein Array) im Speicher. Jeweils zwei gehören zusammen. Das erste ist das Schlüsselwort und das zweite der Wert dazu. Das Schlüssenwort TAG_END kennzeichnet das Ende der Liste. Die Funktion bekommt einen Zeiger auf den Anfang der Liste.

In C gibt es sog. VarArgs, d.h. es kann eine variable Anzahl Argumente übergeben werden. Taglisten machen sich dies zunutze. Da die Tag-Worte in der richtigen Reihenfolge auf dem Stack übergeben werden, kann die Stub-Funktion (OpenWindowTags) der Library-Funktion (OpenWindowTagList) einfach einen Pointer auf das erste Argument übergeben.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

28.01.2003, 15:52 Uhr

westpdmkids
Posts: 168
Nutzer
Achso, glaub jetzt hab ichs gerafft (freu :bounce: )

Wenn ich das also richtig verstanden habe,
würde in Deinem Beispiel:

--schnipp---
tags[2].ti_Data = 100;
tags[3].ti_Tag = WA_Height;
tags[3].ti_Data = 50;
tags[4].ti_Tag = TAG_END
--schnapp----

ein
tags[4].ti_Data = NULL;
theoretisch folgen (da da ja nix mehr gelesen werden müsste), oder ?

Gut. Dankeschön für Deine Hilfe :)

--
SiegNatur

[ Dieser Beitrag wurde von westpdmkids am 28.01.2003 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

28.01.2003, 18:06 Uhr

thomas
Posts: 7718
Nutzer

tags[4].ti_Data ist egal, da TAG_END schon das Ende der Liste kennzeichnet und keinen Wert braucht.

Du könntest auch schreiben:

ULONG tags[] = {WA_Left,10,WA_Top,10,WA_Width,100,WA_Height,50,TAG_END};

Die Methode mit struct TagItem ist nur sicherer, weil damit sichergestellt ist, daß die Worte immer paarweise auftreten. Wenn du z.B. sowas schreibst, kommt nur Schrott bei raus:

ULONG tags[] = {WA_Left,WA_Top,10,WA_Width,100,WA_Height,50,TAG_END};

Besonders bei Flags, wie z.B. WA_Backdrop vergißt man leicht, daß man den Wert (z.B. TRUE) noch mit angeben muß.

Ich bevorzuge die Methode mit dem Stub (OpenWindowTags), weil ich mir da keine Gedanken über Arrays und so machen muß. Ich schreibe einfach drauf los, alles in den Funktionsaufruf rein. Wenn ich was vergesse, kann ich es einfach ergänzen, ohne meine Variable suchen zu müssen. Hier gilt allerdings das gleiche Problem mit dem Vergessen von Werten.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

29.01.2003, 13:00 Uhr

mrbbc
Posts: 101
Nutzer
Zitat:
Original von thomas:

Eine Taglist ist einfach eine Folge von Langworten (ein Array) im Speicher. Jeweils zwei gehören zusammen. Das erste ist das Schlüsselwort und das zweite der Wert dazu. Das Schlüssenwort TAG_END kennzeichnet das Ende der Liste. Die Funktion bekommt einen Zeiger auf den Anfang der Liste.

In C gibt es sog. VarArgs, d.h. es kann eine variable Anzahl Argumente übergeben werden.


Da muss man etwas weiter ausholen... man kann variabele Argumentlisten definieren über die sog. Parabel: "..." (und den zugehörigen va_arg-Makros)

Nehmen wir das einfachste Beispiel:

void printf(const char* format, ...);

Ein erster Parameter ist obligatorisch. Für "..." kann man beliebig viele Parameter anhängen oder auch gar keinen. Wieviele Parameter es aber sind, kann man nur durch Vereinbarungen feststellen.

Bei printf() sind es z.B. die im Formatstring gefundenen Argumente wie %s oder %f, die die Zahl und Art der folgenden Parameter bestimmt - der totale Schutz vor Programmabstürzen (=> Stacklänge !)...

Oder aber das letzte Argument hat z.B. 0 oder -1 zu sein. Dafür gibt es hier auch TAG_END.

Der Nachteil von Taglisten als Funktionsparameter ist, dass lange Argumentlisten langsamer sind; die Übergabe von struct-pointern geht schneller, aber nicht unbedingt übersichtlich.

Taglisten haben den Vorteil, dass man weiss, welche Parameter gesetzt wurden, bei structs muss man alle verwendeten Elemente initialisieren; diejenigen, die man nicht braucht, mit den Defaultwerten.

[ - Antworten - Zitieren - Direktlink - ]

31.01.2003, 21:51 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Ich bevorzuge die Methode mit dem Stub (OpenWindowTags), weil ich mir da keine Gedanken über Arrays und so machen muß. Ich schreibe einfach drauf los, alles in den Funktionsaufruf rein. Wenn ich was vergesse, kann ich es einfach ergänzen, ohne meine Variable suchen zu müssen. Hier gilt allerdings das gleiche Problem mit dem Vergessen von Werten.


Dazu sollte man allerdings im Hinterkopf haben, daß die Annahme, daß alle Parameter linear und in der richtigen Reihenfolge auf dem Stack liegen, zwar für den 680x0 richtig ist, es aber für PPC schon ganz anders aussieht. Man kann davon ausgehen, daß es für die Sourcecode-Kompatibilität sowohl für MorphOS als auch für AmigaOS 4 entsprechende PPC-Versionen dieser Stubs gibt, was diese dann im Hintergrund erledigen müssen, ist aber mehr als bei der 68k Version.
Außerdem wird bei diesem dynamischen Aufruf vorher erst einmal diese Liste auf den Stack kopiert, obwohl die meisten Daten statischer Natur sind. In Hinblick auf Effizienz sind diese Varargs-Stubs also nicht zu empfehlen.

mfg


--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

06.02.2003, 15:31 Uhr

westpdmkids
Posts: 168
Nutzer
Stubs ? Hat bestimmt nix mit Nasen zu tun, oder ? ;)

Sorry das ich so dumm frage, aber anscheinend fehlt mir doch mehr Wissen als ich dachte :-(
--
SiegNatur

[ - Antworten - Zitieren - Direktlink - ]

06.02.2003, 15:49 Uhr

Holger
Posts: 8116
Nutzer
Stubs sind Funktionen, die i.A. nichts selbst tun, sondern die Aufgabe an die eigentliche Funktion weiterleiten.
Im Falle von TagLists gibt es für die meisten OS-Funktionen, die einen TagList-Pointer erwarten, eine Stub-Funktion, die alle TagItems als Parameter erwartet:
Also für OpenXXXTagList(TagListPtr) gibt es dann OpenXXXTags(...) mit beliebig vielen Parametern, die die TagList dynamisch anlegt und dann an OpenXXXTagList weiterleitet.
Das ist in einigen Fällen leichter zu schreiben und lesen, aber meist auch ineffizienter, was aber bei vielen Operationen insb. Fensteröffnen keine große Rolle spielt.

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 > Tag-Listen, wie genau jetzt ?!?!? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.