• Domingo 15 de Diciembre de 2024, 04:27

Autor Tema:  Uso de estructuras  (Leído 2617 veces)

chuscazo

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Uso de estructuras
« en: Martes 24 de Marzo de 2009, 18:11 »
0
Uso de estructuras
Hola, soy medio novato en C, entre otras cosas porque hace bastante tiempo que no me tocaba hacer nada en este lenguaje. Me estoy matando con 2 lineas de código que no acabo de entender. Os comento (es de una API para Remedy):

Tengo definidos:
Código: C
  1.  
  2. typedef char ARNameType[AR_MAX_NAME_SIZE + 1];
  3.  
  4. typedef struct ARNameList
  5. {
  6.    unsigned int   numItems;
  7.    ARNameType    *nameList;
  8.  
  9. }  ARNameList;
  10.  
  11.  
Y ahora quiero crear una variable del tipo ARNameList con 2 ARNameType q
Código: C
  1.  
  2.         ARNameType parametro1="ShortDescription";
  3.         ARNameType parametro2="Category";
  4.  
  5.         ARNameType *parametros[]={&parametro1,&parametro2,0};
  6.  
  7.         ARNameList listaAttr ={ 2 , &parametros};
  8.  
  9.  
Al compilar, la última línea me devuelve:
aviso: inicialización desde un tipo de puntero incompatible.

También he probado:
Código: C
  1.  
  2.         ARNameType *parametros[]={"Name","ShortDescription",0};
  3.         ARNameList listaAttr ={ 2 , &parametros};
  4.  
  5.  
Pero ahora la dos lineas me devuelven:
linea 2: aviso: inicialización desde un tipo de puntero incompatible.
linea 2: aviso: inicialización desde un tipo de puntero incompatible.
linea 3: aviso: inicialización desde un tipo de puntero incompatible.

¿Alguien me podría decir que está mal?

Gracias.

 PD: EDITADO para añadir la etiquetas correctas de código.
« última modificación: Martes 24 de Marzo de 2009, 19:05 por chuscazo »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Uso de estructuras
« Respuesta #1 en: Martes 24 de Marzo de 2009, 18:45 »
0
¡UTILIZA LAS PUÑETERAS ETIQUETAS DE CÓDIGO Y LEETE LAS NORMAS DEL FORO!

Tienes mal esto:

Código: C
  1. ARNameType *parametros[]={&parametro1,&parametro2,0};
  2.  
que debería ser:

Código: C
  1. ARNameType parametros[]={parametro1,parametro2,0};
  2.  
Recuerda que en C los vectores ya son punteros de por sí.

Salud

chuscazo

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Uso de estructuras
« Respuesta #2 en: Martes 24 de Marzo de 2009, 19:04 »
0
Gracias por tu llamada de atención. Ya he editado el post anterior. Y perdón porque en un principio no me aclare con el editor.

 Lo he cambiado como dices:
Código: C
  1.  
  2.         ARNameType parametro1="ShortDescription";
  3.         ARNameType parametro2="Category";
  4.  
  5.         ARNameType parametros[]={parametro2,parametro1,0};
  6.  
  7.         ARNameList listaAttr ={ 2 , &parametros};
  8.  
  9.  
  10.  
Ahora me dice:
linea 5: aviso: la inicialización crea un entero desde un puntero sin una conversión
linea 5: aviso: la inicialización crea un entero desde un puntero sin una conversión
linea 7: aviso: inicialización desde un tipo de puntero incompatible

 La verdad que he probado muchas cosas y no se si me está fallando el código aquí porque son solo avisos. El caso que esa estructura se la tengo que pasar por referencia a una función de la api y parece que nunca me coge mas de un valor en la lista. Según la documentación si debería de cogerlos.

 Saludos.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Uso de estructuras
« Respuesta #3 en: Miércoles 25 de Marzo de 2009, 01:42 »
0
Podrías haberte dado cuenta por ti mismo, pero aquí también incurres en el mismo error:

Código: C
  1. ARNameType parametro1="ShortDescription";
  2. ARNameType parametro2="Category";
  3.  
Aqui estás asignando una cadena a un puntero. Debería ser:

Código: C
  1. ARNameType *parametro1="ShortDescription";
  2. ARNameType *parametro2="Category";
  3.  
Aquí asignamos las cadenas a la memoria apuntada por los punteros, que previamente hemos reservado con [AR_MAX_NAME_SIZE + 1].

Por cierto, para los punteros usa NULL en vez de 0 para asegurarte la portabilidad (aunque en la inmensa mayoría sea 0)

Salud

chuscazo

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Uso de estructuras
« Respuesta #4 en: Miércoles 25 de Marzo de 2009, 09:20 »
0
Curioso, porque yo pensaba que esa parte estaba bien.
El caso es que cambiando lo que me comentas me sale 2 veces mas el error.

 La verdad que cada vez me pierdo mas. porque con el código inicial :
Código: C
  1.  
  2.         ARNameType parametro1="ShortDescription";
  3.         ARNameType parametro2="Category";
  4.  
  5.         ARNameType *parametros[]={&parametro2,&parametro1,NULL};
  6.  
  7.         ARNameList listaAttr ={ 2 , &parametros};
  8.  
  9.  
Solo me devolvía:
linea 7: inicialización desde un tipo de puntero incompatible

Y con el código modificado como comentas:
Código: C
  1.  
  2.         ARNameType *parametro1="ShortDescription";
  3.         ARNameType *parametro2="Category";
  4.  
  5.         ARNameType parametros[]={parametro2,parametro1,NULL};
  6.  
  7.         ARNameList listaAttr ={ 2 , &parametros};
  8.  
  9.  
Me devuelve:
linea 2: inicialización desde un tipo de puntero incompatible
linea 3: inicialización desde un tipo de puntero incompatible
linea 5: la inicialización crea un entero desde un puntero sin una conversión
linea 5: la inicialización crea un entero desde un puntero sin una conversión
linea 7: inicialización desde un tipo de puntero incompatible

 Me comentas que me tendría que haber dado cuenta, pero es que esto hace que me desoriente más todavía.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Uso de estructuras
« Respuesta #5 en: Miércoles 25 de Marzo de 2009, 09:47 »
0
Uf, vaya follón...  <_<  Mil disculpas por el despiste, pero tienes razón. Prueba así:

Código: C
  1. ARNameType parametro1="ShortDescription";
  2. ARNameType parametro2="Category";
  3.  
  4. ARNameType *parametros[]={&parametro2,&parametro1,NULL};
  5.  
  6. ARNameList listaAttr ={ 2 , parametros};
  7.  

También, ¿por qué no pruebas a asignar los valores después de la declaración?

Código: C
  1. ARNameType parametro1;
  2. ARNameType parametro2;
  3. ARNameType *parametros[];
  4. ARNameList listaAttr;
  5.  
  6. *parametro1="ShortDescription";
  7. *parametro2="Category";
  8.  
  9. parametros[0] = parametro2;
  10. parametros[1] = parametro1;
  11. parametros[2] = NULL;
  12.  
  13. listaAttr.numItems = 2;
  14. listaAttr.namelist = parametros;
  15.  
Vemos a ver qué tal. Disculpa por haberte liado tanto...  :bad:
« última modificación: Miércoles 25 de Marzo de 2009, 11:49 por m0skit0 »

chuscazo

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Uso de estructuras
« Respuesta #6 en: Miércoles 25 de Marzo de 2009, 10:23 »
0
Nada tío, así tampoco, siguen saliendo los mismo errores y he probado varias combinaciones.

 Lo he escalado al soporte de la herramienta (la que trae la API) a ver si se estiran y me ayudan o me dicen que es lo que pasa, porque mas combinaciones no pudo probar. También es un problema que no sea utilizado por mucha gente, porque no hay muchos hilos sobre esto.

 Muchas gracias por tu tiempo, ayuda e ideas. En cuanto sepa algo de lo que pasa lo pondré en este hilo. De todas formas si se os siguen ocurriendo ideas yo estaré aquí detrás a la espera.

 Saludos.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Uso de estructuras
« Respuesta #7 en: Miércoles 25 de Marzo de 2009, 10:49 »
0
Pero ¿has probado también las asignaciones independientemente de las declaraciones y tampoco funciona?  :huh:

chuscazo

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Uso de estructuras
« Respuesta #8 en: Miércoles 25 de Marzo de 2009, 11:08 »
0
Claro, y también salen errores y avisos. En esa asignación es donde he hecho varias pruebas ya que de esa forma no había probado todavía.

 De todas formas si que consigo crear la estructura y acceder a ella, aunque con avisos en la asignación, pero lo que parece que luego no funciona bien es el uso que hace de ella otra función de la API.

 Saludos.