Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Luchoz95 en 26 Marzo 2013, 18:39 pm



Título: Problema con struct
Publicado por: Luchoz95 en 26 Marzo 2013, 18:39 pm
tengo un problema con la siguiente structura
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. typedef struct producto
  5. {
  6. int precio[1];
  7. char nombre_product[30];
  8. }producto_n;
  9.  
  10.  
  11.  
  12. int main()
  13. {
  14. producto_n producto1;
  15. printf("introduce el nombre del producto : ");
  16. gets(producto1.nombre_product);
  17. printf("introduce el producto sin iva: ");
  18. fflush(stdin);
  19. scanf("%d",&producto1.precio[0]);
  20. producto1.precio[1]=producto1.precio[0]+5;
  21. printf("el producto %s sale $%d",producto1.nombre_product,producto1.precio[1]);
  22. return 0;
  23. }


bueno el problema es que no se imprime el nombre del producto (producto1.nombre_product) se imprime un caracter cualquiera , la verdad no se que puede ser ... la unica forma que pude hacer andar cambiandole la cantidad de vectores de la variable precio a [2] .. alguien me puede ayudar ? S2!


Título: Re: Problema con struct
Publicado por: rir3760 en 26 Marzo 2013, 19:05 pm
Cuando declaras un array:
Código
  1. int precio[1];
Indicas el numero de elementos (N = 1) y accedes a ellos mediante los indices 0 .. N-1. Como declaras un array de un solo elemento (no tiene caso) accedes a este mediante "precio[0]".

El elemento "precio[1]" no existe ya que seria el segundo elemento del array.

Un saludo


Título: Re: Problema con struct
Publicado por: avesudra en 26 Marzo 2013, 19:25 pm
El elemento "precio[1]" no existe ya que seria el segundo elemento del array.
No me queda muy claro a mí eh, ya que he hecho esto y salen dos direcciones de memoria distintas para el precio y dos valores distintos que los he asignado yo, cuando ¿debería dar error por acceder a una memoria que no es la suya al asignarle los valores?:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. typedef struct producto
  5. {
  6.    char nombre_product[30];
  7.    int precio[1];
  8. } producto_n;
  9.  
  10.  
  11.  
  12. int main()
  13. {
  14.    producto_n producto1;
  15.    producto1.precio[0] = 1;
  16.    producto1.precio[1] = 2;
  17.  
  18.    for(int i = 0; i <= 30;++i)
  19.    {
  20.        producto1.nombre_product[i]='A'+i;
  21.        printf("Direcciones de memoria nombre_product[%d]: \t %x \t Valor: %c\n",i,&producto1.nombre_product[i],producto1.nombre_product[i]);
  22.    }
  23.    printf("Direcciones de memoria nombre_product[%d]: \t %x \t Valor: %d\n",0,&producto1.precio[0],producto1.precio[0]);
  24.    printf("Direcciones de memoria nombre_product[%d]: \t %x \t Valor: %d\n",1,&producto1.precio[1],producto1.precio[1]);
  25.    return 0;
  26. }
Siendo esta la salida(en breve la pongo):
Código:
Direcciones de memoria nombre_product[0]: 	 5b6d2250 	 Valor: A
Direcciones de memoria nombre_product[1]: 5b6d2251 Valor: B
Direcciones de memoria nombre_product[2]: 5b6d2252 Valor: C
Direcciones de memoria nombre_product[3]: 5b6d2253 Valor: D
Direcciones de memoria nombre_product[4]: 5b6d2254 Valor: E
Direcciones de memoria nombre_product[5]: 5b6d2255 Valor: F
Direcciones de memoria nombre_product[6]: 5b6d2256 Valor: G
Direcciones de memoria nombre_product[7]: 5b6d2257 Valor: H
Direcciones de memoria nombre_product[8]: 5b6d2258 Valor: I
Direcciones de memoria nombre_product[9]: 5b6d2259 Valor: J
Direcciones de memoria nombre_product[10]: 5b6d225a Valor: K
Direcciones de memoria nombre_product[11]: 5b6d225b Valor: L
Direcciones de memoria nombre_product[12]: 5b6d225c Valor: M
Direcciones de memoria nombre_product[13]: 5b6d225d Valor: N
Direcciones de memoria nombre_product[14]: 5b6d225e Valor: O
Direcciones de memoria nombre_product[15]: 5b6d225f Valor: P
Direcciones de memoria nombre_product[16]: 5b6d2260 Valor: Q
Direcciones de memoria nombre_product[17]: 5b6d2261 Valor: R
Direcciones de memoria nombre_product[18]: 5b6d2262 Valor: S
Direcciones de memoria nombre_product[19]: 5b6d2263 Valor: T
Direcciones de memoria nombre_product[20]: 5b6d2264 Valor: U
Direcciones de memoria nombre_product[21]: 5b6d2265 Valor: V
Direcciones de memoria nombre_product[22]: 5b6d2266 Valor: W
Direcciones de memoria nombre_product[23]: 5b6d2267 Valor: X
Direcciones de memoria nombre_product[24]: 5b6d2268 Valor: Y
Direcciones de memoria nombre_product[25]: 5b6d2269 Valor: Z
Direcciones de memoria nombre_product[26]: 5b6d226a Valor: [
Direcciones de memoria nombre_product[27]: 5b6d226b Valor: \
Direcciones de memoria nombre_product[28]: 5b6d226c Valor: ]
Direcciones de memoria nombre_product[29]: 5b6d226d Valor: ^
Direcciones de memoria nombre_product[30]: 5b6d226e Valor: _
Direcciones de memoria nombre_product[0]: 5b6d2270 Valor: 1
Direcciones de memoria nombre_product[1]: 5b6d2274 Valor: 2

Es curioso porque si pongo la estructura así:
Código
  1. typedef struct producto
  2. {
  3.    char nombre_product[30];
  4.    int precio[1];
  5. } producto_n;
Se arregla   :¬¬


Título: Re: Problema con struct
Publicado por: 85 en 26 Marzo 2013, 21:56 pm
a veces no da error mientras no modifiques algo crítico, es decir si te salís fuera del límite de una cadena y escribís otra, en teoría no pasa nada. Pero si al pasarte fuera, terminás modificando la dirección almacenada de un puntero por ejemplo, entonces si sería una modificación crítica.

array[2] en teoría debería guardar 2 elementos que son array[0] y array[1], si usás [2] sería el tercero. aunque si no tira error debés estar modificando el dato que se encuentra a continuación, o a no ser que el compilador sea inteligente como para haber creado un array de 3.


Título: Re: Problema con struct
Publicado por: avesudra en 26 Marzo 2013, 22:20 pm
a veces no da error mientras no modifiques algo crítico, es decir si te salís fuera del límite de una cadena y escribís otra, en teoría no pasa nada. Pero si al pasarte fuera, terminás modificando la dirección almacenada de un puntero por ejemplo, entonces si sería una modificación crítica.

array[2] en teoría debería guardar 2 elementos que son array[0] y array[1], si usás [2] sería el tercero. aunque si no tira error debés estar modificando el dato que se encuentra a continuación, o a no ser que el compilador sea inteligente como para haber creado un array de 3.

En este caso si le asigno valores a producto1.precio[1] no da error pero asignandolo a producto.precio[2] sí. Bah acabo de mirar en un libro y llevais razón :/


Título: Re: Problema con struct
Publicado por: Luchoz95 en 27 Marzo 2013, 00:15 am
a ver yo tengo entendido que esto :
Código
  1. int precio [1];
es un vector .. donde puedo guardar dos enteros

Código
  1. precio[0];
  2. precio[1];

pero por lo visto ahi no esta el erro , si no, en gets , me equivoco ?

y la dos soluciens posibles son las siguientes :

  • Primera Solucion: Cambiar esto ..
Código
  1. typedef struct producto
  2. {
  3. int precio[2];
  4. char nombre_product[30];
  5. }producto_n;
  6.  
por esto ...
Código
  1. typedef struct producto
  2. {
  3. char nombre_product[30];
  4. int precio[2];
  5. }producto_n;
  6.  

Muy loco no ?

  • Segunda Solucion: Cambiar la cantidad de vectores del vector
Código
  1. int precio[2];

    ahora mi pregunta es , realmente donde esta el error ?


    Título: Re: Problema con struct
    Publicado por: durasno en 27 Marzo 2013, 01:37 am
    Citar
    a ver yo tengo entendido que esto :
    Código

        int precio [1];

    es un vector .. donde puedo guardar dos enteros

    Código

        precio[0];
        precio[1];
    No, la respuesta ya te la dio rir3760 anteriormente. Solo podes acceder a la posicion 0 al declarar:
    Código
    1. int precio [1];


    Saludos