item" /> item" /> item"/>

Expected identifier with pointers

567 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
DanielGibbs 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
Vlad from Moscow 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
BLUEPIXY 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);