Forum: Compiler & IDEs wert in Buffer schreibn


von Andi (Gast)


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
}

von Rolf M. (rmagnus)


Lesenswert?

char ist als Typ dafür ungeeignet. Entweder unsigned char oder einer 
Typ-Aliase aus <stdint.h>. Sonst gibt es nichts, was dagegen spricht.

von Karl H. (kbuchegg)


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;

von newbie (Gast)


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;

von newbie (Gast)


Lesenswert?

muss natürlich 8bit heissen und nicht 9 bit.

edit geht leider nicht :-(

von Stefan E. (sternst)


Lesenswert?

Wenn ich mir die verwendeten Indizes so anschaue, dann will er es wohl 
als Text haben, also in etwa so:
1
itoa(100,buf,10);
2
itoa(120,buf+3,10);
3
itoa(150,buf+6,10);
4
itoa(170,buf+9,10);
(wozu auch immer das letztlich gut sein soll)

von Andi (Gast)


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

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Probier mal so (anstelle wertX kannst Du auch die Zahlen einsetzen):
1
sprintf( buf, "%3d%3d%3d%3d", wert0, wert1, wert2, wert3);

von Andi (Gast)


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
}

von Karl H. (kbuchegg)


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

von Andi (Gast)


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

von Karl H. (kbuchegg)


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
}

von Andi (Gast)


Lesenswert?

vielen Dank für die  Ausführliche Hilfe,
nun hab ich noch eine Frage,
wie ich die werte einzeln Ausgeben kann zB. in Zeile1 Kanal und in 
Zeile5
den Dimmwert Ausgeben.
mfg

von Karl H. (kbuchegg)


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.

von Andi (Gast)


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

von Karl H. (kbuchegg)


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.

von Andi (Gast)


Lesenswert?

vielen dank die Hilfe von ihnen hat mir sehr geholfen
mfg

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.