elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con struct
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con struct  (Leído 2,644 veces)
Luchoz95

Desconectado Desconectado

Mensajes: 58


Ver Perfil
Problema con struct
« 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!


« Última modificación: 26 Marzo 2013, 18:43 pm por Luchoz95 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con struct
« Respuesta #1 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


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 Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Problema con struct
« Respuesta #2 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   :¬¬
« Última modificación: 26 Marzo 2013, 19:30 pm por avesudra » En línea

Regístrate en
85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Problema con struct
« Respuesta #3 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 línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Problema con struct
« Respuesta #4 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 :/
En línea

Regístrate en
Luchoz95

Desconectado Desconectado

Mensajes: 58


Ver Perfil
Re: Problema con struct
« Respuesta #5 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 ?
    En línea

    durasno


    Desconectado Desconectado

    Mensajes: 373


    Ver Perfil
    Re: Problema con struct
    « Respuesta #6 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
    En línea

    Ahorrate una pregunta, lee el man
    Páginas: [1] Ir Arriba Respuesta Imprimir 

    Ir a:  

    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 Último mensaje 8 Febrero 2013, 03:49 am
    por Swicher
    struct en java??
    Java
    br7 3 4,916 Último mensaje 14 Noviembre 2014, 00:12 am
    por br7
    Problema al compilar con struct
    Programación C/C++
    romybe 2 1,897 Último mensaje 5 Diciembre 2014, 04:04 am
    por leobr6
    struct en c
    Programación C/C++
    ronyop 7 2,879 Último mensaje 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 Último mensaje 2 Enero 2018, 21:40 pm
    por pablombf
    WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines