Forum: Compiler & IDEs string speichern


von kay (Gast)


Lesenswert?

hallo,
ich habe mal ein paar Fragen,

habe hier eine Funktion(glaub hier aus dem forum) die den ankommenden 
String
aus 29zeich +1zeichen für die endeerkennung($) in den Buffer schreibt,

wie ist das wenn ich anstatt einnen String eine zahl zB.16 in den Buffer 
schreiben möchte


char SDBuffer[30];

void uart_gets( char* SDBuffer, int BufferLen )
{
  int i = 0;
  char c;

  while( ( c = uart_getchar() ) != '$' && i < BufferLen - 1 )
    SDBuffer[ i++ ] = c;

  SDBuffer[i] = '\0';
}

mfg kay

von Karl H. (kbuchegg)


Lesenswert?

kay schrieb:

> wie ist das wenn ich anstatt einnen String eine zahl zB.16 in den Buffer
> schreiben möchte

Aufpassen. jetzt müssen wir vorsichtig sein.
Was genau verstehst du unter 'einer Zahl'.

Wenn du auf deinem Terminal hintereinander die Tasten 1 und 6 drückst, 
dann werden in den Buffer die Zeichen '1' und '6' eingetragen. Nur weil 
das für dich Ziffern sind, haben die erst mal keinerlei Sonderbedeutung. 
String ist String. Und ein String (also ein Text) kann 
selbstverständlich komplett aus Ziffern bestehen, also zb "13092011"

Die weiterführende Frage lautet dann: wie kann man aus deinem String, 
der eine Textrepräsentierung einer Zahl beinhaltet, die Zahl selbst 
extrahieren, so dass man dann damit rechnen kann.
das geht zb mit atoi() oder mit strtol() oder sscanf() oder ....
oder man macht sich selber was.

von kay (Gast)


Lesenswert?

> Und ein String (also ein Text) kann
> selbstverständlich komplett aus Ziffern bestehen, also zb "13092011"

das reicht mir aus,

jetzt hab ich nochmal eine frage, die Funktion müsste doch auch so 
funktionieren,es es wird die Funktion  void uart_gets(); aufgerufen und 
dann kommen die daten über UART

 char SDBuffer[30];

void uart_gets(void )
{
  int BufferLen;
  int i = 0;
  char c;

  while( ( c = uart_getchar() ) != '$' && i < BufferLen - 1 )
    SDBuffer[ i++ ] = c;

  SDBuffer[i] = '\0';
}

von Karl H. (kbuchegg)


Lesenswert?

kay schrieb:

>
>  char SDBuffer[30];
>
> void uart_gets(void )
> {
>   int BufferLen;
>   int i = 0;
>   char c;
>
>   while( ( c = uart_getchar() ) != '$' && i < BufferLen - 1 )

welchen Wert hat den BufferLen?

    while( ( c = uart_getchar() ) != '$' && i < sizeof( SDBuffer ) - 1 )

und die Variable BufferLen wirfst du raus.


>     SDBuffer[ i++ ] = c;
>
>   SDBuffer[i] = '\0';
> }


Deine erste Version der Funktion war besser :-)

von kay (Gast)


Lesenswert?

>welchen Wert hat den BufferLen?
ich glaube sie meinten das so

void uart_gets(void )
{
  int BufferLen = 0;
  int i = 0;
  char c;

  while( ( c = uart_getchar() ) != '$' && i < BufferLen - 1 )
    SDBuffer[ i++ ] = c;

  SDBuffer[i] = '\0';
}

von Karl H. (kbuchegg)


Lesenswert?

kay schrieb:
>>welchen Wert hat den BufferLen?
> ich glaube sie meinten das so

No

> void uart_gets(void )
> {
>   int BufferLen = 0;
>   int i = 0;
>   char c;
>
>   while( ( c = uart_getchar() ) != '$' && i < BufferLen - 1 )

Im ersten Schleifendurchlauf:   i ist gleich 0, BufferLen ist gleich 0
Wie soll der Vergleich jemals true ergeben?


Zurücklehnen. Nachdenken.
Was ist die Idee an dieser Stelle. Was soll der Vergleich mit BufferLen 
bewirken?

Nun, ein Array hat eine bestimmte Größe. Und über diese Größe hinaus 
darf man nicht schreiben. Ein Array der Größe 5 hat nun mal nur die 
Elemente 0, 1, 2, 3, 4. Wenn von der UART aber 6 oder 7 Zeichen 
reinkommen, hat man ein Problem, denn die würden im Array ander Position 
5 oder 6 oder 7 (je nachdem das wievielte Zeichen hereinkommt, ehe dann 
mal ein $ daherkommt) abgespeichert werden. Ein Array Element 5 oder 6 
oder 7 existiert aber nicht in einem Array der Größe 5.

-> Diese Abfrage soll verhindern, dass man hinten aus dem Array 
rausschreibt. Und daher muss da die Arraygröße rein. Die ist aber ganz 
sicher nicht 0.

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.