Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Variable verändert einfach ihren Wert

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
08.07.2004, 16:26 Uhr
t10ottoo



Hi,

hab da nen kleinen (rießen) Problem.

Also ich rufe vom Hauptdialog nen anderen Dialog auf. Im Hauptdialog hab ich ne Variable 1 mit dem Wert 3 (oder was weiß ich). Nun rufe ich den anderen Dialog auf, von dem will ich ne Funktion aufrufen, die ich im Hauptdialog geschrieben habe und die auch mit dem Wert i arbeitet. Wenn ich aber nun im Debug-Modus schaue, dann ist beim Funktionsaufruf der Wert von i nimmer 3, sonder sone komische Zahl, also nicht definiert. Wieso speichert er sich den Wert denn nicht? Versteh ich gar net :o

Hoffe, ich konnte mein Problem deutlich darstellen.
Thomas
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.07.2004, 16:33 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zeig mal den code mit dem du das fabzizierst
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.07.2004, 16:41 Uhr
t10ottoo



Nagut, du hast es so gewollt, issn bissl umständlicher.
Also mit der Funktion setze ich den Wert für "i1" fest. Die Funktion ist im Hauptdialog:

C++:
    ifstream butter;

    // Datei "Butter" öffnen
    butter.open("Butter.dat",ios::in);
    i1 = 0;

    // Datei bis zum Ende durchlaufen und die zwei Array füllen
    if (butter)
    {
        while (!butter.eof())
        {
            getline(butter,product_name_bu[i1]);
            butter >> product_menge_bu[i1];
            getline(butter,restzeile);
            // Variable um 1 erhöhne, um ins nächste Feld des Array zu schreiben
            i1++;
        }
    }
    else
    // Datei schließen
    butter.close();


Dann ruf ich irgendwann nen weiteren Dialog auf, wenn ich da auf nen Button klicke, soller ne Funktion aus dem ersten Dialog aufrufen, das geht ja, allerdings nicht mit dem richtig Wert für i1:

C++:
    pruef = 0;
    for (j = 0; j < i1; j++)
    { // for1
        if (produkt == product_name_bu[j].c_str())
        { // if1
            pruef = 1;
        } // if1
    } // for1
    return pruef;


Ich glaub zwar nicht, dass dir der Code jetzt hilft, aber naja *g*
Also in der ersten Funktion hat der Wert nach durchlaufen der gesamten Funktion ja einen Wert. Aber beim aufrufen der zweiten Funktion (die auch im Hauptdialog steht), die durch den zweiten Dialog aufgerufen wird, hat i1 nen ganz anderen Wert, also den komischen, den alle Variablen am Anfang habe.


Bearbeitung:

Also wenn ich mit dem Debugger starte und auf die Variablen vom ersten Dialog schaue, wenn ich im zweiten Dialog grad aktiv bin, dann hat irgendwie jede Variable nicht mehr den Wert, den sie haben soll....


Dieser Post wurde am 10.07.2004 um 12:56 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.07.2004, 16:54 Uhr
~global
Gast


hallo, ich hoffe die "i1" ist eine member-variable, und damit ausserhalb des butter-lese-blocks gültig ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.07.2004, 16:56 Uhr
t10ottoo



Öhhmmm..also ich hab i1 als private im Hauptdialog deklariert.
Weiß net, ob es das ist, was du willst
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.07.2004, 18:01 Uhr
~global
Gast


wie rufst du denn die function in deinem hauptdialog auf ? über eine neu instanz ? zb:
C++:
CDeinHauptDlg* HauptDlg = new CDeinHauptDlg*; // ???
poste mal deine button funktion
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.07.2004, 18:47 Uhr
t10ottoo



Also im Hauptdialog klick ich aufn Button und dann kommt folgender Code:

C++:
CNeuesProduktDlg neu;
neu.DoModal();


Dort wird dann der zweite Dialog geöffnet.
Dazwischen sind halt noch nen paar Zeilen, aber die sind net so wichtig.

Und hier der Code, wo ich die Funktion des ersten Dialog aufrufe, aber befinden tu ich mich in der Zeit im zweiten Dialog:

C++:
CVorratsprogrammDlg vorrat;
pruef1 = vorrat.pruef_butter(new_name);


Die Funktion heißt "pruef_butter"
Die Funktion selbst sieht so aus:

C++:
int CVorratsprogrammDlg::pruef_butter(CString produkt)
{
    pruef = 0;
    for (j = 0; j < i1; j++)
    { // for1
        if (produkt == product_name_bu[j].c_str())
        { // if1
            pruef = 1;
        } // if1
    } // for1
    return pruef;
}


Aber sobald er dort hinspringt, sehe ich in den Variablen (im Debug-Modus), dass i1 nicht den richtigen Wert hat.

Dieser Post wurde am 08.07.2004 um 18:48 Uhr von t10ottoo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.07.2004, 12:18 Uhr
~global
Gast


hi, ja iss ja klar. du legst ja eine neue instanz an, und die ist ja noch nicht initisalisiert --> desshalb auch die werte. du musst dir einen zeiger auf den dialog holen:


C++:

CVorratsprogrammDlg* vorrat = (CVorratsprogrammDlg*)GetParent();
// oder wenn der subDialog ein child ist : GetParentOwner();

// der zugriff ist dann genauso nur halt mit dem ->

pruef1 = vorrat->pruef_butter(new_name);



das war's schon...

Dieser Post wurde am 10.07.2004 um 12:58 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.07.2004, 13:24 Uhr
t10ottoo



Hey, cool Das geht und ich versteh sogar warum

Der Zeiger zeigt sogesehen nur auf die Werte und die verändern sich ja nicht, also hab ich dann immer noch die richtigen Werte wie vorhin, stimmts?

Aber eine Frage hab ich noch zu der Zeile hier:

C++:
CVorratsprogrammDlg* vorrat = (CVorratsprogrammDlg*)GetParent();
// oder wenn der subDialog ein child ist : GetParentOwner();


Was bewirkt denn das "GetParent()"? bzw. das "GetParentOwner()"?

Wennde mir das noch sagst, dann ist alle perfekt
Thomas
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.07.2004, 14:11 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


damit bekommst du einen CWnd*-zeiger auf dein Parent Window...

da dein CVorratsprogrammDlg von CWnd* abgelitten ist (genauer gesagt von CDialog welches wiederum von CWnd geerbt hast) kannst du das teil nach CVorratsprogrammDlg kasten weil den Parent ein CVorratsprogrammDlg ist...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: