Forum: Compiler & IDEs cien


von Textarbeit (Gast)


Lesenswert?

ich hab mir grad mal einen code "zusammengeschustert" für ein Lauflicht, 
klappt auch alles, ist aber eher un schön gemacht.
irgendwelche Tipps für die Funktion move_text um diese effizienter zu 
machen???
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <util/delay.h>
4
#include <string.h>
5
6
#include <lcd.h>
7
8
#define length 30
9
char sLauftext[length+1];
10
11
char* move_text(char* test)
12
{
13
 char sTmp[2];
14
 char sLauftextTmp[length+1];
15
 uint8_t i;
16
 
17
 strcpy(sLauftext,test);
18
 strcpy(sLauftextTmp,sLauftext);
19
20
 sTmp[0]=sLauftext[0];
21
 sTmp[1]='\0';
22
 for (i=1;i<length+1;i++)
23
 {
24
  sLauftextTmp[i-1]=sLauftext[i];  
25
 }
26
 strcat(sLauftextTmp,sTmp);
27
 strcpy(sLauftext,sLauftextTmp);
28
29
 return sLauftext;
30
}
31
32
33
void wait (uint16_t zeit) //zeit: wartezeit in ms (0 bis 65536)
34
{
35
   uint16_t i;
36
   for(i=0;i<zeit;i++) _delay_ms(1); //da für _delay_ms max Takt-abhängige Werte erlaubt
37
} 
38
39
int main (void) 
40
{  
41
  char sLauftext[length+1];
42
43
  lcd_init(LCD_DISP_ON);
44
  lcd_clrscr();
45
  strcpy(sLauftext,"Dies ist der Lauftext Test   ");
46
  lcd_puts(sLauftext);
47
  wait(1000);
48
49
while(1)
50
{ 
51
  lcd_clrscr();
52
  strcpy(sLauftext,move_text(sLauftext)); 
53
  lcd_puts(sLauftext);
54
  wait(200);
55
}
56
57
return 0;           
58
}

von Xenu (Gast)


Lesenswert?

char* move_text(char* text)
{
  char tmp = text[length - 1];

  int n;
  for(int n = length; n > 1; n--)
  {
    text[n-1] = text[n-2];
  }

  text[0] = tmp;

  return text;
}

von Xenu (Gast)


Lesenswert?

Das "int" nach "for" muss noch weg.

von Textarbeit (Gast)


Lesenswert?

ist ja schon mal kompakter, aber der text sollte schon nach links 
laufen, damit man auch vom anfang anfängt zu lesen und nicht am ende 
startet

von Xenu (Gast)


Lesenswert?

Wieso programmierst Du es dann nicht einfach um?

von Textarbeit (Gast)


Lesenswert?

da hab ich aber schon wieder das problem mit dem char welches 
zwischengespeichert wird
der Text wird jetzt zwar nach links durchgeschoben, aber irgendwie 
klappt das mit dem Anfügen des ersten Buchstaben nicht (deswegen hatt 
ichs so umständlich über string operationen)
1
char* move_text(char* text)
2
{
3
  char tmp = text[0];
4
5
  uint8_t i;
6
  for( i = 0; i<length; i++)
7
  {
8
    text[i] = text[i+1];
9
  }
10
  text[length] = tmp;
11
12
  return text;
13
}
wo ist der denkfehler?

von cien (Gast)


Lesenswert?

ich merk grad ich hab im ersten post aus versehen Lauflicht geschrieben, 
soll natürlich Lauftext heißen

von cien (Gast)


Lesenswert?

das Problem ist einfach, dass der Text zwar ordendlich nach links 
durchgereicht wird, aber der Text eben bis zum Ende durchgereicht wird 
und dann wieder von vorne startet und nicht wie in meiner 
"zusammengeschusterten" version der text vorne abgeschnitten und hinten 
wieder angefügt wird um einen flüssigen Übergang zu schaffen
@admin: wäre es möglich den Namen des threads in Textarbeit zu ändern, 
hatte da zwei zeilen vertauscht :(

von cien (Gast)


Lesenswert?

ok, es lag an "length", da dies ein fester wert war und nicht der 
tatsächlichen Länge des strings entsprach
1
char* move_text(char* text, uint8_t len)
2
{
3
  char tmp = text[0];  
4
  uint8_t i;
5
6
  for( i = 0; i<len; i++)
7
  {
8
    text[i] = text[i+1];
9
  }
10
  text[len-1] = tmp;
11
  return text;
12
}
habs einfach so gelöst, dass ich einmalig im main-Programm dei Länge 
abfrage und diese einfach der Funktion mitgebe
und siehe da, es klappt

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.