Expected identifier with pointers

534 Views Asked by At

So, I'm trying to put an item in my dynamic array, but I keep getting this error "expected identifier".

void Lista_Inicia(TLista *lista) {
    lista->item = (TItem *) malloc(100 * sizeof(TItem));
    lista->tamanho=100;
    lista->utilizado=0;
};

void Lista_Insere(TLista *lista, char palavra[]) {
    if(lista->tamanho==lista->utilizado){
        printf("Erro, não há espaço para inserção\n");
        return;
    }

    TItem* itemAux=malloc(sizeof(TItem));
    itemAux->quantidade=malloc(sizeof(int));
    itemAux->quantidade=1;
    itemAux->palavra=malloc(sizeof(char)*strlen(palavra)+1);
    strcpy(itemAux->palavra,palavra);
    lista->*item+(lista->utilizado)=itemAux; // <---Expected identifier here
    lista->utilizado++;
    printf("%d", lista->utilizado);
}

Instead of this code I already tried these ones too:

lista->item+(lista->utilizado)=itemAux; 
lista->*item[lista->utilizado]=itemAux; 
lista->item[lista->utilizado]=itemAux; 

The structs I'm using:

typedef struct Item {
    char* palavra;
    int quantidade;
} TItem;

typedef struct Lista {
    TItem* item;
    int tamanho;
    int utilizado;
} TLista;
3

There are 3 best solutions below

4
On

lista->*item is invalid syntax. It looks like what you want to do is:

lista->item[lista->utilizado]=itemAux;

But the item field in your lista struct only has a pointer to a TItem (TItem *) but you are treating it like an array of pointers to TItems (TItem **). Try updating your Lista struct and the Lista_Inicia method as follows:

typedef struct Lista 
    TItem **item;
    int tamanho;
    int utilizado;
} TLista;

void Lista_Inicia(TLista *lista) {
    lista->item = (TItem **)malloc(100 * sizeof(TItem *));
    lista->tamanho=100;
    lista->utilizado=0;
};
2
On

You already allocated 100 elements of type TItem in your list. So you need not to allocate memory for each new item. You simply have to use a free element in the allocated array.

The function can look like

void Lista_Insere( TLista *lista, char palavra[] )
{
    if ( lista->tamanho == lista->utilizado + 1 )
    {
        printf("Erro, não há espaço para inserção\n");
        return;
    }

    lista->item[lista->utilizado].quantidade = 1;
    lista->item[lista->utilizado].palavra = malloc( strlen( palavra ) + 1 );
    strcpy( lista->item[lista->utilizado].palavra, palavra );

    lista->utilizado++;

    printf("%d", lista->utilizado);
}

Or you may rewrite the function the following way using a temporary variable

void Lista_Insere( TLista *lista, char palavra[] )
{
    if ( lista->tamanho == lista->utilizado + 1 )
    {
        printf("Erro, não há espaço para inserção\n");
        return;
    }

    TItem itemAux;

    itemAux.quantidade = 1;
    itemAux.palavra = malloc( strlen( palavra ) + 1 );
    strcpy( itemAux.palavra, palavra );

    lista->item[lista->utilizado++] = itemAux;

    printf("%d", lista->utilizado);
}
2
On

change to

TItem itemAux;
itemAux.quantidade=1;
itemAux.palavra=malloc(sizeof(char)*(strlen(palavra)+1));
strcpy(itemAux.palavra, palavra);
lista->item[lista.utilizado]=itemAux;
lista->utilizado++;
printf("%d", lista->utilizado);