Double Arrays und Zeiger



  • Hallo liebe C-Gemeine

    Ich habe ein ziemlich umfangreiches Programm bekommen, das ich etwas umschreiben möchte und habe ein Problem mit den Double Arrays darin.
    Das Original benutz feste Arraygrößern.

    #include <stdio.h>
    .
    .
    .
    #define N 8
    
    int main (void)
    {
        double xi[N]={0.};
        .
        .
        .
        return 0;
    }
    

    Jetzt möchte ich die Arrays aber dynamisch nach einer Benutzereingabe gestalten.
    Die Funktionen von malloc o.ä. kenne ich aber dazu brauche ich ja den Pointer.
    Ich habe verschiedene Dinge ausprobiert, wie:

    double xi[1]={0.};
        *xi = (double *) calloc(N, sizeof(double));
    

    oder

    double xi[1]={0.};
        &xi = (double *) calloc(N, sizeof(double));
    

    und auch

    double xi[1]={0.};
        double *ptr_xi;
        ptr_xi = (double *) calloc(N, sizeof(double));
        ptr_xi = xi;
    

    hat aber alles nicht Funktioniert.
    Das letzte wird zwar anstandslos compiliert aber funktioniert weiter unten im Programm nicht mehr. (Führt zu Speicherfehlern)

    Gibt es irgendeinen Weg das Array xi so zu modifizieren, das ich das Programm ohne jeden einzelnen xi Aufruf zu ändern auf dynamische Arrays umbauen kann?
    Wie gesagt ich habe den Code im Ursprung nicht selber geschrieben und möchte ihn auf keinen Fall tief greifend ändern, da er Mathematischer Natur ist und das nicht so richtig mein Steckenpferd ist und ich ihn auch nicht bis in letzte Detail verstehe.

    Schon mal herzlichen Danke im Voraus
    Magier



  • hm arrays und pointer verhalten sich ziemlich gleich.

    änder doch einfach die definition von

    double xi[N]={0.};
    

    in

    double* ix = malloc(sizeof(double)*N);
    

    dannach läufts, sofern ich mich nicht irre, auch ohne anpassungen ohne probleme
    dann liegt die variable halt auf dem heap und nicht auf dem stack.
    brauchst auch keine zwischenvariablen



  • Erst mal Danke für die schnelle Hilfe... aber nein das führt auch zu einem compiliere Fehler.

    Fehler	1	error C2440: 'Initialisierung': 'void *' kann nicht in 'double *' konvertiert werden	c:\dokumente und einstellungen\magier\desktop\miipiii\miipiii\miipiii\main.cpp	352
    


  • hm ja dann bist du im falschen subforum 😛
    in c brauchst du void* nicht casten - in c++ schon
    änder die zeile einfach in:

    double* ix = (double*)malloc(sizeof(double)*N);
    


  • ähm ja hast recht... es ist ein Mischmasch aus C und C++.. dachte aber malloc sei ANSI C... sorry

    aber das ganze haut immer noch nicht so ganz hin... benutze Visual Stuido 2008... vielleicht hilft das... aber ich habe immer noch Fehler...
    Jetzt ist xi nicht mehr bekannt.

    Fehler	1	error C2065: 'xi': nichtdeklarierter Bezeichner	c:\dokumente und einstellungen\magier\desktop\miipiii\miipiii\miipiii\main.cpp	367
    


  • whoops mein fehler 😛
    aber soll dich jetzt nicht vom etwas selbst nachdenken abhalten =P....
    habe die variable ix genannt anstatt wie du xi.. sollte einfach zu beheben sein 😉

    magier-phil schrieb:

    ähm ja hast recht... es ist ein Mischmasch aus C und C++.. dachte aber malloc sei ANSI C... sorry

    aber das ganze haut immer noch nicht so ganz hin... benutze Visual Stuido 2008... vielleicht hilft das... aber ich habe immer noch Fehler...
    Jetzt ist xi nicht mehr bekannt.

    Fehler	1	error C2065: 'xi': nichtdeklarierter Bezeichner	c:\dokumente und einstellungen\magier\desktop\miipiii\miipiii\miipiii\main.cpp	367
    


  • OHHHHHHH MAN....
    ARG... ja wer auch hinschaut beim copy & past ist klar im Vorteil... heißt natürlich xi.... ARG.
    DANKE du hast mir wirklich geholfen!

    P.S. wieso taucht diese Variante eigentlich nirgendwo in einem C/C++ Tutoriel oder Buch auf? Ist doch ungemein Praktisch!



  • magier-phil schrieb:

    [...]

    P.S. wieso taucht diese Variante eigentlich nirgendwo in einem C/C++ Tutoriel oder Buch auf? Ist doch ungemein Praktisch!

    tut sie sicherlich bei den meisten tutorials/büchern. schlag einfach mal in der literatur deines vertrauens im kapitel über speicherverwaltung/dynamische arrays/zeiger/pointer nach.

    beispielsweise auch hier: http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=aryptr (6.3 insbesondere)

    magier-phil schrieb:

    ähm ja hast recht... es ist ein Mischmasch aus C und C++.. dachte aber malloc sei ANSI C... sorry
    [...]

    malloc ist genau wie calloc ansi c, spielt von daher, bis auf die automatische initialisierung aller bytes mit 0 bei calloc, keine große rolle. wobei die byteweise initialisierung mit 0 bei double möglicherweise nichtmal unbedingt einem double 0.0 entsprechen muss afaik - kann mich aber auch irren..
    c++ wäre wohl mit new sowas wie:

    double* xi = new double[N];
    

    theoretisch solltest du noch drauf achten, dass du mit malloc/calloc bzw. new angeforderten speicher wieder mit free bzw. delete frei gibst. würde vermutlich aber nur nochmehr probleme bereiten von daher ist das auch nicht soo wichtig 😛


Log in to reply