Forum: Mikrocontroller und Digitale Elektronik Anzahl der Array Elemente


von Peter Schwaab (Gast)


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 :)

von Karl H. (kbuchegg)


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.

von Klaus W. (mfgkw)


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?

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Karl Heinz Buchegger schrieb:
> LCD_OutChar( *c++ );

Mhh, ist das jetzt nicht C++ ?

duck und wech...

von Klaus W. (mfgkw)


Lesenswert?

Klaus Wachtler schrieb:
> Wenn du erstmal C könntest, wäre es schon klar...

Damit meinte ich jetzt nicht KHB. Es sei denn natürlich, er fühlt sich 
explizit angesprochen :-)

Kan asta schrieb:
> Mhh, ist das jetzt nicht C++ ?

Doch, ist es natürlich auch. Nette Idee...

von Karl H. (kbuchegg)


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/

von Zac Hobson (Gast)


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.

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Zac Hobson schrieb:
> Bei einem LCD sollte man immer den gesammten Inhalt
> schreiben.

Oder einen Clear-Befehl implementieren.

von Peter II (Gast)


Lesenswert?

Zac Hobson schrieb:
> In diesenm Fall leider nicht brauchbar. Mach das Feld mit einer festen
> Groesse, und das wird komplett gefuellt.

dann sollte er für die größe einfach ein define anlegen, anders geht es 
nicht.

von Frank M. (ukw) (Moderator) Benutzerseite


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
}

von Kan a. (Firma: Basta) (kanasta)


Lesenswert?

Implementierungsdetails.
Der TO wird schon merken, wenn da Buchstaben stehenbleiben ;)

von Karl H. (kbuchegg)


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.

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.