[ayuda] duda con una variable en C.

Iniciado por fer_fer_73, 2 Marzo 2011, 00:26 AM

0 Miembros y 3 Visitantes están viendo este tema.

fer_fer_73

hola, buenas tardes, no entiendo por que en este final ponen en la funcion void carga a int* como parametro, ya que es la cantidad de articulos, segun dice ahi, y ademas d eso si me pueden decir si estan bien declaradas las variables segun el final, porque para mi estan bien, pero tuve un problema con otro final que el error que me marcaba era que a no estaba definida... muchas gracias a los que contesten!

el final esta en este link:   http://img42.imageshack.us/i/img112d.jpg/ 

#include <stdio.h>

struct productos {
       int cod_a; /*articulo*/
       char modelo[10];
       char descripcion[200];
       float precio;
       long cod_p; /*proveedor*/
       nom_p[30];};
       
       void carga (struct productos[], int*);
       void ordenar (struct productos[], int*, int);
       void mostrar (struct productos[], int*, char[]);
       .............. buscar (struct productos[], int*, char[]);   /*no se que va en lo que retorna*/
       char* modificar (struct productos[], int*, int);
       
       main()
       {
             struct productos a[49];
             .
             .
             .
             .
             } 

con el rock en las venas...

Oblivi0n

Eso son los prototipos de las funciones, lo que declara es un parametro del tipo int*, es decir un puntero a un int

fer_fer_73

gracias por contestarme, antes que nada, pero mi duda no es que es, eso lo se, lo que no entiendo es por que no es directamente int, ya que un numero nomas, y te pediria que me digas si esta bien el struct, el arreglo a, los prototipos y que va en el retorno que no puse.. (acuerdo al final).
con el rock en las venas...

anonimo12121

que quieres retornar un int? pues int buscar. y asi con lo que sea incluso structuras creo.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

fer_fer_73

Cita de: Xafirot en  2 Marzo 2011, 01:41 AM
que quieres retornar un int? pues int buscar. y asi con lo que sea incluso structuras creo.

retorna un puntero a la estructura, esta bien si pongo struct productos*  en el retonrno??

me podrias decir por favor, de acuerdo al final, si estan bien los prototipos y bien declarado el arreglo a?
con el rock en las venas...

ryan parker

Creo que el mejor tipo seria void.

Bien seria el tipo void por que es un tipo generico que puede representar cualquier tipo de dato, entonces si lo parametros formales son de tipos diferentes, entonces deben devolver a un tipo generico en este caso el tipo void.

Creo que hay otras maneras de devolver valores sin hacer uso de void, mm con operadores cast, bien esto si no se, asi que espero que algun guru nos ilumine :)

Bueno por lo demas no estoy muy avanzado para poder opinar  :silbar:

Saludos
Your kung-fu is not strong!

N0body

La verdad que en el enunciado, por más que el profesor trata de ser lo más detallista posible, se presta a ciertas ambigüedades. Además debo aclarar que detesto cuando tratan de "programar a los programadores" (diciendole como tienen q hacer el código, en vez de dandole la descripcion de la entrada y la relación la la salida) xD

-Al parecer según veo, los argumentos para tus funciones están en el orden en que los nombra en el enunciado.
Además no es sólo en la función carge que pasas la cantidad de articulos como puntero a int, sino en el resto de las funciones que requieren ese dato.
En primer lugar, pensé que quizás la función carga podría modificar la cantidad, en este caso es importante que pases el puntero a la variable, para tener acceso a la variable que pasas como argumento desde el main y no tener una simple "copia" de ella... Espero que lo entiendas, sino, repasa un poco esto:
void fun1 (int a)
{
a++;
return;
}
void fun2 (int *a)
{
(*a)++;
return;
}

En el primer caso paso el valor de un entero, y la modificacion no influye sobre la variable que le paso dede el main (o en donde se llame a fun1). En el segundo paso la direccion y modifico el valor del entero a donde esa direccion apunta, osea que la modificacion es efectiva en la variable con la que trabajo en el main.
Entonces convenimos en esto: si quieres modificar la variable, pasa el puntero a dicha variable... xD Pero creo que no necesitas modificar el valor de la cantidad, así que no sé para que... Si, como dices tu sería mejor pasar el valor (un int directamente). Igualmente no sé de donde sacaste esos prototipos, en el enunciado no están...

-Las variables las declaras bien, no usas variables globales como la consigna bien aclara que no hay que usar. Pero declaras 49 variables del tipo "struct productos", cuando necesitas 50, en las cadenas de caracteres dentro de la definicion de la estructura no tienes problemas con esto... Creo que la confusion viene por este lado:
Cuando hacés
int a[20]
declaras 20 variables int, que serán nombradas desde a[0] hasta a[19]. Yo antes, cuando empecé a programar, pensaba que haciendo int a[19] declarabas 20 variables...

-En la definición de la esctructura no pones el tipo de "nom_p[30]", que como leí en el enunciado debería ser una cadena de caracteres...

-La función buscar, según el enunciado devuelve todos los datos del producto... Justamente aclara (y aca el error de muchos estudiantes) que no muestra dichos datos... Por que? porque a veces vamos a tener que buscar un producto no para mostrar sus datos, sino para trabajar con ellos...Como son muchos datos (todos los de la estructura), puedes hacer varias cosa:
a)devolver un entero, que sea la posicion de la estructura buscada en el array.
b)devolver un puntero a la estructura encontrada (ahí estaría bien hacer "struct producto *").
c)devolver una estructura "struct producto" que sea la estructura encontrada.
La mejor opcion a mi criterio es la "a", ya que con ese dato podés determinar todos los otros. Si tienes un puntero a la estructura en verdad también porque hacés la diferencia entre éste y el puntero q apunta al principio de la estructura y te da la posición en la lista, pero es complicarse sin mucho sentido. Por ultimo, la opción "b" no te brinda información alguna sobre en que posición se encuentra, simplemente te pasa los datos del producto, pero como la consigna dice simplemente esto, no creo que esté mal...

Lo leí muy a la ligera, probablemente me olvide de más cosas, así que revisalo vos...

fer_fer_73

Cita de: N0body en  2 Marzo 2011, 12:52 PM
La verdad que en el enunciado, por más que el profesor trata de ser lo más detallista posible, se presta a ciertas ambigüedades. Además debo aclarar que detesto cuando tratan de "programar a los programadores" (diciendole como tienen q hacer el código, en vez de dandole la descripcion de la entrada y la relación la la salida) xD

-Al parecer según veo, los argumentos para tus funciones están en el orden en que los nombra en el enunciado.
Además no es sólo en la función carge que pasas la cantidad de articulos como puntero a int, sino en el resto de las funciones que requieren ese dato.
En primer lugar, pensé que quizás la función carga podría modificar la cantidad, en este caso es importante que pases el puntero a la variable, para tener acceso a la variable que pasas como argumento desde el main y no tener una simple "copia" de ella... Espero que lo entiendas, sino, repasa un poco esto:
void fun1 (int a)
{
a++;
return;
}
void fun2 (int *a)
{
(*a)++;
return;
}

En el primer caso paso el valor de un entero, y la modificacion no influye sobre la variable que le paso dede el main (o en donde se llame a fun1). En el segundo paso la direccion y modifico el valor del entero a donde esa direccion apunta, osea que la modificacion es efectiva en la variable con la que trabajo en el main.
Entonces convenimos en esto: si quieres modificar la variable, pasa el puntero a dicha variable... xD Pero creo que no necesitas modificar el valor de la cantidad, así que no sé para que... Si, como dices tu sería mejor pasar el valor (un int directamente). Igualmente no sé de donde sacaste esos prototipos, en el enunciado no están...

-Las variables las declaras bien, no usas variables globales como la consigna bien aclara que no hay que usar. Pero declaras 49 variables del tipo "struct productos", cuando necesitas 50, en las cadenas de caracteres dentro de la definicion de la estructura no tienes problemas con esto... Creo que la confusion viene por este lado:
Cuando hacés
int a[20]
declaras 20 variables int, que serán nombradas desde a[0] hasta a[19]. Yo antes, cuando empecé a programar, pensaba que haciendo int a[19] declarabas 20 variables...

-En la definición de la esctructura no pones el tipo de "nom_p[30]", que como leí en el enunciado debería ser una cadena de caracteres...

-La función buscar, según el enunciado devuelve todos los datos del producto... Justamente aclara (y aca el error de muchos estudiantes) que no muestra dichos datos... Por que? porque a veces vamos a tener que buscar un producto no para mostrar sus datos, sino para trabajar con ellos...Como son muchos datos (todos los de la estructura), puedes hacer varias cosa:
a)devolver un entero, que sea la posicion de la estructura buscada en el array.
b)devolver un puntero a la estructura encontrada (ahí estaría bien hacer "struct producto *").
c)devolver una estructura "struct producto" que sea la estructura encontrada.
La mejor opcion a mi criterio es la "a", ya que con ese dato podés determinar todos los otros. Si tienes un puntero a la estructura en verdad también porque hacés la diferencia entre éste y el puntero q apunta al principio de la estructura y te da la posición en la lista, pero es complicarse sin mucho sentido. Por ultimo, la opción "b" no te brinda información alguna sobre en que posición se encuentra, simplemente te pasa los datos del producto, pero como la consigna dice simplemente esto, no creo que esté mal...

Lo leí muy a la ligera, probablemente me olvide de más cosas, así que revisalo vos...



Muchisimas gracias Nobody por todo lo que escribiste, lo del a[49] tenes razon, me confundi, con respecto a lo de los prototipos los hice yo, no estan en el final y queria saber si estan bien. Lo del tipo de nom_p me olvide de ponerlo jaja  seria char*..

otra vez muchas gracias! te re jugaste che!  ;-)
con el rock en las venas...