www.mikrocontroller.net

Forum: PC-Programmierung char array Größenbestimmung


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: icecandle (Gast)
Datum:

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

void Display(char text []){

  int max= (sizeof(text) / sizeof(text[0]));
  int i=0;

  for(i=0; i<=max; i++){

    IOW24Out(0x0300+ text[i]);
    Sleep(1);
    IOW24Out(0x0100+ text[i]);
    Sleep(1);
  }

  printf("%i", max);
  fflush(stdout);

}

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

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.
void Display(char* text) {

  while( *text ) {
    IOW24Out(0x0300+ *text);
    Sleep(1);
    IOW24Out(0x0100+ *text);
    Sleep(1);
    *text++;
  }
  fflush(stdout);
}

Autor: g457 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
man strlen

HTH

Autor: big size (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
void Display(char text [], uint8_t length)
...

Display("123456", sizeof("123456"));
...

Autor: icecandle (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
es funktioniert endlich :DD
Vielen Dank !!

und wieso hat das mit integer werten immer funktionier ?

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
icecandle schrieb:
> und wieso hat das mit integer werten immer funktionier ?

keine ahnung, da wir da keine code gesehen haben.

Autor: big size (Gast)
Datum:

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

Autor: icecandle (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
die lösung:
void Display(char* text){

  while( *text ) {

    IOW24Out(0x0300+ *text);
    Sleep(1);
    IOW24Out(0x0100+ *text);
    Sleep(1);

     *text++;
  }


}

Autor: big size (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ok, Danke!
Aber nie die Nullterminierung vergessen!

Autor: DirkB (Gast)
Datum:

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

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
DirkB schrieb:
> Beim  *text++; ist der * zu viel.

stimmt, danke für die korrektur.

Autor: Rolf Magnus (rmagnus)
Datum:

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

Autor: big size (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
void Display(char text []){

  int max= sizeof(text);

...

// und


void Display(char text [128]){

  int max= sizeof(text);

...

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
big size schrieb:
> und was kommt dann bei den beiden sizeof () raus:

beides mal sizeof(void*)

Autor: Rolf Magnus (rmagnus)
Datum:

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

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