Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: BJM en 10 Octubre 2012, 17:42 pm



Título: ACLARACION EN ACCESO A STRUCT
Publicado por: BJM en 10 Octubre 2012, 17:42 pm
Este programa no esta terminado solo quiero que me aclaren si al acceder a cada struct en este caso seccion1, seccion2, seccion3, debo declarar un puntero por cada struct o puedo utilizar un puntero general supongamos *pt?

struct { struct seccion1;
         struct seccion2;
         struct seccion3;
         } secciones, *p1=&secciones,*p2=secciones,*p3=secciones;
         
struct { char asignatura1;
         char asignatura2;
         char asignatura3;
         char asignatura4;
         char asignatura5;
         } seccion1,seccion2,seccion3,

main(){
       
       struct *p1,*p2,*p3,*cat;
       int opc,n;
       
       p1=(secciones*)malloc(sizeof(secciones));
       p2=(secciones*)malloc(sizeof(secciones));
       p3=(secciones*)malloc(sizeof(secciones));
     
int menu(){
       cout<<"\n MENU \n";
       cout<<"1..Ingreso sección 1 (5 materias)\n";
       cout<<"2..Ingreso sección 2 (4 materias)\n";
       cout<<"3..Ingreso sección 3 (2 materias)\n";
       cout<<"4..Volver al menu \n";
       cout<<"5..salir\n";
       cin>>opc;
       return(opc);
       }
       
       switch (menu()):
       case 1:
       ingreso(p1->secciones.seccion1,&n=5);
       break;
       case 2:
       ingreso(p2->secciones.seccion2,&n=4);
       break;
       case 3:
       ingreso(p3->secciones.seccion3,&n=2);
       break;
       case 4:
       menu();
       break;
       default:
       break;
       }
       
void ingreso(struct p1->secciones.seccion1,int *cat){

if(*cat>0){
cout<<"\n Ingrese asignatura 1: "; cin>>p1->secciones.seccion1.asignatura1;
cout<<"\n Ingrese asignatura 2: "; cin>>p1->secciones.seccion1.asignatura2;

if(*cat<=2){
cout<<"\n Ingrese asignatura 3: "; cin>>p1->secciones.seccion2.asignatura3;
cout<<"\n Ingrese asignatura 4: "; cin>>p1->secciones.seccion2.asignatura4;
}
if(*cat<=5){
cout<<"\n Ingrese asignatura 5: "; cin>>p1->secciones.seccion1.asignatura5;
}
}



Título: Re: ACLARACION EN ACCESO A STRUCT
Publicado por: avesudra en 10 Octubre 2012, 17:57 pm
Hola Mari2012 , no, no tienes porqué declarar un puntero por cada struct , accedes directamente con el operador '.' sin las comillas y un apunte las estructuras seccion1 , sección2 y seccion3 tienes que declararlas antes de la estructura secciones ya que las utiliza.

Otra aclaración , las funciones no se declaran dentro de las llaves del main normalmente, es decir :
Código
  1. #include <iostream>
  2. //Declaramos las funciones
  3. int ejemplo_funcion1 ();
  4. int ejemplo_funcion2 ();
  5. int ejemplo_funcion3 ();
  6. int main()
  7.  {
  8.  
  9.  }//Fin del main.
  10.  //Definimos las funciones
  11. int ejemplo_funcion1 ()
  12.  {
  13.    return 0;
  14.  }
  15. int ejemplo_funcion2 ()
  16.  {
  17.    return 0;
  18.  }
  19. int ejemplo_funcion3 ()
  20.  {
  21.  return 0;
  22.  }
  23.  

PD : No escribas en mayúsculas, dá mala impresión antes de leer el mensaje, por lo menos a mí , y cuando vayas a postear un código , lo seleccionas y te vas donde pone GeSHi , abres el menú desplegable y seleccionas el lenguaje que sea para que se vea coloreado como el de arriba.

¡Un saludo!  ;D


Título: Re: ACLARACION EN ACCESO A STRUCT
Publicado por: BJM en 10 Octubre 2012, 20:45 pm
Gracias avesudra, tenia en cuenta que faltaba los prototipos de funciones, el codigo no lo he terminado, tambien para la proxima omitire las mayusculas, la mayoria no lo utiliza, ahora tengo una nueva duda en la linea 20, el compilador indica :
 variable or field `ingreso' declared void

Código
  1. #include<stdio.h>            
  2. #include<stdlib.h>
  3. #include<iostream>
  4. using namespace std;
  5.  
  6.  
  7. struct { char asignatura1;
  8.         char asignatura2;
  9.         char asignatura3;
  10.         char asignatura4;
  11.         char asignatura5;
  12.         } seccion1,seccion2,seccion3;
  13.  
  14.         struct { struct seccion1;
  15.                  struct seccion2;
  16.                  struct seccion3;
  17.                  } secciones, *pt=&secciones;
  18.  
  19. int menu(int opc);
  20. void ingreso(struct *,int *);
  21.  
  22. main(){
  23.  
  24.       struct *pt;
  25.       int opc,n,*cat;
  26.  
  27.  
  28.       pt=(secciones*)malloc(sizeof(secciones));
  29.  
  30.       switch (menu(opc)){
  31.       case 1:
  32.       ingreso(pt->secciones.seccion1,&n=5);
  33.       break;
  34.       case 2:
  35.       ingreso(pt->secciones.seccion2,&n=4);
  36.       break;
  37.       case 3:
  38.       ingreso(pt->secciones.seccion3,&n=2);
  39.       break;
  40.       case 4:
  41.       break;
  42.       default:
  43.       cout<<"\n OPCION INVALIDA";
  44.       break;
  45.       }
  46.  
  47.       system("pause");
  48.       }
  49.  
  50.       int menu(int opc){
  51.       cout<<"\n MENU \n";
  52.       cout<<"1..Ingreso sección 1 (5 materias)\n";
  53.       cout<<"2..Ingreso sección 2 (4 materias)\n";
  54.       cout<<"3..Ingreso sección 3 (2 materias)\n";
  55.       cout<<"4..salir\n";
  56.       cin>>opc;
  57.       return(opc);
  58.       }
  59.  
  60. void ingreso(struct pt->secciones.seccion1,int *cat){
  61. do{
  62. if(*cat>0){
  63. cout<<"\n Ingrese asignatura 1: "; cin>>pt->secciones.seccion1.asignatura1;
  64. cout<<"\n Ingrese asignatura 2: "; cin>>pt->secciones.seccion1.asignatura2;
  65. }
  66. if(*cat>2){
  67. cout<<"\n Ingrese asignatura 3: "; cin>>pt->secciones.seccion2.asignatura3;
  68. cout<<"\n Ingrese asignatura 4: "; cin>>pt->secciones.seccion2.asignatura4;
  69. }
  70. if((*cat>4)&&(*cat<=5)){
  71. cout<<"\n Ingrese asignatura 5: "; cin>>pt->secciones.seccion1.asignatura5;
  72. }
  73. }while(*cat<=5);
  74. }


Título: Re: ACLARACION EN ACCESO A STRUCT
Publicado por: avesudra en 10 Octubre 2012, 22:25 pm
Mmmm pues es porque no indicas cual es la estructura a pasar es decir , tu para poner un puntero a una estructura tienes que poner cual es la estructura:
Código
  1. void ingreso(struct tipo * , int *);
Aunque en tu código veo innecesario el paso de la estructura pues después siempre asignas el mismo campo, no sé si notas que la estructura secciones es global.
Otra cosa a corregir , en C:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
En C++ :
Código
  1. #include <cstdio>
  2. #include <cstdlib>
Tienes un poco de lio con los punteros y las estructuras.Para declarar una estructura puedes hacer esto:
Código
  1. struct base_de_datos
  2. {
  3. char nombre[100];
  4. char apellidos[100];
  5. int edad;
  6. };
  7. int main()
  8. {
  9. //y ahora declaras una variable de tipo base_de_datos así:
  10. base_de_datos listacompleta1;
  11. }
Si lo hacemos como tu haces tenemos:
Código
  1. struct
  2. {
  3. char nombre[100];
  4. char apellidos[100];
  5. int edad;
  6. }base_de_datos;//VARIABLE O ESTRUCTURA GLOBAL!!!!
  7. int main()
  8. {
  9. //ya no puedes declarar una estructura igual a base_de_datos
  10. //pero base_de_datos es una estructura
  11. }

Yo que tú le pegaba un buen repaso a las estructuras , haría algo con ellas un poco complejo y después pasas al manejo de punteros con ellas , si no te puedes volver loco/a.


Título: Re: ACLARACION EN ACCESO A STRUCT
Publicado por: BJM en 11 Octubre 2012, 17:18 pm
Si tendre que reforzar la base, ahora estoy probando otra manera de manipular los punteros en este caso, si tengo:

Código
  1. struct{ int linea1;
  2.           int linea2;
  3.           int linea3;
  4.           int linea4;
  5.           int linea5;
  6.          }turno1,turno2,turno3,*pt;


 
Código
  1. pt=&turno1;
  2. pt=&turno2;
  3. pt=&turno3;

Es decir:

Código
  1. struct{ int miembro1;
  2.          int miembro2;
  3.          int miembro n;
  4.         }variable1, variable2, variable n,*pt;
  5.  
  6. Es necesario asignarle la direccion de cada variable a pt ?
  7.  
  8. pt=&variable1;
  9. pt=&variable2;
  10. pt=&variable n;

 ;D





Título: Re: ACLARACION EN ACCESO A STRUCT
Publicado por: avesudra en 11 Octubre 2012, 21:25 pm
Pero es que no tienes nada claro porque date cuenta que ahí en ese pedazo de código , el puntero pt termina apuntando SOLO a variable n , que por cierto un nombre de una variable no puede llevar espacios. Y no hace falta asignarle un puntero a una variable global , que ya es accesible en todo el programa.