Forum: Compiler & IDEs warning: statement with no effect


von Slowflyer (Gast)


Lesenswert?

Hallo,

ich wundere mich über die Warnung, die der gcc ausgibt:

../main.c:745: warning: statement with no effect

Ich verwende das AVR-Studio 4.12 mit WinAVR. Die Zeilen, die
ange,eckert werden sind folgende:
1
  int8_t i = 0;    // Laufvariable
2
  lcd_write (0x80,0);  // DD-Ram Adresse auf Anfang 
3
->  for (i; i<16; i++)  // erste Zeile
4
    lcd_write(lcd_text[i], 1);
5
  lcd_write (0xC0,0);  // DD-RAM-Adresse auf Anfang
6
->  for (i; i<33; i++)  // zweite Zeile
7
    lcd_write(lcd_text[i], 1);

Die angemeckerten Zeilen (->) kopieren in der for-Schleife ein array,
das als Buffer dient, ins LCD. Im µC funktioniert es einwandfrei, warum
meckert also der Compiler? Hat jemand eine Idee?

Gruß, Slowflyer

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du schreibst als Schleifeninitialisierung (erstes Argument von "for")
nur "i". Das ist funktionsfrei. Weglassen.

Und bei der zweiten Schleife überprüfen, ob i wirklich erst bei 16
starten soll ...

von Slowflyer (Gast)


Lesenswert?

Wie meinst du weglassen, etwa so for(;i<16;i++)?

Ich wollte zusätzliche Zuweisungen einsparen, deshalb beginnt die
zweite Schleife auch bei 16.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Wie meinst du weglassen, etwa so for(;i<16;i++)?

Genau so funktioniert das.

Zur Erinnerung:

for (a; b; c) { x; }

ist äquivalent zu:

a;
while (b) {
  x;
  c;
}

von Slowflyer (Gast)


Lesenswert?

OK, das hat geholfen, Danke

von Unbekannter (Gast)


Lesenswert?

Sicher dass Du nicht noch einen zweiten (logischen) Fehler drinn hast?

a.) In der ersten Schleife zählst Du von 0 bis 15 also 16 Durchgänge.
b.) In der zweiten Schleife zählst Du von 16 bis 32, also 17
Durchgänge.

Hat Dein Display wirklich in der ersten Zeile 16 Zeichen und in der
zweiten Zeile ein Zeichen mehr, also 17 Zeichen???

Ich habe da so meine Zweifel...

von Slowflyer (Gast)


Lesenswert?

Das stimmt,

hmm.. in der Tat ein logischer Fehler.

Thx

von Torsten O. (Gast)


Lesenswert?

Hallo,

der Therad ist zwar schon etwas älter, aber ich habe selbiges Problem. 
Ich ich dachte immer, ich könnte programmieren. Folgende Funktion möchte 
ich in C (WinAVR) in AVR Studio 4 implementieren.

void Initialize()
{
  // Initialize Heaters

  for (unsigned short int index = 0; index++; index < 6)
  {
  }
}

Ich bekomme ebenso die Wanrung "warning: statement with no effect". 
Warum? Kann mir jemand bitte mal auf den Hinterkopf klopfen?

Danke im voraus.



lg Torsten

von Tassilo H. (tassilo_h)


Lesenswert?

Inkrement und Abbruchbedingung vertauscht

von Karl H. (kbuchegg)


Lesenswert?

Torsten Ohne schrieb:
> Hallo,
>
> der Therad ist zwar schon etwas älter, aber ich habe selbiges Problem.
> Ich ich dachte immer, ich könnte programmieren. Folgende Funktion möchte
> ich in C (WinAVR) in AVR Studio 4 implementieren.
>
> void Initialize()
> {
>   // Initialize Heaters
>
>   for (unsigned short int index = 0; index++; index < 6)

Die Reihenfolge der 3 Bestandteile ist

Initialisierung
Wiederholbedingung
Inkrement


Der Vergleich, ob index kleiner 6 ist, hat im Inkrementteil eher wenig 
Sinn.

von Torsten O. (Gast)


Lesenswert?

Ach Scheibenhonig,

danke für's Klopfen :) Manchmal sieht man den Wald vor leuter Bäumen 
nicht. Peinlich :(


lg Torsten

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.