Suche Funktion
Suche Funktion
Hallöchen zusammen,
ich bin gerade dabei ein Konsolenprogramm für Dos nach Linux zu portieren. In den Quellen ist jetzt nur noch eine Funktion namens "__itoa" (integer to ascii), die dem gcc nicht gefällt (Dos-Quellen wurden unter Visual C++ erstellt).
Gibt es unter Linux eine vergleichbare Funktion, da __itoa wohl nur unter Windows existiert auf MS's Mist gewachsen scheint?
Thanks in advance
Boron
ich bin gerade dabei ein Konsolenprogramm für Dos nach Linux zu portieren. In den Quellen ist jetzt nur noch eine Funktion namens "__itoa" (integer to ascii), die dem gcc nicht gefällt (Dos-Quellen wurden unter Visual C++ erstellt).
Gibt es unter Linux eine vergleichbare Funktion, da __itoa wohl nur unter Windows existiert auf MS's Mist gewachsen scheint?
Thanks in advance
Boron
Re: Suche Funktion
Mach halt soetwas in der Art:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">char * my_itoa(int number)
{
char *result = malloc(20);
if (result != NULL)
snprintf(result, 20, "%d", number);
return result;
}</font><hr></pre></blockquote>
> da __itoa wohl nur unter Windows
> existiert auf MS's Mist gewachsen scheint ?
ANSI ist es auf keinen Fall <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">.
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">char * my_itoa(int number)
{
char *result = malloc(20);
if (result != NULL)
snprintf(result, 20, "%d", number);
return result;
}</font><hr></pre></blockquote>
> da __itoa wohl nur unter Windows
> existiert auf MS's Mist gewachsen scheint ?
ANSI ist es auf keinen Fall <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">.
Re: Suche Funktion
Hi,
laß die beiden Underscores weg (MS-Dummheit), und schon sollte es auch unter Linux klappen.
Gruß,
hjb
laß die beiden Underscores weg (MS-Dummheit), und schon sollte es auch unter Linux klappen.
Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?
Re: Suche Funktion
@hjb:
Das habe ich zuerst auch gedacht, ist aber nicht. Wahrscheinlich denkst Du gerade an atoi() (wie ich auch zuerst). Zu itoa habe ich aber keine man-Page oder sonst eine Referenz gefunden, selbst ein
find /usr/include -name "*.h" -print | xargs grep itoa
war ergebnisfrei. Sebastian hat schon recht...
Jochen
Das habe ich zuerst auch gedacht, ist aber nicht. Wahrscheinlich denkst Du gerade an atoi() (wie ich auch zuerst). Zu itoa habe ich aber keine man-Page oder sonst eine Referenz gefunden, selbst ein
find /usr/include -name "*.h" -print | xargs grep itoa
war ergebnisfrei. Sebastian hat schon recht...
Jochen
Re: Suche Funktion
Du mußt noch eine Headerdatai mit einbinden.
Das müßte eigentlich die stdlib.h oder die string.h sein.
Dann sollte es gehen.
Kann leider gerade nicht nachschauen, da ich hier keine Linuxkiste habe.
Das müßte eigentlich die stdlib.h oder die string.h sein.
Dann sollte es gehen.
Kann leider gerade nicht nachschauen, da ich hier keine Linuxkiste habe.
Re: Suche Funktion
Fällt mir gerade noch ein. Es könnte auch die ctype.h sein.
Re: Suche Funktion
@ Andreas
Zumindest bei glibc 2.2.3 gibt es definitiv *keine* itoa-Routine, wie ein rekursives grep über die Headers (genau wie bei Jochen) ergab - da kannst du includen was du willst, hilft alles nichts.
Man muss dazu auch wissen, dass itoa soweit ich weiss weder ANSI noch POSIX ist (sonst wäre es auch in der glibc implementiert worden).
Die Funktion ist aber selber nicht allzu schwer zu implementieren (s.o).
Zumindest bei glibc 2.2.3 gibt es definitiv *keine* itoa-Routine, wie ein rekursives grep über die Headers (genau wie bei Jochen) ergab - da kannst du includen was du willst, hilft alles nichts.
Man muss dazu auch wissen, dass itoa soweit ich weiss weder ANSI noch POSIX ist (sonst wäre es auch in der glibc implementiert worden).
Die Funktion ist aber selber nicht allzu schwer zu implementieren (s.o).
Re: Suche Funktion
man toascii
[...]
<b>int</b> (!) toascii (int c);
<b>DESCRIPTION</b>
<i>toascii() converts c to a 7-bit unsigned char value that fits into the ASCII character set, by clearing the high-order bits.</i>
[...]
Ist nicht ganz das was wir suchen.
Ich bleib immer noch bei snprintf.
[...]
<b>int</b> (!) toascii (int c);
<b>DESCRIPTION</b>
<i>toascii() converts c to a 7-bit unsigned char value that fits into the ASCII character set, by clearing the high-order bits.</i>
[...]
Ist nicht ganz das was wir suchen.
Ich bleib immer noch bei snprintf.
Re: Suche Funktion
Hi,
irgendwie hat das mit "snprintf" nicht hingehauen, also hab ich mir selbst was Wildes gebastelt.
Trotzdem danke.
Gruss Boron
irgendwie hat das mit "snprintf" nicht hingehauen, also hab ich mir selbst was Wildes gebastelt.
Trotzdem danke.
Gruss Boron
Re: Suche Funktion
@ Boron
Ein häufig gemachter Fehler bei einer eigenen itoa-Implementierung ist soetwas:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">char* itoa(int number)
{
char result[20];
snprintf(result, 20, "%d", number);
return result;
}</font><hr></pre></blockquote>
Das ist falsch, falsch, falsch und nocheinmal falsch.
Denn das Array wird beim Austreten aus der Routine zerstört, und folglich ist es undefiniert, auf was die zurückgegebene Adresse danach zeigt - aber auf jeden Fall *nicht* auf das Array !
Folglich ist es wichtig, dass man den Speicher wirklich durch malloc allociert und selbstverständlich überprüft, ob die Allocierung erfolgreich war.
Ganz gute Programmierer können jetzt noch argumentieren, dass man die in meinem Beispiel fest definierte Grösse von 20 Zeichen (abzüglich NULL-Character) für die Representierung eines int-Wertes auf andere Art und Weise verlässlich herausfinden könnte - aber auf die 7, 8 Bytes kommts nun auch nicht an <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">.
Ein häufig gemachter Fehler bei einer eigenen itoa-Implementierung ist soetwas:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">char* itoa(int number)
{
char result[20];
snprintf(result, 20, "%d", number);
return result;
}</font><hr></pre></blockquote>
Das ist falsch, falsch, falsch und nocheinmal falsch.
Denn das Array wird beim Austreten aus der Routine zerstört, und folglich ist es undefiniert, auf was die zurückgegebene Adresse danach zeigt - aber auf jeden Fall *nicht* auf das Array !
Folglich ist es wichtig, dass man den Speicher wirklich durch malloc allociert und selbstverständlich überprüft, ob die Allocierung erfolgreich war.
Ganz gute Programmierer können jetzt noch argumentieren, dass man die in meinem Beispiel fest definierte Grösse von 20 Zeichen (abzüglich NULL-Character) für die Representierung eines int-Wertes auf andere Art und Weise verlässlich herausfinden könnte - aber auf die 7, 8 Bytes kommts nun auch nicht an <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">.
Re: Suche Funktion
int itoa(int number, char* array)
{
...
}
ist auch nicht schlecht dann geht man auf nummer sicher das array schon von ausserhalb der funktion angelegt wurden ist und so keine missverständnisse bei der specher allokierung besteht.
Bei dem Vorschlag:
char* itoa(int number)
{
static char result[20];
snprintf(result, 20, "%d", number);
return result;
}
und was macht die funktion wenn jemand free(result) macht? dann schlägt jede weiterer versuch fehl, wenn die funktion ausgeführt wird. Oder was passiert bei
char* foo1;
char* foo2;
foo1 = itoa(10);
foo2 = itoa(20);
Der speicher von foo1 <b> und </b> foo2 ist verändert.
Bei char* itoa(int number) wer löscht den Speicher der dabei anfällt? Das ist so nicht klar.
{
...
}
ist auch nicht schlecht dann geht man auf nummer sicher das array schon von ausserhalb der funktion angelegt wurden ist und so keine missverständnisse bei der specher allokierung besteht.
Bei dem Vorschlag:
char* itoa(int number)
{
static char result[20];
snprintf(result, 20, "%d", number);
return result;
}
und was macht die funktion wenn jemand free(result) macht? dann schlägt jede weiterer versuch fehl, wenn die funktion ausgeführt wird. Oder was passiert bei
char* foo1;
char* foo2;
foo1 = itoa(10);
foo2 = itoa(20);
Der speicher von foo1 <b> und </b> foo2 ist verändert.
Bei char* itoa(int number) wer löscht den Speicher der dabei anfällt? Das ist so nicht klar.
Re: Suche Funktion
> Bei char* itoa(int number) wer löscht den
> Speicher der dabei anfällt? Das ist so
> nicht klar.
Der Programmierer.
Alternativ kann man ein itoa ja auch als Makro implementieren und alloca statt malloc benutzen, dann spart man sich die Speicher-Freigabe-Frage.
> Speicher der dabei anfällt? Das ist so
> nicht klar.
Der Programmierer.
Alternativ kann man ein itoa ja auch als Makro implementieren und alloca statt malloc benutzen, dann spart man sich die Speicher-Freigabe-Frage.
Re: Suche Funktion
Oh Mann, vier Semester Studium "Technische Informatik", und ich Depp mach genau den Fehler den Sebastian Ude ankreidet.
Klar wird das result array zerstört wenn ich auf die malloc Version verzichte. Wie konnte ich nur so blöd sein (*kopfpaarmalgegentischschlag*).
Gruss Boron
Klar wird das result array zerstört wenn ich auf die malloc Version verzichte. Wie konnte ich nur so blöd sein (*kopfpaarmalgegentischschlag*).
Gruss Boron