error: request for member ‘arreglo’ in something not a structure or union

publicado por: Anonymous

El programa intenta implementar un arreglo con tope pero envia error con un mensaje que dice:

error: request for member ‘arreglo’ in something not a structure or union

¿Cómo se puede resolver este error?

#include <stdio.h>
#include <stdbool.h>
#include <conio.h>
#define N 30
typedef struct {  int arre[N];
int tope; 
} ArregloConTope;
/* función que me dice si el arreglo ya se llenó */
bool EstaLleno (ArregloConTope act)
{
    bool lleno = false; 
    if (act.tope == N)
        lleno = true;
    return lleno; 
}
/* procedimiento que inserta un valor en el arreglo con tope */
/* precondición: el arreglo no debe estar lleno */
void Insertar (ArregloConTope *act, int valor) 
{
    /* inserto el valor contra el tope y luego lo incremento, como forma de indicar que ahora tengo un valor más */
    int posicion = act->tope;
    act.arreglo[posicion] = valor;
    act->tope++;
}
int main(){
    ArregloConTope *act; int valor;
    int op;
    printf("ttBienvenido al programa de arreglo con topen");
    printf("1.Insertar elementon");
    printf("2.Verificar si el vector esta llenon");
    printf("Ingrese una opcion ");
    scanf("%d",&op);
    switch(op){
    case 1:
        Insertar(act, valor);
        break;
    case 2:
        printf("%d", EstaLleno(*act));
    default:
        printf("Opcion no valida");   
    }
    getch();
    return 0;
}

solución

La estructura define un miembro llamado arre:

typedef struct {
  int arre[N];  // <<--- AQUI!!!
  int tope; 
} ArregloConTope;

Y sin embargo luego intentas acceder al miembro arreglo:

void Insertar (ArregloConTope *act, int valor) 
{
    int posicion = act->tope;
    act.arreglo[posicion] = valor; // <<--- AQUI!!!
    act->tope++;
}

La solución es tan sencilla como sustituir arre por arreglo o viceversa.

Por otro lado fíjate que en el main estás declarando un puntero sin inicializar:

int main(){
    ArregloConTope *act; // <<--- Declaras puntero sin inicializar
    int valor;
    int op;
    printf("ttBienvenido al programa de arreglo con topen");
    printf("1.Insertar elementon");
    printf("2.Verificar si el vector esta llenon");
    printf("Ingrese una opcion ");
    scanf("%d",&op);
    switch(op){
    case 1:
        Insertar(act, valor); // <<--- Y aqui lo usas

Con eso la aplicación va a acceder (mediante el puntero) a memoria que no le pertenece y el Sistema Operativo, para evitar que corrompas memoria, va a matar el proceso. El resultado es un bonito error de segmentación y la aplicación al garete.

Para este caso en concreto no es necesario que uses memoria dinámica, así que de momento yo me la ahorraría (de momento bastante hay con entender el resto del lenguaje). Aun así no hay que olvidar inicializar las variables correctamente para evitar comportamientos extraños:

int main()
{
  ArregloConTope act;
  act.tope = 0; // <<--- Importante

  // ...

  Insertar(&act,valor);

  // ...

  printf("%d", EstaLleno(act));
}

Por cierto, nota que en ningún momento le estás pidiendo al usuario que rellene la variable valor… luego no te quejes si te rellena el arreglo con basura.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *