Forum: PC-Programmierung Null im Array bricht Array ab


von Joachim .. (joachim_01)


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?

: Verschoben durch Admin
von max (Gast)


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.

von Jens B. (nixiefreak)


Lesenswert?

Du könntest auch bei der Startadresse des Arrays anfangen und dann bei 
einem Steuerzeichen deiner Wahl die for-Schleife verlassen.

von Joachim .. (joachim_01)


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.

von Martin (Gast)


Lesenswert?

j = sizeof(buf) / sizeof(buf[0]);

Länge des gesamten Arrays / Länge des ersten Elements = Anzahl der 
Elemente.
Die muß funktionieren, wird genauso im C-Standard vom Compiler 
gefordert.

von Joachim D. (Firma: JDCC) (scheppertreiber)


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 ...

von Martin (Gast)


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);
...

von Joachim .. (joachim_01)


Lesenswert?

Danke für die Hilfe.

Ich werde es wohl mit der zusätzlichen Längenübergabe machen.

von Holger W. (holgerw)


Lesenswert?

ich geb die Länge auch gern im ersten Element des Arrays mit.

von Joachim .. (joachim_01)


Lesenswert?

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...

von Joachim D. (Firma: JDCC) (scheppertreiber)


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

von Wurstbrot (Gast)


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.

von Rolf Magnus (Gast)


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.

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.