Probleme mit Pointern



  • Hallo zuammen,

    ich hoffe ihr könnt mir bei folgendem Problem helfen. Wie kann ich ein existierendes Array in einer Funktion benutzen, der es nicht als Parameter übergeben wird.

    ich habe zum Beispiel drei Dateien.

    Datei1 ist die main. Hier wird ein Array erstellt.
    Dann rufe ich Func1 in Datei 2 auf und übergebe das Array als Parameter.
    In Datei 2 befindet sich auch noch Func2 die nicht aufgerufen wird, aber auch das Array benötigt um es beim Aufruf von Func3 in Datei 3 zu übergeben.
    Und spätestens in Func3 in Datei3 sind meine Arraywerte mit Null überschrieben. Ich hoffe ich konnte mein Problem deutlich machen.

    Ich habe es bereits mit new und static versucht, aber die Werte des Arrays werden dennoch überschrieben, eigentlich dachte ich, dass ein mit new erzeugtes Array niemals überschrieben wird, auch wenn es out of scope ist. Außer ich delete es.

    Für Hilfe wäre ich sehr dankbar.



  • Das ganze klingt komisch. Eine Funktion, die nicht aufgerufen wird? Einzelne Funktionen über 3 Daten verstreut? Ein Array das überschrieben wird? new?
    Vielleicht zeigst du kurzen, kompilierbaren Code und sagst, was deine Aufgabenstellung ist bzw. was dein Programm erreichen soll.



  • Hallo out,

    vielen Dank für deine Hilfe. Den orginalcode kann ich leider nicht senden, da er mir nicht gehört, außerdem ist er sehr umfangreich. Die Funktionen sind über 3 Dateien verstreut, weil es eine VCL-Formularanwendung ist.
    Datei 1 ist ein Formular in dass man Daten eingibt, die dann in dem Array gespeichert werden. Drückt man einen Button, wird ein zweites Formular geöffnet. Das ist File 2. Bei der Formularöffnung wird das Array an Func1 im zweiten Formlar übergeben. Das klappt.
    In Formular 2 ist aber auch noch ein Button der Func2 aufruft, dass dann das array an Func 3 in Datei 3 übergibt, wo dann damit gearbeitet wird. Darum kann ich das Array nicht ordentlich beim Methodenaufruf übergeben, weil Func2 durch den Button aufgerufen wird.

    In Code sieht das stark vereinfacht jetzt ungefähr so aus. Das soll nur mein Problem verdeutlichen und ist kein lauffähiger Code

    Main in File 1:

     ... int _tmain(int argc, _TCHAR* argv[])
    {
    	AnsiString a = "a";
    	AnsiString b = "b";
    	AnsiString  c = "c";
    	AnsiString d = "d";
    	AnsiString* arr = new AnsiString[4];
    	arr[0] = a;
    	arr[1] = b;
    	arr[2] = c;
    	arr[3] = d;
    	func1(arr);
    	return 0;
    }
    

    File 2 Wo mein Problem sitzt.

     void func1(AnsiString* a)
    {
    AnsiString* A = a;
    }
    
    void func2() // wie komtmt diese Methode an das Array ohne dass es  überschrieben wird/out of scope ist?
    {
    	func3(A); 
    } 
    `
    File 3
    

    ... void func3(AnsiString* a){

    for (int i = 0; i < 3; i++) {
    std::cout << a[i].c_str();
    //Hier stehen hinter dem Pointer nur noch Nullen
    }...



  • @derlernende sagte in Probleme mit Pointern:

    void func1(AnsiString* a)
    {
    AnsiString* A = a;
    }

    Soll A eine globale Variable sein? Dann muß es natürlich so zugewiesen werden:

    void func1(AnsiString* a)
    {
      A = a;
    }
    

    (sonst hast du ja eine lokale Variable namens A).



  • @th69 sagte in Probleme mit Pointern:

    (sonst hast du ja eine lokale Variable namens A).

    Vielen Dank.
    Ich hatte A auch schon mal im Header deklariert und in func1 dann so genutzt, wie du vorgeschlagen hast. Ich dachte, dann sei sie in der cpp global, nicht? Geklappt hat es nämlich auch da nicht.



  • Weißt du wirklich nicht, wie man globale Variablen deklariert und definiert (auch wenn man diese eigentlich nicht oder nur sehr selten benutzen sollte)?
    Im Header:

    extern AnsiString* A;
    

    In genau einer Source-Datei:

    AnsiString* A;
    

    Du hast wahrscheinlich fälschlicherweise

    static AnsiString* A;
    

    benutzt (nur damit es keine Linker-Fehler gibt)?!



  • @derlernende sagte in Probleme mit Pointern:

    Methode

    Sind es nun freie Funktionen oder Member einer Klasse?