Wird diese if-Schleife jemals ausgeführt?

OP #6686423
Lesenswert?

Hallo zusammen,

ich habe eine kurze Frage.
Wird eine if-Schleife jemals ausgeführt wenn man in den Bedingungen ein 
= vergessen hat und somit eine Zuweisung anstatt einem Vergleich macht?
1
if ( hnow = 21 && mnow >= 30 && mnow <= 39)

eigentlich muss es ja
1
if ( hnow == 21 && mnow >= 30 && mnow <= 39)

heißen.

Vielen Dank!
Moderator Persönliche Seite #6686434
Lesenswert?

Paul-Gerhard S. schrieb:

> Wird eine if-Schleife

Dass es die nicht gibt, wurde ja schon genannt. ;-)  (Es ist eine 
"if-Anweisung".)

>
1
if ( hnow = 21 && mnow >= 30 && mnow <= 39)

Wenn du dir jetzt die Operatorenreihenfolge zu Gemüte führst, dann weißt 
du hinterher auch, was in "hnow" steht und warum sie ausgeführt wird:
1
if (hnow = (21 && (mnow >= 30) && (mnow <= 39)))
Moderator Persönliche Seite #6686464
Lesenswert?

Paul-Gerhard S. schrieb:
> Wie ist das wenn ich den Code aus dem großen weiten Internet
> heruntergeladen habe darf ich den dann auch hier veröffentlichen und
> darüber diskutieren?

Darüber diskutieren darfst du natürlich.

Inwiefern du den Code selbst veröffentlichen darfst, hängt von dessen 
Lizenz ab.

Für die von dir genannte Zeile greift aber ziemlich unstrittig das 
Zitatrecht, die darfst du also veröffentlicht haben. ;-)
OP #6686484
Lesenswert?

Sorry ich habe vergessen das zu sagen da hängt wohl so eine GNU-Lizenz 
vorne dran.
Dann ist das wohl ok.
Also das Programm soll eigentlich ein Gewicht wiegen den Wert auf eine 
SD-Karte speichern und alle 2 Tage eine SMS senden. (SIM800L-Modul)

Ich selber habe nur das mit dem SMS senden geschrieben. Wohl ziemlich 
reingepfuscht das ganze.
Ich weiß das ist ein "ziemlich" umfangreiches Programm und ich habe 
jetzt auch nur eine von vier Dateien angehängt weil in den anderen 
Teilen auch Telefonnummern stehen und so.

Wenn sich das wirklich jemand genauer anschauen will kann ich das auch 
noch umändern und einstellen.
Eigentlich geht es zuerst mal um die eine Code-Zeile mit der 
if-Anweisung.
Ich habe den Aufbau grade noch im Testaufbau und offiziell sollte erst 
heute Abend um ca. 21:30 eine SMS ankommen. Erst als ich das Programm 
heute vorsichtshalber nochmal angeschaut habe ist mir aufgefallen, dass 
das mit dem "=" wohl so nicht passen kann. Wenn aber tatsächlich nur 
mnow ausschlaggebend ist sollte ich ja jede halbe Stunde eine SMS 
bekommen?!
Ach ja das Weckintervall ist in der config datei definiert (aktuell 
10min) wo auch die Telefonnummern drin sind.

&& schrieb:
> Darum muss man die Warnungen aktivieren. Erst recht bei Arduino. Dazu
> gab es hier ja kürzlich eine lange Diskussion ;-)

Veilen Dank für den Hinweis! Das wusste ich nicht.
Da kommt dann die Warnung mit dem "=".

Es kam auch noch eine Meldung zu
1
char File_Name[15] = "beelogger_Lukas_1.csv";
Die String-Länge sei zu kurz.

Reicht es da einfach eine 22 aus der 15 zu machen?

Vielen Dank!
Angehängte Dateien:
Beitrag #6686509 wurde von einem Moderator gelöscht.
#6686514
Lesenswert?

Paul-Gerhard S. schrieb:
> char File_Name[15] = "beelogger_Lukas_1.csv";
> Die String-Länge sei zu kurz.
> Reicht es da einfach eine 22 aus der 15 zu machen?

Das hängt davon ab, was du für ein Dateisystem hast und wie die anderen 
Teile des Programms geschrieben sind wo dieser Dateiname verwendet wird. 
Wenn dort auch überall eine Limitierung auf 14 Zeichen drin ist, dann 
solltest du die 15 lieber nicht ändern und besser den Dateinamen kürzen.

Wenn die Länge des Namens egal wäre ich ich dort einfach nur folgendes 
geschrieben:
1
char File_Name[] = "beelogger_Lukas_1.csv";

Wenn dort explizit eine Länge drinsteht könnte das einen guten Grund 
haben.

Ich wäre eher defensiv und würde hier nur 8+3 Zeichen für den Dateinamen 
verwenden.

   Michael
Gast #6686515
Lesenswert?

Es ist immer das Selbe.

Leute "organisieren" sich einen Code aber sind NICHT in der Lagen zu 
debuggen.

Was ist so schwer daran. Man lernt mit den Seriellen Monitor umzugehen, 
Manipuliert die Variablen VOR der if-Then-Abfrage  und lässt sich nach 
der Abfrage an der richtigen Stelle, was anzeigen.

Das ist Coden für Anfänger. Ich bin kein Anfänger aber das habe ich 
schon gleich nach Hello-World gemacht. ;)
Gast #6686517
Lesenswert?

Paul-Gerhard S. schrieb:
> Es kam auch noch eine Meldung zu
> char File_Name[15] = "beelogger_Lukas_1.csv";
> Die String-Länge sei zu kurz.
>
> Reicht es da einfach eine 22 aus der 15 zu machen?

Zunächst ja, je nach dem, ob der String irgend wo hinkopiert wird, muss 
das dort halt auch passen (ich analysiere den Code nicht).

Viel Vertrauen kann man dem Code nach solchen Fehlern bei einer 
Veröffentlichung nicht wirklich entgegen bringen ...
OP #6686543
Lesenswert?

Schlaumaier schrieb:
> Es ist immer das Selbe.

Ich werde mir das schon selber nochmal genauer anschauen. Ich denke ich 
bekomme das auch schon irgendwie in den Griff. Ich wollte nur nicht hier 
eine Frage stellen und den Leuten die freundlich antworten den 
Zusammenhang vorenthalten. Vor allem weil sich das mit dem "=" alles 
entgegen der Meinungen der Leute die mir geantwortet haben verhält. 
(Siehe oben)
Aber es kann natürlich auch irgendwo anders ein Fehler im Programm sein. 
Allerdings ist der dann auf mich zurückzuführen. Ohne meine Abänderungen 
lief nämlich alles wie am Schnürchen.
Ich bin auch nicht wirklich davon ausgegangen dass sich jemand die Mühe 
macht das genau anzuschauen. Würde mich aber trotzdem freuen. :)

HildeK schrieb:
> Viel Vertrauen kann man dem Code nach solchen Fehlern bei einer
> Veröffentlichung nicht wirklich entgegen bringen ...

Ich habe den Name abgeändert und deshalb kam die Warnung. Also mein 
Fehler.
Und außerdem ist es ja eigentlich egal wieviel Warnungen der Compiler 
ausspuckt, wenn das Programm zuverlässig läuft.
Ich würde sagen das ist ausgesprochen nett, dass überhaupt jemand seinen 
Code veröffentlicht und sowieso wenn er im GNU-Satz oben drüber 
schreibt, dass er nicht garantiert ob das läuft oder nicht ist man 
selbst schuld.

Trotzdem Danke an alle!
Gast #6686555
Lesenswert?

Paul-Gerhard S. schrieb:
> Und außerdem ist es ja eigentlich egal wieviel Warnungen der Compiler
> ausspuckt, wenn das Programm zuverlässig läuft.

Nein, definitiv nicht. Mit dieser Einstellung wird man bestenfalls eine 
Schlampe, keinesfalls ein Programmierer.

Die Warnungen dienen dazu, Fehler zu vermeiden - vor allem Fehler die 
der Compiler nicht eindeutig erkennen kann. In allen Firmen, wo ich 
Software entwickelte gab es die strikte Regel, dass Programme nur dann 
abgeliefert werden dürfen, wenn sie ohne Warnungen compilieren. 
Teilweise wurden sogar zusätzliche Tools zur statischen Code-Analyse 
hinzugenommen, die noch mehr Warnungen erzeugen.
Gast #6686601
Lesenswert?

Paul-Gerhard S. schrieb:
> Und außerdem ist es ja eigentlich egal wieviel Warnungen der Compiler
> ausspuckt, wenn das Programm zuverlässig läuft.

Warnungen bedeutet immer, das was der Name sagt. Sie WARNEN vor 
möglichen Problemen.

Erst mit jahrelanger Erfahrung mit den Compiler und seinen 
Programmierkünsten kann man selbstständig entscheiden welche Warnungen 
man ignorieren kann, und welche nicht.

Ein einfaches Beispiel :
Die Warnung "Variable MC wurde nicht deklariert".

Wenn man sicher ist, das am die Variable noch nicht benutzt hat, kann 
man diese Warnung ignorieren da der Compiler sie selbst deklariert.

ABER. Diese Warnung kann auch auf ein Tippfehler hindeutet, wenn der 
wirkliche Name MV ist. Und man sich dann wundert wieso die Variable 
falsche Werte hat.

Wie erwähnt, nur ein einfaches Beispiel was nicht einmal bei allen 
Compilern/IDE so funktionieren tut. Aber es erläutert das Problem mit 
Warnungen.

Anfängern rate ich aber dringend so wenige Warnungen wie möglich zu 
erzeugen und immer über JEDE Warnung nachzudenken. Sie hat halt einen 
Grund.

Es kann sogar sein, das die Warnung darauf heraus läuft das das Prg. in 
DIESER Version des Compilers läuft aber in einer neueren Version nicht 
mehr.  Grund : Der verwendete Befehl wird in der neuen Version ersetzt.
Gast #6686606
Lesenswert?

Ich finde es übrigens ein Unding, dass beim gcc die Option -Wall nicht 
standardmäßig aktiv ist.

Noch verwerflicher finde ich, dass bei Arduino standardmäßig alle 
Warnungen unterdrückt werden. Sollte das nicht eine Plattform zum Lernen 
sein? So lernt man es definitiv nicht richtig.
OP #6686641
Lesenswert?

Vielen Dank für die Hinweise mit den Warnungen!
Ich werde das in Zukunft berücksichtigen.

Hat jemand noch eine Idee zu der if-Anweisung?
Im Programm wird ja die aktuelle Uhrzeit abgefragt und nur wenn es 
zwischen 21.30 und 21.39 ist soll eine SMS gesendet werden. Der uC soll 
ja schlafen und nur wenn er in dieser Zeit aufwacht und laut unix-time 
ein gerader Tag ist soll eine SMS gesendet werden.
Das komische ist, dass ich den Test jetzt schon mindestens einen Tag im 
Betrieb hatte der nach unix-time gerade ist. Und wenn die stunden mit 21 
nicht ausschlaggebend sind sollte ich ja alle Stunde eine SMS bekommen 
immer zwischen der halben Stunde und 10 nach halb. Das ist aber 
definitiv nicht so. Deshalb bin ich mir irgendwie unsicher ob ich das 
mit der if jetzt immer noch nicht richtig verstanden habe oder ob etwas 
anderes noch nicht passt.
Das SMS senden an sich und auch das unberührte Original-Programm ist 
schon problemlos gelaufen. Ich wollte das eigentlich nur kurz 
zusammenfügen. :)

Heute ist der erste Abend an dem ich tatsächlich eine SMS erwarte und 
deshalb werde ich heute vor 21.40 keine weiteren debug-Versuche 
unternehmen.
Allerdings habe ich morgen Berufsschulabschlussprüfungen (EGS) und weiß 
deshalb nicht ob da heute Abend noch was läuft.

Die if steht übrigens in der Arduino-Setup. Die Variable SMS_senden wird 
bei beschriebener if Anweisung und einer weiteren if die jeden zweiten 
Tag true sein soll auf 1 gesetzt und dann in der Funktion 
Daten_per_SMS_senden() die in der relativ schlanken Arduino-loop 
aufgerufen wird verarbeitet.
#6686651
Lesenswert?

Paul-Gerhard S. schrieb:
> Die if steht übrigens in der Arduino-Setup. Die Variable SMS_senden wird
> bei beschriebener if Anweisung und einer weiteren if die jeden zweiten
> Tag true sein soll auf 1 gesetzt und dann in der Funktion
> Daten_per_SMS_senden() die in der relativ schlanken Arduino-loop
> aufgerufen wird verarbeitet.

Sehr gut - sehe ich gerade vor mir. Leider erschwert ein dichter Nebel 
die Durchsicht. Ich warte auf Wind.
#6686675
Lesenswert?

Paul-Gerhard S. schrieb:
> Die .ino habe ich vorhin schonmal angehängt.

Hier wird immer wieder gepredigt, dass man einen Code beifügen soll, 
welcher das Problem (ohne den Rest der Entwicklung zu betrachten) 
darstellt.

In Deinem Fall:

Variablen vorbelegen, IF-Anweisung ausführen, (falsches) Ergebnis 
aufzeigen.

Am Besten, den reduzierten Code nachvollziehbar ausgeben oder z. B. als 
Atmel- oder Arduino-Projekt anhängen. Wenn Du das machst erledigt sich 
die Frage vermutlich von selbst.
OP #6686690
Lesenswert?

Hugo H. schrieb:
> Prima, dass Du jetzt schon damit um die Ecke kommst :-)

Entschuldigung, Entschuldigung.
Ich wollte extra keine Salami liefern und hab die ganze .ino angehängt.

Aber dann hat sich inzwischen ja das meiste geklärt werde schauen wie 
weit ich komme und mich dann nochmal melden.

Zum Verständnis noch eine Frage:
In wie weit merkt sich der uC den Zustand der verschiedenen Variablen im 
Schlaufzustand? Macht es da einen Unterschied ob die Variable volatile 
ist oder nicht?

Vielen Dank an alle!
Moderator Persönliche Seite #6686707
Lesenswert?

Paul-Gerhard S. schrieb:
> In wie weit merkt sich der uC den Zustand der verschiedenen Variablen im
> Schlaufzustand?

AVRs merken sich da alles, da der RAM komplett spannungsversorgt bleibt.

Bei anderen Controllern ist das zuweilen nicht so, musst du dann im 
Handbuch nachlesen.

> Macht es da einen Unterschied ob die Variable volatile
> ist oder nicht?

Nein.
Gast #6686725
Lesenswert?

Jörg W. schrieb:
> Paul-Gerhard S. schrieb:
>> laut unix-time ein gerader Tag ist
>
> Dein Test ist aber auf == 1, das wäre ein ungerader Tag.
>
> Ob laut Unix-Zeit aktuell ein gerader oder ein ungerader Tag ist, wüsste
> ich jetzt aber auch nicht auf Anhieb. ;-)

Ich frage mich gerade was ein ungerader Tag ist. Wochentag, Tag im Monat 
oder Tag im Jahr? Da gibt es Fälle wo zwei gerade oder zwei ungerade 
Tage aufeinander folgen. Da ist es meiner Meinung nach wenig sinnvoll 
von gerade oder ungerade zu reden. Julianischer Tag oder ähnlich würde 
funktionieren.
Beitrag #6686731 wurde von einem Moderator gelöscht.
Gast #6686732
Lesenswert?

Paul-Gerhard S. schrieb:
> Hat jemand noch eine Idee zu der if-Anweisung?

Zur if-Anweisung selbst nicht, aber zur Verwendung einer Zuweisung 
innerhalb einer Berechnung in C und C++. Ich weiss nicht ob dir klar 
geworden ist was dann genau passiert:
1. Die Zuweisung wird ausgeführt.
2. Das Ergebnis der Zuweisung ist der zugewiesene Wert.
Dabei muss natürlich die Operatorenreihenfolge beachtet werden.

Also ist ((a=2)>3) immer falsch.

LG, Sebastian
Gast #6686940
Lesenswert?

Jörg W. schrieb:
> mh schrieb:
>> Ich frage mich gerade was ein ungerader Tag ist
>
> Er hat ihn auf die Unix-Zeit bezogen, also den 1. Januar 1970.
Unix Time kennt keine Tage, nur Sekunden. Referenz ist 1970-01-01 
00:00:00. Da Schaltsekunden unberücksichtigt bleiben, verliert sich auch 
die Zuordnung zum Datum und begrenzt ist es ohnehin. Einen letzten Tag 
gibt es ebenfalls nicht.
Im Space Business hat man diese Zählweise übrigens übernommen, außer, 
dass die Referenz schon einige Male angepasst wurde. (Es gab sogar mal 
einen 1. Januar um 12:00 h Mittags - ganz verschroben, sind wir schon 
alle mit auf die Nase gefallen ...)
Moderator Persönliche Seite #6687168
Lesenswert?

dfIas schrieb:
>>> Ich frage mich gerade was ein ungerader Tag ist
>>
>> Er hat ihn auf die Unix-Zeit bezogen, also den 1. Januar 1970.
>
> Unix Time kennt keine Tage, nur Sekunden.

Ja, und er hat das dann einfach durch 86400 dividiert, um die Tageszahl 
zu bekommen und geschaut, ob die gerade oder ungerade ist.

Für ein "sende dies jeden zweiten Tag" ist das doch völlig OK.
OP #6687276
Lesenswert?

Also vielen Dank an alle!
Prüfung ist jetzt vorbei und ich kann weiter testen.

Das eigentlich Problem außer dem "=" das in der if fehlt ist wohl, dass 
ich die Abfrage ob heute gesendet wird oder nicht in der setup mache und 
der Arduino die setup beim aufwachen nicht nochmals durchläuft.

Ich werde das ändern genauso wie das "=" und den zu langen String und 
dann nochmal testen.

Vielen Dank an die die trotz dem Durcheinander wichtige Hinweise gegeben 
haben und mich unterstützt haben.

Werde mich nochmal melden wenn es ein weiteres Problem gibt.
Moderator Persönliche Seite #6687283
Lesenswert?

Paul-Gerhard S. schrieb:
> Arduino die setup beim aufwachen nicht nochmals durchläuft.

Ja, klar, die wird nur nach einem Reset (oder Sprung auf Adresse 0) 
durchlaufen.

In Standard-C++-Terminologie kannst du dir das so vorstellen:
1
void setup(void);
2
void loop(void);
3

4
int main(void)
5
{
6
   setup()
7

8
   for (;;)
9
     loop();
10
}

Wie schon oben zitiert, bleiben beim Sleep alle Registerinhalte 
erhalten, also auch der des PC. Damit befindest du dich nach dem 
Aufwachen immer an dem Befehl, der direkt nach dem Sleep folgt.
Gast #6687407
Lesenswert?

Jörg W. schrieb:
> also auch der des PC.

Na hoffentlich weiss der TO mit der Abkürzung was anzufangen.
Aufgrund der Performance die er als Programmierer an den Tag
legt denke ich eher dass das schwierig wird. Selbst wenn man
diese Abkürzung ausschreibt wird er noch daran zu knabbern
haben.
Beitrag #6687419 wurde von einem Moderator gelöscht.
OP #6687562
Lesenswert?

Ich denke das ist der Programm counter.
Der zeigt irgendwie an wo der uC grade im Programm steht.
Wir hatten das mal in der Schule.
Ist ja so ähnlich wie der Stack. Nur dass der für untergeordnete 
Programteile bzw Funktionen ist oder? Und wenn man in zu viele 
Unterschleifen geht dann läuft der stack über und dann hat man ein 
richtiges Problem. Hab ich das richtig im Kopf?
Oder kann der bei AVR´s inzwischen gar nicht mehr überlaufen?

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