Frage zu char arrays

Gast #3520642
Lesenswert?

Hallo zusammen,

ich schreibe ein C-Programm für einen PIC16F..., das einen Lauftext auf 
einem LCD ausgeben soll. Leider habe ich das LCD momentan nicht zur 
Verfügung und kann daher nicht testen.

Mein Problem:
1
unsigned char text[21];
2
for(i=0;i<21;i++){
3
text[i]=0x20;  // 0x20 = 32 -> ASCII space
4
}
5
text[21]="Das ist ein Text";

Wird mein Text durch text[21]="Das ist ein Text" in text[0] bis 
text['Länge des Textes'-1] geschrieben oder funktioniert das so nicht?

Würde mich freuen, wenn mir jemand weiterhelfen könnte.
Gast #3520646
Lesenswert?

PICuser schrieb:
> Wird mein Text durch text[21]="Das ist ein Text" in text[0] bis
> text['Länge des Textes'-1] geschrieben oder funktioniert das so nicht?

Letzteres. Abgesehen davon, daß es text[21] nicht gibt (text hat 21 
Elemente, mit den Indizes 0 bis 20), beschreibst du mit dieser Zuweisung 
ein einzelnes Zeichen. In das schreibst du die Adresse des Strings 
(bzw das, was davon in das Zeichen reinpasst). Das ergibt keinen Sinn, 
und der Compiler sollte da auch warnen.
Einen String kopierst du mit strcpy:
1
    strcpy(text, "Das ist ein Text");
Gast #3520653
Lesenswert?

Das Array hat 21 Zeichen. Der Index beginnt bei 0 und endet bei 21.

Die Zuweisung text[21]="wasauchimmer" schreibt diese Zeichenkette nicht 
in das Array, sondern genau dahinter!

Du must den String in das Array kopieren:

#include <string.h>
strcpy(text,"wasauchimmer");

So belegst Du aber doppelt Speicher. Denn der String "wasauchimmer" wird 
schon beim Programmstart vom Flash Speicher ins Ram kopiert. Bei AVR 
gibt es spezielle Befehle, um das zu verhindern. Ich schätze, dass es 
bei PIC auch entsprechende besondere Befehle gibt.

Schau mal dort: 
http://books.google.de/books?id=RFLtu4fej00C&pg=PA48&lpg=PA48&dq=pic+string+program+memory&source=bl&ots=nsI-nxPeWh&sig=oCSnGrlZGzphqP6d7MYwdptgjzE&hl=de&sa=X&ei=8nvyUpjENebg7Qb60oHoCA&ved=0CCwQ6AEwAA#v=onepage&q=pic%20string%20program%20memory&f=false
Gast #3520665
Lesenswert?

Okay, danke für die schnellen Rückmeldungen!

Ich weiß ja, dass das Array nur 21 Bytes hat. Deshalb spreche ich in der 
Schleife auch nur text[20] an. Ich dachte lediglich, dass es vielleicht 
einen feststehenden Ausdruck, wie bei char text[]="Hallo" gäbe...
Persönliche Seite #3520673
Lesenswert?

Stefanus schrieb:
> Du must den String in das Array kopieren:

Naja, wenn er von Anfang an drinstehen soll, geht das natürlich auch mit 
einer Initialisierung:
1
char text[] = "Das ist mein Text";

Wird in den eckigen Klammern die Längenangabe weggelassen, verwendet der 
Compiler die Länge, die sich aus der Stringkonstanten (incl. 
abschließender '\0') ergibt.

Die Länge kann wahlweise mit strlen oder mit sizeof ermittelt werden 
- strlen zählt allerdings die '\0' nicht mit.
Gast #3520684
Lesenswert?

Da fällt mir gerade noch etwas ein...

Wenn ich beim Deklarieren des Arrays
1
unsigned char text[]="Das ist ein Text     ";
schreibe (also hinter dem eigentlichen Text noch 5 Leerzeichen => 
16+5=21 Byte), hat das Array dann 21 Elemente oder ignoriert der 
Compiler die Leerzeichen einfach?
Gast #3520764
Lesenswert?

Übrigens: Warum eigentlich unsigned char? Der Typ für Zeichen ist char. 
Ob der dafür verwendete Integertyp ein Vorzeichen hat oder nicht, 
braucht dich nicht zu interessieren, da du den sowieso nicht zum rechnen 
benutzt.
#3520774
Lesenswert?

Ein paar Anmerkungen zu deinem Code.
C-Strings sind Nullterminiert. Das Ende der Zeichen wird mit '\0' 
markiert.
Darum braucht man für einen Text immer ein Zeichen mehr im Array.
Du hast aber alle 21 Elemente mit dem Leerzeichen voll geschrieben.

Ach ja, das Leerzeichen. Wenn du Leerzeichen meinst, dann schreib das 
auch hin und keinen komischen Code.

Und Zeichen speichert man in char. Zum rechnen nimmt man signed char 
oder unsigned char.
1
text[21];
2
for(i=0;i<20;i++) {  // Nur bis 19,
3
  text[i] = ' ';  //Leerzeichen. Kann man sofort sehen.
4
}
5
text[i] = '\0';  // und die Terminierung. i hat hier den Wert 20
Jetzt ist das Array voller Leerzeichen.

Kürzer (aber mit abzählen)
1
text[] = "                    ";  // 20 Leerzeichen. Array hat 21 Elemente
Gast #3520812
Lesenswert?

PICuser schrieb:
> unsigned char text[]="Das ist ein Text     ";
> schreibe (also hinter dem eigentlichen Text noch 5 Leerzeichen =>
> 16+5=21 Byte), hat das Array dann 21 Elemente oder ignoriert der
> Compiler die Leerzeichen einfach?

Wieso sollte er diese denn so "einfach" "ignorieren"? ;D

Das wäre ja dann genauso als ob er einfach den restlichen Text ebenfalls 
so einfach ignorieren könnte... also vollkommen abstrus.

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