Autor
|
Tema: Problema con struct (Leído 2,644 veces)
|
Luchoz95
Desconectado
Mensajes: 58
|
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: "); 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!
|
|
« Última modificación: 26 Marzo 2013, 18:43 pm por Luchoz95 »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
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
|
|
« Última modificación: 26 Marzo 2013, 19:30 pm por avesudra »
|
En línea
|
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.
|
|
|
En línea
|
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
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 :/
|
|
|
En línea
|
Regístrate en
|
|
|
Luchoz95
Desconectado
Mensajes: 58
|
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 ?
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
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: int precio [1];
Saludos
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problema al pasar cadenas a los campos de un struct en FASM
ASM
|
Swicher
|
5
|
4,716
|
8 Febrero 2013, 03:49 am
por Swicher
|
|
|
struct en java??
Java
|
br7
|
3
|
4,916
|
14 Noviembre 2014, 00:12 am
por br7
|
|
|
Problema al compilar con struct
Programación C/C++
|
romybe
|
2
|
1,897
|
5 Diciembre 2014, 04:04 am
por leobr6
|
|
|
struct en c
Programación C/C++
|
ronyop
|
7
|
2,879
|
28 Noviembre 2015, 01:12 am
por class_OpenGL
|
|
|
PROBLEMA!!! algoritmo conversor de struct a int, me devuelve 0
Programación C/C++
|
pablombf
|
3
|
2,187
|
2 Enero 2018, 21:40 pm
por pablombf
|
|