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. :-(
> 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
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.
>> 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.
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...
>@ 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.
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.
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 ...
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
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.