globale Variable ändern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • globale Variable ändern

    Hi!

    Ich würde gerne in einer Funktion den Wert zweier Variablen ändern...

    wäre es nur eine könnte ich es ja mit dem Rückgabewert machen.


    so stelle ich mir es ungefähr vor:

    Quellcode

    1. TForm1 *Form1;
    2. void tausch(String a, String b)
    3. {
    4. String Buffer;
    5. Buffer = a;
    6. a = b;
    7. b = Buffer;
    8. }
    9. //---------------------------------------------------------------------------
    10. __fastcall TForm1::TForm1(TComponent* Owner)
    11. : TForm(Owner)
    12. {
    13. }
    14. //---------------------------------------------------------------------------
    15. void __fastcall TForm1::FormCreate(TObject *Sender)
    16. {
    17. String a = "test";
    18. String b;
    19. tausch(a,b);
    20. Label1->Caption = a;
    21. }
    22. //---------------------------------------------------------------------------
    Alles anzeigen


    War ja irgendwie logisch dass das nicht funktioniert...

    Aber was muss ich machen damit es funktioniert??



    Schonmal vielen vielen Dank für die Antworten!




    MfG Straightflush
  • ich weiß jetzt nicht genau, wo du hinaus willst, weil mich einge zeilen verwirren...
    naja egal, ich versuch einfach mal zu helfen...

    Quellcode

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. void tausche(string &a,string &b)
    5. //mit dem & referenzen machen, also keine kopien der Variable,
    6. //sondern eher sowas wie einen Spiegel.
    7. //Der wert der da dann verändert wird, wird auch bei der anderen variable verändert
    8. {
    9. string buffer;
    10. buffer = a;
    11. a = b;
    12. b = buffer;
    13. }
    14. int main()
    15. {
    16. string a = "Hallo";
    17. string b = "Welt";
    18. cout << a << endl << b << endl << endl;
    19. tausche(a, b);
    20. cout << a << endl << b << endl;
    21. while(1);
    22. return 0;
    23. }
    Alles anzeigen


    ich habs hier noma versucht besser mit dem & zu erklären...

    Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. int var = 9;
    6. int &ref = var; //schön aufs & achten
    7. cout << "var: " << var << endl;
    8. cout << "ref: " << ref << endl;
    9. cout << endl; //beide sind gleich, is ja schonmal schön ^^
    10. var++;
    11. cout << "var: " << var << endl;
    12. cout << "ref: " << ref << endl;
    13. cout << endl; //hossa, ref haben wir doch gar net angesprochen, aber eben sein "ebenbild"
    14. ref++;
    15. cout << "var: " << var << endl;
    16. cout << "ref: " << ref << endl;
    17. cout << endl; //schon wieder, wie kann das nur sein ;-)
    18. cin.ignore();
    19. return 0;
    20. }
    Alles anzeigen



    ich hoffe, ich konnte iwie helfen ^^"
  • öhm...
    gut, ich weiß jetzt grad net was TStringLists sind, aber hast du mal einfach versucht das dann statt string hinzuschrieben? (is irgenteine klasse oder?)

    weil ich net weiß was das is, weiß ich auch net, wo ichs jetzt herkrieg, aber egal...
    ich hab mal versuch das anders zu zeigen...:

    Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. class TStringTest //ich hoffe es is irgenteine klasse...
    4. {
    5. public:
    6. void output()
    7. {
    8. cout << "geht doch!" << endl;
    9. }
    10. };
    11. void test_it(TStringTest &a) //Sagen, das er nen ZReferenz machen soll
    12. {
    13. a.output(); //Funktion output aufrufen
    14. }
    15. int main()
    16. {
    17. TStringTest test;
    18. test_it(test); //die funktion
    19. while(1); //solange machen bis programm beended wird (strg + c)
    20. return 0;
    21. }
    Alles anzeigen


    [edit]
    (mist, war zu langsam x3)
  • so gehts leider nicht:

    Quellcode

    1. void tausch(TStringList &a, TStringList &b)
    2. {
    3. TStringList *Buffer = new TStringList;
    4. Buffer = a;
    5. a = b;
    6. b = Buffer;
    7. }
    8. //---------------------------------------------------------------------------
    9. __fastcall TForm1::TForm1(TComponent* Owner)
    10. : TForm(Owner)
    11. {
    12. }
    13. //---------------------------------------------------------------------------
    14. void __fastcall TForm1::FormCreate(TObject *Sender)
    15. {
    16. TStringList *a = new TStringList;
    17. TStringList *b = new TStringList;
    18. tausch(a,b);
    19. }
    20. //---------------------------------------------------------------------------
    Alles anzeigen




    Fehlermeldungen:

    [C++ Fehler] Programmieren.cpp(14): E2034 Konvertierung von 'TStringList' nach 'TStringList *' nicht möglich
    [C++ Fehler] Programmieren.cpp(15): E2328 Operatoren dürfen keine Argumente mit voreingestellten Werten haben
    [C++ Fehler] Programmieren.cpp(16): E2285 Keine Übereinstimmung für 'TStringList::operator =(TStringList *)' gefunden
    [C++ Warnung] Programmieren.cpp(17): W8004 'Buffer' wurde ein Wert zugewiesen, der nie verwendet wird
    [C++ Warnung] Programmieren.cpp(30): W8030 Temporäre Größe für Parameter 'a' in Aufruf von 'tausch(TStringList &,TStringList &)' verwendet
    [C++ Fehler] Programmieren.cpp(30): E2064 'TStringList &' kann nicht mit 'TStringList *' initialisiert werden
    [C++ Fehler] Programmieren.cpp(30): E2342 Keine Übereinstimmung des Typs beim Parameter 'a' ('TStringList &' erwartet, 'TStringList *' erhalten)
    [C++ Warnung] Programmieren.cpp(30): W8030 Temporäre Größe für Parameter 'b' in Aufruf von 'tausch(TStringList &,TStringList &)' verwendet
    [C++ Fehler] Programmieren.cpp(30): E2064 'TStringList &' kann nicht mit 'TStringList *' initialisiert werden
    [C++ Fehler] Programmieren.cpp(30): E2342 Keine Übereinstimmung des Typs beim Parameter 'b' ('TStringList &' erwartet, 'TStringList *' erhalten)
    [C++ Warnung] Programmieren.cpp(31): W8004 'b' wurde ein Wert zugewiesen, der nie verwendet wird
    [C++ Warnung] Programmieren.cpp(31): W8004 'a' wurde ein Wert zugewiesen, der nie verwendet wird
  • Quellcode

    1. *Buffer = a;
    2. a = b;
    3. b = *Buffer;
    4. //---------------------
    5. tausch(*a,*b);


    es sind zeiger, wenn du einen zeiger ohne * ausgibst, sagt der dir nur die adresse.

    schau dir das mal genau an:

    Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. int wert = 123;
    6. int *zeiger = &wert;
    7. cout << " wert : " << wert << endl;
    8. cout << "&wert : " << &wert << endl << endl;
    9. cout << " zeiger : " << zeiger << endl;
    10. cout << "*zeiger : " << *zeiger << endl;
    11. while(1);
    12. return 0;
    13. }
    Alles anzeigen
  • Du musst Buffer auch wieder freigeben, sonst erzeugst du ein Speicherleck. Außerdem weiß ich gar nicht wofür du die Instanz von TStringList überhaupt brauchst, du willst doch nur zwei Zeiger umbiegen und nicht irgendwelche Objekte umkopieren oder?
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.