Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: type definition string Kategorie: Programmierung (von wernerAZ - 27.03.2007 11:25)
Als Antwort auf Re: type definition string von André H. - 25.03.2007 14:34
Ich nutze:
C164CI-ControllerBoard, CC2-Application-Board, OSOPT V3.1
Hallo Andre',
deine Modifikation von str.length() funktioniert einwandfrei, super.
Aber die neue Textausgabe auf das touchlcd ist ja noch besser
und str.length() kann ich mir dadurch schenken.
Ich werde allerdings die neue Funktion text, in textL,textZ,textR...benennen und mir so
die Eingabe von z.B. 'L' , bzw. 'R' , sparen.
Dann kann ich die Konstante DIR[] und die if-else Zeile mit DIR[dir] weglassen, oder?
Danke für den Tip, Andre'

Mein GPS-Empfänger mit C-Control II macht fortschritte, hurra.

mfg
Werner

> Hallo Werner,
>
> Das Problem liegt am eigenen Datentyp.
> Genaugenommen sind eigene Datentypen einfache Arrays(Byte, Integer etc.).
> "Elemente" aus eigenen Datentypen können, wenn es sich um Strings handelt,
> aber nicht so ohne weiteres einer Funktion übergeben werden, welche explizit
> einen String erwartet.
> Ein String in einem eigenen Datentyp wird aber mehr wie ein Bytearray mit 32 Elementen
> vom Compiler behandelt. (Prinzipiell ist ein String auch nicht mehr.)
> Das ist leider ein allgemeines Problem bei eigenen Datentypen im Zusammenhang mit Strings.
> Abhilfe schafft hier eine geänderte Funktion str.length():
> //-----------------------------------------------
>   inline function length ( byte s[] ) returns int
> //-----------------------------------------------
> {
>   inline vmcodes.VM_STRING | (vmcodes.STRING_GET_LENGTH << 8);
> }

>
> Alternative kannst Du für touchlcd.c2 auch eine neue Funktion text() verwenden:
> /*************************************/
> /* String ausgeben                   */
> /*************************************/
> const DIR[]='L','Z','R','O','M','U';
> function text(byte dir,byte posX, byte posY, byte str[])
> {byte i;
>  //esc();
>  put(ESC);
>  put('Z');
>  if dir<=5 put(DIR[dir]); else put(dir);
>  put(posX);
>  put(posY);
>  for i=0 ... <str[31] put(str[i]);
>  put(0);
> }

>
> Diese Funktion ist aus der 2.0beta von touchlcd.c2, die ich seit Sommer letzten
> Jahres angefangen hatte, aber noch nicht veröffentlich habe.
>
> MfG André H.
>
>
>
> > Hallo zusammen,
> > wieso funktioniert str.length(gps.breite) nicht?
> >
> > type gpsDaten
> > {
> > string kennung;
> > string zeit;
> > string status;
> > string breite;
> > string breiteB;
> > string laenge;
> > string laengeL;
> > string speed;
> > string grad;
> > string datum;
> > string gradM;
> > string direction;
> > string mode;
> > string checksum;
> > }
> >
> > thread main
> > {
> > string egal;
> > egal="12345wert";
> >
> > gpsDaten gps;
> > gps.kennung="$GPRMC";
> > gps.zeit="135155.000";
> > gps.status="A";
> > gps.breite="4959.3687";
> > gps.breiteB="N";
> > gps.laenge="00813.8943";
> > gps.laengeL="E";
> > gps.speed="0.00";
> > gps.grad="258.97";
> > gps.datum="220307";
> > gps.gradM="";
> > gps.direction="";
> > gps.mode="A";
> > gps.checksum="*6c";
> >
> > lcdext.init();
> > touchlcd.init();
> > lcdext.print(egal);
> > lcdext.print2(gps.breite);
> > touchlcd.text('L',0,0,gps.breite,str.length(gps.breite)); //type mismatch, wieso?
> > loop
> >     {
> >     }
> > }
> >

> > mfg
> > Werner


    Antwort schreiben


Antworten: