Forum: Mikrocontroller und Digitale Elektronik PIC - Stringzuweißung (CC5X)


von Klaus m. .. (magic-moe)


Lesenswert?

Hallo,
ich versuche seit längerem einem String (Programmiersprache C, Compiler 
CC5X) einen Text zuzuweißen:

unsigned char string [11];
string = "Hallo";

Doch leider bekomme ich immer die Fehlermeldung "Incompatible storage, 
'const *' is required". Egal was ich versuche, ob ich "Hallo" 
einklammere, zwischen jedem zeichen ein ; setze...

Weiß jemand woran das liegen könnte?

Mfg
Klaus

P.S. ich hab gelesen das es mit dem Befehl "strcpy" gehen könnte, doch 
leider scheint es keine passende "string.h" -header Datei zu geben. :-(

von nachdenklicher (Gast)


Lesenswert?

> CC5X) einen Text zuzuweißen:

Also wenn ich etwas zuzuweißen habe, nehme ich einen Pinsel und Farbe.
Mit einem Compiler konnte ich noch nie weiße Farbe irgendwo auftragen.

Joe

von Martin (Gast)


Lesenswert?

Klaus m. ... schrieb:

> unsigned char string [11];
> string = "Hallo";

Strings sind kein "echter" Datentyp, die kann man nicht einfach per "=" 
zuweisen.

Stattdessen nimmt man...

> P.S. ich hab gelesen das es mit dem Befehl "strcpy" gehen könnte, doch

...genau dieses.

> leider scheint es keine passende "string.h" -header Datei zu geben. :-(

Doch, die gibt es, wenn es ein C-Compiler ist. Suchen. Am besten in der 
Dokumentation bzw. dem Handbuch.

Je nachdem, was du willst, mag bei dir auch

unsigned char string [11] = "Hallo";

eine Option sein.

Hier geht es, weil das "=" keine Zuweisung, sondern eine Initialisierung 
ist.

von holger (Gast)


Lesenswert?

>> leider scheint es keine passende "string.h" -header Datei zu geben. :-(

>Doch, die gibt es, wenn es ein C-Compiler ist.

Nein, die gibt es nicht. CC5x ist ein C-Compiler für
die ganz kleinen PICs. Da muss man schon mit ein paar
Einschränkungen leben. Ich hab mal ne zeitlang damit ein
bißchen rumprobiert. Der meckert schon gerne wenn eine
Zeile Code zu komplex wird. Also so ein richtiger kompletter
C-Compiler ist das nicht. Das komplette Verzeichnis von CC5x
ist gerade mal 1MB groß!

Aber was soll man auf den kleinsten
der PICs auch schon groß in C machen wenn man nur 64 Byte RAM hat;)

Der erzeugte Code war aber immer schön klein und fix, da kann
man nicht meckern. Das Banking nimmt CC5x einem auch ab. Wenns
komplettes C sein soll dann sollte man dann doch langsam zu den
PIC18 wechseln.

von Klaus m. .. (magic-moe)


Lesenswert?

Hallo Martin,
danke für de schnelle Antwort. Die Datei "string.h" finde ich auch nach 
weiterer suche weder im internet, noch bei allen anderen header-dateien 
des Compilers...

Das mit der Option (also den Wert schon in der Deklarationszeile 
versuchen zuzuweißen) habe ich auch schon versucht. Doch dann erscheint 
die Fehlereldung "Initialized static and global RAM variables are not 
supported
", bzw. "Limitation: 'static const' is needed".

Der Hintergrund ist das ich versuche einen Text abzuspeichern (der 
irgendwann vllt. sogar durch das programm verändert werden soll). Des 
weiteren möchte ich dann die einzelnen Buchstaben des Strings auslesen 
und in einem Array die nach einer Tabelle dazu passenden Bytes 
speichern.(Letzteres funktioniert bereits, nur muss ich bisher jeden 
Buchstaben eizeln einer Soeicherzelle zuweißen)

Mfg
Klaus

@ Holger: Ich benutze den 16F876A, der hat bereits 256 Byte Ram und 8 
KByte Flash...

von holger (Gast)


Lesenswert?

>@ Holger: Ich benutze den 16F876A, der hat bereits 256 Byte Ram und 8
>KByte Flash...

Das ändert aber nichts daran das CC5x einige Dinge
ganz einfach nicht möchte oder kann.

>(Letzteres funktioniert bereits, nur muss ich bisher jeden
>Buchstaben eizeln einer Soeicherzelle zuweißen)

strcpy() macht auch nichts anderes.

von Zusel (Gast)


Lesenswert?

Hallo Klaus,

als erstes musst Du vestehen, dass ein String nur eine Array von Bytes 
bzw char ist. strcpy kopiert also auch nur deinen String "hallo" in dein 
Array. Kannst Du auch selber machen.

von Lars D. (Gast)


Lesenswert?

Klaus m. ... schrieb:
> Hallo,
> ich versuche seit längerem einem String (Programmiersprache C, Compiler
> CC5X) einen Text zuzuweißen:
>
> unsigned char string [11];
> string = "Hallo";

Hallo,

also in C gibt es den Datentyp String eigentlich nur als Pseudodatentyp. 
Dahinter verbirgt sich ein Array aus unsigend char. Eine 'richtige' 
(String vollständig) Zuweisung kann nur einmal erfolgen, nämlich bei der 
Deklaration des Arrays:
1
unsigned char _mystring[11] = "Hallo";

oder auch

1
unsigned char _mystring2[] = "Hallo";

Wenn du nun während der Laufzeit (nicht mehr Deklaration) den String 
verändern möchtest, dann kannst du das per 'Stringlibrary' (sehr groß - 
der PIC geht in die Knie) oder einfach per Manipulation der einzelenen 
Felder im Array.
1
_mystring[0] = 'T';
2
_mystring[1] = 'o';
3
_mystring[2] = 'l';
4
_mystring[3] = 'l';

hier nur ganz beispielhaft (zur Demonstration). Im Code würde man 
natürlich 'schönere' Wege suchen, als so eine Aufzählung. Du könntest 
dir z.B. deine Eigene Funktion schreiben die dir deine Strings 
manipuliert ...

von Klaus m. .. (magic-moe)


Lesenswert?

Hallo,
dass ein String lediglich ein Char-Array ist weiß ich. Dei Sache war nur 
die, dass ich mir Quellcode sparen wollte indem ich diesem Array ein 
einer Zeile ein Wort zuweißen kann, während ich sonst eben wesentlich 
mehr bruache (jeder Buchstabe einzeln).
Den "Trick" mit der Deklaration habe ich versucht, doch dann kommt eine 
Fehlermeldung de besagt, dass bei Deklarationen keine Werte zugewiesen 
werden können...

Mfg
Klaus

von holger (Gast)


Lesenswert?

Bei Microchip gibt es eine Free Version vom Hi-Tech C Compiler

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en542849


Vieleicht macht der ja was du möchtest.

von Sebastian Hepp (Gast)


Lesenswert?

Einem Char-Array einen String in einer Zeile zuweisen funktioniert nur 
mit der strcpy Funktion. Ein Stringliteral ist eigentlich vom Typ "const 
char *" und damit inkompatibel mit dem Arraytyp. Evtl. kannst du statt 
dem Array ein Zeiger definieren und diesen auf das Stringliteral zeigen 
lassen.

von Erich (Gast)


Lesenswert?

Bei den einfachen PIC uC kann man keine Strings "bündig" als Array im 
Speicher ablegen, weil es keinen Befehl gibt der das auslesen kann (!).
Stichwort:  Harvard-Architektur
Daher werden Strings vom Compiler in spezielle Opcode-Tabellen gebracht, 
die mit dem "RETLW" Befehl beginnen.

Siehe Kapitel   6.1.2. Table Read  in
http://www.staff.uni-bayreuth.de/~btp918/cmt2004/PIC/Handout/06%20Fortgeschrittene%20Programmiertechniken.pdf

bzw.
http://www.piclist.com/techref/microchip/tables.htm
ungefähr Seitenmitte, am Label    string_table:

Versuche es mal mit
     const char mystring[] = {"hello"} ;
und sieh' dann im .LST file nach was der Compiler erzeugt hat.

Aber möglicherweise unterstützt dein einfacher Compiler  CC5X  Strings 
(Textarray) überhaupt nicht.

von Elektronika (Gast)


Lesenswert?

Hallo,
ich hatte ein ähnliches Problem mit `Limitation static const is needed`.
Ich wollte die Variable direkt "füllen".
z.b.
static const char zeichen[]={1,2,3,4,5,6,7,8,9};

Die Lösung ist, dass du die Variable nicht im Hauptprogramm deklarieren 
darfst, sondern als Globale Variable. Dann gehts....

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.