Forum: Mikrocontroller und Digitale Elektronik Text als char array in funktion übergeben.


von Michael Schumann (Gast)


Lesenswert?

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
void WriteGeneralText(int8 ADDRESS,char text[27]){
2
   char temp[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

von Grrrr (Gast)


Lesenswert?

Michael Schumann schrieb:
> WriteGeneralText(0x05, >>>>>>*<<<<<<< "Text zum Anzeigen");

Lass mal den Stern weg. Wozu soll der gut sein?

von Karl H. (kbuchegg)


Lesenswert?

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
> void WriteGeneralText(int8 ADDRESS,char text[27]){
2
>    char temp[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
void WriteGeneralText(int8 ADDRESS, const char * 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 :-)

von Peter (Gast)


Lesenswert?

warst schon sehr nah dran.
1
void WriteGeneralText(int8 ADDRESS,const char* text){
2
   char temp[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");

von Michael Schumann (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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.

von Grrrr (Gast)


Lesenswert?

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.

von Grrrr (Gast)


Lesenswert?

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.

von Michael Schumann (Gast)


Angehängte Dateien:

Lesenswert?

So, hab nen Screenshot hintendran gehängt...

meine Definition sieht nun so aus:
1
void WriteGeneralText(short controllerSet,int8 ADDRESS,const char* text){
2
   while(BusyXLCD(controllerSet));
3
   SetDDRamAddr(controllerSet,ADDRESS);
4
   while(BusyXLCD(controllerSet));
5
   putrsXLCD(controllerSet,text);
6
}

Der Parameter "controllerSet" ist nur um zwischen dem ersten und zweiten 
Displaycontroller zumzuschalten. Den hat ich vorher zur übersicht 
rausgelassen.

Micha

von Grrrr (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Welcher Compiler ist das?

von Karl H. (kbuchegg)


Lesenswert?

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?

von g457 (Gast)


Lesenswert?

Ist das der CCS? Falls ja dann nimm den Umweg über..

char fubar[] = "hallo welt";
WriteGeneralText(0, 0, fubar);

..das sollte klappen.

von Karl H. (kbuchegg)


Lesenswert?

Hmm.
Das würde auch den völlig bescheuerten, aber anscheinend notwendigen 
sprintf im Originalcode erklären.

von Michael Schumann (Gast)


Lesenswert?

hab alle kombinationen durchprobiert und es wird nix angezeigt.
(Also nur der Text, der mit der alten Version erstellt wurde)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Grrrr (Gast)


Lesenswert?

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.

von Michael Schumann (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Andreas F. (aferber)


Lesenswert?

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

von Michael Schumann (Gast)


Lesenswert?

Jetzt hat sich alles überschlagen. Und ich hab mich dazu noch verlesen.

Mein Lösung nun:
1
void WriteGeneralText(short controllerSet,int8 ADDRESS,char* text){
2
   
3
   while(BusyXLCD(controllerSet));
4
   SetDDRamAddr(controllerSet,ADDRESS);
5
   while(BusyXLCD(controllerSet));
6
   putrsXLCD(controllerSet,text);
7
}
8
9
//Aufruf
10
11
sprintf(buffer,"Anzuzeigender Text mit Variablen: %d",var_a);
12
WriteGeneralText(0,0x05,buffer);

aber zumindest konnt ich von 6 auf 2 Programmzeilen reduzieren.
Vielen dank!!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Grrrr (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Grrrr (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Grrrr (Gast)


Lesenswert?

So desu ka = So ist das (wunder)

Na den werd' ich bestimmt nicht kaufen.

von 12er Dude (Gast)


Lesenswert?

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
 void WriteGeneralText(int8 ADDRESS, const char text[] )
2
 {
aus, da ja array != pointer ;-)))))))))))

Tschü Dude

von Karl H. (kbuchegg)


Lesenswert?

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
>
1
>  void WriteGeneralText(int8 ADDRESS, const char text[] )
2
>  {
3
>
> 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

von 12er Dude (Gast)


Lesenswert?

Schon klar, mir ging es nur um die Schreibweise des Parameters:
1
char * text   // pointer
2
char text[]   // array
und der ;-), weil das Gleiche dabei rauskommt.

Tschü Dude

von Karl H. (kbuchegg)


Lesenswert?

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 )

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.