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

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

0 Miembros y 3 Visitantes están viendo este tema.

_Enko

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 (cpp) [Seleccionar]
typedef struct contacto{
int orden, celular;
char nombre[30], apellido[30], calle[30], ciudad[30], correo[50];
};


void ingresar_datos_(contacto* cntcto)
{
   cntcto->orden = 5;
}

int main(int argc, char *argv[]) {
   
   contacto miagenda[10];
   ingresar_datos_(&miagenda[3]);
   miagenda[3].orden == 5;


Saludos.

eferion

Cita de: DanielC# en  9 Febrero 2015, 18:43 PM
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.

DanielPy

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

#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){
int bucle = 0, cont = 1;

do{
(*(*ptrContactos + cont)).orden = cont;
printf("\n\n orden.....................: = %d", (*(*ptrContactos + cont)).orden);

cont++;
}while(bucle >= 0 && cont <= 10);
}


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

#include <stdio.h>

typedef struct{
int dia, mes, año;
}_fecha;

void funcPuntero(_fecha *ptr);

int main(void){
_fecha fecha, *ptrFecha;

fecha.dia = 10;
fecha.mes = 2;
fecha.año = 2015;

printf("\n hoy es......: %d/%d/%d", fecha.dia, fecha.mes, fecha.año);

ptrFecha = &fecha;

ptrFecha->dia = 11;
ptrFecha->mes = 3;
ptrFecha->año = 2016;

printf("\n otra fecha..: %d/%d/%d", ptrFecha->dia, ptrFecha->mes, ptrFecha->año);

funcPuntero(&fecha);
printf("\n hoy es......: %d/%d/%d", ptrFecha->dia, ptrFecha->mes, ptrFecha->año);

getchar();
return 0;
}

void funcPuntero(_fecha *ptr){
ptr->dia = 10;
ptr->mes = 2;
ptr->año = 2015;
}


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

rir3760

Cita de: DanielC# en 10 Febrero 2015, 22:34 PMEste 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:
#include <stdio.h>

struct registro {
   int ordenint;
   int celular;
   char nombre[30];
   char apellido[30];
   char calle[30];
   char ciudad[30];
   char correo[50];
};

void ingreso(struct registro *reg, size_t num_regs);

int main(void)
{
   struct registro reg[10];
   ingreso(reg, sizeof reg / sizeof reg[0]);
   
   return 0;
}

void ingreso(struct registro *reg, size_t num_regs)
{
   size_t i;
   
   for (i = 0; i < num_regs; i++){
      /* Aqui procesas el elemento reg[i] */
   }
}


Un saludo
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

DanielPy

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 (.).-

#include <stdio.h>
     
typedef struct{
int orden;
int celular;
char nombre[30];
char apellido[30];
char calle[30];
char ciudad[30];
char correo[50];
}registro;
     
void ingreso(registro *reg, size_t num_regs);
     
int main(void){
registro reg[10];
ingreso(reg, sizeof reg / sizeof reg[0]);

getchar();
return 0;
}
     
void ingreso(registro *reg, size_t num_regs){
size_t i;
     
for (i = 0; i < num_regs; i++){
        reg[i].orden = i;
printf("\n orden = %d", reg[i].orden);
}
}


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

rir3760

Cita de: DanielC# en 11 Febrero 2015, 19:06 PMMe queda una duda, el array reg cuando está dentro de la función ingreso ¿no es un puntero al primer elemento del arreglo?
Correcto.

Cita de: DanielC# en 11 Febrero 2015, 19:06 PMy 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:
void ingreso(registro *reg, size_t num_regs)
{
   /* ... */
   
   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:
void ingreso(registro *reg, size_t num_regs)
{
   /* ... */
   
   (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
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

DanielPy

Hola rir3760.
Citar......de Blaster, por favor relee el tema con atención.


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

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

normaaaaaaaa

#17
Hola yo tengo una duda tengo este pedazo de codigo:

Código (cpp) [Seleccionar]

# include <iostream>
# include <stdio.h>
# include <stdlib.h>
# include <cstring>

# include <Mascota.h>
# include <Cacatuas.h>

using std::string;
using namespace std;

int  totalMascotas=0;

int main()
{
   int numMas, a,resp;

   Mascota *cacatuas=new Cacatuas;

   cout <<"¿Cuantas mascotas tiene?"<<endl;
   cin>>numMas;

   for (a=0;a<numMas;a++){
       cacatuas->pedirDatos();}

   for (a=0;a<numMas;a++){
       cout <<"Los datos de  la cacatua son:";
      cout<<((Cacatuas *)cacatua)->getespecieCacatua()<<endl;
   }
   return 0;
}



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.