Forum: Compiler & IDEs itoa in eclipse-gcc


von Karl K. (leluno)


Lesenswert?

1
        b +=(pgm_read_bytex(http_entry[index].new_page_pointer+4)-48);
2
        itoa (var_array[b],var_conversion_buffer,10);

wird von codeRed fehlerlos compiliert.

erst beim debuggen stellt man fest, dass itoa gar nicht vorhanden ist.

in stdlib.h heißt es:
1
// Implementation of the non-standard 'itoa' and 'uitoa' functions,
2
// which support bases between 2 and 16 (2=binary, 10=decimal,
3
// 16=hexadecimal).
4
extern char * uitoa(unsigned int value, char *vstring, unsigned int base);
5
extern char * itoa(int value, char *vstring, unsigned int base);
6
7
#endif /* __STDLIB_H_INCLUDED */
8
9
/* end of <stdlib.h> */

wegen extern gibt es keine Fehlermeldung, aber auch kein brauchbares 
itoa.


Was soll das? Warum ist itoa in codeRed nicht enthalten und wie 
aktiviere ich es am sinnvollsten?

von Stefan R. (srand)


Lesenswert?

karl k. schrieb:
> erst beim debuggen stellt man fest, dass itoa gar nicht vorhanden ist.

Nein, das sollte lange vorher beim Linken einen Fehler werfen.

von Karl K. (leluno)


Lesenswert?

Der Dubugger zeigt die Fehlermeldung:
No source available for "itoa() at 0xab1c"

von Nase (Gast)


Lesenswert?

karl k. schrieb:
> Der Dubugger zeigt die Fehlermeldung:
> No source available for "itoa() at 0xab1c"

Ja, und? Keine Sourcen davon da, aber es reicht ja, wenn die 
Binaries in der Bibliothek liegen. Funktioniert also.

von Karl K. (leluno)


Lesenswert?

funktioniert leider nicht. Wie krieg ich die binaries aus der Bibliothek 
raus?

Ich habe jetzt eine itoa-Funktion neu eingebunden. Fehlermeldung 
conflicting types. Also das neue funktionierende itoa in x_itoa 
umbenannt. Das geht jetzt. Aber ich hätte gerne das defekte itoa aus der 
Bibliothek ganz raus.

von Dr. Sommer (Gast)


Lesenswert?

karl k. schrieb:
> funktioniert leider nicht.
> Aber ich hätte gerne das defekte itoa aus der
> Bibliothek ganz raus.
Woher weißt du dass es nicht funktioniert? Es ist schon sehr 
unwahrscheinlich, dass kaputter Code in einer libc landet.

von Rolf Magnus (Gast)


Lesenswert?

karl k. schrieb:
> funktioniert leider nicht. Wie krieg ich die binaries aus der Bibliothek
> raus?

Jetzt willst du sie auf einmal rauskriegen? Davor hast du behauptet, sie 
seien nicht drin, und du hast gefragt, wie du sie reinkriegst.

> Also das neue funktionierende itoa in x_itoa umbenannt. Das geht jetzt.
> Aber ich hätte gerne das defekte itoa aus der Bibliothek ganz raus.

So einfach eine einzelne Funktion aus der libc zu entfernen dürfte 
schwierig werden. Aber ich hab da so meine Zweifel, daß die wirklich 
kaputt ist. Wie rufst du sie denn auf, was erwartest du als Ergebnis und 
was passiert stattdessen?

von Karl K. (leluno)


Lesenswert?

das war der alte Aufruf der nicht funktionierte:
        itoa (var_array[b],var_conversion_buffer,10);

das ist der neue Aufruf der funktioniert:
         //setzt den Wert der Variable var_array[b] als string in
         //var_conversion_buffer ein.
        x_itoa (var_array[b],var_conversion_buffer,10);

Es funktioniert jetzt genauso wie es soll. Mit dem alten itoa ging es 
nicht.

Vielleicht ist itoa für 8bit anderst als für 32bit. Ich finde jedenfalls 
die Datei nicht, in der das alte itoa steht.

von Dr. Sommer (Gast)


Lesenswert?

karl k. schrieb:
> Vielleicht ist itoa für 8bit anderst als für 32bit.
Logischerweise ja.

karl k. schrieb:
> Ich finde jedenfalls
> die Datei nicht, in der das alte itoa steht.
Datei-Suchfunktion und "nm" verwenden.

von Karl H. (kbuchegg)


Lesenswert?

karl k. schrieb:

> Vielleicht ist itoa für 8bit anderst als für 32bit. Ich finde jedenfalls
> die Datei nicht, in der das alte itoa steht.


Welchen Datentyp hat denn var_array[b]?

Vielleicht willst du ja eigentlich auch nicht itoa verwenden sondern 
ltoa, weil var_array[b] ein long ist?

von leluno (Gast)


Lesenswert?

Karl Heinz schrieb:
> Welchen Datentyp hat denn var_array[b]?
1
char* itoa(int val, char *buf, int radix)
2
{
3
  char *p;
4
  unsigned u;
5
6
  p = buf;
7
  if(radix == 0)
8
  {
9
    radix = 10;
10
  }
11
  if(buf == NULL)
12
  {
13
    return NULL;
14
  }
15
  if(val < 0)
16
  {
17
    *p++ = '-';
18
    u = -val;
19
  }
20
  else
21
  {
22
    u = val;
23
  }
24
  utoa(u, p, radix);
25
26
  return buf;
27
}

Woran man alles denken muss. Das jetzt verwendete x_itoa macht aus einem 
int ein char-array. Bei einem 8-bitb itoa ist das vielleicht anders.

Ich danke jedenfalls für die wie immer hilfreichen Denkanstöße von 
allen.

Die Suche nach dem alten itoa habe ich aufgegeben. Wahrscheinlich ist es 
ein 8bit itoa aus lange zurückliegenden Programmierversuchen.

von Karl H. (kbuchegg)


Lesenswert?

leluno schrieb:

> Woran man alles denken muss. Das jetzt verwendete x_itoa macht aus einem
> int ein char-array. Bei einem 8-bitb itoa ist das vielleicht anders.

Es gibt kein 8_bit itoa.
Das i in itoa steht für 'int'.

> Die Suche nach dem alten itoa habe ich aufgegeben. Wahrscheinlich ist es
> ein 8bit itoa aus lange zurückliegenden Programmierversuchen.

Whrscheinlich ... ist es, dass der eigentliche Fehler in deinem Code zu 
suchen ist und nicht in itoa. itoa ist zu primtiv, so dass man davon 
ausgehen kann, dass die Implementierung korrekt ist.
Nur: von deinem Code zeigst du ja immer nur homöpathische Dosen. 
Irgendetwas gesichertes kann man darüber nicht aussagen. Zumal es ja 
noch nicht einmal sicher gestellt ist, dass überhaupt die Konvertierung 
das Problem ist. Das Problem könnte ja auch ganz woanders stecken und 
was du siehst, sind nur die Symptome, die dich (fälschlicherweise) in 
Richtung itoa lenken. Dass es mit deiner Version funktioniert, ist mir 
als Argument zu wenig, denn mit einer eigenen Version hast du 
grundsätzlich das Programm verändert und damit kann dann auch das 
Symptom gesprungen sein, weil zb das Speicherlayout anders ist.

Bei jemandem der so etwas ...
> erst beim debuggen stellt man fest, dass itoa gar nicht vorhanden ist.
... von sich gibt, gehe ich von allem aus, nur nicht davon, dass das 
mitgelieferte itoa fehlerhaft ist.

: Bearbeitet durch User
von leluno (Gast)


Lesenswert?

das mitgelieferte itoa ist mit Sicherheit nicht fehlerhaft. Da bei 
codeRed aber kein itoa mitgeliefert wird - ich habe jedenfalls mit der 
Windows-Suche keine Datei gefunden, die diese Funktion enthält - kann es 
sich nur um ein AVR-itoa handeln, welches bei der Anpassung von 
AVR-LCD-Text mit in den ARM-Code geraten ist.

Jedenfalls fällt der Fehler erst beim Debuggen auf, da das itoa - als 
source nicht vorhanden - nicht angesprungen wird.

Die Interpretation der Meldung
> No source available for "itoa() at 0xab1c"
als itoa  ist nicht vorhanden, ist vielleicht etwas laienhaft.Die
Schlussfolgerung, dass mit itoa irgendetwas nicht stimmt und dass man es 
suchen muss, scheint mir aber durchaus richtig zu sein.

Das Problem festzustellen, was an die Stelle 0xab1c geladen wurde, ist 
mit meinen Mitteln jedenfalls nicht zu lösen.

Ist aber auch egal, da es mit der Umbenennung einwandfrei funktioniert.

von leluno (Gast)


Lesenswert?

bei codeRed heißt es:
itoa() is non-standard library function which is provided in many other 
toolchains to convert an integer to a string. To ease porting, the 
LPCXpresso IDE provides two variants of this function in the Redlib C 
library....
char * itoa(int value, char *vstring, unsigned int base);
char * uitoa(unsigned int value, char *vstring, unsigned int base);

Vielleicht beruht der Fehler darauf, dass ARM-itoa eine signed Eingabe 
benötigt, aber nur unsigned geliefert wird?

von Oliver (Gast)


Lesenswert?

leluno schrieb:
> Vielleicht beruht der Fehler darauf, dass ARM-itoa eine signed Eingabe
> benötigt, aber nur unsigned geliefert wird?

Wir können jetzt noch ewig im Kreis rätseln. Fakt ist, daß die Annahmen 
des TO über die Ursache unsinning sind, und das Problem ganz woanders 
liegt, aber nicht in itoa.

Den Rest beantworten Glaskugel und Kafeesatz.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

leluno schrieb:

> ich habe jedenfalls mit der
> Windows-Suche keine Datei gefunden, die diese Funktion enthält

Das "Problem" ist, dass du anscheinend noch immer nicht begriffen hast, 
das etwas nur weil du keinen Source Code dafür hast, nicht 'nicht 
mitgeliefert' wird.

Dein itoa steckt in der Bibliothek, die automatisch immer mit 
dazugelinkt wird. Dort ist eine vorübersetzte Version davon enthalten. 
Wenn dem nicht so wäre, dann hätte der Linker bereits Schwierigkeiten, 
ein komplettes Programm zu erstellen.


> Jedenfalls fällt der Fehler erst beim Debuggen auf, da das itoa - als
> source nicht vorhanden - nicht angesprungen wird.
>
> Die Interpretation der Meldung
>> No source available for "itoa() at 0xab1c"
> als itoa  ist nicht vorhanden, ist vielleicht etwas laienhaft.Die
> Schlussfolgerung, dass mit itoa irgendetwas nicht stimmt und dass man es
> suchen muss, scheint mir aber durchaus richtig zu sein.

Die Schlussfolgerung ist einfach nur Unsinn.
Die Meldung des Debuggers bedeutet einfach nur, dass für itoa kein 
Quellcode (also in C-Source Code Form) vorhanden ist. Nicht mehr und 
nicht weniger. Und das ist nichts, was dich groß beunruhigen müsste. Das 
itoa wurde vom Compiler Hersteller compiliert und das Object Code File, 
zusammen mit vielen anderen, in eine Library gesteckt. Diese 
Vorgehensweise ist absoluter Usus. Oder kannst du in printf 
hinein-debuggen? Oder in malloc?

> Ist aber auch egal

Wenn es dir egal ist. Mir wäre es nicht egal.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

leluno schrieb:

> Vielleicht beruht der Fehler darauf, dass ARM-itoa eine signed Eingabe
> benötigt, aber nur unsigned geliefert wird?

Das zeigt eigentlich nur, wie wenig du noch vom C-Typsystem verstehst. 
itoa bzw uitoa können nicht unterscheiden, ob du ihnen einen signed int 
gibst oder nicht. In erster Linie kriegen die beiden einen int. Das ist 
erst mal das wichtigste, denn damit wird etwas darüber ausgesagt, wie 
groß die sizeof des Argumentes ist. Ob das Argument von der Funktion 
dann als signed int oder als unsigned int interpretiert wird, ist 
dahingehend dann erst die 2.te Frage. Ein Fehler bei der 
Argumentübergabe wirkt sich dahingehend aus, dass anstelle von negativen 
Zahlen, dann eben größere positive Zahlen generiert werden.
Was aber zb nicht egal wäre, wäre wenn man dem itoa einen long rein 
gibt. Denn dann kommt es tatsächlich zu ordentlichen Fehlern, weil der 
long auf einen int runter-gestrippt wird.

von Karl K. (leluno)


Lesenswert?

ok
ich habs jetzt noch mal ausprobiert:
1
u16 test=2456;
2
u8 str[20];
3
x_itoa(test,str,10);
4
lgw(11,1,str);
5
uitoa(test,str,10);
6
lgw(12,1,str);
7
itoa(test,str,10);
8
lgw(10,1,str);
 alle drei liefern das richtige Ergebnis. Der Fehler war offensichtlich 
in der Zeile unter itoa. Ich habe die Debugger-Meldung falsch 
interpretiert. Problem geklärt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.