Hi Leute,
hab da ein kleines Problem im Zusammenhang mit Zeichenketten und LCD
Anzeige.
Ok, so hab ich bis jetzt eine Ausgabe am Display erfolgreich angezeigt:
1
while(BusyXLCD());
2
SetDDRamAddr(0x05);
3
sprintf(buffer,"Text zum anzeigen");
4
while(BusyXLCD());
5
putrsXLCD(buffer);
da sich der anzuzeigende Text, allerdings mittlerweile verzehnfacht hat
wollt ich der Übersicht halber ne Funktion für das ganze drumherum
schaffen...
Das sollte dann so aussehen:
1
voidWriteGeneralText(int8ADDRESS,chartext[27]){
2
chartemp[27];
3
while(BusyXLCD());
4
SetDDRamAddr(ADDRESS);
5
sprintf(temp,text);
6
while(BusyXLCD());
7
putrsXLCD(temp);
8
}
9
10
AUFRUF:
11
WriteGeneralText(0x05,*"Text zum Anzeigen");
Das war meine Idee. Leider funktioniert das nicht.
Wie kann ich den Zeichenketten im "Array-format" als parameter sinnvoll
übergeben?
...Micha
Michael Schumann schrieb:
> Ok, so hab ich bis jetzt eine Ausgabe am Display erfolgreich angezeigt:>>
1
>while(BusyXLCD());
2
>SetDDRamAddr(0x05);
3
>sprintf(buffer,"Text zum anzeigen");
4
>while(BusyXLCD());
5
>putrsXLCD(buffer);
6
>
>> da sich der anzuzeigende Text, allerdings mittlerweile verzehnfacht hat> wollt ich der Übersicht halber ne Funktion für das ganze drumherum> schaffen...
Guuute Idee
>
1
>voidWriteGeneralText(int8ADDRESS,chartext[27]){
2
>chartemp[27];
3
>while(BusyXLCD());
4
>SetDDRamAddr(ADDRESS);
5
>sprintf(temp,text);
6
>while(BusyXLCD());
7
>putrsXLCD(temp);
8
>}
9
>
10
>AUFRUF:
11
>WriteGeneralText(0x05,*"Text zum Anzeigen");
12
>
13
>
>> Das war meine Idee. Leider funktioniert das nicht.> Wie kann ich den Zeichenketten im "Array-format" als parameter sinnvoll> übergeben?
C-Buch lesen.
Arrays werden nicht übergeben, sondern die Funktion bekommt einen
Pointer auf das erste Array Element.
1
voidWriteGeneralText(int8ADDRESS,constchar*text)
2
{
3
while(BusyXLCD());
4
SetDDRamAddr(ADDRESS);
5
while(BusyXLCD());
6
putrsXLCD(temp);
7
}
ALternativ hättest du auch einfach nachsehen können, wie eigentlich
putrsXLCD seinen Text übernimmt :-)
Danke für die schnellen Antworten...
Leider lässt sich das Programm so nicht compilieren.
Er meint in der Zeile des Aufrufes, dass ich eine Constante als Zeiger
übertragen soll, er zwingt mich quasi dazu einen " * " vor
"Anzuzeigender Text" zu setzen.
Den Rest hab ich so übernommen wie Peter mir vorgeschlagen hat.
...Micha
Michael Schumann schrieb:
> Er meint in der Zeile des Aufrufes, dass ich eine Constante als Zeiger> übertragen soll, er zwingt mich quasi dazu einen " * " vor> "Anzuzeigender Text" zu setzen.
Wer ist 'ER'?
Welchen Compiler benutzt du?
(Schweren Herzens)
Lass mal das 'const' in der Argumentliste weg.
Michael Schumann schrieb:
> Er meint in der Zeile des Aufrufes, dass ich eine Constante als Zeiger> übertragen soll, er zwingt mich quasi dazu einen " * " vor> "Anzuzeigender Text" zu setzen.
dann zeig doch mal bitte was der compiler genau dazu meint.
Michael Schumann schrieb:
> Er meint in der Zeile des Aufrufes, dass ich eine Constante als Zeiger> übertragen soll, er zwingt mich quasi dazu einen " * " vor> "Anzuzeigender Text" zu setzen.
Das kommt mir komisch vor. Poste mal die Fehlermeldung, bitte.
Ein String Literal an sich sollte einen Zeiger ergeben. Mit *
dereferenzierst Du den wieder und erhälst den Basistyps des Arrays. Nun
gut, das ist dann nicht const aber auch kein char *. Seltsam.
Der Parameter "controllerSet" ist nur um zwischen dem ersten und zweiten
Displaycontroller zumzuschalten. Den hat ich vorher zur übersicht
rausgelassen.
Micha
Lass es mal mit const und * laufen. Ich verwette mein gerade verspeistes
Abendessen, das nur Müll angezeigt wird.
Der Compiler hat auch nicht gesagt, das Du eine Konstante als Zeiger
übertragen sollst, sondern das Du eben dies versuchst. Das ist kein
"Kommando" an Dich sondern nur eine Charakterisierung dessen was der
Compiler gelesen hat.
String Literale sind nicht konstant.
Nimm also das const (wie Karl Heinz schon schrieb) UND den Stern raus.
Grrrr schrieb:
> String Literale sind nicht konstant.
Doch, eigentlich sind sie das schon.
> Nimm also das const (wie Karl Heinz schon schrieb) UND den Stern raus.
Ich hoffe du meinst den *, den er beim Aufruf eingefügt hat um alles
compilierbar zu machen.
In Bezug auf das const: Seltsam ist das schon.
Der IAR Compiler hat doch so eine Eigenart, dass 'const' eigentlich
bedeutet: befindet sich im Flash. Ob es damit zusammenhängt?
Zum dritten mal:
Welcher Compiler ist das.
Die Fehlermeldung, die hier kommt, ist durch nichts im C-Standard
gerechtfertigt. Es handelt sich da um irgendeine 'Erweiterung' die der
Compilerhersteller 'zum Wohle der Menschheit' eigenmächtig eingebaut
hat. Um einen AUsweg zu finden, muss man wissen welcher Compiler das
ist. Dann kann man mal etwas googeln.
Karl heinz Buchegger schrieb:
> Doch, eigentlich sind sie das schon.
In C++ haben sie implizit das const Attribut aber nicht in C. Habe
jedenfalls keine anderere Aussage in K&R ANSI C finden können. Sonst
würde die Meldung auch nicht kommen. Wir sind uns aber einig das auch in
C das Literal "faktisch" konstant ist.
Karl heinz Buchegger schrieb:
> Ich hoffe du meinst den *, den er beim Aufruf eingefügt hat um alles> compilierbar zu machen.
Ja, den meinte ich natürlich.
wow... ihr seit einfach zu schnell...
Respekt!
Also, Ja, ich benutze CSS.
Und Ja, mit dem Umweg über sprintf gehts auch.... nur blöd, dass ich das
sprintf lieber in der Routine stehen hätte..
Aber gut, so kann ich wenigstens auch Variable anzeigen lassen mit
meiner jetzt so tollen Funktion.
... Jetzt brauch ich nur nen anderen Namen dafür^^
So ein mist!
Vielen danke für eure Hilfe.
Schade, dass der CSS da bisschen Zicken macht.
Gruß Micha
Michael Schumann schrieb:
> Schade, dass der CSS da bisschen Zicken macht.
Hier findet sich eine Erklärung dafür
https://www.ccsinfo.com/forum/viewtopic.php?p=71942
(2.tes Posting)
Ganz am Ende des Postings ist die Rede von einem Compilerschalter. Da
das Posting von 2006 ist, könnte es sein, dass der Schalter mitlerweile
funktioniert.
Karl heinz Buchegger schrieb:
>> String Literale sind nicht konstant.> Doch, eigentlich sind sie das schon.
Nö, sind sie nach ANSI-Standard nicht, Datentyp der Array-Elemente ist
einfach nur char. Allerdings ist es explizit undefined, was passiert,
wenn man versucht, das implizit erzeugte Array zu beschreiben. Ausserdem
ist es dem Compiler freigestellt, identische Stringliterale
zusammenzufassen.
Andreas
Andreas Ferber schrieb:
> Karl heinz Buchegger schrieb:>>> String Literale sind nicht konstant.>> Doch, eigentlich sind sie das schon.>> Nö, sind sie nach ANSI-Standard nicht,
Hmm.
OK. Ich nehms zur Kentniss. Wieder ein Detail in dem sich C von C++
unterscheidet.
Moment mal. Habe ich es dann nicht gerade falsch herum erklärt?
Oder ist CCS (den kenne ich überhaupt nicht) so vorauseilend gehorsam,
das es String Literale implizit als const attributiert?
Grrrr schrieb:
> Moment mal. Habe ich es dann nicht gerade falsch herum erklärt?>> Oder ist CCS (den kenne ich überhaupt nicht) so vorauseilend gehorsam,> das es String Literale implizit als const attributiert?
Darum gehts nicht.
Lies dir den Link durch, den ich gefunden habe.
Die haben da getrickst um Speicherplatz im SRAM zu sparen, hatten aber
gleichzeitig das Problem, dass man auf alten PIC anscheinend nicht im
Flash lesen konnte. Also wird ein String Literal implementiert, in dem
der Compiler eine 'Funktion' dafür erzeugt, die das Literal liefert.
Und damit ist es dann mit 'darauf einen Pointer erzeugen' Essig.
Karl heinz Buchegger schrieb:
> Darum gehts nicht.> Lies dir den Link durch, den ich gefunden habe.> Die haben da getrickst um Speicherplatz im SRAM zu sparen, hatten aber> gleichzeitig das Problem, dass man auf alten PIC anscheinend nicht im> Flash lesen konnte. Also wird ein String Literal implementiert, in dem> der Compiler eine 'Funktion' dafür erzeugt, die das Literal liefert.> Und damit ist es dann mit 'darauf einen Pointer erzeugen' Essig.
Auweia. So desu ka!
Grrrr schrieb:
>> Auweia. So desu ka!
Du sagst es (was auch immer)
Wär für mich ein Grund, schleunigst den Compiler zu wechseln, wenn man
das nicht abschalten kann.
Karl heinz Buchegger schrieb:
> Arrays werden nicht übergeben, sondern die Funktion bekommt einen> Pointer auf das erste Array Element.> void WriteGeneralText(int8 ADDRESS, const char * text )> {
wie sähe es denn mit
1
voidWriteGeneralText(int8ADDRESS,constchartext[])
2
{
aus, da ja array != pointer ;-)))))))))))
Tschü Dude
12er Dude schrieb:
> Karl heinz Buchegger schrieb:>> Arrays werden nicht übergeben, sondern die Funktion bekommt einen>> Pointer auf das erste Array Element.>> void WriteGeneralText(int8 ADDRESS, const char * text )>> {>> wie sähe es denn mit>
> aus, da ja array != pointer ;-)))))))))))>
Selbes Problem.
Das Problem liegt nicht in der Funktion selber, sondern in der Art und
Weise wie der Compiler mit "Text zum Anzeigen" (also der
Stringkonstanten) umgeht
12er Dude schrieb:
> Schon klar, mir ging es nur um die Schreibweise des Parameters:
Ah. ok.
Nein das hilft nichts.
An dieser Stelle ist
void WriteGeneralText(int8 ADDRESS, const char text[] )
nur eine andere Schreibweise für
void WriteGeneralText(int8 ADDRESS, const char * text )