Forum: Mikrocontroller und Digitale Elektronik Verstehe die Warnung nicht: Wunused-value (Eclipse,GCC,C)


von Domenik (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen, ich verstehe hier den Grund der Warnung nicht. Kann mir 
jemand weiterhelfen? Es ist vllt nicht der schönste Code, aber er 
funktioniert und alle Variablen werden benötigt.

(Code wurde zur besseren Visualisierung als Bild gepostet)

Danke :)

von loeti2 (Gast)


Lesenswert?

Die komplette Ausgabe der Warnings ist leider nicht lesbar.

von loeti2 (Gast)


Lesenswert?

Achso dein for(i; ...) wird wohl die Ursache sein.
Schreib lieber for(; ...)

von (prx) A. K. (prx)


Lesenswert?

Domenik schrieb:
> aber er funktioniert

Auch dann noch, wenn der jeweils gewünschte Buchstabe überhaupt nicht 
vorkommt?

von Domenik (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Domenik schrieb:
>> aber er funktioniert
>
> Auch dann noch, wenn der jeweils gewünschte Buchstabe überhaupt nicht
> vorkommt?

Ich gehe einfach von einer fehlerfreien Übertragung aus 😁. Aber habe 
noch einen CRC in der aufrufenden Funktion.

loeti2 schrieb:
> Achso dein for(i; ...) wird wohl die Ursache sein.
> Schreib lieber for(; ...)

Verdammt, das war's 🙈🙈🙈. Ich habe echt lange überlegt. Danke

loeti2 schrieb:
> Die komplette Ausgabe der Warnings ist leider nicht lesbar.

Die komplette GCC Ausgabe wird von der IDE leider überschrieben, wenn 
erfolgreich kompiliert wird. D.h. um die GCC-Ausgabe anzuzeigen, muss 
man einen Fehler einbauen.

von Stefan F. (Gast)


Lesenswert?

Wie oft wird eigentlich eine for-Schleife ohne Bedingung wiederholt?

for (i; ; i++)

von OMG (Gast)


Lesenswert?

Domenik schrieb:
> Es ist vllt nicht der schönste Code

Ja, vor allem wenn man den Schleifenzähler innerhalb der
Schleife noch wild verändert. Voll übersichtlich und
überhaupt nicht fehleranfällig ..... oder vielleicht doch?

von EAF (Gast)


Lesenswert?

OMG schrieb:
> Ja, vor allem wenn man den Schleifenzähler innerhalb der
> Schleife noch wild verändert.
Wird er doch gar nicht.
Wird nur im Kopf der Schleifen geändert.
Wie es sich gehört.

Eigentlich ist es egal ob man einen Parser mir goto oder break baut.
Man nimmt hat das, was einem besser liegt.

Natürlich gibts auch andere Methoden.
Aber wirklich schöner wirds damit auch nicht.

Die vorgefertigten strtok(), sscanf() und ihre Geschwister könnte man 
natürlich auch verwenden.

von EAF (Gast)


Lesenswert?

EAF schrieb:
> mir
mit

EAF schrieb:
> hat
halt

von Arno (Gast)


Lesenswert?

Domenik schrieb:
> (prx) A. K. schrieb:
>> Domenik schrieb:
>>> aber er funktioniert
>>
>> Auch dann noch, wenn der jeweils gewünschte Buchstabe überhaupt nicht
>> vorkommt?
>
> Ich gehe einfach von einer fehlerfreien Übertragung aus 😁. Aber habe
> noch einen CRC in der aufrufenden Funktion.

Das hilft dir nicht. Stefan hat das schon verstanden:

Stefan ⛄ F. schrieb:
> Wie oft wird eigentlich eine for-Schleife ohne Bedingung wiederholt?
>
> for (i; ; i++)

Ich würde dir generell empfehlen, die Syntax einer for-Schleife noch 
einmal genau nachzulesen. Das hätte dir vermutlich auch die 
Ausgangsfrage beantwortet: i als Statement hat keinen Effekt. Tut nix. 
Egal ob mitten im Code:
1
int i = 0;
2
i++;
3
i;

Oder eben wie bei dir an erster Stelle im Schleifenkopf.

Und im Übrigen gibt es für deine Aufgabe auch bereits 
Bibliotheksfunktionen wie strchr / strstr, die den Code lesbarer machen 
und dir dumme Fehler beim Implementieren ersparen können.

MfG, Arno

von EAF (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wie oft wird eigentlich eine for-Schleife ohne Bedingung wiederholt?
>
> for (i; ; i++)
for(;;) ist eine Endlosschleife, das würde dir auch dein C oder C++ 
Grundlagenbuch berichten.

von foobar (Gast)


Lesenswert?

Btw, das Gehampel mit tmpStr ist unnötig (und falsch) - atoi hört eh 
beim ersten nicht-Ziffer-Zeichen auf ...

Und "index" ohne Prüfung benutzen schreit nach Speicherfehler.

von Ben S. (bensch123)


Lesenswert?

Ganz abgesehen davon, dass das ein furchtbarer Programmierstil ist.
Wenn schon, dann so:
1
while(string[i++] != ':');

: Bearbeitet durch User
von Anselm (Gast)


Lesenswert?

EAF schrieb:
> for(;;) ist eine Endlosschleife, das würde dir auch dein C oder C++
> Grundlagenbuch berichten.

Wollte ich auch gerade schreiben

for(i; "unbekannte bedingung"; i++) kann nicht funktionieren

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Anselm schrieb:
> for(i; "unbekannte bedingung"; i++) kann nicht funktionieren

Doch, natuerlich "funktioniert" das. Man darf sich halt nicht wundern.
Ist bestimmt wieder dieses boese C dran schuld. Wenn der Bauer nicht 
schwimmen kann, liegts an der Badehose.

SCNR,
WK

von EAF (Gast)


Lesenswert?

Anselm schrieb:
> for(i; "unbekannte bedingung"; i++) kann nicht funktionieren

Das ist keine "unbekannte bedingung" sondern eine "leere bedingung"
Und damit gültiges C oder C++.
Das funktioniert wie im Grundlagenbuch beschrieben.

Bedenke:
Die Entscheidung wird im Schleifenkörper getroffen und dieser ggf. mit 
break verlassen.

Also alles im grünen Bereich, vielleicht nicht schön, aber von der Seite 
her ok.

von Andreas B. (bitverdreher)


Lesenswert?

EAF schrieb:
> Das funktioniert wie im Grundlagenbuch beschrieben.

Ja, aber vermutlich nicht so wie vom TO beabsichtigt.

von Arno (Gast)


Lesenswert?

EAF schrieb:
> Bedenke:
> Die Entscheidung wird im Schleifenkörper getroffen und dieser ggf. mit
> break verlassen.

Oder auch nicht, wie schon oben beschrieben:

(prx) A. K. schrieb:
> Auch dann noch, wenn der jeweils gewünschte Buchstabe überhaupt nicht
> vorkommt?

MfG, Arno

von Großes Zeh Buch (Gast)


Lesenswert?

Dergute W. schrieb:
> Moin,
>
> Anselm schrieb:
>> for(i; "unbekannte bedingung"; i++) kann nicht funktionieren
>
> Doch, natuerlich "funktioniert" das. Man darf sich halt nicht wundern.
> Ist bestimmt wieder dieses boese C dran schuld. Wenn der Bauer nicht
> schwimmen kann, liegts an der Badehose.

In jeder "normalen" Sprache wird ein FOR ohne Next oder anderweitige 
Bedingung sofort mit Husten und Spucken des Compilers beantwortet. Weil 
das Unfaug ist.

C an sich ist aber noch größerer Unfug, wenn es solche Konstrukte ohne 
Murren zuläßt.

von (prx) A. K. (prx)


Lesenswert?

Großes Zeh Buch schrieb:
> C an sich ist aber noch größerer Unfug, wenn es solche Konstrukte ohne
> Murren zuläßt.

Du musst die knappe Syntax von C nicht mögen, aber wenn du C nutzt, 
solltest du die Sprache zumindest kennen. Ein for(;;) als Dauerschleife 
war von Anfang an ausdrücklich vorgesehen und ist ganz offen 
dokumentiert.

: Bearbeitet durch User
von Großes Zeh Buch (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Du musst die knappe Syntax von C nicht mögen, aber wenn du C nutzt,
> solltest du die Sprache zumindest kennen. Ein for(;;) als Dauerschleife
> war von Anfang an ausdrücklich vorgesehen und ist ganz offen
> dokumentiert.

Ich mag nicht nur die knappe Syntax nicht, ich mag C als Ganzes nicht. 
Deshalb nutze ich es auch nicht, weil ich auf Fußangeln und 
Stolperfallen gut verzichten kann.

In der allergrößten Not würde ich ein While(1) vorziehen.

von Axel S. (a-za-z0-9)


Lesenswert?

Großes Zeh Buch schrieb:
> Ich mag nicht nur die knappe Syntax nicht, ich mag C als Ganzes nicht

Das sei dir unbenommen. Nur warum denkst du dann, dieser Kommentar wäre 
in irgendeiner Weise nützlich in diesem Thread?

von Dirk B. (dirkb2)


Lesenswert?

Großes Zeh Buch schrieb:
> wenn es solche Konstrukte ohne
> Murren zuläßt.

Es murrt doch. Muss man aber auch beachten und zulassen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Das Fehlen der Bedingung im For-Kopf heißt – was würde man auch anderes
erwarten – "bedingungslos". Somit läuft die Schleife so lange, bis sie
anderweitig (bspw. durch break) abgebrochen wird.

Großes Zeh Buch schrieb:
> In jeder "normalen" Sprache wird ein FOR ohne Next

Next gibt es nur in Basic und verwandten Sprachen. Wenn du nur diese als
normale Sprachen ansiehst, ist dein Teller eine Suppenschüssel mit
Deckel :)

> oder anderweitige Bedingung

Next ist keine Bedingung, sondern lediglich die Markierung des
Schleifenendes.

> sofort mit Husten und Spucken des Compilers beantwortet.

Wenn mich der Compiler anhusten oder gar anspucken würde, würde ich aber
sofort zurückspucken. Er hat mich gefälligst freundlich auf meine
Fehler hinzuweisen ;-)

von c-hater (Gast)


Lesenswert?

Yalu X. schrieb:

> Das Fehlen der Bedingung im For-Kopf heißt – was würde man auch anderes
> erwarten – "bedingungslos". Somit läuft die Schleife so lange, bis sie
> anderweitig (bspw. durch break) abgebrochen wird.

So ist es. Der Schwachsinn bei C ist halt nur, das ein Konstrukt, was 
dazu prädestiniert ist, eie abzählbare Anzahl von Iterationen zu 
liefern, auch mißbraucht werden kann, um eine unbegrenzte Anzahl von 
Iterationen auszuführen. Das ist nicht sehr logisch, insbesondere nicht 
unter den Aspekt, dass mit while() ja ein viel besser geeignetes 
Konstrukt zur Verfügung steht, bei dem man die Intention LESBAR 
angeben muss.

Aber klar, logisch ist C ja sowieso nicht.

> Next gibt es nur in Basic und verwandten Sprachen. Wenn du nur diese als
> normale Sprachen ansiehst, ist dein Teller eine Suppenschüssel mit
> Deckel :)

Mein Gott, häng' dich jetzt nicht an konkreten Schlüsselwörtern 
konkreter Sprachen auf. Die sind doch Wurscht. Es geht um die Intention 
einer Kontrollstruktur. Und um die Restriktionen, die die verfickte 
Sprache anwendet, um die intentionsgerechete Verwendung sicher zu 
stellen.

Und da kackt C einfach mal ganz fürchterlich ab.

von Norbert (Gast)


Lesenswert?

1
for( hier sind meine Start-Bedingungen; 
2
     hier sind meine Ende-Bedingungen;
3
     tue unbedingt dies bei jedem Durchgang )
Finde ich persönlich jetzt gar nicht mal so schlecht.
Ist aber sicherlich Geschmackssache.

von Schauspieler-Entdecker (Gast)


Lesenswert?

Norbert schrieb:
> for( hier sind meine Start-Bedingungen;
>      hier sind meine Ende-Bedingungen;
>      tue unbedingt dies bei jedem Durchgang )
> Finde ich persönlich jetzt gar nicht mal so schlecht.
> Ist aber sicherlich Geschmackssache.

Das ist ja auch die vollkommen normale Verwendung. Darum geht es aber 
hier nicht.

von EAF (Gast)


Lesenswert?

c-hater schrieb:
> insbesondere nicht
> unter den Aspekt, dass mit while() ja ein viel besser geeignetes
> Konstrukt zur Verfügung steht,

Ist das wirklich in diesem Fall auch so?

Mir scheint beides nicht so gelungen:
1
  while(1)
2
  {
3
    //hier tu das eine
4
    if(bedingung) break;
5
    //hier tu noch was anderes
6
    i++;
7
  }
8
  
9
  for(;;i++)
10
  {
11
    //hier tu das eine
12
    if(bedingung) break;
13
    //hier tu noch was anderes
14
  }
Die for Variante spart immerhin ein paar Tastendrücke ein
(wenn man denn darauf Wert legt)

von Norbert (Gast)


Lesenswert?

Schauspieler-Entdecker schrieb:
> Norbert schrieb:
>> for( hier sind meine Start-Bedingungen;
>>      hier sind meine Ende-Bedingungen;
>>      tue unbedingt dies bei jedem Durchgang )
>> Finde ich persönlich jetzt gar nicht mal so schlecht.
>> Ist aber sicherlich Geschmackssache.
>
> Das ist ja auch die vollkommen normale Verwendung. Darum geht es aber
> hier nicht.
Hmmm, ist das so?
1
for (Ich habe keine Start-Bedingungen;
2
     Ich habe keine Ende-Bedingungen;
3
     Es gibt hier oben nichts was _unbedingt_ getan werden muss) {
4
         Mach solange dies hier,
5
         zumindest bis ich Ende sage
6
}

von Norbert (Gast)


Lesenswert?

EAF schrieb:
> Mir scheint beides nicht so gelungen:
>   while(1)
>   {
>     i++;
>   }
>
>   for(;;i++)
>   {
>   }
> Die for Variante spart immerhin ein paar Tastendrücke ein
> (wenn man denn darauf Wert legt)

Na ja, spätestens wenn irgendwo im Rumpf ein continue an ungünstiger 
Stelle vorkommt, könnte es sich als nützlich erweisen trotzdem 
bedingungslos i zu inkrementieren (wenn man es denn will)
Ich wäre demnach für Version 2.

von (prx) A. K. (prx)


Lesenswert?

Ob diese Empfehlung für Programmierung in einer als geschwätzig 
bekannten Sprache wohl Gefallen findet? Immerhin kann keinerlei Zweifel 
aufkommen, was damit gemeint ist:
1
PERFORM UNTIL 1 < 0
2
   DISPLAY "Something"
3
END-PERFORM
https://programming-idioms.org/idiom/50/make-an-infinite-loop/3307/cobol

: Bearbeitet durch User
von Norbert (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Ob diese Empfehlung für Programmierung in einer als geschwätzig
> bekannten Sprache wohl Gefallen findet? Immerhin kann keinerlei Zweifel
> aufkommen, was damit gemeint ist:PERFORM UNTIL 1 < 0
>    DISPLAY "Something"
> END-PERFORM
> https://programming-idioms.org/idiom/50/make-an-infinite-loop/3307/cobol

Manche Leute ekeln sich aber auch vor gar nichts! ;-)

von EAF (Gast)


Lesenswert?

Norbert schrieb:
> spätestens wenn irgendwo im Rumpf ein continue an ungünstiger
> Stelle vorkommt,

Guter Einwand.

von (prx) A. K. (prx)


Lesenswert?

Mit C, C++ und Java Unzufriedene, einschliesslich des alten Hasens Ken 
Thompson, haben bei Google eine Sprache "Go" definiert. Und dabei völlig 
zurecht erkannt, dass for(;;) an sich der richtige Ansatz ist, aber viel 
zu umständlich:
1
for {
2
  ...
3
}
Besonders sprechend ist sicherlich Haskell:
1
let x = x in x

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

(prx) A. K. schrieb:

> Und dabei völlig
> zurecht erkannt, dass for(;;) an sich der richtige Ansatz ist, aber viel
> zu umständlich:
[...]

Nö. Das ist so ziemlich die schlimmste Perversion, die dieser 
Kontrollstruktur wiederfahren konnte...

Mehr als sinnentleert, vollkommen sinnwidrig.

von Norbert (Gast)


Lesenswert?

1
COMEFROM REPEATME
2
3
4
5
LABEL REPEATME
Besser so? ;-)

von EAF (Gast)


Lesenswert?

c-hater schrieb:
> Mehr als sinnentleert, vollkommen sinnwidrig.

Fein, dass du dir selber die Deutungshoheit zuteilst.
Das klappt aber nur in deinem kleinen Innenweltuniversum.

von EAF (Gast)


Lesenswert?

Norbert schrieb:
> Besser so? ;-)
Grundsätzlich sind Strukturen/Verfahren mit Goto keine unbedingt 
schlechte Idee im Parserbau.

Wobei ich die Beschränkung auf Vorwärtssprünge empfehlen würde. Das 
wirkt der Spagettifizierung deutlich entgegen.

von (prx) A. K. (prx)


Lesenswert?

Norbert schrieb:
> Besser so? ;-)

Eindeutig. Aber INTERCAL war als Jux konzipiert. FORTRAN nicht:
https://en.wikipedia.org/wiki/COMEFROM#OS/360_Fortran_G

von Norbert (Gast)


Lesenswert?

Ach da gibt's so Einiges bei dem ich nicht sicher bin ob's vielleicht 
doch nur ein fürchterlich missglückter Scherz war.
Zum Beispiel als ein paar betrunkene Mauer zusammen saßen und einer 
sagte ›Halt mal mein Bier‹
Und die anderen meinten: Das traust du dich nicht!

Na und mit der PHP-Schweinerei müssen nun alle leben.

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.