Do not wrinkle data in the queue

Asked

Viewed 148 times

3

In my program, I need to use a queue storage function inside another function, but I can’t run it, it doesn’t store it. I switched from Devc++ to Codeblocks and this appears:

"expected 'struct Fila' but argument is of type 'struct FILA *"

Follow the structure that contains the row:

typedef struct Fila {
    int vetor[3][10];
    int tamanho[3];
} FILA;

The prototypes of my functions:

void fLimpar(int a, struct Fila *Carro);
void fArmazenar(int a, struct Fila *Carro, int e);
int fRemover(int a, struct Fila *Carro);
int Menu(struct carros *carro, struct Fila *Carro);

And the implementation of two of these functions:

void fArmazenar(int a, struct Fila *Carro, int e) {

    // Armazena o elemento na próxima posição vaga.
    (*Carro).vetor[a][((*Carro).tamanho[a])] = e;
    printf("teste : ta com %d", (*Carro).vetor[a][(*Carro).tamanho[a]]);
    (*Carro).tamanho[a]++;
}

int fRemover(int a, struct Fila *Carro) {

    int e, i;

    // elemento a ser retornado é o primeiro da fila.
    e = (*Carro).vetor[a][0];

    // Move todos os elementos 1 posição para frente,
    // exceto o 1º (pois este será descartado).
    for (i = 1; i < (*Carro).tamanho[a]; i++) {
        (*Carro).vetor[a][i - 1] = (*Carro).vetor[a][i];
    }

    // diminui o tamanho em 1 porque o elemento do início da fila foi removido.
    (*Carro).tamanho[a]--;

    return e;
}

An example of how I’m using the structure within my menu function:

 if((*carro).estado[0] == 'V'){

    fArmazenar(1, &Carro, 1);
 }

1 answer

0

I couldn’t run your code, but I think the compilation problem is because you created a struct and made it a "type", for variables, using the definition typedef, however, when declaring a variable with the created type, you wanted to declare it as a simple structure.

When we declare a struct we can observe the following declaration rule:

struct <identificador>
{
 <listagem dos tipos e membros>;
} <variavel>

where:

<identificador> is the name given to struct, to be able to identify the structure we are creating;

<variavel> is the variable itself declared;

Example:

/*declaracao da estrutura*/
 struct ANIMAL
{
    int patas;
    char raca[10]; 
} gato // voce criou um variavel gato com a estrutura de um ANIMAL;

Or we can do it that way:

/*declaracao da estrutura*/
struct ANIMAL
{
    int patas;
    char raca[10]; 
} 

/*declaracao da variavel*/
struct ANIMAL gato; // voce criou um variavel gato com a estrutura de um ANIMAL; 

When you make a structure a type, using the typedef, you make this structure a known type for your program, as if it were a primitive type (int, char, float), that is, in your program, the structure you defined as a type, using typedef, is now a type for variables. The structure, for use of the typedef, works that way:

typedef < tipo > <nome_para_o_tipo>

where:

< tipo > is the type that will be "renamed", can be an existing type (int, char, float, etc), or a complex type (structs, enuns, ect);

<nome_para_o_tipo> is the name you’ll give to the guy;

See an example below:

/* Aqui, estamos dizendo que o tipo int também será conhecido, pelo o programa, como int32*/
typedef int int32;  // definição do tipo int32
int32 cont; // declaração da variável "cont" do tipo int32 (que na verdade é um int)

For a structure will look like this:

/*Tranformando uma estrutura em um tipo*/
typedef < tipo >
{
 <listagem dos tipos e membros>;
} <nome_para_o_tipo>

Example:

/*Aqui estamos tornando uma estrutura em um tipo complexo*/
typedef struct ANIMAIS 
{
    int patas;
    char raca[10]; 
} ANIMAL // estamos dizendo que a struct ANIMAIS será conhecida, no programa, como o tipo complexo ANIMAL;

ANIMAL gato; // criamos uma variável gato do tipo complexo ANIMAL. como a estrutura virou um tipo, não é necessário colocar o struct antes do ANIMAL.

Well, therefore, I think the corrections to be made in your program are as follows::

typedef struct Fila {
    int vetor[3][10];
    int tamanho[3];
} FILA;

void fLimpar(int a, FILA *Carro);
void fArmazenar(int a, FILA *Carro, int e);
int fRemover(int a, FILA *Carro);
int Menu(struct carros *carro,FILA *Carro);

void fArmazenar(int a, FILA *Carro, int e) {

    // Armazena o elemento na próxima posição vaga.
    (*Carro).vetor[a][((*Carro).tamanho[a])] = e;
    printf("teste : ta com %d", (*Carro).vetor[a][(*Carro).tamanho[a]]);
    (*Carro).tamanho[a]++;
}

int fRemover(int a, FILA *Carro) {

    int e, i;

    // elemento a ser retornado é o primeiro da fila.
    e = (*Carro).vetor[a][0];

    // Move todos os elementos 1 posição para frente,
    // exceto o 1º (pois este será descartado).
    for (i = 1; i < (*Carro).tamanho[a]; i++) {
        (*Carro).vetor[a][i - 1] = (*Carro).vetor[a][i];
    }

    // diminui o tamanho em 1 porque o elemento do início da fila foi removido.
    (*Carro).tamanho[a]--;

    return e;
}

Here are some links for you to find more details regarding structs and typedef: structs and typedef

Or you can declare the structure without the typedef and the variable FILA, this way, you won’t need to change the rest of your program:

struct Fila {
   int vetor[3][10];
   int tamanho[3];
};

Another thing you can check is if the variable Carro , that you are passing by parameter to the functions fArmazenar(int a, FILA *Carro, int e) and fRemover(int a, FILA *Carro), is a value or an address. This error, which the compiler is reporting, is typical of this type of error. You may want to pass a parameter by value, but the functions are waiting to receive a parameter by reference (a memory address). Anyway, check this, or send the rest of the code, where you call these functions so we can see how you are declaring the Car variable and how you are passing parameters to the functions.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.