Variable Anzahl an Pointern???



  • Für Anfänger würde ich folgendes empfehlen:

    typedef struct
    {
      void* P;
    } tMyPointer;
    
    ...
    
    tMyPointer* MP = malloc(Num * sizeof(tMyPointer));
    ...
    MP[i].P = &MyDouble;
    ...
    free(MP);
    

    Nicht schön, aber für Anfänger ein wenig verständlicher folgendes:

    void** A;
    
    A = (void*) malloc(Num * sizeof(*A)); 
    A[0] = &MyDouble;
    free(A);
    

    Alternativ kann man auch void* P[256] benutzen, in der Hoffnung dass man nicht mehr als 256 Pointer benötigt.



  • Nicht wirklich mit einem Array, denn auch da muss man zumindest in C wissen, wie groß das werden soll.
    Aber was natürlich geht ist, so etwas:

    double *MyValues;
    
    MyValues = (double*)calloc(num_of_val, sizeof(double));
    

    MyValues kannst du dann wie ein double-Array verwenden. Und jedes Mal, wenn ein Wert dazu kommt, erzeugst alllocierst du ausreichend neuen Speicher, kopierst dein altes Array in das neue und löscht das alte.
    Eine andere Alternative wäre eine Liste. Dazu baust du eine Struktur auf bestehend aus einem double und einem Pointer auf die Struktur. In dem double speicherst du deinen Wert, der Pointer zigt auf das folgende Listenelement oder auf 0, wenn es das letzte ist. Neue Elemente kannst du dann dynamisch erzeugen und anhängen. Das ist aber schon eher was für Fortgeschrittene...



  • @macher:
    Ich glaube ich habe deine Frage falsch verstanden. Mein letzten Post kannst du deswegen vergessen, da ich dachte du wolltest eine Array von Pointern anlegen. Ansonsten kann ich mich nur der Meinung von Heimelchen anschließen.

    Diese ... Hitze. 😃 Man sollte unsere Region unter einer riesigen Glasgocke legen und dann eine riesige Klimaanlage darunter installieren. 😃



  • vielen dank für eure ausführlichen Erklärungen, wenn ich "Heimelchen" seinen Vorschlag richtig verstehe hab ich am ende einfach ein einziges array mit Werten drin. Das Problem ist nun, ich befürchte ich brauche tatsächlich die einzelnen variablennamen und nicht nur deren Werte... Ich tu mir gerade schwer mich richtig auszudrücken 🙂
    Bzw ich muss für jede einzelne Variable einen einzelnen Speicher reservieren und nicht alle in einen rein machen.
    Vielleicht gibt es eine Möglichkeit das ich einfach eine Laufvariable in den Bezeichner kriege? sowas in der Art...

    for(i=1;i<genug;i++)
    double *x'i';
    

    wobei ich hier wieder das Problem hätte, das ich das 'i' ja eigentlich erst irgendwo in meinem Programm herausfinden würde aber sowas wie

    double*x1
    

    müsste ja vor main stehen oder würde das trotzdem gehen?

    ja es ist wirklich viel zu warm um ordentlich zu denken 🙂



  • Was hast du denn vor?

    Normal erzeugt man einfach ein zweidimensionales Array, wenn eine unbekannte Anzahl von Pointern mit jeweils eigenen allokierten Speicher benötigt wird.
    Global ginge zwar, aber du kannst dein Programm auch so designen, sodass die Übergabe deines Pointerarrays möglichs nicht oft erfolgt. Wenn das nicht geht,
    auch nicht schlimm, dann übergibst du die halt immer da, wo du die Pointer benötigst.

    Ohne eine Info, was du eigentlich vorhast, ist es, wie du vllt. merkst, nicht leicht einen guten Tipp zu geben 😉

    mFg



  • Eine Variable sammt Name kann man nicht dynamisch anlegen. Das nennt man Programmieren und das passiert nicht zur Laufzeit!
    Übrigens hast du auch einzelne Veriablen, wenn du so ein dynamisch angelegtes Array hast:
    MyValue[0], MyValue[1], MyValue[2], etc.
    Die kann man übergeben, referenzieren, lesen, verändern, ...


  • Mod

    Heimelchen schrieb:

    Eine Variable sammt Name kann man nicht dynamisch anlegen. Das nennt man Programmieren und das passiert nicht zur Laufzeit!

    Man könnte eine Map-Datenstruktur implementieren. Das kommt dem Konzept einer dynamischen Variable sehr nahe.



  • macher schrieb:

    for(i=1;i<genug;i++)
    double *x'i';
    

    wobei ich hier wieder das Problem hätte, das ich das 'i' ja eigentlich erst irgendwo in meinem Programm herausfinden würde aber sowas wie

    double*x1
    

    müsste ja vor main stehen oder würde das trotzdem gehen?

    ja es ist wirklich viel zu warm um ordentlich zu denken 🙂

    double *x=calloc(genug,sizeof(double));
    /* ansprechen tust du die einzelnen Arraywerte dann mit */
    x[0]=1;
    x[1]=2;
    x[genug-1]=4711;
    free(x);
    


  • Bitte ein Bit schrieb:

    Für Anfänger würde ich folgendes empfehlen:

    typedef struct
    {
      void* P;
    } tMyPointer;
    
    ...
    
    tMyPointer* MP = malloc(Num * sizeof(tMyPointer));
    ...
    MP[i].P = &MyDouble;
    ...
    free(MP);
    

    Für meinen Geschmack ist das reichlich umständlich. Wozu ein typedef auf ein struct mit einem Element?

    Und ob dem Poster damit geholfen ist, dass ein Pointer des Arrays dann wieder auf eine zur Compile-Zeit angelegte Variable zeigt. Ich meine, der Poster ist so ein blutiger Anfänger, der macht evtl. solchen Unsinn:

    void fill_my_pointer_array()
    {
      double val;
      val=1.5;
      MP[0].P = &val;
      val=2.223423;
      MP[1].P = &val;
      ...
    }
    

    ...und wundert sich dann nachher, dass überall nur Müll drin steht oder es eine Zugriffsverletzung gibt.



  • PS: mit "zur Compile-Zeit angelegte Variable" meine ich einfach eine Variable (also global oder lokal oder static oder whatever).

    Wenn man schon die Pointer dynamisch erzeugt, sollte man zwangsläufig auch die Daten, auf die diese Pointer zeigen sollen, dynamisch erzeugen.



  • @Paulomat:
    Klar ist der Code ein wenig umständlich. Das struct benutze ich nur als Eselsbrücke um mit den Arrayzugriffen nicht durcheinanderkommen.

    Und ob dem Poster damit geholfen ist, dass ein Pointer des Arrays dann wieder auf eine zur Compile-Zeit angelegte Variable zeigt. Ich meine, der Poster ist so ein blutiger Anfänger, der macht evtl. solchen Unsinn:

    In C kann ich wg. mangelnder Typsicherheit, Datenkapselung, ... nur schwer verhindern dass andere Entwickler mit meinem Code Unsinn machen. 😉

    Wenn man schon die Pointer dynamisch erzeugt, sollte man zwangsläufig auch die Daten, auf die diese Pointer zeigen sollen, dynamisch erzeugen.

    Nicht unbedingt. Wenn die Daten bereits in einem Array/... vorliegen und ich mittels meinem Pointerarray nur auf gewisse Elemente des Datenarray zugreifen möchte, genügt meine Konstruktion. Aber ansonsten gebe ich dir vollkommen Recht.


Anmelden zum Antworten