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
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
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
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
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
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
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
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
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.
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?
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
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
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
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
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!!
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.