Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Structureel struct probleem  (gelezen 772 keer)

Offline kuifje09

  • Lid
Structureel struct probleem
« Gepost op: 2021/07/08, 18:26:26 »
Ik bijt hier al een paar dagen mijn tanden op kapot en zie het nog steeds niet ?

De code spuugt steeds de laatste entry uit ( tweede deel programma ) in plaats van zoals  bij de eerste check...

Dit is maar een eenvoudig gedeelte van een groter geheel, maar hierin schuilt mijn blinde vlek...

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

typedef struct {
        char * first;
        char* second;
} myStruct;

int main(){

        myStruct** myStructs = (myStruct**)malloc(20*sizeof(myStruct*));

        myStruct thisStruct;

        char* myString;

        int i;
        for( i = 0 ; i < 20 ; i++ ){
           myString = (char*)calloc(25,1);
           sprintf(myString,"string-1 %d",i);
           thisStruct.first = myString;

           myString = (char*)calloc(25,1);
           sprintf(myString,"string-2 %d",i);
           thisStruct.second = myString;

           myStructs[i] = &thisStruct;
           printf("first -- %s\nsecond - %s\n",
                           myStructs[i]->first,myStructs[i]->second);
        }

        printf("=================================\n");

        printf("why does this print always only the last entry... \n");

        for( i = 0 ; i < 20 ; i++ ){
                printf("first -- %s\nsecond - %s\n",
                                myStructs[i]->first,myStructs[i]->second);
        }
}


Offline bart85

  • Lid
  • Steunpunt: Nee
Re: Structureel struct probleem
« Reactie #1 Gepost op: 2021/07/08, 21:51:12 »
Mystructs is een pointer naar pointer, geen array.

Is dit waar de foutmelding over gaat als je compiler cc gebruikt?
Als Linux niet goed genoeg vind, verander de source code.

Offline kuifje09

  • Lid
Opgelost: Structureel struct probleem
« Reactie #2 Gepost op: 2021/07/08, 22:58:22 »
Probleem was de ruimte voor de thisStruct.
opgelost door er een pointer voor te maken en maloc voor de ruimte..

Ziet en test....

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

typedef struct {
        char * first;
        char* second;
} myStruct;

int main(){

        myStruct** myStructs = (myStruct**)malloc(20*sizeof(myStruct*));

        myStruct* thisStruct;

        char* myString;

        int i;
        for( i = 0 ; i < 20 ; i++ ){

           thisStruct = (myStruct*)malloc(sizeof(myStruct));

           myString = (char*)calloc(25,1);
           sprintf(myString,"string-1 %d",i);

           thisStruct->first = myString;

           myString = (char*)calloc(25,1);
           sprintf(myString,"string-2 %d",i);

           thisStruct->second = myString;

           myStructs[i] = (myStruct*)thisStruct;

           printf("first -- %s\nsecond - %s\n",
                           myStructs[i]->first,myStructs[i]->second);

        }

        printf("=================================\n");

        for( i = 0 ; i < 20 ; i++ ){
                printf("first -- %s\nsecond - %s\n",
                                myStructs[i]->first, myStructs[i]->second);
        }
}


En ja, nu nog de garbage collection voor het stoppen... malloc etc, wordt niet automatisch gefreed voorzover ik weet...
« Laatst bewerkt op: 2021/07/08, 23:01:12 door kuifje09 »

Offline kuifje09

  • Lid
Re: Structureel struct probleem
« Reactie #3 Gepost op: 2021/07/09, 17:51:06 »
Final versie voor de liefhebbers.
Het doet niet veel maar laat de proof of concept zien.
( het kan nog anders , ik weet het... maar dit is overzichtelijk voor mij.)

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

typedef struct {
        char * first;
        char* second;
} myStruct;

int MAX = 1;

int main(int argc , char **argv){

        if (argc == 2) {
                printf("argc = %d, argv[1] = %s\n",argc,argv[1]);
                MAX = atoi(argv[1]); // non-integer = 0 ;)
        }else{
                printf("usage %s <number>\n",argv[0]);
                return (1);
        }

      // next malloc space needs to be freed on exit
        myStruct** myStructs = (myStruct**)malloc(1*sizeof(myStruct*));
        myStruct* thisStruct;
        char *myString, tmpString[1024];
        int i;


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

        // expand space for the pointer to array of pointers
           myStructs = (myStruct**)realloc(myStructs, (i+1)*sizeof(myStruct*));

        // next malloc space needs to be freed on exit
           thisStruct = (myStruct*)malloc(sizeof(myStruct));

        // next malloc space needs to be freed on exit
           sprintf(tmpString,"string-1 %d",i);
           myString = (char*)calloc(strlen(tmpString)+1,1);
           strcpy(myString, tmpString);
           thisStruct->first = myString;

        // next malloc space needs to be freed on exit
           sprintf(tmpString,"string-2 %d",i);
           myString = (char*)calloc(strlen(tmpString)+1,1);
           strcpy(myString, tmpString);
           thisStruct->second = myString;

           myStructs[i] = (myStruct*)thisStruct;

           printf("first0 -- %s\nsecond0 - %s\n",
                           myStructs[0]->first,myStructs[0]->second);
           printf("first -- %s\nsecond - %s\n",
                           myStructs[i]->first,myStructs[i]->second);
        }

        printf("=================================\n");
        for( i = 0 ; i < MAX ; i++ ){
        printf("first -- %s\nsecond - %s\n",
                        myStructs[i]->first, myStructs[i]->second);
        }


        // free all [c|m]alloc space
        for ( i = 0 ; i < MAX ; i++ ){
            free( myStructs[i]->first); // members
            free( myStructs[i]->second);
            free( myStructs[i] );       // ponter to struct
        }
        free( myStructs);               // pointer to struct-pointers

        // even now, free space seems draining.... sometimes.
}

sla op als b.v.i : struct2.c
compile - run slag , b.v. : cc -g -o struct2 struct2.c && ./struct2 10000; echo $?