Compiler Warnungen - Runde 2

Hallo,

Programm funktioniert soweit, nur die Warnungen sind schon seltsam. Hätte gern gewußt was stört.

Im EEprom stehen in einer Art Tabelle Uhrzeiten und ein Meßintervall. Die werden ausgelesen und verglichen ob es soweit ist.

warning: statement has no effect [-Wunused-value]

for (searchAdr; searchAdr < searchEndadr; searchAdr+=8) {

warning: variable ‘TimerNr’ set but not used [-Wunused-but-set-variable]

byte TimerNr, Intervall, Stunde1, Minute1, Stunde2, Minute2 = 0;

warning: ‘Stunde2’ may be used uninitialized in this function [-Wmaybe-uninitialized]

if ( _Stunde >= Stunde1 && _Stunde <= Stunde2 && _Minute >= Minute1 && _Minute <= Minute2) {

warning: ‘Minute1’ may be used uninitialized in this function [-Wmaybe-uninitialized]

if ( _Stunde >= Stunde1 && _Stunde <= Stunde2 && _Minute >= Minute1 && _Minute <= Minute2) {

warning: ‘Stunde1’ may be used uninitialized in this function [-Wmaybe-uninitialized]

if ( _Stunde >= Stunde1 && _Stunde <= Stunde2 && _Minute >= Minute1 && _Minute <= Minute2) {

warning: ‘Intervall’ may be used uninitialized in this function [-Wmaybe-uninitialized]

aktiv_Intervall = Intervall; // wenn ja, setzte aktive_Interval neu

das ist die Funktion dazu. Variablen mit _ davor sind global, werden aber auch nicht angemeckert.

boolean Messinterval(int I2C_Adresse, int speicherAdresse)
{   
  boolean error = false;                        // Fehlerstatus setzen
  boolean Messzeit = false;
  static byte aktiv_Intervall = 30;
  byte TimerNr, Intervall, Stunde1, Minute1, Stunde2, Minute2 = 0;
  int searchAdr = speicherAdresse+8;
  int searchEndadr = _MessTimerAnzahl*8+speicherAdresse+1;
    
  SERIAL_IMPL.println(F("refresh_Messintervall"));
        
  //      88    ;    88     <     121     ;      +8
  for (searchAdr; searchAdr < searchEndadr; searchAdr+=8)  {
    Wire.beginTransmission(I2C_Adresse);      // Connect
    Wire.write( (byte)(searchAdr >> 8)   );   // MSB
    Wire.write( (byte)(searchAdr & 0xFF) );   // LSB
    if (Wire.endTransmission() > 0 )  {       // war Connect fehlerfrei?
      error = true;                           // nein
      return error;                           // Abbruch mit Fehler
    }    
    Wire.requestFrom(I2C_Adresse, 6);         // 6 Bytes in Folge anfordern/lesen
    while (Wire.available() > 0 )  {          // sind Daten vorhanden?
      TimerNr  = Wire.read();  // 
      Intervall = Wire.read();  // 
      Stunde1 =  Wire.read();  // 
      Minute1 =  Wire.read();  // 
      Stunde2 =  Wire.read();  // 
      Minute2 =  Wire.read();  //
    }
        
    // ist aktuelle Uhrzeit in einem gespeicherten Zeitbereich?  
    if ( _Stunde >= Stunde1 && _Stunde <= Stunde2 && _Minute >= Minute1 && _Minute <= Minute2) { 
      aktiv_Intervall = Intervall;  // wenn ja, setzte aktive_Interval neu   
      Messzeit = true;  // Uhrzeit liegt in einem eingespeicherten Messzeitbereich
      break;            // for Schleife bei Gültigkeit vorzeitig verlassen
    } 
  }  // for Ende      
    
  if (Messzeit == false)  {    // wenn kein Zeitbereich paßt nehme default Meßintervall
    aktiv_Intervall = leseEEprom(I2C_Adresse, speicherAdresse+1);  // default Intervall von TimerNr 0 aus Speicheraddresse 81 lesen
    SERIAL_IMPL.print(F("default Intervall: ")); SERIAL_IMPL.print(aktiv_Intervall); SERIAL_IMPL.println(F("min"));
  }
  
  if (_Intervallzeit != aktiv_Intervall)  {  // hat sich Messinterval geändert?
    _RTC_Alarmflagcounter = 255;   // kurzzeitige Erhöhung, damit wird eine syncronisierte Messung zum Zeitbereichsanfang erzwungen
    _Intervallzeit = aktiv_Intervall;  
    SERIAL_IMPL.print(F("aktives Intervall: ")); SERIAL_IMPL.print(_Intervallzeit); SERIAL_IMPL.println(F("min"));
  }
  return error;                                // Abbruch mit Fehler
}  // Funktion Ende

Variablen mit _ davor sind global, werden aber auch nicht angemeckert

Natürlich nicht. Globale Variablen werden automatisch mit 0 initialisiert!

byte TimerNr, Intervall, Stunde1, Minute1, Stunde2, Minute2 = 0;

Und hier wird nur Minute2 initialisiert. Die anderen nicht

'TimerNr' set but not used

Das ist logisch. Die schreibt auf die Variable mit Wire.read(), aber verwendest sie danach nie

statement has no effect [-Wunused-value]

Auch das ist klar:

 for (searchAdr, ...)

Statt dessen wenn du die Zahl-Variable außerhalb initialisierst:

 for (, ...)

Einfach weglassen, aber das Komma trotzdem setzen

Serenifly:

byte TimerNr, Intervall, Stunde1, Minute1, Stunde2, Minute2 = 0;

Und hier wird nur Minute2 initialisiert. Die anderen nicht

Hallo,

vielen Dank. Daran hatte und habe ich nicht gedacht. Mit der Mehrfachdeklaration hab ich jetzt nachlesen müssen wie man das richtig macht. So gibts kein Gemecker. In einer Funktion soll man ja direkt 0 definieren. TimerNr hab ich als Dummy rausgenommen, leeres read reicht aus. Die Warnungen nehmen schon merklich ab. :slight_smile:

byte Interval = 0, Stunde1 = 0, Minute1 = 0, Stunde2 = 0, Minute2 = 0;

Es gibt übrigens einen netten Trick, wie man dem Compiler sagen kann dass man Variablen bewusst nicht verwendet:

Das würde also auch gehen:

(void) (TimerNr  = Wire.read());

read() zu machen und den Wert zuzuweisen geht natürlich auch

Hallo,

was es nicht alles gibt. :wink:

Runde 3.
seinerzeit hatte mir, ich glaube combie war es, netterweise eine Headerdatei geschrieben Zwecks Mehrfachverwendung. Alles bestens.
Der Compiler meckert hier rum, dass die Initialisierungsreihenfolge falsch wäre. Laut meiner Logik paßt das aber. Wie sonst? Seltsamerweise meckert er nicht mit jeder. Er müßte doch konsequenterweise auch mit off_time meckern. Auch hier bin ich ratlos.

In constructor 'Blinker::Blinker(byte, unsigned int, unsigned int)':

warning: 'Blinker::pin_LED' will be initialized after [-Wreorder]

byte pin_LED;

warning: 'unsigned int Blinker::on_time' [-Wreorder]

unsigned int on_time;

warning: when initialized here [-Wreorder]

Blinker(byte pin, unsigned int on, unsigned int off) : pin_LED(pin), on_time(on), off_time(off)

struct Blinker
{
  unsigned long lastTime;
  unsigned int on_time;
  unsigned int off_time;
  byte pin_LED;
  bool state_LED;
  
  Blinker(byte pin, unsigned int on, unsigned int off) : pin_LED(pin), on_time(on), off_time(off)  
  {
    lastTime = millis();
    state_LED = false;
    digitalWrite(pin_LED, state_LED);
  }
  
  void update()
  {
    if (state_LED == LOW && millis() - lastTime > off_time )  
    {
      digitalWrite(pin_LED, HIGH);       // LED einschalten für x ms
      lastTime = millis();             
      state_LED = HIGH;
    }
    if (state_LED == HIGH && millis() - lastTime > on_time ) 
    {
      digitalWrite(pin_LED, LOW);         // LED ausschalten für x ms
      lastTime = millis();  
      state_LED = LOW;
    }
  }
};

Initialisiere die Variablen in der gleichen Reihenfolge wie du sie im struct deklariert hast. Das ist die Reihenfolge die der Compiler verwendet! Bei komplexen Datentypen oder Referenzen ist das sehr, sehr, sehr wichtig. Das kann zu ganz gemeinen Fehlern führen:

state_LED könnte man auch in der Initialisierungsliste erschlagen. In C++11 kann man Variablen auch bei der Deklaration gleich initialisieren (wenn es sich um feste Werte handelt wie true/false oder Zahlen).

Hallo,

vielen Dank. Was man so alles wissen muß beim programmieren.
Sag mal, seit wieviel Jahren programmierst du eigentlich schon? Wenn du immer die richtige/passende Antwort parat hast. :slight_smile:

Abgesehen von primitiven Gehversuchen in BASIC, ca. 15 Jahre. Mit C++ mache ich aber noch nicht so lange rum. Das kam erst später.

Und die Antworten zu den Fragen hier hättest du auch mit Google schnell gefunden. Einfach Fehlermeldungen oder Warnungen als Stichwort nehmen. Ich schlage da auch viel nach. Manchmal auch bevor ich hier eine Antwort gebe. Sehr häufig steht dann die Antwort auf StackOverflow. Mehrfach. Ich meine nicht, dass du hier nicht fragen sollst, aber das ist kein exotisches Wissen.

okay, aktzeptiert. :wink:

seufz

Wenn ich bedenke, dass ich schon einige Jahre mehr auf dem Buckel habe in Sachen Software und besonders beruflich andere Sprachen gelernt habe... sind C++ und diese kleinen µC noch großes Neuland für mich. Hier kommt jeden Tag jede Menge Input zusammen und manchmal sehe ich den Wald vor lauter Bäumen noch nicht wirklich.

Egal, ich gebe die Hoffnung nicht auf. Die ausführlichen Compiler-Warnungen zeigen mir echt viele Dinge, wo man eventuell im Trüben fischt und besonders wo man über alte Gewohnheiten vielleicht stolpert oder nachlässig ist...

Bis denne
Rudi
:slight_smile:

Hallo,

dann schreibe ich auch mal paar Zeilen mehr. Groß gewurden bin ich mit einem Amige 500. Habe darauf mit Basic programmiert. Natürlich auch gespielt. :slight_smile: 1997 kam ich dann zum x86 Rechner und bin dabei geblieben. War damals kurz davor mir noch einen Amiga 4000 zu kaufen. Habs zum Glück nicht getan. Anfang 2006 fiel mir im Kiosk eine Elektor in die Hände mit eingeklebten Renesas R8C13 µC Bausatz. Ein Redakteur hatte den frisch in Japan entdeckt. Das war mein eigentlicher Start in die µC Welt. Sie dauerte aber nicht lange. Zu viele Stolpersteine die ich damals einfach nicht verstanden habe/hatte. Dann entdeckte ich Anfang 2013 den Arduino. Verwendet einen 8 Bit AVR mit hinlänglich "weltweiten Internetsupport", seitdem gehts stetig bergauf. Okay, manchmal 1 Schritt zurück und wieder 2 vor. :slight_smile: Und das nette Forum hier ist bisher auch ungeschlagen!