string and funktion als ptr übergeben



  • hi,
    ich hab momentan ein kleines problem mit meinem C programm.
    es gibt eine funktion die folgendermaßen aufgerufen werden soll.
    LCD_display("12345");
    den string direkt im funktionsaufruf reinzuschreiben waere schon relativ wichtig, da ich keine direkte abfrage machen kann und der benutzer wissen sollte wo genau das ganze dann reingeschrieben wird. im notfall waere ein
    text[]="1234";
    auch noch zu akzeptieren.
    mein groesseres problem liegt aber immer auf der anderen seite, also bei der funktion selber^^

    void LCD_display (char *text)
    {
        int i = 0;
        while( text[i] != '\0' )             // write data to LCD up to null
        {
            LCD_WriteChar (text[i]+0x80); 	// write character to LCD
            i++; 				// step to next character
        }
    }
    

    wie muss der teil beim funktionsaufruf aussehen damit er einen pointer auf den uebergebenen string hat, so das ich jedes einzelne zeichen per LCD_WriteChar verschicken kann?
    falls ich doch die notfall variante brauch, wie muss ich das genau angeben damit er das wie gewollt uebergibt?

    char test[];
    .....
    test="12345";
    LCD_display(test);
    

    dieses ganze ptr und funktionszeuch hab ich immer gehasst und jetzt sitz ich auch noch ohne c-buch hier rum. bitte helft mir bevor ich verzweifel -.-



  • Abgesehen davon, daß ich der Funktion einen "const char*" übergeben würde, sieht sie schonmal recht gut aus. Aufrufen kannst du sie dann auch mit:

    LCD_display("12345");
    //oder
    char text[]="12345";
    LCD_display(text);
    //oder
    char text[max_len];
    ...
    strcpy(text,"12345"); /*oder z.B.*/ scanf("%s",text);
    LCD_Display(text);
    //oder ...
    


  • CStoll schrieb:

    LCD_display("12345");
    //oder
    char text[]="12345";
    LCD_display(text);
    //oder
    char text[max_len];
    ...
    strcpy(text,"12345"); /*oder z.B.*/ scanf("%s",text);
    LCD_Display(text);
    //oder ...
    

    oder

    char *text="12345";
    LCD_Display(text);
    


  • also, abfragen um dann mit scanf zu arbeiten kann ich leider nicht verwenden.
    auch möchte ich ein dynamisches array, da ich mit einem microcontroller arbeite und das ganze so schoener waere/ist.
    die variable test aus der main kann theoretisch öfter verwendet werden, muss halt an verschiedenen stellen neu zugewiesen werden. daher hatte ich die ueberlegung den string direkt in den funktionsaufruf zu schreiben.
    wie wuerde das ganze aussehen? oben müsste mit char text[]; das array deklariert werden, aber wie speicher ich kurz vorm funktionsaufrauf den string darin? text = "abcd"; geht bei mir nicht. du hast das ganze noch mit strcpy angegeben, aber auch das haut net ganz hin.

    das was ich spaeter erreichen möchte is,das ich mit
    LCD_WriteChar (text[i]+0x80);
    den hexwert 0x80 dazu addiere zum urspruenglichen ascii wert, damit ich das selbe zeichen auf dem lcd dargestellt bekomm. mit
    char text[]="12345";
    LCD_display(text);
    hatte es bereits am laufen, aber dazu muss ich ja ganz am anfang schon wissen was drinsteht und zudem kann ich der variablen nur einen string zuweisen.



  • Die Funktion nimmt einen char-Pointer entgegen. Woher sie den bekommt und auf welcher Daten er zeigt, ist ihr dabei egal - das kann ein String-Literal sein, ein lokales char-Array oder auch ein char-Pointer (wie codefrag ergänzt hat).

    Allerdings kannst du ein Array nicht einfach über = zuweisen (einen char-Pointer schon). Das mußt du entweder manuell füllen (vergiss das '\0' am Ende nicht, sonst stellt dein LDC-Display irgendwelchen Müll dar) oder du verwendest strcpy() und seine Verwandten.
    (Und wenn du ein char-Array verwendest, denk dran, es groß genug für deine kompletten Daten inklusive Null-Terminator zu machen)



  • Was funktioniert denn nicht an

    LCD_display("12345");
    

    😕

    BTW: Wenn Du wie CStoll angeregt hat den Parameter als const char * deklarierst, würde die Funktion sogar noch in C++ funktionieren 😉



  • das const char* hab ich ja bereits verwendet und hat auch geholfen. aber wenn ich LCD_display("12345"); verwende, bekomme ich die warnung:
    \main.c:53:Warning [2066] type qualifier mismatch in assignment
    und er rechnet definitiv nichtmehr mit hexzahlen und erkennt sowieso kein \0. das mit \0 kann ich notfalls durch strlen aendern, aber es aendert nichts an der tatsache das der funktionsaufruf nicht zur erwuenschten berechnung führt. es ist egal was ich fuer einen string uebergebe, das lcd zeigt immer die gleichen schwachsinnigen zeichen an.



  • Und in welcher Zeile kommt diese Warnung?

    Ansonsten könnte es auch daran liegen, daß du eine falsche Vorstellung vom Inhalt eines char's hast - text[0] enthält den Wert '1' (=0x31), was du dort drin erwartest, kann ich nur raten (ich tippe spontan auf 0x01).



  • die warnung bezieht sich auf den befehl in der main: LCD_display(abcde");
    ich erwarte ja ein 0x31, weil addiert mit 0x80 bekomme ich 0xB1, was der '1' auf meinem LCD entspricht. das ganze wuerde zwar vorerst nur mit zahlen und buchstaben funktionieren, aber ich waere erstmal darueber froh. den rest werd ich eh wahrscheinlich nicht brauchen.
    wenn ich strcpy benutze, dann geht das auch mit dynamischem array? ich hab irgendwie das gefuehl das er das nich richtig speichert bzw der pointer woanders hinzeigt, so das er einen teil ausgibt der nie geaendert wird. aber wieso?



  • also bei LCD_display("12345"); oder mit strcpy davor oder sogar nur zeichenweiser eingabe mit 'p', macht er was er will mit der variablen text.
    hat oft nen wert von 0x03B4, wobei er natuerlich nur die beiden rechten hexstellen nimmt, 0x80 draufrechnet und totaler muell rauskommt. dachte das passiert vielleicht nur bei strings, aber wie gesagt auch bei einzelnen buchstaben. warum strcpy nicht funktioniert versteh ich ehrlich gesagt nicht.
    das einzigste was geht is oben vor der main char test[]= "muell"; einzugeben, dann wird alles richtig angezeigt.



  • Also in der obigen Funktion kann ich keinen Fehler entdecken - das heißt das Problem liegt höchstwahrscheinlich im Inneren von LCD_WriteChar() (hast du die selber geschrieben? und was kommt heraus, wenn du sie direkt als LCD_WriteChar('x'+0x80); aufrufst?) oder an der seltsamen Zeichenumrechnung (ist die überhaupt notwendig? wenn ja, würde ich sie eher in der LCD_WriteChar() unterbringen, bevor das Zeichen nach außen geschickt wird).



  • wollt grad schreiben das es sich erledigt hat. das problem is irgendwie das er versucht hat das ganze aus dem ram zu lesen, aber da es im programcode is speichert er das ganze is rom ab. folglich musste man "nur" hier:
    void LCD_display (const rom char* text) {blabla}
    das rom einfuegen und schon gehts mit dem normalen aufruf mit string, also
    LCD_display ("abcd578");
    wie schon gesagt war dieses +0x80 nie das problem, da er es bei direkter deklarierung des arrays auch richtig umgerechnet und ausgegeben hat.
    aber egal, dass tut es jetzt endlich auch. trotzdem vielen dank an alle die geholfen haben, zumindest hat es mich bestaetigt das ich kein totaler trottel bin und der grund doch woanders lag:P


Log in to reply