PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Int wert in String umwandeln, aber wie?



Steilheckull
11.02.2008, 10:41
Hi,
ich möchte am A/D Wandler im ATmega16 einen Analogwert einlesen und diesen auf einem Display ausgeben. Der Wert steht als uint16_t zur Verfügung und soll in einen string umgewandelt werden.
Dazu habe ich folgenden Tip von einem Kollegen bekommen:


unsigned int int_to_char (uint16_t a)

{
unsigned int b;

itoa(a,b,10);
return b;
}

Der return Wert ist immer null...
auch wenn ich den Wert für a direkt in dem Programmteil von Hand zuweise.
Was mache ich falsch?

Gruß Ulli

Ceos
11.02.2008, 11:31
itoa(int a, char* b, in len);

heisst a ist der wert, b ist ein zeiger auf ein string (char-array) und die länge gibt die maximale länge des strings an!

1024 sollte maximalewert sein also reicht ne länge von 4

void int_to_char (uint16_t a, char* target)

{

itoa(a,target,5);
}

und in der main dann irgendwo:

...
char myString[5]; // 5 hier weil ein String immer 0 terminiert ist
int_to_char(ADC, myString); // beachte da myString als Array definiert ist
// ist der Bezeichner myString OHNE "[]" automatisch ein pointer
...

und myString kannste dann einfach versenden

PS: OT: ich mag stufenheck auch lieber ... deshalb iss mein auto schon 17 jahre alt ... die neuen sehen alle aus wie gelutschte bonbons

Hubert.G
11.02.2008, 11:33
Sollte es nicht so heißen
unsigned int b[6];
Für eine max. 6 stellige Anzeige.

fumir
11.02.2008, 11:50
gib bei google "itoa" ein und lies dir durch was dieser befehl macht, und wie er es macht (d.h. welche parameter man übergeben muss)!

fluchtpunkt
11.02.2008, 11:50
itoa(int a, char* b, in len);
nein.



char* itoa ( int __val,
char * __s,
int __radix
)
Convert an integer to a string.

The function itoa() converts the integer value from val into an ASCII representation that will be stored under s. The caller is responsible for providing sufficient storage in s.

Note:
The minimal size of the buffer s depends on the choice of radix. For example, if the radix is 2 (binary), you need to supply a buffer with a minimal length of 8 * sizeof (int) + 1 characters, i.e. one character for each bit plus one for the string terminator. Using a larger radix will require a smaller minimal buffer size.
Warning:
If the buffer is too small, you risk a buffer overflow.
Conversion is done using the radix as base, which may be a number between 2 (binary conversion) and up to 36. If radix is greater than 10, the next digit after '9' will be the letter 'a'.

If radix is 10 and val is negative, a minus sign will be prepended.

radix ist uebrigens englisch und heisst Basis, bei radix 10 befindet man sich also im Dezimalsystem.

HTH

Ceos
11.02.2008, 17:06
oh verzeihung ... habs selber noch net benutzt, aber meine es so gelesen zu haben >_<

@Hubert nein, du willst schliesslich einen string füllen und der besteht nun mal aus character(char) und immer fein auf die nullterminierung des strings achten ^^

McJenso
11.02.2008, 17:18
Hallo,



void int_to_char (uint16_t a, char* target)


das hier ist gut und wichtig. Es wird nur der Zeiger auf den Speicherbereich für den String an die Funktion übergeben. Die Reservierung des Speichers erfolgt außerhalb. Wir der Speicher für den String innerhalb der Funktion reseviert, gibt es ein kleines fieses Gültigkeitsproblem.
Gruß

Jens

Steilheckull
12.02.2008, 13:54
Vielen Dank an Ceos und fluchtpunkt, hat geklappt.
(Auch wenn ich 6h später auf "dtostrf" umgestiegen bin zwecks kommawerte, es hat mir geholfen)

OT; @Ceos: Was fährst du denn?
Bin auch ein freund der markanteren Karosserieformen :)
Meine Autos waren im Schnitt beim Kauf 20 Jahre alt,
mein jüngster war beim Kauf 15, den fahre ich grade (Honda Prelude).
Mein Ältester ist ein 82er VW Derby, der steht vorm Haus und wartet auf den Sommer ;)