Array de estructura (struct) typedef y punteros[C].

Iniciado por DanielPy, 7 Febrero 2015, 22:11 PM

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

DanielPy

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);

getchar();
return 0;
}


Saludos.
Daniel
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

Tal vez tu estructura "agenda" debiera ser más bien "contacto", y luego hacer una array de contactos.

DanielPy

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);

getchar();
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
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

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


DanielPy

Hola Blaster.
Muchas gracias, funciona a la perfección, el tema estaba en utilizar correctamente la aritmética de punteros.-

Saludos.
Daniel
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

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);


getchar();
return 0;
}

void ingreso(agenda *ptrContactos){
(*ptrContactos + 3)->orden = 5;
    //(*(ptrContactos)).orden = 5;

printf("\n\n %d", (*ptrContactos + 3)->orden);
}



CitarC:\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
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

#6
Cita de: DanielC# en  9 Febrero 2015, 15:44 PM

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

_Enko

#7
No sería mas lógico tener algo como esto?

Código (cpp) [Seleccionar]


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
Código (cpp) [Seleccionar]

//miagenda[0].apellido;
(miagenda +0)->apellido;

Pero vale la pena  complicar la sintaxis?


Saludos

eferion

Cita de: _Enko en  9 Febrero 2015, 16:51 PM
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 :)

DanielPy

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:

CitarPero 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
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.-