PIC - Stringzuweißung (CC5X)

OP #2128586
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. :-(
Gast #2128589
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.
Gast #2128674
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.
OP #2128688
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...
Gast #2128705
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.
Gast #2129136
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 ...
OP #2130352
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
Gast #2130821
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.
Gast #2131057
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.
Gast #2260085
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....

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