Autor
|
Tema: Array de estructura (struct) typedef y punteros[C]. (Leído 11,629 veces)
|
DanielPy
Desconectado
Mensajes: 145
|
Hola a todos. Estoy estudiando estructuras y voy a programar una agenda, al programa le falta todo pero no quiero seguir sin aprender las dos cosas por las que doy de alta este post.- La primera como puedo insertar typedef y la otra, como hago para declarar la estructura para que se le pueda ingresar de o a 10 contactos (unaAgenda [10]).- Espero se entienda, estimo que si.- #include <stdio.h> struct agenda{ int orden, celular; char nombre[30], apellido[30], calle[30], ciudad[30], correo[50]; }; int main(void){ struct agenda unaAgenda; struct agenda *ptrAgenda; ptrAgenda = &unaAgenda; (*ptrAgenda).orden = 1; printf("\n\n %d", (*ptrAgenda ). orden); return 0; }
Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Tal vez tu estructura "agenda" debiera ser más bien "contacto", y luego hacer una array de contactos.
|
|
|
En línea
|
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola ivancea96. Gracias por ocuparte y por el consejo, voy a dejar por el momento lo de typedef, con respecto a la otra duda pude avanzar un poco, solo que me da el siguiente error (expongo a continuación) que por más que modifico el programa no logro solucionar.- #include <stdio.h> struct agenda{ int orden, celular; char nombre[30], apellido[30], calle[30], ciudad[30], correo[50]; }contacto[10]; int main(void){ struct agenda *ptrContacto; ptrContacto = &contacto[0]; (*ptrContacto+3).orden = 3; //printf("\n\n %d", (*ptrContacto).orden); return 0; }
C:\ProgramasNotepad\Pruebas.c: In function 'main': C:\ProgramasNotepad\Pruebas.c:12:15: error: invalid operands to binary + (have 'struct agenda' and 'int') (*ptrContacto+3).orden = 3;Espero puedas ayudarme.- Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
Blaster
Desconectado
Mensajes: 190
|
Es necesario cambiar (*ptrcontact+3).order = 3;
a ptrcontact[3].order = 3;
O poniendo los paretesís necesarios al usar arítmetica de punteros (*(ptrcontact+3)).order = 3;
También usando el operador -> (ptrcontact + 3)->order = 3;
De lo contrario, de acuerdo con la regla de prioridad * tiene mayor precedencia sobre + provocando el error en tu caso. Un Saludo
|
|
|
En línea
|
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola Blaster. Muchas gracias, funciona a la perfección, el tema estaba en utilizar correctamente la aritmética de punteros.-
Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola gente. Una vez más acudo a Uds. Para ver si me dan una mano con este nuevo inconveniente.- La línea que figura como comentario me da error, estuve consultando en internet y no logro dar con la solución- #include <stdio.h> typedef struct{ int orden, celular; char nombre[30], apellido[30], calle[30], ciudad[30], correo[50]; }agenda[10]; void ingreso(agenda *ptrContactos); int main(void){ agenda contactos; ingreso(&contactos); return 0; } void ingreso(agenda *ptrContactos){ (*ptrContactos + 3)->orden = 5; //(*(ptrContactos)).orden = 5; printf("\n\n %d", (*ptrContactos + 3)->orden ); }
C:\ProgramasNotepad\Pruebas.c: In function 'ingreso': C:\ProgramasNotepad\Pruebas.c:21:22: error: request for member 'orden' in something not a structure or union (*(ptrContactos)).orden = 3; Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
typedef struct{ /* ... */ }agenda[10]; void ingreso(agenda *ptrContactos)
ptrContactos es un puntero de tipo "agenda" que a su vez es un arreglo de diez elementos... luego ptrContactos es un puntero doble. Entonces: ptrContactos: puntero doble *ptrContacots: puntero (necesitas el operador '->' en vez del operador '.' ) **ptrContactos: acceso directo a la estructura (necesitas el operador '.' ) Un saludo
|
|
« Última modificación: 9 Febrero 2015, 16:31 pm por eferion »
|
En línea
|
|
|
|
_Enko
|
No sería mas lógico tener algo como esto? typedef struct contacto{ int orden, celular; char nombre[30], apellido[30], calle[30], ciudad[30], correo[50]; }; int main(int argc, char *argv[]) { contacto* miagenda; miagenda = (contacto*) malloc(10 * sizeof(contacto)); miagenda[0].orden = 0; strcpy(miagenda[0].nombre, "Nombre"); strcpy(miagenda[0].apellido, "Apellido");
Y no hace falta el "->" porque [] haria la indireccion. Se podria hacer //miagenda[0].apellido; (miagenda +0)->apellido;
Pero vale la pena complicar la sintaxis? Saludos
|
|
« Última modificación: 9 Febrero 2015, 16:57 pm por _Enko »
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Pero vale la pena complicar la sintaxis? Desde mi punto de vista no merece la pena. El código tiene que ser lo más sencillo y legible posible para reducir los costes de mantenimiento, el número de errores, y el coste de ampliar el programa... pero la decisión final no depende de nosotros
|
|
|
En línea
|
|
|
|
DanielPy
Desconectado
Mensajes: 145
|
Hola a todos. Eferion, me parece muy interesante lo de puntero doble, etc. Yo creí que sabía bastante sobre punteros pero veo que tengo que repasarlos, si estaríamos sentados los dos frente a la misma compu te efectuaría una pregunta, pero no es este el caso, seguramente consultando en la web voy a obtener la respuesta a mi duda.- _Enko, 2 aclaraciones en cuanto a tu código, la primera es que todavía no llegue a estudiar memoria dinámica y la restante es que el programa se va a extender bastante porque al pedir el ingreso de los datos voy a validar que sean correctos, por lo tanto tengo que utilizar funciones, no debo hacerlo todo dentro de la función principal (main).- En cuanto a: Pero vale la pena complicar la sintaxis? ……………………………………. ……………………………………. Desde mi punto de vista no merece la pena.
Les aclaro mi punto de vista y el criterio del porqué, yo no puedo estar seguro de hacer sólo programas para terceros, que pasa si me trajeran para corregir o modificar programas hechos por otros, en estos casos puedo encontrarme con una gran diversidad de formas de programar y según me dicta mi sentido común debo tener el mayor conocimiento posible, este es el único motivo por el cual este programa(o todos) los hago un tanto complicado.- Para finalizar, espero alguna respuesta en cuanto a mi planteo para saber cuál es el criterio utilizados por Uds. Al estudiar. Saludos. Daniel
|
|
|
En línea
|
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
quien me puede ayudar a pasar este codigo con punteros y memoria dinamica
Programación C/C++
|
attackers
|
3
|
2,483
|
23 Noviembre 2011, 13:04 pm
por attackers
|
|
|
[Ayuda-C] Vectores y punteros (inicialización dinámica)
Programación C/C++
|
Miky Gonzalez
|
4
|
2,148
|
12 Noviembre 2014, 21:32 pm
por Miky Gonzalez
|
|
|
Punteros y memoria dinamica
Programación C/C++
|
bemone
|
4
|
2,292
|
30 Agosto 2015, 03:13 am
por geeke
|
|
|
definir los argumentos de una función de manera dinamica
Programación C/C++
|
fafafa01
|
2
|
2,426
|
2 Julio 2016, 10:22 am
por MAFUS
|
|
|
Escribir en una parte específica de un fichero o documento, de manera dinámica
PHP
|
big_ed
|
0
|
1,448
|
25 Abril 2019, 18:26 pm
por big_ed
|
|