ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Varargs | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
12.04.2008, 18:28 Uhr ZeroG Posts: 1487 Nutzer |
Ich habe mich mal an meiner ersten varargs-Funktion probiert, aber irgendwie kommt am ende immer die falsche Zahl hinter Irgendwas: raus. Ich hab jetzt schon einige Zeit darüber nachgedacht, komme aber nicht auf die Lösung. Hat vielleicht jemand einen Tipp für mich? code:// gcc -Wall test.c -lauto #include <proto/exec.h> #include <proto/utility.h> #include <stdarg.h> #include <stdio.h> STRPTR PASPrintf(STRPTR, void *, CONST_STRPTR, void *); STRPTR VARARGS68K VPASPrintf(STRPTR, void *, CONST_STRPTR, ...); void main() { void *StringPool = 0; STRPTR test = 0; StringPool = IExec->AllocSysObjectTags(ASOT_MEMPOOL, ASOPOOL_MFlags, MEMF_ANY|MEMF_PRIVATE, ASOPOOL_Puddle, 2024, ASOPOOL_Threshold, 2016, TAG_DONE); test = IExec->AllocVecPooled(StringPool, 6); test[0] = 'T'; test[1] = 'E'; test[2] = 'S'; test[3] = 'T'; test[4] = 'n'; test[5] = 0; test = VPASPrintf(test, StringPool, "Irgendwas: %ldn", 122343); if(test) printf(test); else printf("NULL Zeiger!n"); IExec->FreeSysObject(ASOT_MEMPOOL, (APTR)StringPool); } STRPTR VARARGS68K VPASPrintf(STRPTR old, void *pool,CONST_STRPTR format, ...) { va_list ap; STRPTR ret = 0; void *args; va_startlinear (ap, format); args = va_getlinearva(ap, void *); ret = PASPrintf(old, pool, format, args); va_end(ap); return ret; } STRPTR PASPrintf(STRPTR old, void *pool, CONST_STRPTR format, void *args) { LONG size = 0; if(old) { IExec->FreeVecPooled(pool, old); old = NULL; } size = IUtility->SNPrintf(NULL, 1, format, args); old = IExec->AllocVecPooled(pool, size); if(old) IUtility->SNPrintf(old, size, format, args); return old; } [ - Antworten - Zitieren - Direktlink - ] |
12.04.2008, 20:06 Uhr thomas Posts: 7718 Nutzer |
Warum machst du es denn gleich so kompliziert ? Fang doch mit etwas einfachem an, bis du verstanden hast, wie's funktioniert. code:#include <stdio.h> #include <stdarg.h> #include <amiga_compiler.h> VARARGS68K void printargs (long n,...) { va_list ap; char **args; long i; va_startlinear (ap,n); args = va_getlinearva (ap,char **); for (i = 0; i < n; i++) { printf ("arg %ld = <%s>n",i+1,args[i]); } } int main (void) { printargs (3,"a","b","c"); return(0); } Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
12.04.2008, 21:00 Uhr ZeroG Posts: 1487 Nutzer |
@thomas:Zitat:Weil ich das gerade für ein Projekt brauche, und mir das drumherum gar nicht so kompliziert vorkommt... Zitat:Nachdem ich mir dein Beispiel angesehen habe ist mir wie Schuppen von den Augen gefallen. Bei PASPrintf() kommt als letzter Parameter ein Zeiger auf das erste Element eines Arrays von Zeigern an. Da muß ich natürlich VSNPrintf() benutzen und nicht SNPrintf(). Vielen dank für den Denkanstoß. [ Dieser Beitrag wurde von ZeroG am 12.04.2008 um 21:00 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Varargs | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |