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 | |
eigentlich muss es ja
1 | |
heißen. Vielen Dank!
|
Anzeige
|
Wird diese if-Schleife jemals ausgeführt?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?
eigentlich muss es ja
heißen. Vielen Dank!
Gast
#6686427
Ja
Gast
#6686428
Es gibt keine If-Schleifen! Paul-Gerhard S. schrieb: > Vielen Dank! Gerne geschehen.
Gast
#6686430
Ist immer wahr, weil die zuweisung mit 21 immer ungleich null ist. Jemand schrieb: hin wais geber schrieb: > Es gibt keine If-Schleifen! Entschuldigung. Wie nennt man es dann? Vielen Dank! Paul-Gerhard S. schrieb: > Wird eine if-Schleife Dass es die nicht gibt, wurde ja schon genannt. ;-) (Es ist eine "if-Anweisung".) >
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:
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?
Gast
#6686448
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.
Gast
#6686453
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?
Gast
#6686458
Paul-Gerhard S. schrieb: > Entschuldigung. Wie nennt man es dann? Programmverzweigung https://www.computerwissen-online.de/?page=lexika&action=view&content=261
kann man auch schreiben als
Der erzeugte Code ist der gleiche. Dabei sind die Klammern in der ersten Zeile optional.
Gast
#6686461
Paul-Gerhard S. schrieb: > hin wais geber schrieb: >> Es gibt keine If-Schleifen! > > Entschuldigung. Wie nennt man es dann? > > Vielen Dank! Verzweigung 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
Die String-Länge sei zu kurz. Reicht es da einfach eine 22 aus der 15 zu machen? Vielen Dank!
Gast
#6686504
>> Es gibt keine If-Schleifen! Paul-Gerhard S. schrieb: > Entschuldigung. Wie nennt man es dann? http://if-schleife.de/
Beitrag #6686509 wurde von einem Moderator gelöscht.
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:
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
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
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!
Gast
#6686555
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!
Gast
#6686601
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
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.
Gast
#6686666
Paul-Gerhard S. schrieb: > Die if steht übrigens in der Arduino-Setup Setup wird nur einmal nach Programmstart ausgeführt. 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!
Gast
#6686672
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. Paul-Gerhard S. schrieb: > Ja er soll nach dem Aufwachen Prima, dass Du jetzt schon damit um die Ecke kommst :-) 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: > AVRs merken sich da alles, da der RAM komplett spannungsversorgt bleibt. Hast Du dazu eine sichere Quelle?
Gast
#6686725
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." mh schrieb: > Ich frage mich gerade was ein ungerader Tag ist Er hat ihn auf die Unix-Zeit bezogen, also den 1. Januar 1970.
Beitrag #6686731 wurde von einem Moderator gelöscht.
Gast
#6686732
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.
Gast
#6686940
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 ...)
Gast
#6687015
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:
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
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.
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? Paul-Gerhard S. schrieb: > Hab ich das richtig im Kopf? Sehr grob. :-)
Gast
#6687605
Soviel dazu dass auch eine Fernschätzung mal ganz gut sein kann. Also inzwischen läuft alles wie ich mir das vorgestellt habe. Vielen Dank an alle die dazu beigetragen haben. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|