Problema con struct

Iniciado por Luchoz95, 26 Marzo 2013, 18:39 PM

0 Miembros y 1 Visitante están viendo este tema.

Luchoz95

tengo un problema con la siguiente structura
#include <stdio.h>
#include <string.h>

typedef struct producto
{
int precio[1];
char nombre_product[30];
}producto_n;



int main()
{
producto_n producto1;
printf("introduce el nombre del producto : ");
gets(producto1.nombre_product);
printf("introduce el producto sin iva: ");
fflush(stdin);
scanf("%d",&producto1.precio[0]);
producto1.precio[1]=producto1.precio[0]+5;
printf("el producto %s sale $%d",producto1.nombre_product,producto1.precio[1]);
return 0;
}



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!

rir3760

Cuando declaras un array:
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

avesudra

#2
Cita de: rir3760 en 26 Marzo 2013, 19:05 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?:
#include <stdio.h>
#include <string.h>

typedef struct producto
{
   char nombre_product[30];
   int precio[1];
} producto_n;



int main()
{
   producto_n producto1;
   producto1.precio[0] = 1;
   producto1.precio[1] = 2;
   
   for(int i = 0; i <= 30;++i)
   {
       producto1.nombre_product[i]='A'+i;
       printf("Direcciones de memoria nombre_product[%d]: \t %x \t Valor: %c\n",i,&producto1.nombre_product[i],producto1.nombre_product[i]);
   }
   printf("Direcciones de memoria nombre_product[%d]: \t %x \t Valor: %d\n",0,&producto1.precio[0],producto1.precio[0]);
   printf("Direcciones de memoria nombre_product[%d]: \t %x \t Valor: %d\n",1,&producto1.precio[1],producto1.precio[1]);
   return 0;
}

Siendo esta la salida(en breve la pongo):
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í:
typedef struct producto
{
    char nombre_product[30];
    int precio[1];
} producto_n;

Se arregla   :¬¬
Regístrate en

85

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.
Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/

avesudra

Cita de: 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.

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 :/
Regístrate en

Luchoz95

a ver yo tengo entendido que esto :
int precio [1];
es un vector .. donde puedo guardar dos enteros

precio[0];
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 ..
typedef struct producto
{
int precio[2];
char nombre_product[30];
}producto_n;

por esto ...
typedef struct producto
{
char nombre_product[30];
int precio[2];
}producto_n;


Muy loco no ?

  • Segunda Solucion: Cambiar la cantidad de vectores del vector
int precio[2];


ahora mi pregunta es , realmente donde esta el error ?

durasno

Citara 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:
int precio [1];


Saludos
Ahorrate una pregunta, lee el man