[C]problema con los datos(estructuras)

A ver si alguien me puede ayudar con este asunto... resulta que tengo una función que sirve para inicializar los productos y otra para inicializar los clientes, y mientras estas dentro de esa misma funcion si que se "guardan" los datos introducidos y si haces referencia a ellos, mediante un printf por ejemplo muestra el contenido de la variable, pero cuando termina el subprograma es como si se borraran los datos que has introducido y entonces las siguentes funciones no tienen datos y no sirven para nada. Todo esta en valenciano pero lo que importa es lo de los datos que no es plan de ponerme a traducir xD no se si seran los parametros de las funciones o que lo que estara mal, pero yo creo que eso esta bien. Si alguien sabe que me pasa... que me ayude por favor xq llevo 2 dias dandole vueltas ya y hasta se lo he dicho al profesor y no ha sabido solucionarlo :( por cierto mi compilador es el Dev-C++ si alguien lo puede comprobar con otro compilador... Muchas gracias [bye]

PD: si alguien lo prueba con otro compilador que ejecute la funcion mes_car (numero 3) xq con esa es con la que estava provando yo y tiene un printf ahi acoplado para ver si salen los datos xD

//INCLUDES
#include <stdio.h>
#include <string.h>
#include <iostream>

//CONSTANTS
#define NCLIEN 2
#define NPROD 2

//VARIABLES-VECTORS
typedef struct{int dia, mes, any;}fecha;

typedef struct{
        char ref[5];
        char nom[16];
        int preu_u;
        int quan;
}producte;

typedef struct{
        char nif[10];
        char nom[16];
        char cog1[16];
        char cog2[16];
}client;

typedef struct{
        char ref[5];
        int unitat;
        char dni[10];
        fecha compra, entrega;
        float preu_total;
}comanda;

typedef struct{
        producte p[NPROD];
        client cl[NCLIEN];
        comanda co[NCLIEN];
}tenda;

tenda t;
int op;

//PROTOTIPS FUNCIONS
int menu();
int iniprod(tenda t);
int inicli(tenda t);
void menys_deu(tenda t);
int menys_popular(tenda t);
int mes_car(tenda t);

//FUNCIÓ MAIN
int main(){
   
    iniprod(t);
    inicli(t);
    do{
       op=menu();
       switch(op){
                  case 1:
                       menys_deu(t);
                       break;
                  case 2:
                       printf("El producte menys popular es el %i, %s", menys_popular(t), t.p[menys_popular(t)].nom);
                       break;
                  case 3:
                       printf("El mes producte mes car es el %i, %s", mes_car(t), t.p[mes_car(t)].nom);
                       break;                   
                  default:
                          printf("opcio no valida\n");
       }
    }while(op!=6);
   
    system("PAUSE");
}

//IMPLEMENTACIÓ DE FUNCIONS
int menu(){
    int i;
    printf("\n\n\tOpcions:\n\n");
    printf("\t\t1)Mostrar tots els productes amb menys de 10 unitats \n");
    printf("\t\t2)Informar quin es l'article menys 'popular'\n");
    printf("\t\t3)Informar quin es el producte mes car\n");
    printf("\t\t6)Eixir\n");
    scanf("%i", &i);
    return i;
}

int iniprod(tenda t){
     int i;
     for(i=0;i<NPROD;i++){
                         printf("________________________\n");
                         printf("  Numero producte %i\n", i);
                         printf("________________________\n");
                         printf("Numero referencia:\n");
                         fflush(stdin);
                         gets(t.p[i].ref);
                         printf("Nom producte:\n");
                         fflush(stdin);
                         gets(t.p[i].nom);
                         printf("Preu unitari:\n");
                         fflush(stdin);
                         scanf("%i", &t.p[i].preu_u);
                         printf("Quantitat:\n");
                         scanf("%i", &t.p[i].quan);
     }
     printf("%i\n", t.p[0].preu_u);
     printf("cadena:%s:",t.p[0].nom);
}

int inicli(tenda t){
     int i;
     for(i=0;i<NCLIEN;i++){
                         printf("________________________\n");
                         printf("  Numero client %i\n", i);
                         printf("________________________\n");
                         printf("NIF:\n");
                         fflush(stdin);
                         gets(t.cl[i].nif);
                         printf("Nom:\n");
                         fflush(stdin);
                         gets(t.cl[i].nom);
                         puts(t.cl[i].nom);
                         printf("Primer cognom:\n");
                         fflush(stdin);
                         gets(t.cl[i].cog1);
                         printf("Segon cognom:\n");
                         fflush(stdin);
                         gets(t.cl[i].cog2);
     }
}

void menys_deu(tenda t){
     int i;
     for(i=0;i<NPROD;i++){
                         if(t.p[i].quan<10){
                                         printf("%s\n", t.p[i].nom);
                         }
     }
}

int menys_popular(tenda t){
     int quan, posquan, i;
     posquan=0;
     quan=t.p[0].quan;
     i=1;
          printf("%d", quan);
     while(i<NPROD){
          if(quan<t.p[i].quan){
               posquan=i;
               quan=t.p[i].quan;
          }
          i++;
     }
     return posquan;
}

int mes_car(tenda t){
     
     printf("%i\n", t.p[0].preu_u);
     printf("cadena:%s:",t.p[0].nom);
     
     int poscar, i, car;
     poscar=0;
     car=t.p[0].preu_u;
     i=1;
     printf("%i", car);
     while(i<NPROD){
          if(car<t.p[i].preu_u){
               poscar=i;
               car=t.p[i].preu_u;
          }
          i++;
     }
     return poscar;
}   
Tienes que pasar las imágenes por referencia, si no lo que estás haciendo es crear una copia de la estructura que se destruye al salir de la funcion.
En C tendrás que usar punteros
no hemos dado punteros todavia :S

Edito: solucionado, he quitado la estructura tienda y asi si que se queda guardado :)
Hace mucho q no toco C..... pero, una cosa...

Si las variables las declaras fuera del main, son de ámbito global, no?

El problema no viene de q pasas tenda por parámetro? Simplemente, podrías acceder a la structura desde la funcion (o voy errado?)

De todas formas, una estructura, no es un puntero ya? Sé que un array, sí (o eso creo recordar).

PD: Ya odiarás los punteros!
PD2: Si no has dado punteros, no pueden pedirte que pases una variable como parametro y su contenido se guarde SIN devolver valor..... lo unico q podrías hacer es

int main() {
....
tenda=la_funcion(tenda);
....

}

tenda la_funcion(tenda t) {
..
t[algo]++;
..
return t;
}


Creo q esta sería la solucion SIN usar punteros, ni globales.
Un saludo :)
Eleazar escribió:Si las variables las declaras fuera del main, son de ámbito global, no?

si
Eleazar escribió:El problema no viene de q pasas tenda por parámetro? Simplemente, podrías acceder a la structura desde la funcion (o voy errado?)

pues no se alomejor si que se soluciona asi, gracias por tu ayuda, aunque estamos dando punteros ya... de momento lo tengo claro supongo que no tardara en complicarse la cosa xD cuando tenga un momento lo modificaré a ver...
hasta luego :)
Si las variables las declaras globales no puedes recivirlas como parametros porque si dentro de una funcion usas una variable con el mismo nombre que una global, el compilador la interpreta como una privada independiente de la misma funcion y no la asocia como la global de fuera, si usas globales ten cuidado de no repetir los nombres dentro de las funciones al declarar otras variables. Para eso el consejo mas practico es el siguiente:

si es una variable global nombrala asi: g_nombrevariable
si es una variable local de la funcion: v_nombrevariable
si es un puntero: p_nombrepuntero

Usar prefijos para variables y tipos de objetos es muy practico y te soluciona esos problemas sin que prestes mas atencion. Si luego dais Visual Basic, ahí si que son casi imprescindibles para identificar objectos de diferentes tipos (comos, textos, etc...)

Tambien evita usar variables globales si puedes usar locales o punteros, siempre dara mas estabilidad al programa.

Un Saludo!
5 respuestas