Anzahl der Array Elemente

Gast #2726339
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 :)
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.
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?
> 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
>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
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
}
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.