amiga-news 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:
Warum machst du es denn gleich so kompliziert ?
Weil ich das gerade für ein Projekt brauche, und mir das drumherum gar nicht so kompliziert vorkommt... I-)
Zitat:
Fang doch mit etwas einfachem an, bis du verstanden hast, wie's funktioniert.
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.
.