Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Variable aus if-Abfrage weiter verwenden?  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
justusjonas
Unregistrierter




Beitrag 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
C++:
double sol;

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




Beitrag 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




Beitrag 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




Beitrag 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
Beitrag 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
C++:
else if
sollte außerdem ein
C++:
else
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




Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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




Beitrag 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!
c++.de :: C++ (auch C++0x und C++11) ::  Variable aus if-Abfrage weiter verwenden?  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.