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: 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: 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. -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
29.12.2009, 22:54 Uhr tboeckel Posts: 124 Nutzer |
Zitat: 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: Doch, muß man Zitat: 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: 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: 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: 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: 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 -- --- µA1 PPC 750GX-800 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: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: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. |