wert in Buffer schreibn

Gast #2535420
Lesenswert?

guten tag,

ich habe mal eine Frage an euch, und zwar möchte ich 4Werte in einen 
Buffer schreiben.

Könnte das so Funktionieren
1
static char buf[31];                         // puffer für die DIMMWERTE
2
 
3
 
4
void  arr(void)
5
{
6
  int i= 0;
7
  int c= 0;
8

9
 
10
    c= 100;
11
    buf[ i ] = c;
12
    
13
    i=+3
14
    c= 120;
15
    buf[ i ] = c;
16
    
17
    i=+3
18
    c= 150;
19
    buf[ i ] = c;    
20
    
21
    i=+3
22
    c= 170;
23
    buf[ i ] = c;      
24
}
#2535433
Lesenswert?

Schon, aber noch viel komplizierter kann man das wirklich nicht mehr 
schreiben. Wozu brauchst du die Hilfsvariable c? DIe verwirrt doch mehr 
als notwendig

warum nicht einfach

   buf[0] = 100;
   buf[3] = 120;
   buf[6] = 150;
   buf[9] = 170;

oder wenn das schon ab einem bestimmten Index anfangen soll, der in i 
steht

   buf[i+0] = 100;
   buf[i+3] = 120;
   buf[i+6] = 150;
   buf[i+9] = 170;
Gast #2535444
Lesenswert?

Es kommt vielleicht nicht so gut, eine int Variable mit mindestens 16bit 
an eine Stelle eines char Feldes mit 9 bit zu schreiben.

Außerdem schreibst Du ab dem 2. Zugriff immer auf den Index 3, wenn Du 
das fehlende Semikolon anfügst.

Ich denke aber du meinst

i+=3;

statt

i=+3;
Gast #2535524
Lesenswert?

vielen Dank erstmal,
Letzendlich wollte ich 4 Dimmwerte im Buffer ablegen, die ich später per 
UART
ausgeben wollte .
also sprich mit Taster1 den Kanal wählen und mit Taster2 den Dimwert 
einstellen.
mfg
Gast #2535621
Lesenswert?

ich habs jetzt mal so versucht aber ich bekomm nur mist Angezeigt
1
 
2
void  arr(void)
3
{
4
  char i= 0;
5
  char c= 0;
6
  static char buf[31];                         // puffer für die DIMMWERTE
7

8

9
  char dim_string[10];
10

11
  if ( get_key_short( 1<<taste4 )){
12
   i++;
13
   if (i>=3)
14
      i=0;
15
 }
16

17
  if ( get_key_short( 1<<taste5 )){
18
   c++;
19
   if (c>=200)
20
      c=1;
21
 }
22
 
23
   buf[i*3] = c;
24
   itoa( buf, dim_string, 10 ); // 
25
   uart_puts( dim_string );     
26

27
}
#2535643
Lesenswert?

Andi schrieb:
> ich habs jetzt mal so versucht aber ich bekomm nur mist Angezeigt

>    buf[i*3] = c;

das vergisst du gleich mal wieder.
Das ist nur deshalb entstanden, weil du in deinem Eröffnungsposting 
keine vernünftige Beschreibung dessen gebracht hast, was du eigentlich 
machen willst.

>    itoa( buf, dim_string, 10 ); //

Wenn du nicht weißt, was eine Funktion macht, dann sieh in deinem Buch 
nach oder befrag Google danach.

itoa wandelt einen INteger (daher das i) zu einem String (daher das a) 
um.

Wo in diesem Aufruf ist denn der Integer, also die ganze Zahl? Die ganze 
Zahl steckt in c oder in i. Also willst du auch die an itoa übergeben.

   itoa( c, dim_string, 10 );
Gast #2535704
Lesenswert?

oh wie Peinlich,
ich wollte mit i den Kanal Wählen und in c steht der Dimmwert drinne.
Im buf sollten die 4 Dimmwerte stehen.
wenn i=0 kanal 1  i=3 kanal 4.
aber wie setz ich das um wenn zb.i=1 den dimmwert für kanal 2.
vielleicht könnten sie mir dabei ein Denkanstoss geben
mfg
#2535719
Lesenswert?

Andi schrieb:
> oh wie Peinlich,
> ich wollte mit i den Kanal Wählen und in c steht der Dimmwert drinne.
> Im buf sollten die 4 Dimmwerte stehen.

Also ein Array von DimmWerten.
Dann mach auch ein Array von Dimmwerten!

Und einen davon wandelst du zu einem Text um, den du ausgeben kannst. 
Welchen? Na den, den du mit den Tastendrücken zum 'aktiven' (Hinweis für 
schon wieder einen vernünftigen Variablennamen) gemacht hast.

> vielleicht könnten sie mir dabei ein Denkanstoss geben

Ja. Nenn die Dinge vernünftig. Progammiert sich einfach leichter, wenn 
der Code selber eine 'Geschichte' erzählt.

Du hast 4 Dimmwerte. Hier sind sie

int DimmWert[4];

und einer davon ist der den du mittels Taste ausgewählt hast. Die 
Auswahl speicherst du hier

int activeDimmWert;

wenn activeDimmWert den ausgewählten Dimmwert angibt, dann ist

   DimmWert[ activeDimmWert ]

der zugehörige Wert.
1
uint8_t DimmWert[4];
2
uint8_t activeDimmWert;
3

4
int main()
5
{
6
  char Buffer[40];
7
  ...
8

9
  while( 1 ) {
10

11
    if ( get_key_short( 1<<taste4 )){
12
      activeDimmWert++;
13
      if (i > 3)
14
        i = 0;
15
    }
16

17
    if ( get_key_short( 1<<taste5 )){
18
      DimmWert[activeDimmWert]++;
19
      if( DimmWert[activeDimmWert] >= 200)
20
        DimmWert[activeDimmWert] = 0;
21
    }
22

23
    sprintf( Buffer, "Kanal: %d, Wert: %d", (int)activeDimmWert, (int)DimmWert[activeDimmWert] );
24
    uart_puts( Buffer);     
25
  }
26
}
#2535799
Lesenswert?

Andi schrieb:

> wie ich die werte einzeln Ausgeben kann zB. in Zeile1 Kanal und in
> Zeile5
> den Dimmwert Ausgeben.

Du brauchst Steuerzeichen, mit denen du deine Ausgabeterminal steuern 
kannst. Das hängt davon ab, was am anderen Ende des UART sitzt. Oft 
können Terminals die sog. VT100 Steuersequenzen. (Googeln)
Aber ehrlich gesagt bin ich mir ziemlich unsicher, ob das noch nicht zu 
viel für dich ist.
Gast #2535813
Lesenswert?

Die Ausgabe erfolgt auf einem GLCD.
ich habe das  so.

//Zeilen Position auf LCD x0 y100 Kanal Anzeigen
 uart_putc( 17);
 uart_putc( 0 );
 uart_putc( 0 );
 uart_putc( 100 );
 uart_putc( 0 );

 sprintf( Buffer, "Kanal: %d", (int)activeDimmWert);
 uart_puts( Buffer);

//Zeilen Position auf LCD x40 y100 Dimmwert Anzeigen
 uart_putc( 17);
 uart_putc( 40 );
 uart_putc( 0 );
 uart_putc( 100 );
 uart_putc( 0 );

 sprintf( Buffer, " Wert: %d", (int)DimmWert[activeDimmWert] );
 uart_puts( Buffer);

Der Kanalwert wird auch Ausgegeben,die Dimmwerte werden ja alle 
ausgegeben.
ich wollte gern das die Dimmwerte einzeln in einer neuen Zeile ausgeben,
zb. zeile100 = Dimmwert1
    zeile105 = Dimmwert2
    .........
#2535837
Lesenswert?

Andi schrieb:
> Die Ausgabe erfolgt auf einem GLCD.

Sag das doch gleich.

> ich habe das  so.
>
> //Zeilen Position auf LCD x0 y100 Kanal Anzeigen
>  uart_putc( 17);
>  uart_putc( 0 );
>  uart_putc( 0 );
>  uart_putc( 100 );
>  uart_putc( 0 );

mach dir doch erst mal eine Funktion, mit der du die Ausgabeposition 
setzen kannst. Das ist doch Unsinn, da jedesmal wieder die ganze Litanei 
aufzuführen.
1
void gotoxy( uint8_t x, uint8_t y )
2
{
3
  uart_putc( 17);
4
  uart_putc( x );
5
  uart_putc( 0 );
6
  uart_putc( y );
7
  uart_putc( 0 );
8
}

und dann kannst du vor einer Ausgabe schon mal einfach die Position 
festlegen
1
   ...
2
   sprintf( Buffer, "Kanal: %d", (int)activeDimmWert);
3
   gotoxy( 0, 100 );
4
   uart_puts( Buffer );
5

6
   sprintf( Buffer, " Wert: %d", (int)DimmWert[activeDimmWert] );
7
   gotoxy( 40, 100 );
8
   uart_puts( Buffer);

Ist doch schon mal ganz was anderes, als da jedes mal dieselbe Litanei 
nur mit andere Zahlenwerten


> ich wollte gern das die Dimmwerte einzeln in einer neuen Zeile ausgeben,
> zb. zeile100 = Dimmwert1
>     zeile105 = Dimmwert2
>     .........

Na, dann mach das doch.

Mach dir eine Funktion, die einen Wert an eine bestimmte POsition 
ausgibt
1
void outValue( uint8_t x, uint8_t y, uint8_t value )
2
{
3
  char Buffer[10];
4

5
  sprintf( Buffer, "%3d", value );
6
  gotoxy( x, y );
7
  uart_puts( Buffer );
8
}

und du benutzt das dann für
1
    outValue( 0, 100, DimmWert[0] );
2
    outValue( 0, 105, DimmWert[1] );
3
    outValue( 0, 110, DimmWert[2] );
4
    outValue( 0, 115, DimmWert[3] );

oder wenns noch mehr werden
1
   for( i = 0; i < 4; i++ )
2
     outValue( 0, 100 + i * 5, DimmWert[i] );


Funktionen sind dein Handwerkszeug. Schreib dir Funktionen, die dir die 
Arbeit erleichtern.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren