Anzahl der Array Elemente

Gast #2726339
Lesenswert?

ich versuche zurzeit ein LCD zu programmieren.
Mein Problem ist nur, dass ich eine char-array ausgeben will und dafür 
die Anzahl der Elemente benötige, die ich in dem Array gespeichert habe.
Ich hab mich im Internet informiert und das genau wie im Internet 
beschreiben gemacht nur irgendwie kommt immer nur der Wert 2 dabei raus, 
obwohl ich ein char-Array mit 9 Zeichen habe.
1
//Deklaration
2
 unsigned short test_array = 0;
3

4

5
//Aufruf
6
 LCD_OutString("123456789");
7

8
//Funktion
9
void LCD_OutString(char data_string[])    // gibt einen String aus
10
{
11
  unsigned short   str = 0;
12
  for(str=0; str<(sizeof(data_string)/sizeof(char));str++)
13
  {
14
    LCD_OutChar(data_string[str]);
15
  }  
16
}

danke schonmal für eure Hilfe :)
#2726349
Lesenswert?

Peter Schwaab schrieb:
> ich versuche zurzeit ein LCD zu programmieren.
> Mein Problem ist nur, dass ich eine char-array ausgeben will und dafür
> die Anzahl der Elemente benötige, die ich in dem Array gespeichert habe.

Nö. Brauchst du nicht.
In C gilt ja die Konvention: Ein String ist dort zu Ende, wo das \0 
Zeichen steht.
D.h. du musst nur solange ausgeben, bis du auf ein \0 stösst. Dort ist 
dann der String komplett ausgegeben
1
void LCD_OutString( const char* c )
2
{
3
  while( *c != '\0' )
4
    LCD_OutChar( *c++ );
5
}
Fertig.

Informier dich über Stringverarbeitung in C. Das ist täglich Brot und 
sind Grundlagen.
#2726351
Lesenswert?

Wenn du erstmal C könntest, wäre es schon klar...

Ein Feld wird in C nie als Feld übergeben, sondern immer nur als Zeiger 
auf das unterste Element.
Dementsprechend liefert dir sizeof(data_string) nicht die Feldlänge in 
Byte, sondern die Größe eines Zeigers in Byte.

Die Länge des Strings musst du immer entweder getrennt an eine Funktion 
übergeben, oder es wird im Feld ein Element eingefügt mit einem 
besonderen Wert als Marker für das Ende - bei C-Strings ist das 
üblicherweise ein Nullbyte (also mit dem Wert 0, nicht '0').

Peter Schwaab schrieb:
> Ich hab mich im Internet informiert und das genau wie im Internet
> beschreiben gemacht

Wo hat man dir da so gezeigt?
#2726358
Lesenswert?

> Ich hab mich im Internet informiert

Du sollst dich nicht im Internet informieren, sondern ein C-Buch lesen 
und durcharbeiten!

Kernighan&Ritchie
Programmieren in C

Persönlich bevorzuge ich Bücher aus Papier (weil man da am Rand mit 
Bleistift Anmerkungen machen kann, oder Post-Its auf der Seite verteilen 
kann oder überhaupt ganze Blätter mit eigenen Notizen an bestimmten 
Stellen einlegen kann), aber es gibt natürlich auch Online-Bücher
http://openbook.galileocomputing.de/c_von_a_bis_z/
Gast #2726408
Lesenswert?

>Nö. Brauchst du nicht. In C gilt ja die Konvention: Ein String ist dort zu Ende, 
wo das \0 Zeichen steht.

In diesenm Fall leider nicht brauchbar. Mach das Feld mit einer festen 
Groesse, und das wird komplett gefuellt. Denn sonst bleiben dir alte 
Zeichen rumstehen. Bei einem LCD sollte man immer den gesammten Inhalt 
schreiben.
Moderator Persönliche Seite #2726418
Lesenswert?

Zac Hobson schrieb:
> In diesenm Fall leider nicht brauchbar. Mach das Feld mit einer festen
> Groesse, und das wird komplett gefuellt. Denn sonst bleiben dir alte
> Zeichen rumstehen. Bei einem LCD sollte man immer den gesammten Inhalt
> schreiben.

Meines Erachtens Speicherverschwendung. Dann ändere ich besser KHBs 
Funktion einfach ab, um den Rest der Zeile mit Blanks zu beschreiben:
1
#define ZEICHEN_PRO_ZEILE 20
2

3
void LCD_OutString( const char* c )
4
{
5
  int len = 0;
6

7
  while( *c != '\0' )
8
  {
9
    LCD_OutChar( *c++ );
10
    len++;
11
  }
12

13
  while (len < ZEICHEN_PRO_ZEILE)
14
  {
15
    LCD_OutChar(' ');
16
    len++;
17
  }
18
}
#2726435
Lesenswert?

Zac Hobson schrieb:
>>Nö. Brauchst du nicht. In C gilt ja die Konvention: Ein String ist dort zu Ende,
> wo das \0 Zeichen steht.
>
> In diesenm Fall leider nicht brauchbar.

Komisch.
Für mindestens 8 Millionen Programmierer ist das brauchbar.

> Mach das Feld mit einer festen
> Groesse,

Was hat das mit der generellen String Ausgabefunktion zu tun?

Das es Spezialfälle gibt, in denen zusätzlicher Aufwand nötig ist, 
bestreitet keiner. Aber wenn, dann mach es auch richtig. Dann muss die 
Funktion dann nämlich auch damit klarkommen, dass du einen String der 
Länge 25 in einem Feld der Größe 10 ausgeben willst. D.h. du gibst nicht 
die Stringlänge mit, sondern die Feldgröße, in die der String eingepasst 
werden muss. Und das ist dann ein ganz anderes Thema.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren