Autor Tema: Identificar un determinado campo de una estructura en la función. [C]  (Leído 4338 veces)

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

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Hola, ¿que tengan un muy buen día? -
En la función se nota como lo hago en este momento, pero me gustaría saber si se puede identificar el campo en la función sin pasarle un parametro identificador. -

Llamada a función:
Código: C
  1. get_String( (ptrAlumno+max)->nombre, max, iden );
  2.  
  3.                 iden = 1;
  4.                 get_String( (ptrAlumno+max)->direccion, max, iden );

Código: C
  1. void get_String( char *strNomDir, int max, int iden ){
  2.         int ok, i=0, j=0, espacios=0, espIzquierda=0;
  3.         char iDen[13];
  4.         (iden == 0) ?  strcpy( iDen, "el nombre" ) : strcpy( iDen, "la dereccion" ) ;
  5.  
  6.         do{
  7.                 ok=1;
  8.                 printf("\n Ingresa %s del alumno [%d]......:", iDen, max+1);

Saludos y muchas gracias por el tiempo que le dediquen al tema.-
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.-

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Identificar un determinado campo de una estructura en la función. [C]
« Respuesta #1 en: 01 de Febrero de 2017, 20:36:25 »
Primero, puede que no te responda por un tiempo, por que acabo dar de baja a internet y no voy a poder acceder al mismo.

Pero creo que estas equivocado en tu forma de programar. Si programas algo es para que luego lo puedas reutilizar, y solo cambias aquello que es especifico al proyecto.
Por eso mismo en el anterior hilo yo hice una funcion que se llama "get_String" la cual lo unico que hace es.. Tomar el string, limpiarlo y devolver eso. Nada mas.
Si por algun motivo yo tengo que agregar otro campo, suponete que sea "Lugar de Nacimiento" yo no tengo que modificar get_String para acomodar esto nuevo, simplemente vuelvo a utilizar el mismo codigo.

Codigo al que hago referencia:
http://www.todopic.com.ar/foros/index.php?topic=47256.msg394038#msg394038

Como era un programa corto, lo referente y exclusivo al proyecto era lo que estaba en el main, Yo podia ver en el main que sucedia en todo el proyecto:
- Lo que se imprime en pantalla
- Lo que pido (Numero o string)
- En caso de que se reporte algun error que imprimir.

Actualmente lo que intentas hacer es un codigo que resulta muy dificil luego de modificar, te vas a pasar el tiempo tratando de agregar algo. Y lo peor es que lo va a hacer menos legible para cualquiera que lo lea.

De todas formas te doy una especie de respuesta para tu pregunta aca.

Cuando queres hacer cosas asi, es muy dificil tratar de recorda cual es el 0, cual es el 1, cual es el 2, etc. Asi que lo mejor es darle nombres, pero tenes que pasar numeros...
Para eso podemos usar
- el ENUM, es como "darle nombre a los numeros"
- Define

Código: C
  1. #define NOMBRE  0               // Nombre va a tener el valor 0, por que nosotros se lo pedimos
  2. #define DIRECCION  1            // Direccion va a tener el valor 1, continuando lo anterior o si le ponemos el igual le asignamos un valor
  3.  
  4.  
  5. const char * TiposString[]={"el nombre","la direccion"}; //Verificar que esa linea sea correcta!
  6.  
  7. void get_String( char *strNomDir, int max, int iden ){
  8.         int ok, i=0, j=0, espacios=0, espIzquierda=0;
  9.  
  10.         // Proteccion de valores
  11.         if(iden >= sizeof TiposString)           // Verificar que esta linea sea correcta. Creo que le falta ser dividido por sizeof(char *), la idea es que tenga un 2 alli, es decir: iden >= 2
  12.         {
  13.                 //Error no se dio ni nombre ni direccion
  14.                 return 0;
  15.         }
  16.        
  17.  
  18.         do{
  19.                 ok=1;
  20.                 printf("\n Ingresa %s del alumno [%d]......:", TiposString[iden], max+1);

Otra cosa mas, utiliza nombres que identifiquen las variables, por mas que sean un poco mas largas, usualmente los IDEs con CTRL + Espacio te dan las opciones de autocompletado.
Cualquier se podria confundir creyendo que iden e iDen son iguales, pero C es case sensitive.

-----------

La otra para no pasar eso en un parametro es modificar la estructura para que contenga el tipo

Código: C
  1. typedef struct {
  2.         char texto[30];
  3.         int tipo;
  4. } texto_t;
  5.  
  6. typedef struct{
  7.         texto_t nombre;
  8.         texto_t direccion;
  9.         int edad;
  10. }alumno;

y podrias usarlo:

Código: C
  1. get_String( (ptrAlumno+max)->nombre, max);
  2.  
  3. void get_String( texto_t * NomDir, int max){
  4.         int ok, i=0, j=0, espacios=0, espIzquierda=0;
  5.  
  6.  
  7.         do{
  8.                 ok=1;
  9.                 printf("\n Ingresa %s del alumno [%d]......:", TiposString[NomDir->tipo], max+1);
  10.  
  11. // Para acceder/guardar al texto es:
  12.  
  13. NomDir->texto

Aunque sigo pensando que ante un cambio se hace demasiado dificil.
Y aunque no le agregues ningun cambio, de todas formas se hace dificil el leerlo, me refiero a que te tenes que pasar un buen tiempo leyendolo para entenderle
« Última modificación: 01 de Febrero de 2017, 20:40:21 por KILLERJC »

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Identificar un determinado campo de una estructura en la función. [C]
« Respuesta #2 en: 01 de Febrero de 2017, 21:19:28 »
Hola.
por lo que noto sos el único que responde y si ya no lo vas a hacer para que seguir en este foto. -
Igual muchas gracias por todo lo que me enseñaste y te deseo mucha felicidad. -

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Identificar un determinado campo de una estructura en la función. [C]
« Respuesta #3 en: 01 de Febrero de 2017, 22:38:31 »
Soy el unico que respondio antes y otras personas tal ves dejaron pasar al ver ya respuesto el tema, pero hay mucha gente que te puede ayudar tambien, no soy el unico.

Ademas voy a estar sin internet unos dias nomas. Vuelvo cuando me puedan bajar la linea en la otra casa.

PD: Acabo de ver que dice:

Citar
pero me gustaría saber si se puede identificar el campo en la función sin pasarle un parametro identificador. -

No, no podrias, de todas formas tendrias que pasar un parametro sino no tenes forma de distinguir entre uno u otro.
« Última modificación: 02 de Febrero de 2017, 00:39:55 por KILLERJC »


 

anything