Compile error when registering information in a struct and a substruct

-2

I have a problem with my C code. My goal is to register categories in my first struct, which happens without problems. Then I want to register some subcategories for each category, which causes the following problem in the code:

main.c|45|error: ‘(cate + (sizetype)((long unsigned int)i * 24))->sub’ is a pointer; did you mean to use ‘->’?|

I think I'm wrong about something in the pointer.

Here is the code:

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

struct categoria_st{
    char * nome_categ;
    int num_subcateg;
    struct subcategorias_st * sub;
    };

struct subcategorias_st{
    char *nome_subcateg;
};

void le_string(char * buffer, int tam);

    int main(){
    struct categoria_st * cate;
    struct subcategorias_st * subcat;
    char aux[5000];
    int qtd_cat,i,k,tam,index=0 ,index2 = 0;

    printf("Quantidade de categorias que deseja cadastrar:\n");
    scanf("%d", &qtd_cat);
    cate = malloc(qtd_cat * sizeof(struct categoria_st));

    for(i=0; i < qtd_cat; i++){
        printf("Digite o nome da categoria:\n");
        le_string(aux, 5000);
        tam = strlen(aux)+1;
        cate[i].nome_categ = malloc(tam * sizeof(char));
        strcpy(cate[i].nome_categ, aux);

        printf("Digite o numero de subcateg:\n");
        scanf("%d", cate[i].num_subcateg);
        cate[i].sub = malloc(cate[i].num_subcateg * sizeof(cate->sub));

I believe this part is not correct.

            for(k=0;k<cate[i].num_subcateg; k++){
            printf("Digite o nome da subcategoria:\n");
            le_string(aux, 5000);
            tam = strlen(aux)+1;
            cate[i].sub.nome_subcateg = malloc(tam * sizeof(char));
            strcpy(cate[i].sub[k].nome_subcateg, aux);
        }
        };

        while(index != 99){
        printf("Qual nome de categoria deseja vizualisar:\nEscolha entre 1 e %d:\n\n",qtd_cat);
        scanf("%d", &index);

        printf("Qual nome de subcategoria deseja vizualisar:\nEscolha entre 1 e %d:\n\n",cate[qtd_cat-1].num_subcateg);
        scanf("%d", &index2);

       printf("Nome da categoria eh: %s\nNome da subcategoria eh:%s\n", cate[index-1].nome_categ,cate[index-1].sub[index2-1].nome_subcateg);


           }

       return 0;
    };

    void le_string(char * buffer, int tam){
        do {
            fgets(buffer, tam, stdin);
        } while( strcmp("\n", buffer) == 0);
    }
    
asked by anonymous 30.12.2018 / 01:32

1 answer

1

No stretch

cate[i].sub.nome_subcateg = malloc(tam * sizeof(char));

The .sub element is treated as a variable, but the compiler recognizes a pointer.

struct categoria_st{
    char * nome_categ;
    int num_subcateg;
    struct subcategorias_st * sub; /* sub é um ponteiro */
};

Just add [k] after sub , like this:

cate[i].sub[k].nome_subcateg = malloc(tam * sizeof(char));
    
11.01.2019 / 22:02