array / struct



  • hi!
    könnte mir mal jemand über folgenden code drüberschaun!?

    struct TST  {
    
        int testINT1;
        char *testSTRING;
        int testINT2;
    
    };
    
    void test_array(void)
    {
    
        int i;
        struct TST *test;
    
        for(i=0;i<=10;i++)   {
    
            test = calloc(i+1, sizeof(struct TST));
    
            test[i].testINT1 =  i +1;
    
            test[i].testSTRING = calloc(strlen("hallo")+1, sizeof(char));
            strcpy(test[i].testSTRING, "hallo");
    
            test[i].testINT2 = 10 -i;
    
        }
    
        MessageBoxA(0, test[10].testSTRING, "test", 0);
    
    }
    

    das problem ist, dass ich immer nur das letzte struct auslesen kann! (in diesem fall : das 10te) alle anderen sind irgendwo verschollen!

    danke, TGT



  • sieh dir mal auf
    [url] www.pronix.de
    [/url]

    die verkette Listen an.



  • der calloc-Aufruf in der for-Schleife erscheint mir völlig unmotiviert und undurchdacht. Alloziere den Speicher für test doch vor der Schleife:

    test = malloc(11 * sizeof(struct TST));
    


  • "unmotiviert und undurchdacht" (?):
    das kommt daher, da die schleife eigentlich darauf ausgelegt war/ist, eine unbestimmte zahl an einträgen anzuhängen!

    mfG, TGT



  • Wo wird da denn angehängt? Du schmeißt den alten Speicherblock weg (ohne free -- also Speicherloch), allozierst einen neuen, der ein Stück größer ist, und bearbeitest nur das Ende davon.

    Ich versteh nicht ganz, wie er's gemacht hat, aber <marci> kann anscheinend Gedanken lesen. Ich würde dir jetzt auch mal die Beschäftigung mit verketteten Listen nahelegen.



  • void test_array(void)
    {

    int i;
    struct TST *test;

    for(i=0;i<=10;i++) {

    if(i==0)
    test = malloc(sizeof(struct TST));
    else
    test = realloc(test,(i+1)*sizeof(struct TST));

    // test =calloc(i+1, sizeof(struct TST));

    test[i].testINT1 = i+1;

    test[i].testSTRING = (char*)calloc(strlen("hallo")+1, sizeof(char));
    strcpy(test[i].testSTRING, "hallo");

    test[i].testINT2 = 10 -i;

    }

    // MessageBoxA(0, test[10].testSTRING, "test", 0);

    }

    in der Zeile "test = calloc(i+1, sizeof(struct TST));" forderst du immer wieder einen neuen speicherbereich für deinen Zeiger an (mit calloc kann man keinen speicherbereich erweitern!!).
    deshalb kommt immer nur ein sinnvoller wert für dein letztes struct raus!
    hab dir mal eine mögliche loesungsvariante mit reingeschrieben!



  • *Brizzel* *Gedankenless* *Brizzel*

    Ja ist auch besser. Also ich hab mir ne ganze Latte an Listenfunktionen geschrieben, und in ne Lib, gpackt, so kann ich die immer verwenden und muss die net jedesmal neu schreiben. -->Verdunkelung<-- in der Fachsprache, da ich ja mir nur noch den Funktionsaufruf merken muss, den Rest macht die Lib.
    Und mit V. L. kannst x viele einträge machen. Bis dir halt's RAM ausgeht.*g*



  • okay, jetzt weiß ich wenigstens auch, was falsch war! wie ich beschrieben hab, wollte ich immerwieder neue einträge _anhängen_ ! folglich : REALLOC!
    hab ich wohl übersehn, schlampig gearbeitet oder sonst irgendwie vergeigt.

    hier nochmal der code!

    struct TST  {
    
        int testINT1;
        char *testSTRING;
        int testINT2;
    
    };
    
    void test_array(void)
    {
    
        int i;
        struct TST *test;
    
        test = calloc(1, 1);
    
        for(i=0;i<=10;i++)   {
    
            realloc(test, (i+1) * sizeof(struct TST));
    
            test[i].testINT1 =  i +1;
    
            test[i].testSTRING = calloc(strlen("hallo")+1, sizeof(char));
            strcpy(test[i].testSTRING, "hallo");
    
            test[i].testINT2 = 10 -i;
    
        }
    
        for(i=0;i<=10;i++)   {
    
            MessageBoxA(0, test[i].testSTRING, "test", 0);
    
        }
    
        free(test);
    
    }
    

    nun erhalte ich auch alle 11 einträge!

    mfG TGT

    // edit 15:26
    da hab ich wohl den "refresh"- button verfehlt!
    aufjedenfall : danke trotzdem (@ <friend> )

    [ Dieser Beitrag wurde am 20.05.2003 um 15:27 Uhr von TGT editiert. ]


Anmelden zum Antworten