DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > Varargs | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2008-04-12, 18:28 h ZeroG Posts: 1487 User |
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; } [ - Answer - Quote - Direct link - ] |
2008-04-12, 20:06 h thomas Posts: 7718 User |
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/ [ - Answer - Quote - Direct link - ] |
2008-04-12, 21:00 h ZeroG Posts: 1487 User |
@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. ] [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Varargs | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |