[C] La duda eterna

Iniciado por n-utz, 5 Septiembre 2016, 02:13 AM

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

n-utz

Buenas noches gente, tengo una duda, estoy con un programa en el cual paso un array bidimensional de caracteres.

La cosa es que al pasarlo como pasaría un array unidimensional, en la función no es reconocido. La pregunta puntual es:

¿Cómo paso un array bidimensional de caracteres definido dentro del main a una función?. Había solucionado este problema poniendolo como variable global, pero quiero hacerla local.

Si es necesario apunto el código.

AlbertoBSD

int main(){
char variable[N][M];
funcion(variable);
}

void funcion(char variable[][]){
//codigo
}
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

n-utz

#2
Así lo hice y nada, te adjunto el main reducido con la función más reducida del programa[..]

EDITO: Ya me acordé como era, debes especificar siempre el tamaño del segundo parámetro del array, es decir las columas. EJ void funcion(array[][4]);


Gracias, pero...

Ahora tengo otra duda, el programa es un TATETI, que esta relleno de numeros el usuario elige el numero donde este sera reemplazado por el simbolo del jugador, una vez que gana, el programa pregunta si se desea volver a jugar, mi idea es colocar alli un llamado a main para que comience el juego nuevamente pero debo limpiar el tablero, es decir llenar el array nuevamente con los numeros originales y no lo podria estar haciendo, al imprimirlo por primera vez lo imprime con los numeros, pero cuando entra en la funcion de comprobacion de si hay ganador, este lo confirma directamente con el tablero viejo.


AlbertoBSD

Si lo manejaras como apuntadores la cosa seria mas sencilla:

funcion(char **variable)
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

n-utz

Cita de: n-utz en  5 Septiembre 2016, 02:39 AM
[...]
EDITO: Ya me acordé como era, debes especificar siempre el tamaño del segundo parámetro del array, es decir las columas. EJ void funcion(array[][4]);


Gracias, pero...

Ahora tengo otra duda, el programa es un TATETI, que esta relleno de numeros el usuario elige el numero donde este sera reemplazado por el simbolo del jugador, una vez que gana, el programa pregunta si se desea volver a jugar, mi idea es colocar alli un llamado a main para que comience el juego nuevamente pero debo limpiar el tablero, es decir llenar el array nuevamente con los numeros originales y no lo podria estar haciendo, al imprimirlo por primera vez lo imprime con los numeros, pero cuando entra en la funcion de comprobacion de si hay ganador, este lo confirma directamente con el tablero viejo.



Tengo que leerme punteros, es algo pendiente hace rato, aca cite mi comentario con mi nuevo problema, te adjunto el codigo lo mas reducido que pueda, a ver si me ayudas.


void movimientox(char movi, char tateti[][3]);

int main(){

char tateti[3][3]= {'1','2','3','4','5','6','7','8','9'};
int i,j;

char mov, mov2, jugar;

for(i=0;i<3;i++){
        printf("\t");
    for(j=0;j<3;j++){
        printf("%c",tateti[i][j]);

    }
    printf("\n");
}
while(!termina(ganador, tateti)){
printf("\nJuega jugador X\t");
fflush(stdout);
scanf("%c", &mov);
getchar();
movimientox(mov, tateti);
termina(ganador, tateti);
ganador=termina(ganador, tateti);
if(ganador){
    printf("GANO EL JUGADOR X, FELICITACIONES!\n");
    system("pause");
    system("cls");
    printf("Desea volver a jugar? Y/N"  );
    fflush(stdout);
    scanf("%c", &jugar);
    switch(jugar){
        case 'Y': main();
        case 'y': main();
        case 'N': break;;
        case 'n': break;}
}

void movimientox(char movi, char tateti[][3]){
    int x, y;

    for(x=0;x<3;x++){
        printf("\t");
    for(y=0;y<3;y++){
        if(tateti[x][y]==movi)tateti[x][y]='X';

        printf("%c", tateti[x][y]);
    }
    printf("\n");
}}


Coloque solo la parte de la funcion en cuestion, definida arriba.

AlbertoBSD

Hola, no deberia de llamar a main.

Lo que se debe de realizar es un meter todo en un ciclo do-while y preguntar al usuario por continuar el juego o no.

int main(){
bool entrar = true;
do {
//Inicilizar TATETI, Rellenar la Matriz etc...

//JUGAR

//Evaluar si el usuario quiere salir
if(something == other) {
entrar = false;
}
}while(entrar);
}
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

n-utz

Igualmente no se me soluciona el problema ya que las funciones quedan cargadas con el tablero anterior, por mas que lo inicialice dentro de un bucle.

AlbertoBSD

Entonces deberías de cambiar el como trabajan esas funciones.

El detalle esta en que no se deberia de llamar a main. Tendrias que tener una función que inicialize el tablero y deje todas las variajes como si nunca si hubiera jugado.

Por ejemplo para reinicializar el tablero


int main(){
bool entrar = true;
char tateti[3][3];
do {

for(int i = 0; i < 3;i++){
for(int j = 0; j < 3;j++){
tateti[i][j] = '1' + (i*3) + j;
}
}
//Inicilizar TATETI, Rellenar la Matriz etc...

//JUGAR

//Evaluar si el usuario quiere salir
if(something == other) {
entrar = false;
}
}while(entrar);
}


Asi en cada do el tablero estaria inicializado como la primera vez.

Tendrías que realizar algo similar para las otras variables

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

user-marcos

Si haces:
Código (cpp) [Seleccionar]
int function(int Matriz[][]);
El compilador te dice:
error: declaration of 'Matriz' as multidimensional array must have bounds for all dimensions except the first

Por lo tanto la única dimensión de la matriz que puedes dejar vacía es al primera.

Código (cpp) [Seleccionar]
#define SIZE 8
int function(int Matriz[][SIZE]);
int main(){}