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

amiga-news.de Forum > Programmierung > C va_ [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

28.12.2009, 19:44 Uhr

MaikG
Posts: 5172
Nutzer
Muss man bei va_start zwangsläufig der Funktion die Anzahl der ... Parameter selbst übergeben? Ist ziemlich unbequem.
Oder gehts auch nach dem prinzip lesen bis 0 kommt?

[ - Antworten - Zitieren - Direktlink - ]

28.12.2009, 19:53 Uhr

thomas
Posts: 7718
Nutzer
Zitat:
die Anzahl der ... Parameter

Hääh ?????

va_start bekommt die va_list und den letzten statischen Parameter.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

28.12.2009, 20:17 Uhr

MaikG
Posts: 5172
Nutzer
Zitat:
Original von thomas:

Hääh ?????

va_start bekommt die va_list und den letzten statischen Parameter.

Gruß Thomas


In den Beispielen die ich fand sieht das etwa so aus:

void function (int count, ...)
{
va_list ap;
va_start(ap, count);
while (--count >0)
{
...
}

das sieht für mich so aus als sei count die Anzahl der anderen Parameter, weil count runtergezählt wird?

[ - Antworten - Zitieren - Direktlink - ]

29.12.2009, 22:35 Uhr

whose
Posts: 2156
Nutzer
@MaikG:

Ja, im Grunde ist das wohl so... das Dumme an "..." ist, daß man eben nicht feststellen kann, wie viele Parameter bei einem Funktionsaufruf tatsächlich übergeben wurden, es sei denn, man gibt der aufgerufenen Funktion irgendwie die Information mit, wann die Parameterliste denn zu Ende ist. In diesem Fall wurde das wohl mittels "count" erledigt. Man könnte das auch mit einem Parameter machen, der "0" enthält, was aber nur sehr selten wirklich sinnvoll ist. Daher gibt man meistens einen Argument-Zähler mit, über den die aufgerufene Funktion dann die tatsächliche Anzahl der Parameter ermitteln kann.
--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

29.12.2009, 22:54 Uhr

tboeckel
Posts: 124
Nutzer
Zitat:
Original von whose:
Ja, im Grunde ist das wohl so... das Dumme an "..." ist, daß man eben nicht feststellen kann, wie viele Parameter bei einem Funktionsaufruf tatsächlich übergeben wurden, es sei denn, man gibt der aufgerufenen Funktion irgendwie die Information mit, wann die Parameterliste denn zu Ende ist. In diesem Fall wurde das wohl mittels "count" erledigt. Man könnte das auch mit einem Parameter machen, der "0" enthält, was aber nur sehr selten wirklich sinnvoll ist. Daher gibt man meistens einen Argument-Zähler mit, über den die aufgerufene Funktion dann die tatsächliche Anzahl der Parameter ermitteln kann.


Die Frage ist, ob man die Anzahl der Parameter wirklich wissen muss.

Für Taglisten braucht man das zB nicht, da es ein definiertes Ende gibt und die Anzahl der Parameter irgendwas größer oder gleich Eins (wegen TAG_DONE) sein kann.

Für printf()-ähnliche Funktionen ebenfalls nicht. Die Anzahl der nötigen Parameter ergibt sich aus der Anzahl der Platzhalter. Gibt man mehr Parameter an werden die ignoriert, weniger führen zu Müll in der Ausgabe. Gute Compiler (zB GCC 4.x) erkennen zuwenige Parameter und meckern beim Übersetzen.

Das eigentliche Problem scheint aber eher das übliche zu sein: MaikG fragt ähnlich wie AGSzabo ziemlich zusammenhangslos und ohne vollständigen Beispielcode. Niemand weiß welchen Sinn und Zweck die "count" Variable in seinem Beispiel wirklich hat. Nur weil die Variable "count" heißt, bedeutet das nicht automatisch, daß sie in irgendeinem Zusammenhang mit der Anzahl der folgenden Parameter steht.

Üblicherweise holen sich Funktionen mit variablen Parametern solange Daten bis sie ein definiertes Ende finden (zB Taglisten) oder einfach so viele Daten wie sie brauchen (zB printf()). Alles andere hängt von der jeweiligen Implementierung ab und irgendein beliebiges Beispiel taugt mit Sicherheit nicht, um sich die generelle Funktionsweise von dort abzuschauen.

[ - Antworten - Zitieren - Direktlink - ]

30.12.2009, 01:09 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von tboeckel:
Zitat:
Original von whose:
Ja, im Grunde ist das wohl so... das Dumme an "..." ist, daß man eben nicht feststellen kann, wie viele Parameter bei einem Funktionsaufruf tatsächlich übergeben wurden, es sei denn, man gibt der aufgerufenen Funktion irgendwie die Information mit, wann die Parameterliste denn zu Ende ist. In diesem Fall wurde das wohl mittels "count" erledigt. Man könnte das auch mit einem Parameter machen, der "0" enthält, was aber nur sehr selten wirklich sinnvoll ist. Daher gibt man meistens einen Argument-Zähler mit, über den die aufgerufene Funktion dann die tatsächliche Anzahl der Parameter ermitteln kann.


Die Frage ist, ob man die Anzahl der Parameter wirklich wissen muss.


Doch, muß man ;)

Zitat:
Für Taglisten braucht man das zB nicht, da es ein definiertes Ende gibt und die Anzahl der Parameter irgendwas größer oder gleich Eins (wegen TAG_DONE) sein kann.

Nichts anderes als das habe ich ihm ja erklärt (man muß ein definiertes "Ende" haben). Ob er das versteht (bzw. verstehen will), steht auf einem anderen Blatt.

Zitat:
Für printf()-ähnliche Funktionen ebenfalls nicht. Die Anzahl der nötigen Parameter ergibt sich aus der Anzahl der Platzhalter. Gibt man mehr Parameter an werden die ignoriert, weniger führen zu Müll in der Ausgabe. Gute Compiler (zB GCC 4.x) erkennen zuwenige Parameter und meckern beim Übersetzen.

Nicht böse sein, aber Du versaust ihm gerade die Möglichkeit, das Prinzip variabler Parameterlisten in C zu verstehen (und zu akzeptieren). Letztendlich benötigt auch printf() einen Parameter-Zähler. Es spielt keine Rolle, ob es sich bei diesem Zähler um eine numerische Variable oder ein char-Array handelt. Genauso ist es nicht gut, sich auf Implementierungsdetails der printf()-Funktion zu stützen ("... weniger führen zu Müll in der Ausgabe". Das kann auch anders ausgehen...)

Zitat:
Das eigentliche Problem scheint aber eher das übliche zu sein: MaikG fragt ähnlich wie AGSzabo ziemlich zusammenhangslos und ohne vollständigen Beispielcode.

Hm, möglicherweise tun wir ihm ausnahmsweise einmal Unrecht. Ich wollte zuerst auch in der Art von thomas antworten, bis mir einfiel, daß die "üblichen" Beispiele zu den variablen Parameterlisten zumeist einen simplen numerischen Zähler verwenden. Mit hoher Wahrscheinlichkeit handelt es sich in dem Beispiel von MaikG bei "count" um eben diesen Zähler.

Zitat:
Niemand weiß welchen Sinn und Zweck die "count" Variable in seinem Beispiel wirklich hat. Nur weil die Variable "count" heißt, bedeutet das nicht automatisch, daß sie in irgendeinem Zusammenhang mit der Anzahl der folgenden Parameter steht.

Stimmt schon, aber der Zusammenhang läßt mich eher darauf schließen, daß er nach einer Möglichkeit suchte, den Parameter-Zähler "irgendwie" zu umgehen. Es wird ihm nicht gefallen, daß das nicht so einfach geht (bzw. daß z.B. ein "0"-Parameter als Ende-Kennzeichen durchaus eine Menge Nachteile haben kann), aber es ist seine Sache, wie er mit den Tatsachen letztendlich umgeht ;)

Zitat:
Üblicherweise holen sich Funktionen mit variablen Parametern solange Daten bis sie ein definiertes Ende finden (zB Taglisten) oder einfach so viele Daten wie sie brauchen (zB printf()). Alles andere hängt von der jeweiligen Implementierung ab und irgendein beliebiges Beispiel taugt mit Sicherheit nicht, um sich die generelle Funktionsweise von dort abzuschauen.

Hm? Die Funktionsweise der va_-"Dinger" ist nicht implementierungsabhängig. Es wird auch immer ein definiertes "Ende" benötigt, ansonsten gibt's Ärger. Ich meine, es kann nicht gut gehen, wenn man sich aus dem Speicherbereich hinauswagt, der einem "gehört", selbst, wenn es "nur" ein Lesezugriff ist. Ganz abgesehen von Werten, die man liest, obwohl man das eigentlich besser ließe...

Die Implementierung der Verwendung der va_-"Dinger" selbst ist hingegen durchaus von Bedeutung, da hast Du Recht.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 30.12.2009 um 01:14 Uhr geändert. ]

[ Dieser Beitrag wurde von whose am 30.12.2009 um 01:21 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

30.12.2009, 10:53 Uhr

MaikG
Posts: 5172
Nutzer
Okay, danke.

Also mit Zähler oder NULL als Abschluss.
Nicht berauschend unter einer anderen Programmiersprachen hab
ich eine Funktion gesehen die jene ... Anzahl zurückgibt.

Der Sinn war alles übersichtlicher zu gestalten, aber die Funktion
ist leider nicht so toll wie gedacht. Das würde mit einem Array
dann besser aussehen.

[ - Antworten - Zitieren - Direktlink - ]

30.12.2009, 13:53 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MaikG:
Der Sinn war alles übersichtlicher zu gestalten, aber die Funktion
ist leider nicht so toll wie gedacht. Das würde mit einem Array
dann besser aussehen.

In dem Punkt ist C konsistent: weder bei varargs, noch bei arrays bekommt man eine Längeninformation.

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

[ - Antworten - Zitieren - Direktlink - ]

30.12.2009, 14:18 Uhr

Thore
Posts: 2266
Nutzer
Wieso soll die Funktion schlecht sein?
Intern wird ein Stack benutzt, und der ist (rein theoretisch) unendlich. Also braucht man entweder die Anzahl oder ein Ende-Wert (meist NULL). Eine Funktion die die Anzahl zurückgibt macht dein Code nicht kleiner und schneller, und übersichtlicher auch nicht unbedingt.
Bis zu NULL oder Anzahl durchiterieren ist daher schon eine gute Lösung.

Innerhalb Funktionen ist mir bei C nichts vergleichbares bekannt, nur beim Übergeben von Variablen über den Programmaufruf, aber das ist eine andere Baustelle.

[ - Antworten - Zitieren - Direktlink - ]

01.01.2010, 13:57 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Thore:
Eine Funktion die die Anzahl zurückgibt macht dein Code nicht kleiner und schneller, und übersichtlicher auch nicht unbedingt.

Kommt drauf an, wie die Programmiersprache es implementiert. Wenn die Information, die ja an Aufrufstelle bekannt ist, durchgereicht wird, ist das durchaus effizienter als die Information durch Iterieren erneut zu ermitteln.

Wenn man wirklich nur exakt eine Iteration ohne vorheriges Wissen über die Länge benötigt, mag bei NULL o.ä. zu terminieren ausreichen. Aber schon bei den trivialsten Fällen muss man i.A. mehrfach iterieren, weil man die Länge doch schon vor der eigentlichen Arbeit benötigt, wie z.B. zum Anlegen eines Pufferspeichers.

--
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 > C va_ [ - Suche - Neue Beiträge - Registrieren - Login - ]


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