Forum: Mikrocontroller und Digitale Elektronik char array buchstaben einzeln auslesen


von Sonke A. (soeni)


Lesenswert?

ich habe folgenden Pointer auf ein chararray, welcher an die Funktion 
übergeben wird:
1
funktion("hallo");
2
3
4
void funktion(char *data){
5
6
    char text[10];
7
    // jetzt möchte ich den 5. Buchstaben ausgeben
8
    sprintf(text, "%s", data[4])
9
    // nur funktioniert das nicht
10
}

wie kann ich das machen???

danke im voraus

Sönke

von Simon K. (simon) Benutzerseite


Lesenswert?

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

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

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

von holger (Gast)


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.

von Simon K. (simon) Benutzerseite


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.

von holger (Gast)


Lesenswert?

>Wo steht was von "ausgeben" ;)

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

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

von Sonke A. (soeni)


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:
1
funktion("hallo"); // aufruf mit Wort
2
3
void funktion(char *data){
4
5
lcd_data(data[4]);
6
lcd_clear();
7
lcd_data(data[3]);
8
lcd_data(data[4]);
9
...
10
// natürlich mit schleifen verallgemeinert
11
}

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

hier nochmal die Funktion lcd_data:
1
 
2
void lcd_data(unsigned char temp1)
3
{
4
   unsigned char temp2 = temp1;
5
 
6
   LCD_PORT |= (1<<LCD_RS);        // RS auf 1 setzen
7
 
8
   temp1 = temp1 >> 4;
9
   temp1 = temp1 & 0x0F;
10
   LCD_PORT &= 0xF0;
11
   LCD_PORT |= temp1;               // setzen
12
   lcd_enable();
13
 
14
   temp2 = temp2 & 0x0F;
15
   LCD_PORT &= 0xF0;
16
   LCD_PORT |= temp2;               // setzen
17
   lcd_enable();
18
   
19
   _delay_us(42);
20
}

von fubu1000 (Gast)


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++;
      }
   }
}

von fubu1000 (Gast)


Lesenswert?

äähhmmm sorry,
statt der Zeile

*data += durchlauf,

besser ->

*data += count;

GRUSS

von fuuuubar (Gast)


Lesenswert?

Sowas läuft bei mir unter Vergewaltigung der Sprache C !


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

von fuuuubar (Gast)


Lesenswert?

Auch nicht besser ! Pointerschänder !

von fuuuubar (Gast)


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.

1
void funktion(char *data)
2
{
3
   char * d = data;
4
   while(*d++);
5
   while(--d>=data)
6
         lcd_data(*data);
7
}

von fuuuubar (Gast)


Lesenswert?

Kleines Feature:


lcd_data(*d);

und nicht:

lcd_data(*data);


**g**

von fubu1000 (Gast)


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

von fubu1000 (Gast)


Lesenswert?

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

von fuuuubar (Gast)


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");
}

von Sonke A. (soeni)


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.

von fuuuubar (Gast)


Lesenswert?

Hallo,

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

O
LO
LLO
ALLO
HALLO

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1
funktion("hallo"); // aufruf mit Wort
2
3
void funktion(char *data){
4
5
lcd_data(data[4]);
6
lcd_clear();
7
lcd_data(data[3]);
8
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.

von Karl H. (kbuchegg)


Lesenswert?

Meine Version
1
void FlyIn( const char* string )
2
{
3
  uint8_t len = strlen( string ) - 1;
4
5
  while( len > 0 ) {
6
    lcd_clear();
7
    lcd_string( string + len );
8
    _delay_ms( 100 );
9
    len--;
10
  }
11
12
  lcd_clear();
13
  lcd_string( string );
14
}

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.

von Karl H. (kbuchegg)


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_funktioniert_String-Verarbeitung_in_C.3F

von Stefan E. (sternst)


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. ;-)

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger wrote:
>
1
> void FlyIn( const char* string )
2
> {
3
>   uint8_t len = strlen( string ) - 1;
4
> 
5
>   while( len > 0 ) {
6
>     lcd_clear();
7
>     lcd_string( string + len );
8
>     _delay_ms( 100 );
9
>     len--;
10
>   }
11
> 
12
>   lcd_clear();
13
>   lcd_string( string );
14
> }
15
>


Ist noch früh am Morgen.
Das geht auch einfacher (und vor allen Dingen: richtiger)
1
void FlyIn( const char* string )
2
{
3
  uint8_t len = strlen( string );
4
5
  while( len > 0 ) {
6
    lcd_clear();
7
    lcd_string( string + len-- );
8
    _delay_ms( 100 );
9
  }
10
}

von Rufus Τ. F. (rufus) Benutzerseite


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.

von fuuuubar (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.