| Autor |
Nachricht |
justusjonas
Unregistrierter
|
justusjonas Unregistrierter
16:32:27 14.07.2012 Titel: |
Variable aus if-Abfrage weiter verwenden? |
Zitieren |
Ich versuche, die kleinste positive Zahl aus einer Funktionsausgabe in Form eines Arrays "rx" zu finden und in weiteren Rechenschritten zu benutzen. Dazu möchte ich eine if-Abfrage in der Form
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | double sol;
if (rx[0] > 0.0 &&
rx[0] < rx[1] &&
rx[0] < rx[2] )
sol = 0;
else if (rx[1] > 0.0 &&
rx[1] < rx[0] &&
rx[1] < rx[2] )
sol = 1;
else if (rx[2] > 0.0 &&
rx[2] < rx[1] &&
rx[2] < rx[0] )
sol = 2;
// Rechenschritte, die rx[sol] benutzen sollen | |
benutzen. Den Fehler habe ich (so glaube ich) schon selbst erkannt, nämlich dass die Variable "sol" mit Ende der if-Abfrage ihren scope verliert und daher in den folgenden Rechenschritten wieder mit dem Ursprungswert aus der Definition
benutzt wird. Dabei handelt es sich offenbar um Null.
Meine Frage ist, wie ich das Ergebnis aus der if-Abfrage in weiteren Rechenschritten benutzen kann. Über weitere Tipps zu if-Abfragen wäre ich ebenfalls dankbar.
Vielen Dank im voraus!
Mit freundlichen Grüßen
justusjonas |
|
|
|
 |
ganszahl
Unregistrierter
|
ganszahl Unregistrierter
16:42:05 14.07.2012 Titel: |
|
Zitieren |
benutze unsigned statt double. es ist kein scope-problem, das sollte so funktionieren. |
|
|
|
 |
ganszahl
Unregistrierter
|
ganszahl Unregistrierter
17:41:55 14.07.2012 Titel: |
|
Zitieren |
es kann natürlich sein, dass keine bedingung zutrifft. dann ist der inhalt von sol undefiniert. null (wie nulltpr) kann er jedenfalls nicht sein. |
|
|
|
 |
justusjonas
Unregistrierter
|
justusjonas Unregistrierter
19:48:29 14.07.2012 Titel: |
|
Zitieren |
Vielen Dank für die schnellen Antworten. Ich habe "double" in "unsigned" geändert, erhalte damit allerdings beim Ausführen des Programms einen Wert von 134519369 für sol und danach stürzt es ab mit der Fehlermeldung "Segmentation fault (core dumped)".
Ich habe weiterhin folgendes versucht:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | unsigned sol = 3;
if (rx[0] > 0.0 &&
rx[0] < rx[1] &&
rx[0] < rx[2] )
sol = 0;
else if (rx[1] > 0.0 &&
rx[1] < rx[0] &&
rx[1] < rx[2] )
sol = 1;
else if (rx[2] > 0.0 &&
rx[2] < rx[1] &&
rx[2] < rx[0] )
sol = 2;
cout << "rx[0]= " << rx[0] << endl;
cout << "rx[1]= " << rx[1] << endl;
cout << "rx[2]= " << rx[2] << endl;
cout << "sol= " << sol << endl; | |
Damit erhalte ich für rx sinnvolle Werte und das Programm stürzt auch nicht ab (z.B. rx[0] = -3.14407 ; rx[1]= -1.06378 und rx[2] = 15.3603) ; die sol-Abfrage ergibt allerdings wieder 3! Wenn ich das im C++-Tutorial richtig verstanden habe, müsste der Wert von "sol" doch überschrieben werden, wenn in der Abfrage z.B. "sol = 1" gesetzt wird. Meine Abfragen habe ich auch noch einmal überprüft, ich denke nicht, dass der Fehler hier zu suchen ist, da im o.g. Beispiel 15.3603 die Bedingungen erfüllt.
Könnte es evtl. funktionieren, dass ich meine "sol"-Variable als return-value der if-Abfrage ausgeben lassen? Habe mal ein return vor die sol = ... - Definition gesetzt, das hat das Problem leider nicht beheben können. Aber da gibt es bestimmt einen eleganten Lösungsweg für ...
Ich danke nochmals für die schnelle Hilfe und würde mich über weitere Vorschläge sehr freuen! |
|
|
|
 |
EOP
Mitglied
Benutzerprofil
Anmeldungsdatum: 15.09.2007
Beiträge: 809
|
EOP Mitglied
20:06:32 14.07.2012 Titel: |
|
Zitieren |
Zeig doch mal die ganze Funktion (im Zusammenhang) und nicht nur zusammengefrickelte Zeilen.
Das letzte sollte außerdem ein sein. Falls du das so willst.
Was ohne abschließenden else-Zweig passiert kann ich nur raten.
Wahrscheinlich die Verwendung deiner uninitialisierten Variablen sol. |
Zuletzt bearbeitet von EOP am 20:10:01 14.07.2012, insgesamt 1-mal bearbeitet |
|
 |
manni66
Unregistrierter
|
manni66 Unregistrierter
23:49:32 14.07.2012 Titel: |
|
Zitieren |
&& bedeutet und, d.h. keine deiner Bedingungen wird erfüllt! Suchst du oder (||)? |
|
|
|
 |
Sone
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.05.2012
Beiträge: 3473
|
Sone Mitglied
01:35:10 15.07.2012 Titel: |
|
Zitieren |
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | if (rx[0] > 0.0 &&
rx[0] < rx[1] &&
rx[0] < rx[2] )
sol = 0;
else if (rx[1] > 0.0 &&
rx[1] < rx[0] &&
rx[1] < rx[2] )
sol = 1;
else if (rx[2] > 0.0 &&
rx[2] < rx[1] &&
rx[2] < rx[0] )
sol = 2; | |
Was zum Teufel-?
Und du bist dir ganz sicher, dass man das nicht eleganter mit Schleifen lösen könnte? |
_________________ You want to do X, and you think Y is the best way of doing so. Instead of asking about X, you ask about Y. | Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur.
|
|
 |
JaykopX
Mitglied
Benutzerprofil
Anmeldungsdatum: 21.01.2010
Beiträge: 192
|
JaykopX Mitglied
03:40:54 15.07.2012 Titel: |
|
Zitieren |
Ich nehme an rx ist ein c-Array, sollte man in c++ nicht benutzen, dafür ist der std::vector einfach zu nützlich.
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | //c mit cout Lösung
#include <iostream>
using namespace std;
int main() {
double rx[3];
unsigned sol = 0;
rx[0] = 1.1;
rx[1] = -6;
rx[2] = 1.7;
bool firstNumberFound=false;
for(unsigned i=0; i<3; ++i) { //Gehe alle 3 Werte durch
if(rx[i] > 0.0) { //Zahl soll Positiv sein
if(!firstNumberFound) { //Ersten Index einer positiven Zahl merken
firstNumberFound=true;
sol=i;
}
if(rx[i] < rx[sol]) { //Ist die Zahl kleiner als die bekannteste kleinste?
sol = i; //Index Merken
}
}
}
cout << "rx[0]= " << rx[0] << endl;
cout << "rx[1]= " << rx[1] << endl;
cout << "rx[2]= " << rx[2] << endl;
cout << "sol= " << sol << endl;
} | |
Dann das Ganze in c++, wenn man nur die Zahl haben möchte(die Eingangsdaten werden manipuliert durch remove_if).
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //c++ Lösung
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool isNegative(double i) {
return i<0.;
}
double findPositiveSmallest(vector<double>& Vector) {
vector<double>::iterator newEnd = remove_if(Vector.begin(), Vector.end(), isNegative); //Entferne alle nicht-Positiven zahlen
//remove_if(Vector.begin(), Vector.end(), [](int i) {return i<0.;}); //Alternative mit Lambda, isNegativ braucht dann nicht definiert werden
return *min_element(Vector.begin(), newEnd); //Gibt die kleinste Zahl zurück
}
int main() {
vector<double> Test; //Ersatz für dein rx[3]
Test.push_back(-1.1);
Test.push_back(7.);
Test.push_back(0.1);
cout<<findPositiveSmallest(Test);
} | |
Den Fall, dass alle Zahlen negativ sind muss man noch hinzufügen. Hoffe, da ist nichts Falsches drin, ist schon spät, Licht aus. |
|
|
|
 |
camper
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5906
|
camper Mitglied
04:10:59 15.07.2012 Titel: |
|
Zitieren |
| JaykopX schrieb: | | Dann das Ganze in c++, wenn man nur die Zahl haben möchte(die Eingangsdaten werden manipuliert durch remove_if). | remove_if ist nicht erforderlich, man kann ja auch min_element mit einem geeigneten Komparator versehen, z.B.
| C++: | | min_element(first, last, [](double a, double b){ return a > 0 ? b <= 0 || a < b : b <= 0 && a > b; }); | | |
|
|
|
 |
justusjonas
Unregistrierter
|
justusjonas Unregistrierter
11:36:48 15.07.2012 Titel: |
|
Zitieren |
Ich habe jetzt gesehen und sogar verstanden, was an meiner Abfrage falsch ist. Die Lösungsvorschläge funktionieren hervorragend, ich werde mir noch anlesen müssen, was genau die einzelnen Elemente daraus bedeuten und wie sie verwendet werden. Ist aber auch das erste kleine Programm, das ich ohne Anleitung versucht habe ...
Wenn ich es fertig und funktionsfähig habe und meine Lösung in mehr als nur zwei Buchstaben von der von JaykopX vorgeschlagenen differiert, werde ich sie noch posten.
Ganz vielen herzlichen Dank für eure Antworten!
Viele Grüße! |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|