Text als char array in funktion übergeben.

Gast #1630162
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
#1630172
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 :-)
Gast #1630174
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");
Gast #1630207
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
#1630214
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.
Gast #1630215
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.
Gast #1630219
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.
Gast #1630233
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
Angehängte Dateien:
Gast #1630244
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.
#1630256
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?
#1630273
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.
Gast #1630277
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.
Gast #1630279
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
#1630287
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
Gast #1630291
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!!
#1630309
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.
Gast #1630320
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!
Gast #1631491
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
#1631494
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
#1631537
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 )

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