Makro für sprintf ((char*) s , "abc");

Gast #1940002
Lesenswert?

Hallo!

gerne würde ich statt:

sprintf(s, "abc");

folgendes schreiben, um die Warnung des Compilers zu eliminieren:

sprintf( (char *) s, "abc");

Meine Idee ist ein define dafür.(Sollte Makro heißen?)

#define sprintf(s,"abc");       sprintf((char *)s,"abc");


Sowas kann aber nicht funktionieren, weil ich nie vorher weiß,

1) wie viele Parameter ich übergebe
2) abc auch anders sein könnte

Wie kann ich nun ein dynamischeres Makro erzeugen?
Gast #1940123
Lesenswert?

unterdrücken?? Das will ich ja nicht!

die Funktion erwartet von mir ein char*. Ich habe aber ein char s[38];

also muss ich einen typecast machen im Funktionsaufruf:

sprintf((char*)&s,"abc");

diesen will ich aber nicht jedes mal wenn ich sprintf nutze schreiben. 
Was kann ich dagegen tun? Grundsätzlich nicht s als:

 char s[38]; sondern als char * s[38]; anlegen?

Peter schrieb:
> welche warnung,

Warnung: argument 1 of sprintf discards qualifiers from pointer target 
type

Peter schrieb:
> wenn man es richtig macht kommt da keine Warnung

Wie soll ich es denn "richtig" machen
Persönliche Seite #1940126
Lesenswert?

Timo P schrieb:
> die Funktion erwartet von mir ein char*. Ich habe aber ein char s[38];
>
> also muss ich einen typecast machen im Funktionsaufruf:
>
> sprintf((char*)&s,"abc");

Nein. Das musst Du nicht. Das funktioniert auch so.

Wenn Du da eine Warnung bekommst, dann bekommst Du die aus einem 
anderen Grund.

Poste ein exaktes Quelltextbeispiel und die genaue Meldung des 
Compilers.
Gast #1940203
Lesenswert?

functions.c:
1
#include main.h
2

3
check_command()
4
{
5
  if(strstr((char*)buffer_,"SENSORS\n"))  
6
  {
7
    kill_buffer_();
8
    sprintf(s,"SENSORS:%02d\n",AVAILABLE_SENSORS);
9
    uart_puts(s);
10
    sei();
11
  }
12
}

uart.c:
1
void uart_putc(unsigned char byte)
2
{
3
  while(!(UCSRA&(1<<UDRE)));//delay til data register empty
4
  UDR=byte;   // sending one byte
5
}
6

7
// send string with /0
8
void uart_puts(char *s) 
9
{
10
    while (*s!=0) 
11
  {
12
     uart_putc(*s);
13
      s++;
14
   }
15
    uart_putc(0); //endmark 0
16
}

WARNING:../functions.c:72: warning: passing argument 1 of 'sprintf' 
discards qualifiers from pointer target type
Gast #1940304
Lesenswert?

Wann genau habe ich volatile nötig?

Ich weiß, dass volatile notwendig ist, wenn man die varialbe aus einem 
Interrupt heraus verändern möchte. Gibt es noch weitere praktische 
Anwendungen von volatile?
Gast #1940309
Lesenswert?

Timo P schrieb:
> Ich weiß, dass volatile notwendig ist, wenn man die varialbe aus einem
> Interrupt heraus verändern möchte.
nein, nur wenn sie im Interrupt geändert wird und in der Main genutzt 
wird. Das sich bei dir um ein zeiger handelt ist auch noch die Frage ob 
du den Zeiger selber änderst oder ob du das Änderst worauf der Zeiger 
zeigt.
#1940313
Lesenswert?

Ich würde sagen nicht mal unbedingt im Interrupt ist volatile notwendig. 
Kommt aber auf den Optimizer darauf an.

Volatile ist dann notwendig, wenn sich der Wert einer Variablen ändern 
kann, ohne dass Dein Programmcode dies verursacht hat. Das ist 
insbesondere bei Timerregistern oder Eingangsports des Mikrocontrollers 
der Fall. Da musst Du dem Compiler mitteilen, dass er hier die Zustände 
immer neu einlesen muss und das Einlesen nicht wegoptimieren darf.

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