Variable übernimmt Wert nicht.
-
@Christine0107 sagte in Variable übernimmt Wert nicht.:
Welche Fehler enthält das Codestück denn noch? Ich habe der
hilfsvariable
testweise eine positiven bzw einen negativen wert zugewiesen, was dazu geführt hat, dass dernulldurchgang
bei allen negativen bzw dann positivenzufallswerten
angezeigt wurde, was den Verdacht erhärtet, dass diehilfsvariable
nicht den Wert deszufallswert
übernimmt. Genau da liegt mein Problem!Gerade deshalb wäre es doch wichtig zu wissen, woher dieser Wert überhaupt kommt. Und auch, wie der fehlerhafte Code exakt aussieht. Nach
hilfsvariable = zufallswert;
hathilfsvariable
den Wert vonzufallswert
, dass garantiere ich dir. Deshalb müssen wir nachvollziehen können, was dich überhaupt zu der Annahme bringt, dass das nicht so sein könnte.In der Hilfe steht explizit das Problem auf das Wesentliche runterzubrechen und keine 300 Zeilen Code anzugeben.
Ja, aber da steht auch, dass dein Code das Problem demonstrieren muss! Was du hier zeigst ist irgendetwas, wie du dir vorstellst, wie dein Code eventuell funktionieren könnte, zeigt das Problem nicht, und ist überhaupt reine Fantasie.
-
Erstmal formatieren wir deinen Code (verwende irgendeinen automatischen Code-Formatierer, z.B.
clang-format
). Dann sieht er so aus:bool nulldurchgang = false; double hilfsvariable; { { if (zufallswert < 0 && hilfsvariable > 0) nulldurchgang = true; else if (zufallswert > 0 && hilfsvariable < 0) nulldurchgang = true; else nulldurchgang = false; } hilfsvariable = zufallswert; }
Es fällt auf, dass die beiden Klammernpaare nichts tun. Sie können also weg:
bool nulldurchgang = false; double hilfsvariable; if (zufallswert < 0 && hilfsvariable > 0) nulldurchgang = true; else if (zufallswert > 0 && hilfsvariable < 0) nulldurchgang = true; else nulldurchgang = false; hilfsvariable = zufallswert;
Die ersten beiden ifs haben denselben then-Teil. Man kann sie also zusammenfassen.
if ((zufallswert < 0 && hilfsvariable > 0) || (zufallswert > 0 && hilfsvariable < 0)) ...
da im then- und else-Teil nur eine bool-Variable gestezt wird, kann man das weiter kürzen auf:
double hilfsvariable; bool nulldurchgang = ( (zufallswert < 0 && hilfsvariable > 0) || (zufallswert > 0 && hilfsvariable < 0) ); hilfsvariable = zufallswert;
Hier siehst du jetzt sehr gut, dass der Code nicht sinnvoll ist. Wie schon gesagt, ist
hilfsvariable
undefiniert. Somit ist auchnulldurchgang
undefiniert.nulldurchgang
wird in deinem Beispiel aber nicht weiter verwendet und waszufallswert
ist, ist auch nicht bekannt.
-
@Quiche-Lorraine
Genau, die Hilfsvariable soll den Zufallswert übernehmen und beim nächsten durchlauf mit dem neuen Zufallswert vergleichen. Mitenum
habe ich noch nicht gearbeitet.
-
@wob
Vielen Dank für das Feedback,
Derzufallswert
wird automatisch generiert. Allerdings kann ich den genauen Zeilenabschnitt nicht erkennen und wie das genau gemacht wird (Das Programm hat mehr als 300 Zeilen). Wenn ich diehilfsvariable
definiere (zBhilfsvariable = 1
), würde das am Problem was ändern?
-
@Christine0107 sagte in Variable übernimmt Wert nicht.:
Der
zufallswert
wird automatisch generiert. Allerdings kann ich den genauen Zeilenabschnitt nicht erkennen und wie das genau gemacht wird (Das Programm hat mehr als 300 Zeilen). Wenn ich diehilfsvariable
definiere (zBhilfsvariable = 1
), würde das am Problem was ändern?Unwahrscheinlich. Wenn du in 300 Zeilen nicht erkennen kannst, wo eine Variable ihren Wert herbekommt, oder wenn das Programm so ein Kuddelmuddel ist, dass man das tatsächlich nicht erkennen kann, dann ist eher davon auszugehen, dass du einfach völlig auf dem Holzweg bist und die ganz falsche Frage zu ganz falschem Code stellst. Wie dir ja schon wiederholt gesagt wurde, brauchen wir Code, der das Problem repräsentiert. Wenn du nicht einmal weißt, wo und wie in deinem echten Code eine der entscheidenden Variablen ihren Wert ändert, wie soll dein Beispielcode dann korrekt dein Problem zu einer nicht-Änderung eines Wertes darstellen? Wahrscheinlicher ist da doch, dass du fälschlicherweise davon ausgehst, dass sich da was ändern sollte, wenn das gar nicht der Fall ist, sondern du das Programm nicht richtig verstehst. Daher um so wichtiger, dass du dein Problem systematisch reduzierst.
-
@Christine0107 sagte in Variable übernimmt Wert nicht.:
Genau, die Hilfsvariable soll den Zufallswert übernehmen und beim nächsten durchlauf mit dem neuen Zufallswert vergleichen.
Du meinst, in einer Schleife wird dieser gesamte Code wieder neu durchlaufen?
Dann verstehst du das Speichermodell von C++ (bzw. auch schon von C) nicht. Bei jedem Aufruf dieses gesamten Codes werden alle lokalen Variablen (hier also auchhilfsvariable
) neu erzeugt und selbst, wenn sie nicht initialisiert werden, behalten sie nicht den vorherigen Wert bei, sondern haben einen undefinierten Wert (da diese üblicherweise auf dem Stack bzw. in einer Registervariablen gehalten werden, in denen vorher andere Werte drin stehen).Abhilfe könnte hier entweder die Übergabe der Variablen
hilfsvariable
als Funktionsparameter (sofern dein Code selber als Funktion implementiert ist) schaffen oder das Schlüsselwortstatic
(s. z.B. static in Funktionen).Wenn dein Code jedoch direkt Teil dieser Schleife ist, dann müßte es auch reichen, einfach die Deklaration dieser Variablen vor die Schleife zu setzen, so daß diese nur einmalig initialisiert wird (du müßtest jedoch noch einen passenden Initialwert setzen, damit beim ersten Durchlauf nicht wieder ein undefinierter Wert dort drin steht - das müßtest du logisch entscheiden).
-
@Christine0107 sagte in Variable übernimmt Wert nicht.:
Genau, die Hilfsvariable soll den Zufallswert übernehmen und beim nächsten durchlauf mit dem neuen Zufallswert vergleichen.
Und was machst du am Anfang wo du noch keinen Wert hast? Ich glaube deine Logik stimmt so nicht ganz.
Mit enum habe ich noch nicht gearbeitet.
Oh je, ich bin mal lieb:
#include <iostream> class ZeroDetection { private: enum class State { UNKNOWN, ABOVE, UNDER }; private: State gState = State::UNKNOWN; ///< Zustand des letzten bekannten Put() Aufrufs public: /** * * * \return true, wenn ein Nulldurchgang erfolgte, sonst false **/ bool Put(double v) { if (gState == State::UNKNOWN) { gState = (v > 0) ? State::ABOVE : State::UNDER; return false; } else if (gState == State::ABOVE) { if (v > 0) { gState = State::ABOVE; return false; } else { gState = State::UNDER; return true; } } else // if (gState == State::UNDER) { if (v > 0) { gState = State::ABOVE; return true; } else { gState = State::UNDER; return false; } } } }; int main(int argc, char const *argv[]) { ZeroDetection zd; if (zd.Put(1)) std::cout << "1. Nulldetektion\n"; if (zd.Put(-1)) std::cout << "2. Nulldetektion\n"; return 0; }
So ungefähr würde ich die Funktion implementieren.
-
@Quiche-Lorraine : Was ist bei Tangieren der Null?
-
@SeppJ sagte in Variable übernimmt Wert nicht.:
Was ist bei Tangieren der Null?
Das überlasse ich der Threaderstellerin.
BTW: Ich glaube hier könnte es für die Threaderstellerin auch übungstechnisch Sinn machen einen Zustandsdiagramm zu malen und dieses dann zu implementieren.
-
Naja ich bin auch nicht so fit in C++. Die Aufgabe ist Teil einer Hausarbeit und nach Grundkurs C++ ist für mich alles noch nicht so einfach bzw einleuchtend.
Anforderung in der Aufgabe ist auch, dass die Programmierung im modularen Konzept umgesetzt wird, dh ich darf außerhalb meiner Programmierung nichts verändern.
-
Vielen Dank für die Mühe.
Ich muss mir das mal in Ruhe nach der Arbeit anschauen, da mir der Datentyp in den Skripten noch nicht über den Weg gelaufen ist.
-
Wie gesagt das ist Teil einer Hausarbeit und ich bin in dem Thema noch nicht so sattelfest. Der Code, in dem da gearbeitet wird ist zumindest für mich alles andere als verständlich und hat mit dem Niveau in den Skripten nichts mehr zu tun.
-
Sind all diese Ausflüchte jetzt wirklich weniger Mühe, als einfach mal den konkreten Code zu deinem Problem zu zeigen? Tut mir leid, aber man kann dir nur helfen, wenn du es auch willst.