- 12V Akku mit 280 Ah bauen         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 35

Thema: String zerlegen und umwandeln ?!

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    58
    Beiträge
    576

    String zerlegen und umwandeln ?!

    Anzeige

    Praxistest und DIY Projekte
    Hallo
    Der Thread geht von hier weiter:
    https://www.roboternetz.de/phpBB2/vi...=303371#303371

    Habe das mal durchgenommen:
    http://www.pronix.de/pronix-735.html

    Geht aber doch nicht ganz so wie ich wollte

    Also mein Problem:
    Ich möchte im eine Routine schreiben, wo ich auf einem Grafikdisplay, Text ausgeben kann.

    Dazu möchte ich schreiben können:
    Zeile=xx
    Spalte=xx
    Text="xxxxx"

    (Das mit Zeile und Spalte funktioniert schonmal)

    Jetzt muss ich aber irgendwie das schaffen, dass ich da eine String-Kette übergeben kann (Text="xxx")
    Diese Stringkette muss ich dann zerlegen und beginnend mit dem ersten Zeichen, umwandeln in den ASCII-Code.
    Mit dem ASCII-Code könnte ich dann in meinem Zeichensatz nachschauen und die entsprechenden Daten dann am LCD ausgeben.

    Leider habe ich gemerkt, dass ich mit Text[]= "T"; nur ein Zeichen übergeben kann.
    Ich dachte mir, ich könnte da meine max. 40 Zeichen gleich übergeben

    Wie gesagt in Bascom funktioniert es ja...aber C ist da wieder so eine eigene (fremde) Welt


    Habe zu string.h noch hier was gefunden.
    http://www.pronix.de/pronix-737.html
    Muss das aber noch durchkauen..


    Vielleicht könnt Ihr mir ja da ein paar Hinweise geben

    L.G. Roberto

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    Hallo Roberto,

    Du kannst das n-te Zeichen eines strings s mit s[n] abrufen(beginnend mit 0, nicht mit 1!)


    Wenn Du ein einzelnes Zeichen schon auf das Display Zaubern kannst, dann kannst Du einen ganzen String ungefähr so ausgeben:

    Code:
    void LCD_puttext(char* pstr,unsigned char x_pos, unsigned char y_pos)
    {
    	while(*pstr)//solange der string nicht zu ende ist (*pstr nicht 0 ist)
    	{
    		LCD_putchar(*pstr,x_pos,y_pos);//zeichne einen buchstaben
    		x_pos+=Zeichenbreite;//erhöhe die x-Position für das nachste Zeichen
    		pstr++;//erhöhe den Zeiger
    	}
    }
    Der erste Parameter ist dann ein Zeiger auf die Zeichenkette, der zweite und der dritte die Position.

    MfG Mark

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    58
    Beiträge
    576
    Hallo Mark

    Danke für die Antwort.
    Muss mir das noch durchkauhen... (dauert noch ein bisschen)
    Aber bevor alle schlafen gehen... Vielleicht kann mir noch wer sagen, wie ich eigentlich einen z.B. 30 Zeichen langen String überhaupt in ein String-Array bekomme (irgendwo im Programm)

    Mit :const char hallo[] = { "Hallo Welt\n" };
    geht es ja nur beim deklarieren am Anfang des Codes.


    Einmal hatte ich es dann im "Main" geschafft..
    (Durch das probieren weis ich jetzt aber nicht mehr, ob das mit "const char..." war, oder nicht war)
    Auf jedenfall wollte er es dann am Anfang von "Main" haben und nicht am Ende. (Fehler)



    Und noch eine Frage dazu
    Wird eigentlich immer die ganze Include Datei eingebunden oder nur die Befehle, die davon auch verwendet werden

    l.G. Roberto

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo,
    Mit :const char hallo[] = { "Hallo Welt\n" };
    geht es ja nur beim deklarieren am Anfang des Codes.
    1. Lass Dir dieses const auf der Zunge zergehen überleg 2 Sekunden und gib Dir selbst eine Antwort darauf, ob Du da noch was im laufendem Programm verändern kannst
    2. Gut angenommen, Du läßt const Weg damit ist Dein char hallo[] genau 11 Bytes lang (der Text + Zeilenumbruch + '\0')
    Damit mußt Du dafür Sorgen, daß Du nichts größeres hineinkopierst.
    3. Nach der Einführung gibt es wieder 2 Wege:
    A. Du nutzt die string.h und gukst Du dir strcpy(char *a,char *b) an,
    es kopiert Array/Zeichenkette b in a inklusive '\0' a u. b müssen natürlich auch Nullterminiert sein.
    B. Du implementierst Dir eine eigene Routine dafür z.B. so
    Code:
    void kopierebina(char *a,char *b) {
       while(*a++ = *b++);
         *a='\0';
       }
    Du hast die Wahl

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    58
    Beiträge
    576
    Hallo Sebastian


    1. Lass Dir dieses const auf der Zunge zergehen überleg 2 Sekunden und gib Dir selbst eine Antwort darauf, ob Du da noch was im laufendem Programm verändern kannst Zwinkern
    2. Gut angenommen, Du läßt const Weg damit ist Dein char hallo[] genau 11 Bytes lang (der Text + Zeilenumbruch + '\0')
    Ok, das Beispiel hatte ich schnell von hier genommen:
    http://www.pronix.de/pronix-735.html

    Habe nachgeschaut und gesehen, dass ich es eh nur mit :
    char Text [30];
    deklariert habe.

    Ich kann aber im "main" leider nicht richtig einen längeren String übergeben

    z.B.:

    Text [] = "test test"; (invalid expression)
    Text [] = 'test test; (invalid expression)
    char Text [] = 'test test; (must declare in first in block) (auch bei " ")

    Wenn ich das am Anfang von "main " einfüge, nimmt der Compiler es.

    Was mache ich falsch?

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Roberto,
    langsam und nochmal von vorne:

    C kennt keine Strings, leider (oder Gott sei dank) das mußt Du Dir hinter die Ohren schreiben.
    Strings kannst Du in C darstellen als char Array, mit einer NULL '\0' am Ende.
    Ein Array kannst Du nicht direkt in ein anderen kopieren, wie Du das vorhast
    Die leeren Klammeren [] sind nur bei der Deklaration zuläßig und die muß ganz am Anfang erfolgen.
    Was in die Klammer reinkommt berechnet der Kompiler selber anhand der Zeichen die zwischen "" stehen plus 1 Byte für die NULL '\0'
    Zu Laufzeit ist es nicht möglich.
    Was aber möglich ist, ein Array in ein anderen zu kopieren
    Und in Verbindung mit Strings benutzt man die string.h !

    Hier ein Beispiel:
    Code:
    #include<string,h>
    char puffer[30]; /*Hier passen max 29 Zeichen*/
    const char eintext[]="noch was";
    char nocheinpuffer[10];
    strcpy(puffer,"Hallo Roberto");
    put_lcd(puffer);/*es wird Hallo Roberto ausgegeben*/
    strcpy(puffer,eintext);
    put_lcd(puffer);
    strcpy(puffer,nocheinpuffer);
    put_lcd(puffer);
    usw.usw
    Willst Du aber string.h nicht nutzen, weil Du alles zu Fuß machen willst, oder es Dir gerade danach ist nimmst Du die Funktion, die ich oben geschrieben habe und machst Du damit weiter anstatt von strcpy
    ufff, ich hoffe daß es hilft

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    58
    Beiträge
    576
    Hallo Sebastian (Danke für die Geduld

    So langsam dämmert es..
    (Aber mit den Zeigern tue ich mich noch ein bisschen schwer)

    Was sagst Du zu diesem Versuch?

    #include<String.h>
    char Text[30];

    void Lcd(char a)
    {
    strcpy(Text,a);
    }


    void main(void)
    {
    Lcd("Test test");
    }

    Oder muss ich das irgendwie mit Zeigern machen? (*)
    Muss noch nachschauen, wie das mit der Übergabe von Werten an eine Funktion funktioniert...

    Ps.: zur Erklärung:
    Ich möchte einen Text im Code angeben ( z.B. mit: Lcd("Test test"); ) der mir dann
    in das char "Text" kopiert wird.
    Später zerlege ich dann char "Text" in die einzelnen Zeichen und ASCII-Werte

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    Hallo Roberto!

    Zitat Zitat von Roberto
    Ich möchte einen Text im Code angeben ( z.B. mit: Lcd(Test test); ) der mir dann
    in das char "Text" kopiert wird.
    'Text' ist in diesem Fall kein char, sondern ein Araay von chars. Ein einzelner char kann nur einen einzigen Buchstaben aufnehmen.

    Deine Funktion LCD(char a) ist auch fehlerhaft, da strcpy zwei Zeiger auf einen char erwartet und nicht einen Zeiger und einen char.

    Wenn Du eine Funktion LCD_putchar(char) hast, dann kannst Du mit der Funktion meines ersten Beitrags den ein char-Array ausgeben. Da Du in C aber noch einige Probleme hast(keine Sorge, am Anfang hat jeder Probleme), werde ich Dir die Funktion näher erläutern:
    Code:
    /*Die Funktion LCD_puttext erwartet als ersten Parameter  einen Zeiger auf das 
    mit 0 abgeschlossene Array von zeichen, das ausgegeben werden soll. Der
    weite und dritte Parameter ist die Position des Textes
    */
    void LCD_puttext(char *pstr,unsigned char x_pos, unsigned char y_pos)
    {
    	while(*pstr)/*Folgende schleife wird solange durchgeführt, bis das char, 
    	auf das der Zeiger pstr zeigt, nicht 0 ist. '*' ist der Dereferenzierungsoperator,
    	der dafür sorgt, dass der Compiler nicht mit dem Zeiger rechnet, sondern mit dem
    	Wert, auf den der Zeiger zeigt.*/
    	{
    		LCD_putchar(*pstr,x_pos,y_pos);/*Zeichnet den Buchstaben, der sich an der Stelle befindet, 
    		worauf pstr zeigt auf das LCD*/
    		x_pos+=Zeichenbreite;//erhöhe die x-Position für das nachste Zeichen.
    		pstr++;/*erhöhe den Zeiger selbst. Nun zeigt er nicht mehr auf den char, der gerade 
    		gezeichnet wurde, sondern auf den nächsten. Sollte der char, auf den er jetzt zeigt,
    		eine 0 sein, so wird die Schleife verlassen, weil die Bedingung in while(*pstr) nicht 
    		mehr stimmt.*/
    	}
    }
    Jetzt Kannst Du mit LCD_puttext("Dein Text"); oder LCD_puttext(Text); (Text ist in diesem Fall das char-Array aus deinem Beitrag unten) ausgeben. Ich hoffe Du hast es jetzt einigermahßen verstanden. Guck mal hier, wenn Du mehr über Zeiger erfahren willst.

    MfG Mark

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    58
    Beiträge
    576
    Hallo Mark (Elefant geht leider noch nicht von der Leitung )

    Deine Funktion LCD(char a) ist auch fehlerhaft, da strcpy zwei Zeiger auf einen char erwartet und nicht einen Zeiger und einen char.
    Aber das Beispiel von Izaseba
    kopiert ja auch zwei Arrays?!
    #include<string,h>
    char puffer[30]; /*Hier passen max 29 Zeichen*/
    char nocheinpuffer[10];
    strcpy(puffer,nocheinpuffer);
    Kann ich jetzt mit strcpy nur char aneinander hängen oder auch char-Arrays?
    Sind das im obigen Beispiel jetzt Zeiger oder nur Arrays?

    ----------------
    Angenommen ich schreibe jetzt:
    Lcd ("test test");

    Dann mache ich mir eine Funktion:

    Lcd (char *a);

    Dann habe ich ja einen ZEIGER (der "a" heißt) der auf das
    Array "test test" zeigt?!

    Wahrscheinlich ist "test test" kein Array?!
    Wo muss ich das deklarieren?

    Ps.:
    @Mark

    Habe deine Code mal probiert.
    Leider fange ich da nix mit dem LCD_putchar..... an
    (Habe das mal weggelassen)
    Leider schreibt der Compiler mir bei :
    LCD_puttext("test test");
    immer den Fehler:
    Parameter #1 of type 'flash unsigned char*' is incompatible with type 'unsigned char*' specified in the function 'LCD_puttext' declaration

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    Hallo Roberto!

    Aber das Beispiel von Izaseba
    kopiert ja auch zwei Arrays?!
    Jaja, Deine Lcd(char a)-Funktion versucht einen char in ein Array zu kopieren und nicht einen Array in ein Array.

    Kann ich jetzt mit strcpy nur char aneinander hängen oder auch char-Arrays?
    Sind das im obigen Beispiel jetzt Zeiger oder nur Arrays?
    Aneinanderhängen kann man mit strcpy garnix, sondern nur kopieren. Du übergibst der Funktion einen Zeiger auf das Array, wo was reinkopiert werden soll und einen Zeiger auf das Array, von wo kopiert werden muss.

    Wahrscheinlich ist "test test" kein Array?!
    Wo muss ich das deklarieren?
    Doch, "test test" ist ein Array, was anderes bleibt ja nicht übrig.

    Habe deine Code mal probiert.
    Leider fange ich da nix mit dem LCD_putchar..... an
    (Habe das mal weggelassen)
    Leider schreibt der Compiler mir bei :
    LCD_puttext("test test");
    immer den Fehler:
    Parameter #1 of type 'flash unsigned char*' is incompatible with type 'unsigned char*' specified in the function 'LCD_puttext' declaration
    Was für einen Compiler benutzt Du? Keinen GCC oder? 'flash unsigned char*' ist kein Standart-C sondern anscheinend auf die AVRs angepasstes. Ich nehme an, es soll einen Zeiger auf ein char im Flash darstellen. Dann musst Du auch in der Funktion anstatt 'unsigned char*pstr' 'flash unsigned char*pstr' schreiben. Das wird dann aber wiederum nur mit konstanten Texten gehen, aber nicht mit variablen Arrays. LCD_puttext("Hallo Welt") geht dann, LCD_puttext(Text) dann aber nicht mehr. Um Arrays auszugeben, die im RAM sind, musst Du eine zweite Funktion mit 'unsigned char*pstr' als Parameter erstellen.

    MfG Mark

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen