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?
hnow schrieb:> Ist immer wahr, weil die zuweisung mit 21 immer ungleich null ist.
Sicher?
Was ist wenn mnow 0 ist?
Die If-Abfrage ist dann (true && false && true) und das ergibt False.
Oder?
hnow schrieb:> if ( hnow = 21 && mnow >= 30 && mnow <= 39)>> Ist immer wahr, weil die zuweisung mit 21 immer ungleich null ist.
Also unabhängig von mnow? Im Arduino-Compiler auch?
Paul-Gerhard S. schrieb:> Also unabhängig von mnow?
natürlich nicht.
mnow wäre bei der Zuweisung (statt Vergleich) die einzige Variable, die
entscheidet ob die if-Schleife ausgeführt wird oder nicht.
Paul-Gerhard S. schrieb:> Also unabhängig von mnow?
Nein. Denk doch mal bitte selbst mit. Wie man den Ausdruck so klammern
muss, wie es der Compiler implizit macht, hatte ich dir geschrieben.
> Im Arduino-Compiler auch?
Auch Arduino benutzt einen C++-Compiler, der dem ganz normalen
C++-Standard entspricht.
Paul-Gerhard S. schrieb:> Im Arduino-Compiler auch?
Darum muss man die Warnungen aktivieren. Erst recht bei Arduino. Dazu
gab es hier ja kürzlich eine lange Diskussion ;-)
Vielen Dank!
Dann muss mein Fehler woanders liegen.
Den Code hab ich leider zum Großteil nicht selber geschrieben.
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?
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. ;-)
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
charFile_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!
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
charFile_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
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. ;)
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 ...
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!
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.
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!
Nein, nein, nein!
Tu‘ dir das nicht an!
Nein,nein, nein!
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.
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.
Jörg W. schrieb:> Es ist eine> "if-Anweisung"
Ich kenne das als "Bedingte Verarbeitung". "Verzweigung" hört sich so
an, als mache man nebenbei noch etwas Anderes - dem ist aber nicht so.
Man geht den einen oder den anderen Weg.
Manchmal sind Flussdiagramme oder "Nassi-Shneidermann"-Diagramme gar
nicht so verkehrt :-)
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.
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.
Hugo H. schrieb:> Sehr gut - sehe ich gerade vor mir. Leider erschwert ein dichter Nebel> die Durchsicht. Ich warte auf Wind.
Verstehe ich jetzt nicht ganz. Soll ich den ganzen Code einstellen oder
nur die erwähnten Teile? Dann ist doch wieder alles aus dem Zusammenhang
gerissen.
Die .ino habe ich vorhin schonmal angehängt.
Ja er soll nach dem Aufwachen nur kurz schauen ob er jetzt die SMS
senden soll oder nicht. Oder wird die Setup beim Aufwachen nicht
nocheimal durchlaufen?
Wenn nein dann ist der Fehler schon gefunden. Vielen Dank!
Paul-Gerhard S. schrieb:
Das Aufwachen ist kein Programmstart, sondern eine Fortsetung nach dem
Einschlafen.
Du hast das eventuell mit dem ESP8266 verwechselt, der muss zum
Aufwachen resetted werden, also tatsächlich neu starten.
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.
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!
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. ;-)
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.
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.
Hugo H. schrieb:> Jörg W. schrieb:>> AVRs merken sich da alles, da der RAM komplett spannungsversorgt bleibt.>> Hast Du dazu eine sichere Quelle?
Genügt dir (außer meiner eigenen jahrelangen Erfahrung) das Datenblatt
als ausreichend "sicher"?
"The contents of the register file and SRAM are unaltered when the
device wakes up from sleep."
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
Hugo H. schrieb:>> Es ist eine>> "if-Anweisung">> Ich kenne das als "Bedingte Verarbeitung".
Wobei es mehrere "bedingte Anweisungen" gibt (if, switch, ternärer
Operator), insofern ist "if-Anweisung" stärker eingrenzend.
Auch die Schleifenanweisungen sind bedingte Anweisungen.
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 ...)
Paul-Gerhard S. schrieb:> Ich wollte extra keine Salami liefern und hab die ganze .ino angehängt.
An deinem Code sehen wir leider nur, was du programmiert hast. Nicht was
du beabsichtigt hast.
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.
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.
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
voidsetup(void);
2
voidloop(void);
3
4
intmain(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.
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.
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?