www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Makro für sprintf ((char*) s , "abc");


Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> sprintf(s, "abc");
> folgendes schreiben, um die Warnung des Compilers zu eliminieren:
welche warnung, wenn man es richtig macht kommt da keine Warnung

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Standard-Präprozessor kann man keine Variable Anzahl von Parametern 
angeben.
Auch wenn es (nicht portabel) geht, wie z.B.
http://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/Variad...
, macht es normalerweise mehr Sinn, ordentlich zu programmieren.
Dann braucht man nicht mit dem PP irgendwelche Warnungen unterdrücken.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> Was kann ich dagegen tun? Grundsätzlich nicht s als:
>
>  char s[38]; sondern als char * s[38]; anlegen?

das ganz bestimmt nicht.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
functions.c:
#include main.h

check_command()
{
  if(strstr((char*)buffer_,"SENSORS\n"))  
  {
    kill_buffer_();
    sprintf(s,"SENSORS:%02d\n",AVAILABLE_SENSORS);
    uart_puts(s);
    sei();
  }
}

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

// send string with /0
void uart_puts(char *s) 
{
    while (*s!=0) 
  {
     uart_putc(*s);
      s++;
   }
    uart_putc(0); //endmark 0
}

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

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evtl. liegt es daran, dass ich im main.c

char s[38]; anlege, es in der uart.c und functions.c als extern 
deklariere?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schwer zu sagen, wenn man die relevanten Teile nicht sieht.

Deshalb sage ich einfach mal: bestimmt!

Autor: Timo P (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ist für nen Atmega16 via GCC + AVR-Studio kompiliert.

Hier ist das Projekt...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, da haben wir doch das Problem:

functions.c
extern volatile char         ssid[37], key[37], s[33];

s ist als volatile deklariert, damit aber rechnet sprintf nicht.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johnny B. (johnnyb)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.