Hallo,
ich habe grade versucht den folgenden Code auf einem Mega168 zu benutzen
1
#include"utils/strings.h"
2
3
unsignedcharitoa(unsignedintuiVal,char*pBuff)
4
{
5
unsignedcharucIndex=0;
6
unsignedcharucHelper=0;
7
unsignedcharucLenght=0;
8
9
charcDigit;
10
11
do
12
{
13
cDigit='0'+uiVal%10;
14
pBuff[ucIndex++]=cDigit;
15
}
16
while(uiVal/=10);
17
18
ucLenght=ucIndex;
19
pBuff[ucIndex--]=0;
20
21
while(ucHelper<ucIndex)
22
{
23
cDigit=pBuff[ucIndex];
24
pBuff[ucIndex--]=pBuff[ucHelper];
25
pBuff[ucHelper++]=cDigit;
26
}
27
28
returnucLenght;
29
}
Das Teil soll einfach einen Integer in einen ASCII String umwandeln. Das
hat auch mal funktioniert, als ich es in nem C++ Projekt benutzt habe.
Jetzt ist es in C-Projekt.
Allerdings bricht die obere while Schleife nicht ab. Ich hab mir per
UART mal uiVal ausgeben lassen und das ist irgendwann 0. Allerdings
scheint die Abbruchbedingung die Schleife absolut nicht zu kratzen. Der
rennt da fröhlich weiter drin rum und schreibt den RAM voll.
Ich bin langsam so durcheinander, dass ich vorne und hinten
verwechsel... Mal besser ne Pause machen.
Achso... Fragt mich nicht, warum ich nicht die stdlib.h nutze. Tu ich
gleich. Nur will ich jetzt einfach wissen, wieso der Scheiß da nicht
funktioniert grr
http://www.cplusplus.com/doc/tutorial/operators.html
Entweder da kommt bei mir oben was gleich 0 oder ungleich 0 raus.
Gleich 0: false
Ungleich 0: true
Aber damit wäre geklärt, warum das nicht geht. In C scheint das nicht so
zu sein ;)
edit:
Grade getestet.
Beispiel in C++:
Hmm... Nochmal editieren darf ich nicht ;)
So... Um nochmal Klarheit zu schaffen: Es ist eine C++ Eigenheit, dass
der Rückgabewert einer Zuweisung der rechtsseitige Wert der selbigen
ist. Somit funktioniert der Kram von mir da oben in C++ aber nicht in C.
Das is aber auch dreckig ;)
Andreas Galauner wrote:
> So... Um nochmal Klarheit zu schaffen: Es ist eine C++ Eigenheit, dass> der Rückgabewert einer Zuweisung der rechtsseitige Wert der selbigen> ist. Somit funktioniert der Kram von mir da oben in C++ aber nicht in C.> Das is aber auch dreckig ;)
??? Das ist doch in ANSI-C genau so. Eigentlich müsste die Routine
meiner Meinung nach funktionieren, wenn die Operationen korrekt
ausgeführt werden.
PS: Da der Mega-AVR Divisionen in Software ausführen muss, ist das kein
effizientes Verfahren zur Umwandlung.
Und warum heißt die Funktion eigentlich itoa, wenn du unsigned(!) int
umwandeln willst. Verwirrst du dich gern selbst?
Naja... Sie geht nicht ;)
Und ob effizient oder nicht is jetzt auch egal. Ich will nur wissen,
wieso das nicht funktioniert. Die einzige Erklärung die ich dazu hab ist
wirklich, dass aus der Zuweisung immer irgendwas != 0 rauskommt. Weiß
der Geier wieso.
>Und warum heißt die Funktion eigentlich itoa, wenn du unsigned(!) int>umwandeln willst. Verwirrst du dich gern selbst?
Verwirrt mich nicht. Ich hab ja ne Parameterliste ;)
Jörg Wunsch wrote:
> Du weißt aber, dass es ein itoa() in der Bibliothek gibt?
Ich zitier mich mal selbst:
>Achso... Fragt mich nicht, warum ich nicht die stdlib.h nutze. Tu ich>gleich. Nur will ich jetzt einfach wissen, wieso der Scheiß da nicht>funktioniert *grr*
Ich sehe keinen Grund, warum die Schleife nicht funktionieren sollte. Ob
C oder C++, es gilt immer noch, dass alle assign-ops den abschliessenden
Wert der linken(!) Seite wiederspiegeln, und das in diesem Zusammenhang
bekanntere "++i" ist exakt äquivalent zu "i += 1".
Im Simulator von AVR Studio bricht bei mir die Schleife ab. (testwerte
0, 10, 1234).
Welche Revision des Compilers benutzt du denn? Vielleicht gibt es da ja
einen bereits dokumentierten Bug.
>Das sollte ja dann gehen. Ich hab aber schon öfter bemerkt, dass der GCC>eine Warnung ausgiebt, wenn man sowas schreibt:>if(a = b) {
Jupp, dann sollte man weitere Klammern setzen:
if((a = b)) {
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.