www.mikrocontroller.net

Forum: PC-Programmierung Null im Array bricht Array ab


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Joachim ... (joachim_01)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
void  SendCommand(unsigned char buf[])
{ 
  unsigned char i, j, bcc, test;
  j = strlen (buf);  
  test = i2c_write(0x11); //  Send  DC1
  bcc =  0x11;
  test += i2c_write(j); //  Send  data  length
  bcc = bcc + j;  
  for(i=0;  i  <  j;  i++) {
        test += i2c_write(buf[i]);
        bcc = bcc + buf[i];
  };
  i2c_write(bcc); //  Send  checksum
}

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?

Autor: max (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Jens B. (nixiefreak)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Du könntest auch bei der Startadresse des Arrays anfangen und dann bei 
einem Steuerzeichen deiner Wahl die for-Schleife verlassen.

Autor: Joachim ... (joachim_01)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Joachim Drechsel (Firma: JDCC) (scheppertreiber)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
void  SendCommand(unsigned char buf[], int len)
{ 
  unsigned char i, bcc, test;
  
  test = i2c_write(0x11); //  Send  DC1
  bcc =  0x11;
  test += i2c_write(j); //  Send  data  length
  bcc = bcc + j;  
  for(i=0;  i  <  len;  i++) {
        test += i2c_write(buf[i]);
        bcc = bcc + buf[i];
  };
  i2c_write(bcc); //  Send  checksum
}

Einfach die Länge als Argument mitgeben ...

Autor: Martin (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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);
...

Autor: Joachim ... (joachim_01)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Danke für die Hilfe.

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

Autor: Holger W. (holgerw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ich geb die Länge auch gern im ersten Element des Arrays mit.

Autor: Joachim ... (joachim_01)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Autor: Joachim Drechsel (Firma: JDCC) (scheppertreiber)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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 :-)

Autor: Wurstbrot (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.
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
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net