C++. Cargar una matriz de struct usando archivos de cabeceras

Iniciado por LeoXsiempre, 8 Abril 2015, 03:07 AM

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

LeoXsiempre

Hola estoy trabajando es c++ desde hace poco tiempo, quise hacer algo mas jugado, pero nose que estoy haciendo mal. Arme una matriz de struct pero nose si estoy usando mal las cabeceras o utilizando mal los typedef. Si alguien me puede ayudar se lo agradecería mucho.
En funciones.h tengo:

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

typedef struct {int padron; string nombre;}datos;
typedef datos alumno[2][2];

void cargarmatriz(alumno alu);
void imprime(alumno alu);

En funciones.cpp tengo:

#include <iostream>
#include <string>
#include <cstdlib>
#include "funciones.h"


using namespace std;


void cargarmatriz(alumno alu)
{
   for(int i=0; i<2; i++)
   {
       for(int j=0; j<2; j++)
       {
           cout << "padron: " << endl;
           cin >> alu[j].padron;
           cout << "nombre " << endl;
           cin >> alu[j].nombre;
           cout << endl;
       }
   }
}

void imprime(alumno alu)
{
   for(int r=0; r<2; r++)
   {
       for(int t=0; t<2; t++)
       {
           cout << alu[r][t].padron << endl;
           cout << alu[r][t].nombre << endl;
       }
   }
}

Y finalmente en main.cpp:

#include <iostream>
#include <string>
#include <cstdlib>
#include "funciones.h"

using namespace std;

int main()

{
   typedef struct {int padron; string nombre;}datos;
   typedef datos alumno[2][2];

   alumno alu;

   cargarmatriz(alu);
   imprimir(alu);
   return 0;
}

El error me lo marca en cargarmatriz y el mensaje es:
...main.cpp|26|error: cannot convert 'main()::datos (*)[2]' to 'datos (*)[2]' for argument '1' to 'void cargarmatriz(datos (*)[2])'|

eferion

Bienvenido al foro.

Lo primero, el código lo tienes que decorar con las etiquetas GeSHi. Son las normas del foro y, además, mejora su legibilidad.

Un consejo: en C++ no hace falta usar typedef para declarar las estructuras o las clases. Las dos líneas de código siguientes son equivalentes en C++:

Código (cpp) [Seleccionar]
typedef struct {int padron; string nombre;}datos;
struct datos{int padron; string nombre;};


Vamos con tu error. A ver, typedef se usa para definir un alias... si el alias lo defines en un archivo de cabecera, todos los ficheros que incluyan dicha cabecera tendrán acceso a dicho alias.

En tu caso el problema es que estás definiendo dos veces el alias "datos"... uno a nivel global y otro dentro del main. El conflicto que esto genera se basa en que el alias del main únicamente tiene validez dentro del main... y no solo eso... no solo su ámbito es diferente, también lo es su "nombre interno" de cara al compilador C++:

Citarmain.cpp|26|error: cannot convert 'main()::datos (*)[2]' to 'datos (*)[2]' for argument '1' to 'void cargarmatriz(datos (*)[2])'|

es básicamente lo que te está diciendo el mensaje de error... no sabe cómo convertir main::datos a ::datos.

La solución es tan simple como quitar el typedef del main.

Un saludo.

LeoXsiempre

AAh listo, a seguir practicando entonces.
Muchas gracias.
Saludos.