Null im Array bricht Array ab

OP #2607662
Lesenswert?
• ▲
▼
Array: Wie 0 senden?

Hi,
ich möchte einer Funktion folgendes übergeben:
unsigned char commandToDisplay2[5] = {0x1B,'G','B',0};  //cursor off ESC 
G B 0
Das letzte Datenbyte, in dem Fall die 0, schaltet den Cursor aus, erst 
dann kommt die Ende-Kennung 0.

Wenn ich dies dann an folgende Funktion übergebe:
1
void  SendCommand(unsigned char buf[])
2
{ 
3
  unsigned char i, j, bcc, test;
4
  j = strlen (buf);  
5
  test = i2c_write(0x11); //  Send  DC1
6
  bcc =  0x11;
7
  test += i2c_write(j); //  Send  data  length
8
  bcc = bcc + j;  
9
  for(i=0;  i  <  j;  i++) {
10
        test += i2c_write(buf[i]);
11
        bcc = bcc + buf[i];
12
  };
13
  i2c_write(bcc); //  Send  checksum
14
}

dann berechnet strlen(buf) einen falschen Wert, der String ist um ein 
Byte zu kurz.


strlen(buf[]) hab ich probiert, gleiches Ergebnis. Wie macht man das am 
Elegantesten?
Gast #2607667
Lesenswert?
• ▲
▼
nim statt strlen() sizeof()

strlen ist, wie der Name eigentlich auch ausdrückt für Zeichenketten 
(Strings) gedacht und nicht für Arrays. In C werden Zeichenketten am 
Ende immer mit dem Char 0x00 abgeschlossen. Dieser wird bei strlen nicht 
mitgezählt, da er ja kein darstellbares Zeichen ist.
OP #2607678
Lesenswert?
• ▲
▼
>nim statt strlen() sizeof()
Das funktioniert noch schlechter, sizeof() berechnet soviel ich weiß nur 
die größe des Datentypen, hier also für char.

>strlen ist, wie der Name eigentlich auch ausdrückt für Zeichenketten
>(Strings) gedacht und nicht für Arrays.
Aber das könnt mich weiterbringen, ich muß aus dem Array nen String 
machen, dann könnt's gehen.
(Firma: JDCC) #2607681
Lesenswert?
• ▲
▼
1
void  SendCommand(unsigned char buf[], int len)
2
{ 
3
  unsigned char i, bcc, test;
4
  
5
  test = i2c_write(0x11); //  Send  DC1
6
  bcc =  0x11;
7
  test += i2c_write(j); //  Send  data  length
8
  bcc = bcc + j;  
9
  for(i=0;  i  <  len;  i++) {
10
        test += i2c_write(buf[i]);
11
        bcc = bcc + buf[i];
12
  };
13
  i2c_write(bcc); //  Send  checksum
14
}

Einfach die Länge als Argument mitgeben ...
Gast #2607684
Lesenswert?
• ▲
▼
Oh seh grad, daß das Array als Paramter übergeben wird.
Da funktioniert meine Lösung so nicht.

So sollte es gehen:

void  SendCommand(unsigned char buf[], int len) {...}

...
len = sizeof(buf) / sizeof(buf[0]);
SendCommand(buf[], len);
...
(Firma: JDCC) #2607700
Lesenswert?
• ▲
▼
Joachim ... schrieb:
> len = sizeof(buf) / sizeof(buf[0]);
> Hmm. Wiki schreibt:
> In the programming languages C and C++, the unary operator sizeof is
> used to calculate the sizes of datatypes, in number of bytes.
>
> ...und buf ist ja vom Typ Datentyp char, also sollte 1 rauskommen... was
> nicht das gewünschte ist...

Naja, schau's Dir nochmal genau an :-)
Gast #2607922
Lesenswert?
• ▲
▼
sizeof( ... ) wird zur Kompilierzeit bestimmt. Wenn also ein Array mit 
unbekannter Größe übergeben wird, kann man dort sizeof nicht einsetzen. 
Die richtige Lösung ist in diesem Fall wirklich, einen zweiten Parameter 
zu übergeben, der die Länge des Buffers angibt.
Gast #2607967
Lesenswert?
• ▲
▼
Wurstbrot schrieb:
> sizeof( ... ) wird zur Kompilierzeit bestimmt. Wenn also ein Array mit
> unbekannter Größe übergeben wird, kann man dort sizeof nicht einsetzen.

Das ist nur die halbe Wahrheit. sizeof() kann man prinzipiell immer 
einsetzen, aber wenn man die Details nicht kennt, kommt nicht unbedingt 
das raus, was man vielleicht erwartet.
Eins dieser Details ist, daß man in C ein Array nicht direkt an eine 
Funktion übergeben kann. Es sieht zwar bei der obigen Definition so aus, 
als würde das geschehen, aber das täuscht. Die C-Erfinder fanden das 
damals intuitiver, aber es ist meiner Meinung nach genau das Gegenteil.
1
void  SendCommand(unsigned char buf[])
Hier sieht es zwar so aus, als sei buf ein Array, aber in diesem Falle 
tritt eine C-Spezialregel inkraft, nach der bei einem Funktionsparameter 
die eckigen Klammern nicht wie sonst bei Definitionen üblich für ein 
Array stehen, sondern stattdessen für einen Zeiger. Das heißt, es ist zu 
100% äquivalent zu
1
void  SendCommand(unsigned char* buf)
Deshalb kommt für sizeof(buf) die Größe eines Zeigers heraus. Man darf 
übrigens zwischen die  eckigen Klammern auch eine Zahl als Arraygröße 
schreiben, aber die hat keinerlei Bedeutung und wird schlichtweg 
ignoriert.

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