Forum: PC-Programmierung char array Größenbestimmung


von icecandle (Gast)


Lesenswert?

Guten Tag!
Ich weiß einfach nicht mehr weiter...
Wie bestimmt man jetzt genau die Größe eines char arrays, ich versuche 
es schon die ganze Zeit, die Größe ist bei mir immer 4 -.-
1
void Display(char text []){
2
3
  int max= (sizeof(text) / sizeof(text[0]));
4
  int i=0;
5
6
  for(i=0; i<=max; i++){
7
8
    IOW24Out(0x0300+ text[i]);
9
    Sleep(1);
10
    IOW24Out(0x0100+ text[i]);
11
    Sleep(1);
12
  }
13
14
  printf("%i", max);
15
  fflush(stdout);
16
17
}
Das wär mal die Funktion

Der Aufruf: Display("ABCDEFG");

Das ganze soll an einem LCD-Display angezeigt werden, leider werden nur 
die ersten 5 Zeichen angezeigt, das Display kann man zu 100% als 
Fehlerquelle ausschließen, das Problem liegt bei der falschen 
Größenbestimmung des arrays

Ich hoffe ihr könnt mir weiterhelfen

von Peter II (Gast)


Lesenswert?

es geht nicht, ein array hat keine Größenangabe in C.

Es dem grund muss man die Größe immer mit übergeben.

Da du aber scheinbar strings varbeiten willst, dann kannst du mit zum 0 
byte lesen.
1
void Display(char* text) {
2
3
  while( *text ) {
4
    IOW24Out(0x0300+ *text);
5
    Sleep(1);
6
    IOW24Out(0x0100+ *text);
7
    Sleep(1);
8
    *text++;
9
  }
10
  fflush(stdout);
11
}

von g457 (Gast)


Lesenswert?

man strlen

HTH

von big size (Gast)


Lesenswert?

icecandle schrieb:
> void Display(char text []){
>
>   int max= (sizeof(text) / sizeof(text[0]));

Das geht so nicht. Du musst die Länge des array mit übergeben:
1
void Display(char text [], uint8_t length)
2
...
3
4
Display("123456", sizeof("123456"));
5
...

von icecandle (Gast)


Lesenswert?

es funktioniert endlich :DD
Vielen Dank !!

und wieso hat das mit integer werten immer funktionier ?

von Peter II (Gast)


Lesenswert?

icecandle schrieb:
> und wieso hat das mit integer werten immer funktionier ?

keine ahnung, da wir da keine code gesehen haben.

von big size (Gast)


Lesenswert?

icecandle schrieb:
> wieso hat das mit integer werten immer funktionier

Weil die Größe (Bits) bekannt ist. Du hast oben ein offenes array 
übergeben.

Zeige bitte Deine Lösung.

von icecandle (Gast)


Lesenswert?

die lösung:
1
void Display(char* text){
2
3
  while( *text ) {
4
5
    IOW24Out(0x0300+ *text);
6
    Sleep(1);
7
    IOW24Out(0x0100+ *text);
8
    Sleep(1);
9
10
     *text++;
11
  }
12
13
14
}

von big size (Gast)


Lesenswert?

Ok, Danke!
Aber nie die Nullterminierung vergessen!

von DirkB (Gast)


Lesenswert?

Beim  *text++; ist der * zu viel.
Du willst ja nur den Zeiger weiterstellen und nicht auf den Wert 
zugreifen.

Das mit dem sizeof funktioniert da, wo du das Array auch definiert hast.

von Peter II (Gast)


Lesenswert?

DirkB schrieb:
> Beim  *text++; ist der * zu viel.

stimmt, danke für die korrektur.

von Rolf M. (rmagnus)


Lesenswert?

big size schrieb:
> icecandle schrieb:
>> wieso hat das mit integer werten immer funktionier
>
> Weil die Größe (Bits) bekannt ist. Du hast oben ein offenes array
> übergeben.

Was soll denn ein "offenes Array" sein? Er hat einen Zeiger übergeben, 
und dessen Größe ist auch bekannt und auf seinem System offenbar 4 Bytes 
groß.
Merke: Man kann Arrays nicht direkt an Funktionen übergeben.

icecandle schrieb:
> void Display(char text []){

Ach wenn's auf den ersten Blick so aussieht, ist text hier kein Array, 
sondern ein Zeiger.

von big size (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Er hat einen Zeiger übergeben,
> und dessen Größe ist auch bekannt und auf seinem System offenbar 4 Bytes
> groß.
> Merke: Man kann Arrays nicht direkt an Funktionen übergeben.

und was kommt dann bei den beiden sizeof () raus:
1
void Display(char text []){
2
3
  int max= sizeof(text);
4
5
...
6
7
// und
8
9
10
void Display(char text [128]){
11
12
  int max= sizeof(text);
13
14
...

von Peter II (Gast)


Lesenswert?

big size schrieb:
> und was kommt dann bei den beiden sizeof () raus:

beides mal sizeof(void*)

von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> beides mal sizeof(void*)

Um genau zu sein: sizeof(char*)

big size schrieb:
> void Display(char text []){

Das ist zu 100% äquivalent zu:
1
void Display(char* text){

Bei Funktionsparameteren haben die eckigen  Klammern nicht die übliche 
Bedeutung.

> void Display(char text [128]){

Das ist genau das gleiche wie oben. Die 128 werden vom Compiler einfach 
ignoriert.

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.