Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DanielPy en 7 Febrero 2015, 22:11 pm



Título: Array de estructura (struct) typedef y punteros[C].
Publicado por: DanielPy en 7 Febrero 2015, 22:11 pm
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.-

Código
  1. #include <stdio.h>
  2.  
  3. struct agenda{
  4. int orden, celular;
  5. char nombre[30], apellido[30], calle[30], ciudad[30], correo[50];
  6. };
  7.  
  8. int main(void){
  9. struct agenda unaAgenda;
  10. struct agenda *ptrAgenda;
  11. ptrAgenda = &unaAgenda;
  12.  
  13. (*ptrAgenda).orden = 1;
  14.  
  15. printf("\n\n %d", (*ptrAgenda).orden);
  16.  
  17. return 0;
  18. }

Saludos.
Daniel


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: ivancea96 en 8 Febrero 2015, 00:29 am
Tal vez tu estructura "agenda" debiera ser más bien "contacto", y luego hacer una array de contactos.


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: DanielPy en 8 Febrero 2015, 14:47 pm
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.-

Código
  1. #include <stdio.h>
  2.  
  3. struct agenda{
  4. int orden, celular;
  5. char nombre[30], apellido[30], calle[30], ciudad[30], correo[50];
  6. }contacto[10];
  7.  
  8. int main(void){
  9. struct agenda *ptrContacto;
  10. ptrContacto = &contacto[0];
  11.  
  12. (*ptrContacto+3).orden = 3;
  13.  
  14. //printf("\n\n %d", (*ptrContacto).orden);
  15.  
  16. return 0;
  17. }

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


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: Blaster en 8 Febrero 2015, 15:33 pm
Es necesario cambiar

Código
  1. (*ptrcontact+3).order = 3;

a

Código
  1. ptrcontact[3].order = 3;

O poniendo los paretesís necesarios al usar arítmetica de punteros

Código
  1. (*(ptrcontact+3)).order = 3;

También usando el operador ->

Código
  1. (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



Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: DanielPy en 8 Febrero 2015, 15:54 pm
Hola Blaster.
Muchas gracias, funciona a la perfección, el tema estaba en utilizar correctamente la aritmética de punteros.-

Saludos.
Daniel


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: DanielPy en 9 Febrero 2015, 15:44 pm
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-

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct{
  4. int orden, celular;
  5. char nombre[30], apellido[30], calle[30], ciudad[30], correo[50];
  6. }agenda[10];
  7.  
  8. void ingreso(agenda *ptrContactos);
  9.  
  10. int main(void){
  11. agenda contactos;
  12. ingreso(&contactos);
  13.  
  14.  
  15. return 0;
  16. }
  17.  
  18. void ingreso(agenda *ptrContactos){
  19. (*ptrContactos + 3)->orden = 5;
  20.    //(*(ptrContactos)).orden = 5;
  21.  
  22. printf("\n\n %d", (*ptrContactos + 3)->orden);
  23. }


Citar
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


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: eferion en 9 Febrero 2015, 15:58 pm
Código
  1. typedef struct{ /* ... */ }agenda[10];
  2.  
  3. 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


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: _Enko en 9 Febrero 2015, 16:51 pm
No sería mas lógico tener algo como esto?

Código
  1.  
  2. typedef struct contacto{
  3. int orden, celular;
  4. char nombre[30], apellido[30], calle[30], ciudad[30], correo[50];
  5. };
  6.  
  7.  
  8. int main(int argc, char *argv[]) {
  9.  
  10.    contacto* miagenda;
  11.    miagenda = (contacto*) malloc(10 * sizeof(contacto));
  12.    miagenda[0].orden = 0;
  13.    strcpy(miagenda[0].nombre, "Nombre");
  14.    strcpy(miagenda[0].apellido, "Apellido");
  15.  

Y no hace falta  el "->" porque [] haria la indireccion.
Se podria hacer
Código
  1. //miagenda[0].apellido;
  2. (miagenda +0)->apellido;
  3.  
Pero vale la pena  complicar la sintaxis?


Saludos


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: eferion en 9 Febrero 2015, 17:06 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 :)


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: DanielPy en 9 Febrero 2015, 18:43 pm
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:

Citar
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


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: _Enko en 9 Febrero 2015, 21:02 pm
Pues sigo  pensando que diseñar todo pasando por parametro un puntero a un arreglo de 10 estructuras no es necesario. Al menos que vayas a tener mas de un arreglo de esos?
Pero el arreglo es uno solo. Entonces para que pasarlo como parametro?

Y si aun pasas ese arreglo como parametro por referencia, pues no pasas el indice del arreglo, entonces que se modifica? Primer elemento, segundo? todos?

Código
  1. typedef struct contacto{
  2. int orden, celular;
  3. char nombre[30], apellido[30], calle[30], ciudad[30], correo[50];
  4. };
  5.  
  6.  
  7. void ingresar_datos_(contacto* cntcto)
  8. {
  9.    cntcto->orden = 5;
  10. }
  11.  
  12. int main(int argc, char *argv[]) {
  13.  
  14.    contacto miagenda[10];
  15.    ingresar_datos_(&miagenda[3]);
  16.    miagenda[3].orden == 5;
  17.  

Saludos.


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: eferion en 10 Febrero 2015, 09:13 am
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.

Siempre puedes probar suerte, lo mismo alguno de nosotros es capaz de resolverte la duda.

Por otro lado, me parece estupenda la iniciativa de buscar la solución por tu cuenta. Valerse por uno mismo es ley de vida en este mundo, sobretodo porque cuando alcanzas cierto nivel te das cuenta de que hay muy poquitos recursos a tu alcance que merezcan realmente la pena... y si te atascas al final dependes únicamente de ti mismo para salir del agujero.


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: DanielPy en 10 Febrero 2015, 22:34 pm
Hola a todos.
Espero que no me odien por tanta molestias, pero prefiero que me envíen algún mal pensamiento antes que quedarme con alguna duda.-
Este programa es para que me digan con teoría que le estoy pasando a la función.-

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct{
  4. int orden, celular;
  5. char nombre[30], apellido[30], calle[30], ciudad[30], correo[50];
  6. }agenda[10];
  7.  
  8. void ingreso(agenda *ptrContactos);
  9.  
  10. int main(void){
  11. agenda contactos;
  12. ingreso(&contactos);
  13.  
  14.  
  15. return 0;
  16. }
  17.  
  18. void ingreso(agenda *ptrContactos){
  19. int bucle = 0, cont = 1;
  20.  
  21. do{
  22. (*(*ptrContactos + cont)).orden = cont;
  23. printf("\n\n orden.....................: = %d", (*(*ptrContactos + cont)).orden);
  24.  
  25. cont++;
  26. }while(bucle >= 0 && cont <= 10);
  27. }

Este es para que vean que no pretendo que me den todo hecho, me desconecté de internet, cerré la ventana con el manual y lo logré sin ayuda, no es gran cosa pero me da cierta seguridad.-

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct{
  4. int dia, mes, año;
  5. }_fecha;
  6.  
  7. void funcPuntero(_fecha *ptr);
  8.  
  9. int main(void){
  10. _fecha fecha, *ptrFecha;
  11.  
  12. fecha.dia = 10;
  13. fecha.mes = 2;
  14. fecha.año = 2015;
  15.  
  16. printf("\n hoy es......: %d/%d/%d", fecha.dia, fecha.mes, fecha.año);
  17.  
  18. ptrFecha = &fecha;
  19.  
  20. ptrFecha->dia = 11;
  21. ptrFecha->mes = 3;
  22. ptrFecha->año = 2016;
  23.  
  24. printf("\n otra fecha..: %d/%d/%d", ptrFecha->dia, ptrFecha->mes, ptrFecha->año);
  25.  
  26. funcPuntero(&fecha);
  27. printf("\n hoy es......: %d/%d/%d", ptrFecha->dia, ptrFecha->mes, ptrFecha->año);
  28.  
  29. return 0;
  30. }
  31.  
  32. void funcPuntero(_fecha *ptr){
  33. ptr->dia = 10;
  34. ptr->mes = 2;
  35. ptr->año = 2015;
  36. }

Bueno, en definitiva todo tiene que ver con el primer programa es decir modificar los 7 campos del  registro en la función ingreso pasándole un puntero a la estructura agenda pero no copiando todo el array a la función sino tan sólo un puntero al primer elemento.-
Gente mil disculpas si ya me dieron la solución a esto pero estoy tan embotado que tal vez no me dí cuenta.-

Saludos.
Daniel


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: rir3760 en 11 Febrero 2015, 02:40 am
Este programa es para que me digan con teoría que le estoy pasando a la función.
Demasiado complicado para lo que intentas.

Basta con declarar la funcion con dos parámetros: el primero es la dirección en memoria del array y el segundo su numero de elementos. De esta forma:
Código
  1. #include <stdio.h>
  2.  
  3. struct registro {
  4.   int ordenint;
  5.   int celular;
  6.   char nombre[30];
  7.   char apellido[30];
  8.   char calle[30];
  9.   char ciudad[30];
  10.   char correo[50];
  11. };
  12.  
  13. void ingreso(struct registro *reg, size_t num_regs);
  14.  
  15. int main(void)
  16. {
  17.   struct registro reg[10];
  18.   ingreso(reg, sizeof reg / sizeof reg[0]);
  19.  
  20.   return 0;
  21. }
  22.  
  23. void ingreso(struct registro *reg, size_t num_regs)
  24. {
  25.   size_t i;
  26.  
  27.   for (i = 0; i < num_regs; i++){
  28.      /* Aqui procesas el elemento reg[i] */
  29.   }
  30. }

Un saludo


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: DanielPy en 11 Febrero 2015, 19:06 pm
Hola rir3760.
Me queda una duda, el array reg cuando está dentro de la función ingreso ¿no es un puntero al primer elemento del arreglo? y si es así ¿porque no puedo utilizar el operador flecha (->)? y si me acepta el operador punto (.).-

Código
  1. #include <stdio.h>
  2.  
  3. typedef struct{
  4. int orden;
  5. int celular;
  6. char nombre[30];
  7. char apellido[30];
  8. char calle[30];
  9. char ciudad[30];
  10. char correo[50];
  11. }registro;
  12.  
  13. void ingreso(registro *reg, size_t num_regs);
  14.  
  15. int main(void){
  16. registro reg[10];
  17. ingreso(reg, sizeof reg / sizeof reg[0]);
  18.  
  19. return 0;
  20. }
  21.  
  22. void ingreso(registro *reg, size_t num_regs){
  23. size_t i;
  24.  
  25. for (i = 0; i < num_regs; i++){
  26.        reg[i].orden = i;
  27. printf("\n orden = %d", reg[i].orden);
  28. }
  29. }
  30.  

Saludos.
Daniel


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: rir3760 en 12 Febrero 2015, 03:31 am
Me queda una duda, el array reg cuando está dentro de la función ingreso ¿no es un puntero al primer elemento del arreglo?
Correcto.

y si es así ¿porque no puedo utilizar el operador flecha (->)? y si me acepta el operador punto (.).
Primero, no hay relación entre los operadores ya que "->" aplica a un puntero mientras que "." aplica a un objeto.

Segundo, en tu caso:
Código
  1. void ingreso(registro *reg, size_t num_regs)
  2. {
  3.   /* ... */
  4.  
  5.   reg[i].orden = i;
Tienes el puntero reg y para acceder al objeto apuntado debes aplicar indireccion con "[]" y solo entonces se accede al campo indicado con ".".

Puedes utilizar el operador "->" sin ningún problema:
Código
  1. void ingreso(registro *reg, size_t num_regs)
  2. {
  3.   /* ... */
  4.  
  5.   (reg + i)->orden = i;
Pero me temo estoy repitiendo la explicación (en la primera pagina de este tema) de Blaster, por favor relee el tema con atención.

Un saludo


Título: Re: Array de estructura (struct) typedef y punteros[C].
Publicado por: DanielPy en 12 Febrero 2015, 13:55 pm
Hola rir3760.
Citar
……de Blaster, por favor relee el tema con atención.

(http://i62.tinypic.com/13ymsm8.png)
 :) :) :)
Tienes toda la razón, en definitiva se hizo un poco largo, pero realmente he aprendido mucho pero mucho con esto.- ;-) ;-) ;-)
Muchas gracias a todos por el tiempo [Solucionado].- 

Saludos.
Daniel



Título: punteros de manera dinamica?
Publicado por: normaaaaaaaa en 26 Mayo 2015, 01:00 am
Hola yo tengo una duda tengo este pedazo de codigo:

Código
  1. # include <iostream>
  2. # include <stdio.h>
  3. # include <stdlib.h>
  4. # include <cstring>
  5.  
  6. # include <Mascota.h>
  7. # include <Cacatuas.h>
  8.  
  9. using std::string;
  10. using namespace std;
  11.  
  12. int  totalMascotas=0;
  13.  
  14. int main()
  15. {
  16.    int numMas, a,resp;
  17.  
  18.    Mascota *cacatuas=new Cacatuas;
  19.  
  20.    cout <<"¿Cuantas mascotas tiene?"<<endl;
  21.    cin>>numMas;
  22.  
  23.    for (a=0;a<numMas;a++){
  24.        cacatuas->pedirDatos();}
  25.  
  26.    for (a=0;a<numMas;a++){
  27.        cout <<"Los datos de  la cacatua son:";
  28.       cout<<((Cacatuas *)cacatua)->getespecieCacatua()<<endl;
  29.    }
  30.    return 0;
  31. }
  32.  
  33.  

Mi problemas esta que cuando mando a imprimir mi apuntador solo me imprime los ultimos valores que introduje en la ultima vuelta del ciclo y queria saber como puedo o si hay alguna forma de que mi apuntador pueda almacenar varios valores
Porfa ayuda!!!! es urgente


[MOD] No está permitido publicar un post por duplicado, el otro te ha sido borrado.

Usa las etiquetas GeShi para publicar codigo.

Mejor sería abrir un tema nuevo para tu problema.