www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik char array buchstaben einzeln auslesen


Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe folgenden Pointer auf ein chararray, welcher an die Funktion 
übergeben wird:

funktion("hallo");


void funktion(char *data){

    char text[10];
    // jetzt möchte ich den 5. Buchstaben ausgeben
    sprintf(text, "%s", data[4])
    // nur funktioniert das nicht
}

wie kann ich das machen???

danke im voraus

Sönke

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sönke Paschko wrote:
> ich habe folgenden Pointer auf ein chararray, welcher an die Funktion
> übergeben wird:
>
>
> 
> funktion("hallo");
> 
> 
> void funktion(char *data){
> 
>     char text[10];
>     // jetzt möchte ich den 5. Buchstaben ausgeben
>     sprintf(text, "%s", data[4])
>     // nur funktioniert das nicht
> }
> 

Probiers mal mit
sprintf(text, "%c", data[4]);

Oder
text[0] = data[4];
text[1] = '\0';

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>sprintf(text, "%c", data[4]);

sprintf() gibt gar nichts aus. Damit kopiert man nur
Texte in einen Speicherbereich. Bei dir "text".
Den kannst du dann mit puts(text); oder printf("%s",text);
ausgeben.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger wrote:
>>sprintf(text, "%c", data[4]);
>
> sprintf() gibt gar nichts aus. Damit kopiert man nur
> Texte in einen Speicherbereich. Bei dir "text".
> Den kannst du dann mit puts(text); oder printf("%s",text);
> ausgeben.

Wo steht was von "ausgeben" ;) Okay im Quelltext. Aber ich denke mal 
dass er sich dessen schon bewusst ist.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wo steht was von "ausgeben" ;)

>>// jetzt möchte ich den 5. Buchstaben ausgeben

printf("%c", data[4]);

Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erstmal danke für die Antworten. leider geht das nicht, ich hol mal ein 
wenig weiter aus:

ich habe eine Funktion welche Buchstaben auf einem LCD anzeigt. diese 
heist lcd_data(unsigned char temp1); (die gleiche wie im Tutorial)
dieser funktion muss ich einen Buchstaben übergeben.

nun bekommt meine Funktion ein wort, welches buchstabenweise an die 
funktion lcd_data weitergeleitet werden soll. nur halt nicht wie in der 
Funktion lcd_string(); sondern in einer anderen Reihenfolge. ich möchte, 
das der text sozosagen einfliegt von links, also, dass erst der lezte 
Buchstabe, dann die beiden letzten usw. angezeigt werden. hierzu 
benötige ich die einzelnen buchstaben. so soll das dann ungefär im 
programm ablaufen:
funktion("hallo"); // aufruf mit Wort

void funktion(char *data){

lcd_data(data[4]);
lcd_clear();
lcd_data(data[3]);
lcd_data(data[4]);
...
// natürlich mit schleifen verallgemeinert
}


weder das funktioniert noch das vorherige Umwandeln in der form mit 
sprintf, wie es oben vorgeschlagen wurde.

hier nochmal die Funktion lcd_data:
 
void lcd_data(unsigned char temp1)
{
   unsigned char temp2 = temp1;
 
   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
 
   temp1 = temp1 >> 4;
   temp1 = temp1 & 0x0F;
   LCD_PORT &= 0xF0;
   LCD_PORT |= temp1;               // setzen
   lcd_enable();
 
   temp2 = temp2 & 0x0F;
   LCD_PORT &= 0xF0;
   LCD_PORT |= temp2;               // setzen
   lcd_enable();
   
   _delay_us(42);
}

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

void funktion(char *data)
{
   char count = 0;
   while(*data)
   {
       data++;
       count++
   }

   while(count != 0)
   {
      count -= 1;
      *data += durchlauf;
      while(*data)
      {
         lcd_data(*data);
         data++;
      }
   }
}

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
äähhmmm sorry,
statt der Zeile

*data += durchlauf,

besser ->

*data += count;

GRUSS

Autor: fuuuubar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowas läuft bei mir unter Vergewaltigung der Sprache C !


Soll das LCD ein Rauschen für eine Zufallszahl erzeugen oder etwas 
Anzeigen ?

Autor: fuuuubar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch nicht besser ! Pointerschänder !

Autor: fuuuubar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal angenommen dein wirres Zeugs da oben meint das was ich meine,
hier mein bescheidener Vorschlag. Da die Länge des Strings wohl
bekannt sein wird, empfiehlt es sich die mit zu übergeben und auch
zu benutzen.

void funktion(char *data)
{
   char * d = data;
   while(*d++);
   while(--d>=data)
         lcd_data(*data);
}

Autor: fuuuubar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleines Feature:


lcd_data(*d);

und nicht:

lcd_data(*data);


**g**

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
meine Funktion war Mist, hier ne neue Version ;-)


void lcd_funktion(char *data)
{
   char count = 0;
   char *save = data;
   while(*data)
   {
       data++;
       count++;
   }


   while(count != 0)
   {
      data = save;
      count -= 1;
      data += count;
      while(*data)
      {
         lcd_data(*data);
         data++;
      }
   }
}

Gruss

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@fuubar : deine Funktion funktioniert bei mir nicht, Meine Version funzt 
wunderbar ;-)

Autor: fuuuubar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Viel bringt nicht viel ;-). Besonders nicht auf dem Stack ...


#include <stdio.h>

void funktion(char *data)
{
   char * d = data;
   while(*d++);
   while(--d>=data)
         printf("%c",*d);
   printf("\n");
}

int main()
{
    funktion("HALLO");
}

Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke nochmal nur gibt soweit ich das jezt verstehe das script das wort 
nur rückwärts aus, nicht einen einzelnen Buchstaben oder??? somit stehe 
ich wieder am anfang, das ich aus dem pointer auf das Array einen 
einzelnen buchstaben übergeben kann.

Autor: fuuuubar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

d ist dein Pointer auf den String den du haben willst ! Also:

O
LO
LLO
ALLO
HALLO

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
funktion("hallo"); // aufruf mit Wort

void funktion(char *data){

lcd_data(data[4]);
lcd_clear();
lcd_data(data[3]);
lcd_data(data[4]);

Das kann auch gar nicht funktionieren. "hallo" hat vier Zeichen - 
worauf greift data[4] zu? Nein, nicht auf das 'o'.

Du solltest Dich --damit Du auch die Dir gemachten Lösungsvorschläge 
verstehst-- mal mit der Arrayindizierung von C vertraut machen.

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

Bewertung
0 lesenswert
nicht lesenswert
Meine Version
void FlyIn( const char* string )
{
  uint8_t len = strlen( string ) - 1;

  while( len > 0 ) {
    lcd_clear();
    lcd_string( string + len );
    _delay_ms( 100 );
    len--;
  }

  lcd_clear();
  lcd_string( string );
}

PS: Gott sei dank willst du den Text von links einfliegen
lassen. Dadurch kannst du dir das ganze Gerödel mit der
Einzelzeichenverarbeitung sparen. Die String-Funktionalität
erledigt das wunderbar. Man muss nur wissen, dass ein String
immer von der Startadresse bis zum ersten '\0' Zeichen geht.
Wenn ich also einen String habe, dann brauche ich nur der
String-verarbeitenden Funktion (in dem Fall lcd_string) eine
falsche Startadresse vorgaukeln und sie bearbeitet den 'Teilstring'
von dieser gefälschten Startadresse bis zum Stringende.

Wenn du von rechts einfliegen lassen willst, dann geht das nicht
mehr so einfach. Da könnte man allerdings ausnutzen, dass das
LCD (zb ein 16 Zeichen breites LCD) am rechten Rand einige Stellen
hat, die es nicht anzeigt.

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

Bewertung
0 lesenswert
nicht lesenswert
> Du solltest Dich --damit Du auch die Dir gemachten Lösungsvorschläge
> verstehst-- mal mit der Arrayindizierung von C vertraut machen.

Und auch damit, wie in C der Zusammenhang von Arrays und Pointern
ist, sowie wie Stringverarbeitung funktioniert.

http://www.mikrocontroller.net/articles/FAQ#Wie_fu...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly wrote:

> Das kann auch gar nicht funktionieren. "hallo" hat vier Zeichen -
> worauf greift data[4] zu? Nein, nicht auf das 'o'.

Na na na, zähl besser noch mal nach. ;-)

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

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
>
> void FlyIn( const char* string )
> {
>   uint8_t len = strlen( string ) - 1;
> 
>   while( len > 0 ) {
>     lcd_clear();
>     lcd_string( string + len );
>     _delay_ms( 100 );
>     len--;
>   }
> 
>   lcd_clear();
>   lcd_string( string );
> }
> 


Ist noch früh am Morgen.
Das geht auch einfacher (und vor allen Dingen: richtiger)
void FlyIn( const char* string )
{
  uint8_t len = strlen( string );

  while( len > 0 ) {
    lcd_clear();
    lcd_string( string + len-- );
    _delay_ms( 100 );
  }
}

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Na na na, zähl besser noch mal nach. ;-)

Grr. 's ist früh. Jedenfalls für mich.

Asche auf mein eigentlich schon ausreichend ergrautes Haupt.

Autor: fuuuubar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
--len würde die Schleife um 100ms verkürzen ! Eine "\0" Zeigt das 
Display nicht an.

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.