Forum: Mikrocontroller und Digitale Elektronik Frage zu char arrays


von PICuser (Gast)


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.

von Rolf Magnus (Gast)


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

von Mark B. (markbrandis)


Lesenswert?

Du willst Dir also unbedingt den Speicher zerschießen?

Dein Array hat genau 21 Bytes:
1
unsigned char text[21];

Du willst aber auf das 22. Byte zugreifen:
1
text[21]

Das kann nichts werden.

Edit: Ninja'd.

: Bearbeitet durch User
von Stefanus (Gast)


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

von Stefanus (Gast)


Lesenswert?

Soory, Tippfehler. Es soll heissen:

und endet bei 20.

von PICuser (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von PICuser (Gast)


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?

von Dietrich L. (dietrichl)


Lesenswert?

PICuser schrieb:
> ignoriert der Compiler die Leerzeichen einfach

Nein.

von Rolf Magnus (Gast)


Lesenswert?

PICuser schrieb:
> hat das Array dann 21 Elemente oder ignoriert der Compiler die
> Leerzeichen einfach?

Keins von beiden. Das Array hat 22 Elemente.

von Rolf Magnus (Gast)


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.

von Dirk B. (dirkb2)


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

von Ahja..? (Gast)


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.

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.