DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > sprintf() problem auf MOS | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2005-10-03, 21:43 h DariusBrewka Posts: 899 [Banned user] |
ich habe mir einen Crosscompiler für MOS auf Linux installiert allerdings habe ich ein Problem mit der sprintf() funktion dass ich denke das die Standart include lib (Libnix) nicht so funktioniert wie Sie soll. Folgende Zeile:code:sprintf(Buffer,"%s.font", FontName); Fontname enthält nur den Namen des Fonts ohne Erweiterung, natürlich müsste bei FontName="Topaz" in Buffer danach "Topaz.font" stehen, aber unter MOS steht nur Müll drinne. Ich habe versuch es ohne Libnix zu compilieren, dann mekkert er aber dass er eine amigastubs.lib nicht finden kann, ich Allerdings auch nicht. Natürlich kann ich das obige auch mit strncpy() und strncat() machen, das ist aber nicht der Sinn der Sache und sprintf() benutze ich noch anderswo. Jemand einen Rat? gruss Darius [ - Answer - Quote - Direct link - ] |
2005-10-03, 23:44 h geit Posts: 332 [Former member] |
Da ich kein Freund von nicht eigenen Linkerdateien bin. ( Da ist man immer ausgeliefert und kann bei Fehlern nichts selbst beheben.) Daher hier meine Variante: #include <proto/exec.h> #include <exec/types.h> #include "SDI_misc.h" /* This structure keeps our sprintf vars during RawDoFmt() */ struct SPrintfStream { char *Target; ULONG TargetSize; }; /********************************************************************* ***** SPrintf_DoChar ********************************************************************** ****/ PUTCHARPROTO( SPrintf_DoChar, char c, struct SPrintfStream *s ) { *(s->Target++) = c; } /********************************************************************* ***** SPrintf ********************************************************************** ****/ ULONG SPrintf(char *target, char *format, ULONG *args) { struct SPrintfStream s; s.Target = target; RawDoFmt( format, args, ENTRY( SPrintf_DoChar), &s); return( s.Target - target); } Die Struktur wäre nicht nötig, aber ich hab 3 verschiedene Varianten der Routine, sowohl mit Längen als auch mit VarArgs und da ist das ganz praktisch. Ich hoffe das hilft weiter. Geit [ - Answer - Quote - Direct link - ] |
2005-10-04, 11:32 h thomas Posts: 7718 User |
@DariusBrewka: Also wenn man sprintf unter MorphOS benutzt (kompiliert), dann funktioniert es auch. Naja, hier ist meine selbstgemachte Variante: code:#include <proto/exec.h> #include <stdio.h> #include <stdarg.h> #if defined(__amigaos4__) char type[] = "AmigaOS4"; VARARGS68K void Sprintf (char *buffer,char *format, ... ) { va_list args; va_startlinear (args, format); RawDoFmt (format,va_getlinearva(args,void *),NULL,buffer); } #elif defined(__MORPHOS__) char type[] = "MorphOS"; void Sprintf (char *buffer,char *format, ... ) __attribute__((varargs68k)); void Sprintf (char *buffer,char *format, ... ) { va_list args; va_start (args, format); RawDoFmt (format,args->overflow_arg_area,NULL,buffer); } #else char type[] = "68k"; void Sprintf (char *buffer,char *format,...) { static ULONG putchproc[] = {0x16c04e75}; RawDoFmt (format,(&format) + 1,(APTR)putchproc,buffer); } #endif int main (void) { char buffer[100]; printf ("type = %sn",type); sprintf (buffer,"%ld %ld %ld %ld",1,2,3,4); printf ("clib = %sn",buffer); Sprintf (buffer,"%ld %ld %ld %ld",1,2,3,4); printf ("exec = %sn",buffer); return (0); } Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Answer - Quote - Direct link - ] |
2005-10-04, 12:36 h gni Posts: 1106 User |
Zitat:va_end fehlt... Zitat:Ditto.code:#elif defined(__MORPHOS__) char type[] = "MorphOS"; void Sprintf (char *buffer,char *format, ... ) __attribute__((varargs68k)); void Sprintf (char *buffer,char *format, ... ) { va_list args; va_start (args, format); RawDoFmt (format,args->overflow_arg_area,NULL,buffer); } Zitat:Das funktioniert mit GCC 3.4+ nicht mehr, wenn die Implementation von sprintf() sich in der selben Translation-Unit befindet wie die Nutzer der Funktion. Deshalb sollte man auch hier stdarg.h benutzen.code:#else char type[] = "68k"; void Sprintf (char *buffer,char *format,...) { static ULONG putchproc[] = {0x16c04e75}; RawDoFmt (format,(&format) + 1,(APTR)putchproc,buffer); } #endif Zudem sollte man einen Wrapperheader benutzen, der die unterschiedlichen Vorgehensweisen versteckt, zb. SDI_stdarg.h. Dann wirds zum einen lesbarer und zum anderen kommt man dann mit *einer* Funktion aus. [ - Answer - Quote - Direct link - ] |
2005-10-04, 23:56 h DariusBrewka Posts: 899 [Banned user] |
Hmm ist alles schön und gut lieber wäre mir jedoch eine Funktionierende standard library, wer weiss was da noch kaputt ist :-(, ich werde es dennoch ersteinmal mit einem der gegebenen Konstrukte verwenden und bedanke mich dafür. gruss [ - Answer - Quote - Direct link - ] |
2005-10-05, 01:32 h tokai Posts: 1071 User |
Da ist nichts kaputt, die frage ist vielmehr was du falsch machst. Ich hatte noch nie Probleme mit sprintf(), egal mit welcher libnix version. Vielleicht ist etwas mit deinem Compilersetup falsch? regards, tokai -- http://www.christianrosentreter.com ~ MorphOS Software [ Dieser Beitrag wurde von tokai am 05.10.2005 um 01:33 Uhr editiert. ] [ - Answer - Quote - Direct link - ] |
2005-10-05, 01:43 h tokai Posts: 1071 User |
code:--dev:tests> type sprintf.c #include <exec/types.h> #include <proto/exec.h> #include <proto/dos.h> #include <string.h> #include <stdio.h> int main(void) { STRPTR FontName = "topaz"; UBYTE buffer[64]; /* stdc lib style */ sprintf(buffer, "%s.fontn", FontName); printf(buffer); /* morphos style */ (void)NewRawDoFmt("%s.fontn", NULL, buffer, FontName); Printf(buffer); return 0; } dev:tests> gcc -W -Wall sprintf.c -o sprintf dev:tests> sprintf topaz.font topaz.font dev:tests> http://www.christianrosentreter.com ~ MorphOS Software [ - Answer - Quote - Direct link - ] |
2005-10-05, 09:13 h gni Posts: 1106 User |
Zitat:Er versucht ja gerade _ohne_ libnix auszukommen. Die amiga.lib für AmigaOS/68k enthält eben auch ein sprintf(), das RawDoFmt() benutzt und sowas will er anscheinend unter MOS benutzen. Wenn es soetwas gibt, in welcher Bibliothek? Zitat:Er schrieb was von "amigastubs" nicht gefunden. Gehört sowas zu MOS? [ - Answer - Quote - Direct link - ] |
2005-10-05, 10:00 h DariusBrewka Posts: 899 [Banned user] |
Naja ich würde schon lieber mit den Dateien arbeiten, welche zu MOS gehören, da ich diese ja auch unter AOS3.x, AOS4, AROS benutze eine Extrawurst für MOS möchte ich nicht machen, ggf. könnte ja mein Compilersetup falsch sein (http://www.lysator.liu.se/~lcs/files/gg-cross/) aber anders funktioniert es halt nicht, wenn man keinen Päg hat und da ist sprintf() bei mir nicht OK wenn es selbst an dieser simplen Zeile scheitert, bis zu dieser Zeile läuft Alles einwandfrei. Wie gesagt ohne Libnix wäre es auch OK, ist dann halt länger?, aber da habe ich die amigastubs.lib nicht und die gibt's soweit ich es herausgefunden habe nur auf einem älterem MOS-SDK, man kann's also vergessen. [ - Answer - Quote - Direct link - ] |
2005-10-05, 10:05 h DariusBrewka Posts: 899 [Banned user] |
Zitat: mag ja sein, dass es so funktioniert bei mir jedenfalls nicht (amigastubs) und so wird ja auch nicht Libnix verwendet bzw. muss man da nicht -noixemul und den Ganzen libnix Krempel eintragen? [ - Answer - Quote - Direct link - ] |
2005-10-05, 11:00 h tokai Posts: 1071 User |
@DariusBrewka: hast recht, hatte doch glatt den noixemul switch vergessen, das ändert aber nichts an der Tatsache, dass es einfach so funktioniert: code:dev:tests> gcc -W -Wall -noixemul sprintf.c -o sprintf dev:tests> sprintf topaz.font topaz.font dev:tests> Ich empfehle Dir, dein Setup entsprechend zu aktualisieren. Anstatt der amigastubs kannst du die aboxstubs verwenden (diese enthalten aber an sich nur die #?Tags versionen diverser #?TagList funktionen). Für libamiga nimmst du libabox. Am besten schaust du mal in das Compiler Specs file vom MorphOS SDK wie es dort gelöst ist und vergleichst mit deinem Setup. notfalls könnte sowas wie: -L/gg/ppc-morphos/lib -lc -labox -laboxstubs funktionieren. Alternativ einfach eine Mail an Martin schreiben, dass er das X-development kit entsprechend aktualisiert, das scheint wohl noch auf dem MorphOS 0.4 SDK zu basieren. Obwohl wir keine grösseren Probleme hatten es für das Crosskompilieren von OpenTTD auf einer 64bit-Linux maschine zu installieren (dort gabe es auch nur das Problem mit libamiga <-> libabox). sprintf() machte keine Probleme (und wird in OpenTTD auch verwendet). code:dev:openttd/trunk> grep -r "sprintf" * | wc -l 97 Und NewRawDoFmt() ist eine exec funktion, siehe clib/exec_protos.h. regards, tokai -- http://www.christianrosentreter.com ~ MorphOS Software [ - Answer - Quote - Direct link - ] |
2005-10-05, 11:08 h tokai Posts: 1071 User |
@gni:Zitat: Wieso verzichten? Wenn man die Library-Funktionen (RawDoFmt() bzw. NewRawDoFmt(), siehe mein Beispiel) nicht nutzen will, sollte man doch ruhig auf die Standard funktionen vertrauen. Sofern diese I/O-less sind, sehe ich da generell keine Probleme. Wobei ich es persönlich vorziehe, Amiga/MorphOS-API nicht mit std-API zu vermischen Aber jeder macht das so, wie er will: solange es sauber funktioniert ist es legitim. regards, tokai -- http://www.christianrosentreter.com ~ MorphOS Software [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > sprintf() problem auf MOS | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |