Autor
|
Tema: [C] La duda eterna (Leído 4,742 veces)
|
n-utz
Desconectado
Mensajes: 165
Babylon es el vampiro!
|
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.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
int main(){ char variable[N][M]; funcion(variable); } void funcion(char variable[][]){ //codigo }
|
|
|
En línea
|
|
|
|
n-utz
Desconectado
Mensajes: 165
Babylon es el vampiro!
|
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.
|
|
« Última modificación: 5 Septiembre 2016, 02:48 am por n-utz »
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
Si lo manejaras como apuntadores la cosa seria mas sencilla: funcion(char **variable)
|
|
|
En línea
|
|
|
|
n-utz
Desconectado
Mensajes: 165
Babylon es el vampiro!
|
[...] 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.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
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); }
|
|
|
En línea
|
|
|
|
n-utz
Desconectado
Mensajes: 165
Babylon es el vampiro!
|
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.
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
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!
|
|
|
En línea
|
|
|
|
user-marcos
Desconectado
Mensajes: 159
|
Si haces: 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. #define SIZE 8 int function(int Matriz[][SIZE]); int main(){}
|
|
|
En línea
|
|
|
|
|
|