amiga-news 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: %ld\n", 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: 7716
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:
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. ]

[ - 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.
.