Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: LeoXsiempre en 8 Abril 2015, 03:07 am



Título: C++. Cargar una matriz de struct usando archivos de cabeceras
Publicado por: LeoXsiempre en 8 Abril 2015, 03:07 am
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])'|


Título: Re: C++. Cargar una matriz de struct usando archivos de cabeceras
Publicado por: eferion en 8 Abril 2015, 08:17 am
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
  1. typedef struct {int padron; string nombre;}datos;
  2. 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++:

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


Título: Re: C++. Cargar una matriz de struct usando archivos de cabeceras
Publicado por: LeoXsiempre en 10 Abril 2015, 00:34 am
AAh listo, a seguir practicando entonces.
Muchas gracias.
Saludos.