Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con un error de estructura

Estas en el tema de Problema con un error de estructura en el foro de C/C++ en Foros del Web. Buenas a todos, desde hace tiempo estoy haciendo un programilla en C, que por una parte inserte, borre, visualicé y guarde los datos (tanto clientes ...
  #1 (permalink)  
Antiguo 26/08/2010, 18:38
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Problema con un error de estructura

Buenas a todos, desde hace tiempo estoy haciendo un programilla en C, que por una parte inserte, borre, visualicé y guarde los datos (tanto clientes como libros. Estoy haciendo una librería xd).

Bien pues mi problema esta en el fichero de la lista que es el que muestra una relación entre los ficheros de clientes y libros. Al parecer cuando compilo para que se habrá el programa me devuelve un error diciéndome como si no encontrara o no cogiera bien una de las estructuras.

Al final os dejo una imagen mostrando el error que muestra el programa. Que seguramente me este explicando mal, así que supongo que una imagen vale mas que mil palabras.

Seguramente el error sea una gran tontería, pero me esta desesperando el error.
Si no es molestia y no están ocupados, me gustaría que me pudieran ayudar, para poder avanzar con mi programa y así aprender de mis errores. Porque aun tengo muchos en este mundillo.

Gracias por el tiempo dedicado a leer mi mensaje y por la ayuda que puedas prestar respondiendome a mi duda.

  #2 (permalink)  
Antiguo 26/08/2010, 22:10
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 2 meses
Puntos: 1
Respuesta: Problema con un error de estructura

bien el error es simple. esas variables estan definidas en alguna otra parte. extern se utiliza para hacer referencia a una variable declarada globalmente en otra parte. ya sea en alguna liberia o otro archivo
  #3 (permalink)  
Antiguo 27/08/2010, 05:35
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Problema con un error de estructura

Primero muchas gracias por responderme.

Segundo, la estructura que tengo ahi puesta la: extern struct L_Libros *cap_li,*aux_li,*f_li,*p_li; . Solo esta en el fichero lista.cpp en las demas solo estan como:extern struct L_Libros *cap,*aux,*f,*p;. Así que el fallo deberia estar en ese fichero y no en otros, no?
  #4 (permalink)  
Antiguo 30/08/2010, 01:03
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Problema con un error de estructura

Tal como lo has puesto, estás indicando que esos punteros a estructura del tipo L_Libros están en otro módulo del programa, en un archivo llamado lista.cpp. Pero, ojo, son precisamente esos punteros los que deben estar definidos en lista.cpp, con esos mismos nombres y tipos, de no ser así, lo normal es que el linker te dé, precisamente, el error que te está reportando, ya que no encuentra por ninguna parte las variables que le indicas.

Dado que no has posteado el código completo, interpreto que tienes un módulo denominado lista.cpp, que hace el tratamiento de estructuras del tipo L_Libros. Entonces, lo que tendrías que hacer es:

1. Define la estructura L_Libros en Librería.h (que, supongo, es la que contiene el interface con el módulo lista.cpp).

2. Declara tus variables normalmente, no como extern, es decir:

Código C++:
Ver original
  1. ....
  2. #include "Libreria.h"
  3. struct L_Libros *cap_li, *aux_li, *f_li, *p_li
  4. ....

3. Evidentemente, las funcones de lista.cpp tendrán que trabajar con punteros a esta estructura de datos (supongo que ya es así, dado que las has declarado directamente como punteros).

Sin ver el resto del código no puedo indicarte más. Saludos,
  #5 (permalink)  
Antiguo 30/08/2010, 19:09
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Problema con un error de estructura

Muchas gracias por responder, he quitado todos los externs de los ficheros. Pero ahora me sale un nuevo error. Es el siguiente:

multiple definition of `cap_li'
first defined here

Y asi con los demas. Te adjunto el codigo de todos mis ficheros, haber si tu o alguien puede encontrarme el fallo y asi poder poder proseguir con el.

Muchas gracias por el esfuerzo al responderme.

Codigos:

Main

Código:
#include <cstdlib>
#include <iostream>
#include <string>
#include <conio2.h>
#include "Libreria.h"

struct L_Libros *cap_li=NULL,*aux_li=NULL,*f_li=NULL,*p_li=NULL;
struct C_Clientes *cap_cli=NULL,*aux_cli=NULL,*f_cli=NULL,*p_cli=NULL;

using namespace std;
int main(int argc, char *argv[])

{
int op;    

//struct Clientes *cap2=NULL,*aux2=NULL,*f2=NULL,*p2=NULL;
//crear_lista_libros();
//guardar_lista_libros();


    gotoxy(40,5); cout << " MENU PRINCIPAL " << endl;
    
    gotoxy(33,6); cout << " --------------------- " << endl; 
    
    gotoxy(33,7); cout << " 1-Gestion de libros  " << endl; 
    
    gotoxy(33,8); cout << " 2-Gestion de clientes  " << endl;
    
    gotoxy(33,9); cout << " 3-Visualizar lista  " << endl;  
    
    gotoxy(33,10); cout << " 4-Salir del programa  " << endl;
     
    gotoxy(33,11); cout << " --------------------- " << endl; 
    
    gotoxy(33,13); cout << " Que opcion desea elegir? ";
    cin >> op;
    
    switch(op){
               case 1: Gestion_de_Libros();
                       break;
               case 2: Gestion_de_clientes();
                       break;
               case 3: //visualizar_Lista();
                       break;
               case 4: system("cls");
                       exit(1);
               }
    
    system("PAUSE");
}

Libreria.h

Código:
//Estructuras...

struct Libros{
       int cod_libro;
       int cod_clientes;
       char nom_libro[20];
       char autor[15];
       char editorial[15];
};
struct L_Libros{
       int cod_libro;
       int cod_clientes;
       char nom_libro[20];
       char autor[15];
       char editorial[15];
       struct L_Libros *seg;
};
struct Clientes{
       int cod_clientes;
       char nom_clientes[20];
       char apellidos_clientes[20];
       char direccion[15];
       int telefono;
};
struct L_Clientes{
       int cod_clientes;
       char nom_clientes[20];
       char apellidos_clientes[20];
       char direccion[15];
       int telefono;
       struct L_Clientes *seg;
};

//Funciones para los libros
void Gestion_de_Libros(void);
void poner_libros(void);
void Borrar_libros(void);
void Visualizar_libros(void);

//Funciones para los clientes
void Gestion_de_clientes(void);
void poner_clientes(void);
void Borrar_clientes(void);
void Visualizar_clientes(void);

//Funciones de lista Libros
void crear_lista_libros(void);
void guardar_lista_libros(void);

//Funciones de lista Clientes
void crear_lista_Clientes(void);
void guardar_lista_Clientes(void);
  #6 (permalink)  
Antiguo 30/08/2010, 19:11
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Problema con un error de estructura

Sigo por aqui:

Gestion de clientes

Código:
#include <cstdlib>
#include <iostream>
#include <string>
#include <conio2.h>
#include "Libreria.h"
struct L_Clientes *cap,*aux,*f,*p;
using namespace std;

void Gestion_de_clientes(void)
{ 

int op;    
struct Clientes cli;
do{
    gotoxy(36,5); cout << " GESTION DE LOS CLIENTES " << endl;
    
    gotoxy(33,6); cout << " -------------------------- " << endl; 
    
    gotoxy(33,7); cout << " 1-Introducir Clientes " << endl; 
    
    gotoxy(33,8); cout << " 2-Borrar Clientes  " << endl;
    
    gotoxy(33,9); cout << " 3-Visualizar Clientes  " << endl;    
    
    gotoxy(33,10); cout << " 4-Volver al menu principal  " << endl;
     
    gotoxy(33,11); cout << " -------------------------- " << endl; 
    
    gotoxy(33,13); cout << " Que opcion desea elegir? ";
    cin >> op;
    
    switch(op){
               case 1: poner_clientes();
                       break;
               case 2: Borrar_clientes();
                       break;
               case 3: Visualizar_clientes();
                       break;
               case 4: system("PAUSE");
                       return;
                       exit(1);
               }
}while(op!=4);
               system("PAUSE");
}
void poner_clientes(void)
{
   aux=(struct L_Clientes *)malloc(sizeof(struct L_Clientes));
  clrscr( );
   cout<< " Introduce el Codigo del Cliente: ";
   cin>>aux->cod_clientes;
   aux->seg=NULL;
   if (cap==NULL)
       cap=aux;
   else if (cap->cod_clientes > aux->cod_clientes)
        {
           aux->seg=cap;
           cap=aux;
         }
         else
            {
              p=f=cap;
              while (p->cod_clientes < aux->cod_clientes && p->seg!=NULL)
                 {
                   if (p==cap) p=p->seg;
                   else
                      {
                        p=p->seg;
                        f=f->seg;
                       }
                  }

                  if(p->seg==NULL && p->cod_clientes<aux->cod_clientes)
                    {
                     aux->seg=p->seg;
                     p->seg=aux;
                     }
                  else
                    {
                     aux->seg=f->seg;
                     f->seg=aux;
                     }
            }

   cout<< " Introduce el Nombre del Cliente: ";
   cin>>aux->nom_clientes;
   aux->seg=NULL;
   if (cap==NULL)
       cap=aux;
   else if (cap->nom_clientes > aux->nom_clientes)
        {
           aux->seg=cap;
           cap=aux;
         }
         else
            {
              p=f=cap;
              while (p->nom_clientes < aux->nom_clientes && p->seg!=NULL)
                 {
                   if (p==cap) p=p->seg;
                   else
                      {
                        p=p->seg;
                        f=f->seg;
                       }
                  }

                  if(p->seg==NULL && p->nom_clientes<aux->nom_clientes)
                    {
                     aux->seg=p->seg;
                     p->seg=aux;
                     }
                  else
                    {
                     aux->seg=f->seg;
                     f->seg=aux;
                     }
            }
   cout<< " Introduce el Apellido del cliente : ";
   cin>>aux->apellidos_clientes;
   aux->seg=NULL;
   if (cap==NULL)
       cap=aux;
   else if (cap->apellidos_clientes > aux->apellidos_clientes)
        {
           aux->seg=cap;
           cap=aux;
         }
         else
            {
              p=f=cap;
              while (p->apellidos_clientes < aux->apellidos_clientes && p->seg!=NULL)
                 {
                   if (p==cap) p=p->seg;
                   else
                      {
                        p=p->seg;
                        f=f->seg;
                       }
                  }

                  if(p->seg==NULL && p->apellidos_clientes<aux->apellidos_clientes)
                    {
                     aux->seg=p->seg;
                     p->seg=aux;
                     }
                  else
                    {
                     aux->seg=f->seg;
                     f->seg=aux;
                     }
            }
 cout<< " Introduce la Direccion del Cliente: ";
   cin>>aux->direccion;
   aux->seg=NULL;
   if (cap==NULL)
       cap=aux;
   else if (cap->direccion > aux->direccion)
        {
           aux->seg=cap;
           cap=aux;
         }
         else
            {
              p=f=cap;
              while (p->direccion < aux->direccion && p->seg!=NULL)
                 {
                   if (p==cap) p=p->seg;
                   else
                      {
                        p=p->seg;
                        f=f->seg;
                       }
                  }

                 if(p->seg==NULL && p->direccion<aux->direccion)
                    {
                     aux->seg=p->seg;
                     p->seg=aux;
                     }
                  else
                    {
                     aux->seg=f->seg;
                     f->seg=aux;
                     }
            }
    cout<< " Introduce el Telefono: ";
   cin>>aux->telefono;
   aux->seg=NULL;
   if (cap==NULL)
       cap=aux;
   else if (cap->telefono > aux->telefono)
        {
           aux->seg=cap;
           cap=aux;
         }
         else
            {
              p=f=cap;
              while (p->telefono < aux->telefono&& p->seg!=NULL)
                 {
                   if (p==cap) p=p->seg;
                   else
                      {
                        p=p->seg;
                        f=f->seg;
                       }
                  }

                  if(p->seg==NULL && p->telefono<aux->telefono)
                    {
                     aux->seg=p->seg;
                     p->seg=aux;
                     }
                  else
                    {
                     aux->seg=f->seg;
                     f->seg=aux;
                     }
            }
            system("cls");
            
}

void Borrar_clientes(void)
{
int var;
    if (cap==NULL) return;
    clrscr( );
    cout<<"Introduce el codigo del Cliente a eliminar: ";
    cin>>var;
    if (cap->cod_clientes==var)
      {
        p=cap;
        cap=cap->seg;
        free(p);
      }
   else
     {
       p=f=cap;
      while (p->cod_clientes != var && p->seg!=NULL)
         {
            if (p==cap)p=p->seg;
            else
              {
                p=p->seg;
                f=f->seg;
              }
         }
       if (p->seg==NULL && p->cod_clientes!=var)
          {
            cin.get();
            cout<<"Este valor no esta en la lista";
            cin.get();
            cout<<endl;
            return;
          }
       f->seg=p->seg;
       free(p);
    }
              system("cls");
}

void Visualizar_clientes(void)
{
   if (cap==NULL)
      {
        cout<<"La llista esta vacia";
        cin.get();
        return;
      }
  clrscr( );
  aux=cap;
  while (aux!=NULL)
    {
      cout<<aux->cod_clientes;
      aux=aux->seg;
     }
   cin.get( );
   system("cls");
}

void crear_lista_Clientes(void)
{
   struct L_Clientes cli;
   FILE *f1;
   
   if((f1=fopen("Clientes.dat", "rb"))==NULL){
   cout << "El archivo \"Clientes.dat\" no se puede leer." << endl;
   cin.get();
   exit(1);
   }
   
   fread(&cli, sizeof(cli),1,f1);
   
   while(!feof(f1)){
    aux=(struct L_Clientes *)malloc(sizeof(struct L_Clientes));   
    aux->cod_clientes=cli.cod_clientes;
    strcpy(aux->nom_clientes,cli.nom_clientes) ;
    strcpy(aux->apellidos_clientes,cli.apellidos_clientes);   
    strcpy(aux->direccion,cli.direccion);   
    aux->telefono=cli.telefono;
    aux->seg=NULL;
   
    if (cap==NULL)
     cap=aux;
    else if (cap->cod_clientes > aux->cod_clientes){
     aux->seg=cap;
     cap=aux;
     }else{
      p=f=cap;
      while (p->cod_clientes < aux->cod_clientes && p->seg!=NULL){
       if (p==cap) p=p->seg;
       else{
        p=p->seg;
        f=f->seg;
       }
      }

    if(p->seg==NULL && p->cod_clientes<aux->cod_clientes){
     aux->seg=p->seg;
     p->seg=aux;
     }else{
      aux->seg=f->seg;
      f->seg=aux;
     }
    }
    
    fread(&cli, sizeof(cli),1,f1);
        
   }
   fclose(f1);
}

void guardar_lista_Clientes(void)
{
 struct L_Clientes cli;
 FILE *f1;
     
 if((f1=fopen("Clientes.dat", "wb"))==NULL){
  cout << "El archivo \"Clientes.dat\" no se puede leer." << endl;
  cin.get();
  exit(1);
  }

    aux=cap;
    while(!feof(f1)){
    aux->cod_clientes=cli.cod_clientes;
    strcpy(cli.nom_clientes,aux->nom_clientes);
    strcpy(cli.apellidos_clientes,aux->apellidos_clientes);   
    strcpy(cli.direccion,aux->direccion);  
    aux->telefono=cli.telefono;
    fwrite(&cli, sizeof (cli),1,f1);
    aux->seg=NULL;
   
   }
   
   fclose(f1);
}
  #7 (permalink)  
Antiguo 30/08/2010, 19:12
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Problema con un error de estructura

Gestion de libros

Código:
#include <cstdlib>
#include <iostream>
#include <string>
#include <conio2.h>
#include "Libreria.h"
struct L_Libros *cap,*aux,*f,*p;
using namespace std;

void Gestion_de_Libros(void)
{ 

int op;    
struct Libros lib;
do{
    gotoxy(36,5); cout << " GESTION DE LOS LIBROS " << endl;
    
    gotoxy(33,6); cout << " -------------------------- " << endl; 
    
    gotoxy(33,7); cout << " 1-Introducir Libros " << endl; 
    
    gotoxy(33,8); cout << " 2-Borrar Libros  " << endl;
    
    gotoxy(33,9); cout << " 3-Visualizar Libros  " << endl;    
    
    gotoxy(33,10); cout << " 4-Volver al menu principal  " << endl;
     
    gotoxy(33,11); cout << " -------------------------- " << endl; 
    
    gotoxy(33,13); cout << " Que opcion desea elegir? ";
    cin >> op;
    
    switch(op){
               case 1: poner_libros();
                       break;
               case 2: Borrar_libros();
                       break;
               case 3: Visualizar_libros();
                       break;
               case 4: system("PAUSE");
                       return;
                       exit(1);
               }
}while(op!=4);
               system("PAUSE");
}
void poner_libros(void)
{
   aux=(struct L_Libros *)malloc(sizeof(struct L_Libros));
  clrscr( );
   cout<< " Introduce el Codigo del Libro: ";
   cin>>aux->cod_libro;
   aux->seg=NULL;
   if (cap==NULL)
       cap=aux;
   else if (cap->cod_libro > aux->cod_libro)
        {
           aux->seg=cap;
           cap=aux;
         }
         else
            {
              p=f=cap;
              while (p->cod_libro < aux->cod_libro && p->seg!=NULL)
                 {
                   if (p==cap) p=p->seg;
                   else
                      {
                        p=p->seg;
                        f=f->seg;
                       }
                  }

                  if(p->seg==NULL && p->cod_libro<aux->cod_libro)
                    {
                     aux->seg=p->seg;
                     p->seg=aux;
                     }
                  else
                    {
                     aux->seg=f->seg;
                     f->seg=aux;
                     }
            }

   cout<< " Introduce el Codigo del Cliente: ";
   cin>>aux->cod_clientes;
   aux->seg=NULL;
   if (cap==NULL)
       cap=aux;
   else if (cap->cod_clientes > aux->cod_clientes)
        {
           aux->seg=cap;
           cap=aux;
         }
         else
            {
              p=f=cap;
              while (p->cod_clientes < aux->cod_clientes && p->seg!=NULL)
                 {
                   if (p==cap) p=p->seg;
                   else
                      {
                        p=p->seg;
                        f=f->seg;
                       }
                  }

                  if(p->seg==NULL && p->cod_clientes<aux->cod_clientes)
                    {
                     aux->seg=p->seg;
                     p->seg=aux;
                     }
                  else
                    {
                     aux->seg=f->seg;
                     f->seg=aux;
                     }
            }
   cout<< " Introduce el nombre del Libro : ";
   cin>>aux->nom_libro;
   aux->seg=NULL;
   if (cap==NULL)
       cap=aux;
   else if (cap->nom_libro > aux->nom_libro)
        {
           aux->seg=cap;
           cap=aux;
         }
         else
            {
              p=f=cap;
              while (p->nom_libro < aux->nom_libro && p->seg!=NULL)
                 {
                   if (p==cap) p=p->seg;
                   else
                      {
                        p=p->seg;
                        f=f->seg;
                       }
                  }

                  if(p->seg==NULL && p->nom_libro<aux->nom_libro)
                    {
                     aux->seg=p->seg;
                     p->seg=aux;
                     }
                  else
                    {
                     aux->seg=f->seg;
                     f->seg=aux;
                     }
            }
 cout<< " Introduce el Autor: ";
   cin>>aux->autor;
   aux->seg=NULL;
   if (cap==NULL)
       cap=aux;
   else if (cap->autor > aux->autor)
        {
           aux->seg=cap;
           cap=aux;
         }
         else
            {
              p=f=cap;
              while (p->autor < aux->autor && p->seg!=NULL)
                 {
                   if (p==cap) p=p->seg;
                   else
                      {
                        p=p->seg;
                        f=f->seg;
                       }
                  }

                  if(p->seg==NULL && p->autor<aux->autor)
                    {
                     aux->seg=p->seg;
                     p->seg=aux;
                     }
                  else
                    {
                     aux->seg=f->seg;
                     f->seg=aux;
                     }
            }
    cout<< " Introduce la Editorial: ";
   cin>>aux->editorial;
   aux->seg=NULL;
   if (cap==NULL)
       cap=aux;
   else if (cap->editorial > aux->editorial)
        {
           aux->seg=cap;
           cap=aux;
         }
         else
            {
              p=f=cap;
              while (p->editorial < aux->editorial && p->seg!=NULL)
                 {
                   if (p==cap) p=p->seg;
                   else
                      {
                        p=p->seg;
                        f=f->seg;
                       }
                  }

                  if(p->seg==NULL && p->editorial<aux->editorial)
                    {
                     aux->seg=p->seg;
                     p->seg=aux;
                     }
                  else
                    {
                     aux->seg=f->seg;
                     f->seg=aux;
                     }
            }
            system("cls");
            
}

void Borrar_libros(void)
{
int var;
    if (cap==NULL) return;
    clrscr( );
    cout<<"Introduce el codigo de libro a eliminar: ";
    cin>>var;
    if (cap->cod_libro==var)
      {
        p=cap;
        cap=cap->seg;
        free(p);
      }
   else
     {
       p=f=cap;
      while (p->cod_libro != var && p->seg!=NULL)
         {
            if (p==cap)p=p->seg;
            else
              {
                p=p->seg;
                f=f->seg;
              }
         }
       if (p->seg==NULL && p->cod_libro!=var)
          {
            cin.get();
            cout<<"Este valor no esta en la lista";
            cin.get();
            cout<<endl;
            return;
          }
       f->seg=p->seg;
       free(p);
    }
              system("cls");
}

void Visualizar_libros(void)
{
   if (cap==NULL)
      {
        cout<<"La llista esta vacia";
        cin.get();
        return;
      }
  clrscr( );
  aux=cap;
  while (aux!=NULL)
    {
      cout<<aux->nom_libro;
      aux=aux->seg;
     }
   cin.get( );
   system("cls");
}

void crear_lista_libros(void)
{
   struct L_Libros lib;
   FILE *f1;
   
   if((f1=fopen("libros.dat", "rb"))==NULL){
   cout << "El archivo \"libros.dat\" no se puede leer." << endl;
   cin.get();
   exit(1);
   }
   
   fread(&lib, sizeof(lib),1,f1);
   
   while(!feof(f1)){
    aux=(struct L_Libros *)malloc(sizeof(struct L_Libros));   
    aux->cod_libro=lib.cod_libro;
    strcpy(aux->nom_libro,lib.nom_libro) ;
    strcpy(aux->autor,lib.autor);   
    strcpy(aux->editorial,lib.editorial);   
    aux->seg=NULL;
   
    if (cap==NULL)
     cap=aux;
    else if (cap->cod_libro > aux->cod_libro){
     aux->seg=cap;
     cap=aux;
     }else{
      p=f=cap;
      while (p->cod_libro < aux->cod_libro && p->seg!=NULL){
       if (p==cap) p=p->seg;
       else{
        p=p->seg;
        f=f->seg;
       }
      }

    if(p->seg==NULL && p->cod_libro<aux->cod_libro){
     aux->seg=p->seg;
     p->seg=aux;
     }else{
      aux->seg=f->seg;
      f->seg=aux;
     }
    }
    
    fread(&lib, sizeof(lib),1,f1);
        
   }
   fclose(f1);
}

void guardar_lista_libros(void)
{
 struct L_Libros lib;
 FILE *f1;
     
 if((f1=fopen("libros.dat", "wb"))==NULL){
  cout << "El archivo \"libros.dat\" no se puede leer." << endl;
  cin.get();
  exit(1);
  }

    aux=cap;
    while(!feof(f1)){
    aux->cod_libro=lib.cod_libro;
    strcpy(lib.nom_libro,aux->nom_libro);
    strcpy(lib.autor,aux->autor);   
    strcpy(lib.editorial,aux->editorial);  
    fwrite(&lib, sizeof (lib),1,f1);
    aux->seg=NULL;
   
   }
   
   fclose(f1);
}

[/CODE]
  #8 (permalink)  
Antiguo 30/08/2010, 19:13
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Problema con un error de estructura

Lista
Código:
#include <cstdlib>
#include <iostream>
#include <string>
#include <conio2.h>
#include "Libreria.h"
using namespace std;
struct L_Clientes *cap2,*aux2,*f2,*p2;
struct L_Libros *cap,*aux,*f,*p;


void mostrar_lista(void){
     int espacio=7;   
                    clrscr();
                    if (cap==NULL)   {
                        gotoxy(30,13);cout<<"La lista esta vacia...";
                          return;
                    }
                    if (cap==NULL)   {
                        gotoxy(30,13);cout<<"La lista esta vacia...";
                          return;
                    }
                                        
                    gotoxy(2,4); cout<<"Codigo del Cliente ";
                    gotoxy(22,4); cout<<"Nombre del Cliente";
                    gotoxy(32,4); cout<<"Direccion del Cliente";
                    gotoxy(42,4); cout<<"Telefono del Cliente";
                    gotoxy(2,5); cout<<"--- ---";
                    gotoxy(22,5); cout<<"------";
                    gotoxy(32,5); cout<<"--------";
                    gotoxy(42,5); cout<<"--------";
                    gotoxy(10,5); cout<<"Codigo del Libro";
                    gotoxy(49,5); cout<<"Nombre del Libro";
                    gotoxy(60,5); cout<<"Autor";
                    gotoxy(72,5); cout<<"Editorial";
                    gotoxy(10,6); cout<<"--- ----";
                    gotoxy(49,6); cout<<"---- -------";
                    gotoxy(60,6); cout<<"------";
                    gotoxy(72,6); cout<<"------";
                    aux=cap;
                    while (aux!=NULL)  {
                      gotoxy(5,espacio); cout<<aux2->cod_clientes;
                      gotoxy(22,espacio); cout<<aux2->nom_clientes;
                      gotoxy(32,espacio); cout<<aux2->direccion;
                      gotoxy(42,espacio); cout<<aux2->telefono;
                      espacio++;
                    aux=cap;
                    while (aux!=NULL)  {
                      if (aux->cod_libro==aux2->cod_clientes){
                          gotoxy(13,espacio); cout<<aux->cod_libro;
                          gotoxy(43,espacio); cout<<aux->nom_libro;
                          gotoxy(61,espacio); cout<<aux->autor;
                          gotoxy(74,espacio); cout<<aux->editorial;
                          espacio++;
                      }
                      
                      aux=aux->seg;
                    }
                    aux2=aux2->seg;
                    }
                    
                    gotoxy(5,espacio);

                    system("pause");

}
  #9 (permalink)  
Antiguo 30/08/2010, 19:22
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Problema con un error de estructura

Os pongo mejor el error que me sale:



Y por cierto en el Main cambie los cli por 2, y quite los li del L_Libros y los deje tal cual, con aux, cap, f, p. Por si sirve de algo. Haber si asi, me podeis ayudar mejor con todo el codigo.

Espero que entre todos podamos solucionarlo porque voy a necesitar que funcione para el miercoles o me suspenden la recuperación xd.

Espero que se pueda arreglar el fallo que tiene mi programa y llegue a tiempo.

Y si no, igualmente muchas gracias por invertir vuestro tiempo en ver mi post.
  #10 (permalink)  
Antiguo 31/08/2010, 02:33
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Problema con un error de estructura

El error que te da es un error del enlazador (linker). Te indica que estás declarando esas variables en más de un módulo de programa (llamo módulo a un archivo de código fuente). Te explico por qué.

Las variables que declaras fuera de las funciones son globales. Esto quiere decir que son conocidas en todos los módulos que componen el programa. El compilador trata los archivos de código fuente uno por uno, sin tener en cuenta los demás, por lo que si se utiliza una variable definida como global en otro archivo va a dar error (no sabe que esa variable ya está definida en otra parte). De ahí el empleo del atributo extern: Se le dice al compilador que la variable se ha definido en otro lugar. Esto exige que haya SOLO UNA declaración "normal" de la variable en uno de los módulos, y declaraciones con atributo extern en el resto de módulos donde se utilice (deberá coincidir tanto el nombre como el tipo de la variable). Este era el origen de los errores en tu primer post: Las variables estaban declaradas como extern en todos los módulos, de cara al compilador no era incorrecto, pero al enlazar el linker no encontraba la, digamos, "variable original" (de ahí el error de "undefined reference").

El error que te da ahora es justamente lo contrario. Hay variables globales con el mismo nombre en varios módulos, y el enlazador no sabe cuál de ellas es la que debe emplear (aunque para tí sean lo mismo, ya que tienen el mismo nombre y tipo, la cosa cambia después de compilar).

Tienes dos soluciones posibles (suponiendo que, por lo demás, el programa funciona correctamente).

La primera, si quieres emplear variables globales (poco recomendable, y menos aún si deben ser comunes a varios módulos), es declararlas "normalmente" en uno de ellos, y como extern en el resto.

La segunda es declararlas con el atributo static en el módulo principal (de este modo son globales solamente para este módulo, y desconocidas para el resto). Pasa la información a las funciones mediante parámetros (he visto que no utilizas parámetros en ninguna de las funciones que has definido). Tendrás, lógicamente, que cambiar en consecuencia las declaraciones, las implementaciones y las llamadas a las funciones. Aunque algo más pesado que lo anterior (tampoco es para tanto), tiene la ventaja de que "aíslas" los módulos entre sí y evitas posibles "efectos colaterales" que pueden resultar del empleo de variables globales.

En ambos casos, las variables auxiliatres que necesites, en la medida de lo posible, decláralas dentro de las funciones que hagan uso de ellas. Si necesitas que sean globales dentro del módulo, decláralas con el atributo static.

Espero que todo este rollo te ayude a resolver tu problema. Saludos,
  #11 (permalink)  
Antiguo 01/09/2010, 10:46
 
Fecha de Ingreso: agosto-2010
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Problema con un error de estructura

Veran, me han dado un dia mas para entregar el proyecto. Asi que ha sido un punto de esperanza para mi, porque me daba fallos.

Bien les comento los fallos que me da.

Una vez arregle lo del extern por static, ya se habria el programa, pero hay fallos, son los siguientes:

1-En el codigo de la gestion de libros, inserta bien, pero cuando le doy a visualizar la informacion que teoricamente deberia guardat en un .dat se embucla toda la informacion que rellene. Por lo tanto fallaria, la visualizacion de los libros. Y tambien me falla el borrado.

2-En el codigo de la gestion de clientes, me falla la insercion. Cuando inserto toda la informacion a rellenar, vuelve a preguntarme el primer dato a rellenar y se bloquea el programa. Y a consecuencia, fallan el borrado y la visualizacion del mismo.

Seguro que seran fallos tontos, pero no consigo verlos. Yo intentare encontrarlos, pero si alguien puede ir ayudandome mientras, os lo agradecere muchisimo. Recordad que los codigos estan todos un poco mas arriba.

Gracias por todo amigos. Y gracias por preocuparos por ver este post y ayudarme.
  #12 (permalink)  
Antiguo 02/09/2010, 00:26
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Problema con un error de estructura

En la visualización, según lo que has posteado,en la función mostrar_lista() tienes

Código C++:
Ver original
  1. //
  2. aux = cap;
  3. while (aux != NULL) {...

Dentro de ese bucle, vuelves a hacer exactamente lo mismo, con lo que la variable de control del bucle while externo vuelve a su valor inicial. Parece como si faltase un cierre de llave después del primer bucle while (con lo que alguna de las siguientes llaves de cierre sobrarían), o la variable de control de alguno de los bucles while (el interno o el externo) no fuese la que deba ser. De hecho, pienso que la variable de control del bucle while externo debiera ser aux2 y no aux, lo que achaco a un simple error mecanográfico.

En cuanto al otro problema, no sé como ha quedado el código después de los cambios que hiciste. Partiendo de lo que hay posteado, el fallo parece consecuencia de efectos colatrales por el empleo de varables globales.

Saludos,

Etiquetas: estructura
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:50.