Esto está mal, es decir está bien pero no funcionará tal como esperas. Para cada declaracion de la estructura 'persona' se ejecuta la llamada a la funcion 'persona()' (el segundo campo de tu struct es una llamada a la funcion); como se da el caso que tienes declarado un array de 2 estructuras pues se ejecuta dos veces la funcion 'persona()' ok?
Código:
#define MP 2
struct persona {
char nom[MAX],tel[MAX];
persona ();
} t[MP];
Al hacer t[MP] la aplicacion ejecuta lo siguiente: inicia la carga de t[0], reserva MAX bytes para 'nom' en t[0], reserva MAX bytes para 'tel' en t[0], ejecuta 'persona()', inicia la carga de t[1], reserva MAX bytes para 'nom' en t[1], reserva MAX bytes para 'tel' en t[1] y ejecuta 'persona()'. Si declaras el array con 5 structs veras que la funcion se ejecuta 5 veces.
Lo ideal para eso es llamar a la funcion de inicio desde el main; de momento entras los nombres disponibles manualmente y mas adelante seguramente haras un archivo a modo de agenda. Esta funcion que te carga los datos iniciales no puede estar dentro del struct a menos que el struct sea una clase. Si aun no has trabajado con clases puedes quitar la funcion del struct y llamarla desde el main (o si pones una opcion de recargar):
Código:
typedef struct {
char nom[MAX];
char telefon[MAX];
} AGENDA;
AGENDA agenda[MP];
void carrega_agenda() {
for (int i = 0; i < MP; i++)
{
cout << "Introdueix el nom i telefon " << " i == " <<i << " < " << MP << " : ";
cin >> t[i].nom >> t[i].tel;
}
}
int main() {
carrega_agenda();
do {
...
} while...
return 0;
}
Y ya que estas trabajando en c++ tal vez te interese echar un vistazo (ademas de a las clases) a los vectores, te permitira usar una lista de personas no limitada.
Saludos
vosk