mikrocontroller.net

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


Autor: Michael Schumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
while(BusyXLCD());
SetDDRamAddr(0x05);
sprintf(buffer,"Text zum anzeigen");
while(BusyXLCD());
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:
void WriteGeneralText(int8 ADDRESS,char text[27]){
   char temp[27];
   while(BusyXLCD());
   SetDDRamAddr(ADDRESS);
   sprintf(temp,text);
   while(BusyXLCD());
   putrsXLCD(temp);
}

AUFRUF:
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

Autor: Grrrr (Gast)
Datum:

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

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Schumann schrieb:
> Ok, so hab ich bis jetzt eine Ausgabe am Display erfolgreich angezeigt:
>
>
> while(BusyXLCD());
> SetDDRamAddr(0x05);
> sprintf(buffer,"Text zum anzeigen");
> while(BusyXLCD());
> putrsXLCD(buffer);
> 
>
> da sich der anzuzeigende Text, allerdings mittlerweile verzehnfacht hat
> wollt ich der Übersicht halber ne Funktion für das ganze drumherum
> schaffen...

Guuute Idee

>
> void WriteGeneralText(int8 ADDRESS,char text[27]){
>    char temp[27];
>    while(BusyXLCD());
>    SetDDRamAddr(ADDRESS);
>    sprintf(temp,text);
>    while(BusyXLCD());
>    putrsXLCD(temp);
> }
> 
> AUFRUF:
> 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?

C-Buch lesen.

Arrays werden nicht übergeben, sondern die Funktion bekommt einen 
Pointer auf das erste Array Element.
void WriteGeneralText(int8 ADDRESS, const char * text )
{
  while(BusyXLCD());
  SetDDRamAddr(ADDRESS);
  while(BusyXLCD());
  putrsXLCD(temp);
}

ALternativ hättest du auch einfach nachsehen können, wie eigentlich 
putrsXLCD seinen Text übernimmt :-)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warst schon sehr nah dran.
void WriteGeneralText(int8 ADDRESS,const char* text){
   char temp[27];
   while(BusyXLCD());
   SetDDRamAddr(ADDRESS);
   sprintf(temp,text);
   while(BusyXLCD());
   putrsXLCD(temp);
}

//AUFRUF:
WriteGeneralText(0x05,"Text zum Anzeigen");

Autor: Michael Schumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Schumann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So, hab nen Screenshot hintendran gehängt...

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

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

Micha

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Compiler ist das?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das der CCS? Falls ja dann nimm den Umweg über..

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

..das sollte klappen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Michael Schumann (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Schumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Schumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt hat sich alles überschlagen. Und ich hab mich dazu noch verlesen.

Mein Lösung nun:

void WriteGeneralText(short controllerSet,int8 ADDRESS,char* text){
   
   while(BusyXLCD(controllerSet));
   SetDDRamAddr(controllerSet,ADDRESS);
   while(BusyXLCD(controllerSet));
   putrsXLCD(controllerSet,text);
}

//Aufruf

sprintf(buffer,"Anzuzeigender Text mit Variablen: %d",var_a);
WriteGeneralText(0,0x05,buffer);


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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So desu ka = So ist das (wunder)

Na den werd' ich bestimmt nicht kaufen.

Autor: 12er Dude (Gast)
Datum:

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

Tschü Dude

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
>
>  void WriteGeneralText(int8 ADDRESS, const char text[] )
>  {
> 
> 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

Autor: 12er Dude (Gast)
Datum:

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

Tschü Dude

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.