所以...我正在参加河内塔计划,这打破了整个事情...请您帮助我吗?这是我的第一个问题,我真的不知道这是如何工作的:(在主函数中宣布" tablero"时会破裂
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void imprime(int *tab, int fil, int col, int ultNum, char name[64], char caso, int count, int filOrig, int filDest) {
/*
Precondición:
*tab Puntero a una matriz de tipo entero.
fil Entero que indica el numero de filas de la matriz.
col Entero que indica el numero de columnas de la matriz.
disc Parámetro de tipo entero que indica el numero de discos usados.
ultNum Entero que indica el numero que esta usando el disco mas grande.
*/FILE *f;
switch (caso) {
case 119:
f = fopen(name, "w");
break;
case 97:
f = fopen(name, "a");
break;
default:
printf("no file");
break;
};
int j, c;
int i, esp;
printf("Move %d to %d, movement number %d n", filOrig, filDest, count);
for (c = col - 1; c >= 0; c--) {
for (j = 0; j < fil; j++) {
esp = (ultNum - tab[col * j + c]) / 2;
// Espacios a la izquierda
for (i = 0; i < esp; i++) {
fprintf(f, " ");
printf(" ");
};
// Imprime los comodines
for (i = 0; i < tab[col * j + c]; i++) {
fprintf(f, "*");
printf("*");
};
// Espacios a la derecha
for (i = 0; i < esp; i++) {
fprintf(f, " ");
printf(" ");
}
fprintf(f, "t");
printf("t");
};
fprintf(f, "rn");
printf("n");
};
printf("n n n n n");
fprintf(f, " rn rn rn rn rn ");
fclose(f);
count++;
};
void mueveDisco(int *tab, int fil, int col, int ultNum, int filOrig, int filDest, char name[64], char caso, int count) {
/*
Precondición:
*tab Puntero a una matriz de tipo entero.
fil Entero que indica el numero de filas de la matriz.
col Entero que indica el numero de columnas de la matriz.
disc Parámetro de tipo entero que indica el numero de discos usados.
ultNum Entero que indica el numero que esta usando el disco mas grande.
filOrig Entero que indica el numero de fila de la matriz en la cual hay que coger el numero/disco
filDest Entero que indica el numero de fila de la matriz en la cual hay que dejar el numero/disco.
Poscondición:
Se mueve el disco y se llama a la función que imprime el tablero.
*/
int cO = col - 1, cD = col - 1;
// Se busca el disco que se encuentre mas arriba y por lo tanto el mas pequeño de la fila de origen.
while (cO >= 0 && tab[col * filOrig + cO] == 0) {
cO--;
};
if (cO < 0)
cO = 0;
// Ahora se calcula cual es la posición libre mas arriba de la fila de destino
while (cD >= 0 && tab[col * filDest + cD] == 0) {
cD--;
};
// Se mueve el disco de la fila de origen a la de destino:
tab[col * filDest + cD + 1] = tab[col * filOrig + cO];
tab[col * filOrig + cO] = 0;
// Se imprime el tablero:
imprime(tab, fil, col, ultNum, name, caso, count, filOrig, filDest);
};
void hanoi(int *tab, int fil, int col, int disc, int ultNum, int O, int A, int D, char name[64], char caso, int count) {
/*
Precondición:
*tab Puntero a una matriz de tipo entero.
fil Entero que indica el numero de filas de la matriz.
col Entero que indica el numero de columnas de la matriz.
disc Parámetro de tipo entero que indica el numero de discos usados.
ultNum Entero que indica el numero que esta usando el disco mas grande.
O,A,D Tres enteros que indican la fila desde donde se ha de coger el disco y a donde se ha de traspasar. La primera vez que se llama a hanoi tienen los valores de: 0 ,1 y 2 respectivamente.
Poscondición:
Se llama recursivamente a hanoi hasta resolver el tablero.
*/
if (disc == 1) {
// Se borra la pantalla, se imprime la tabla y se hace una pausa que varia dependiendo del numero de discos:
mueveDisco(tab, fil, col, ultNum, O, D, name, caso, count);
if (col <= 5) system("sleep 0.8");
else if (col <= 10) system("sleep 0.3");
else if (col <= 15) system("sleep 0.06");
else if (col > 15) system("sleep 0.02");
} else {
hanoi(tab, fil, col, disc - 1, ultNum, O, D, A, name, caso, count);
mueveDisco(tab, fil, col, ultNum, O, D, name, caso, count);
if (col <= 5) system("sleep 0.8");
else if (col <= 10) system("sleep 0.3");
else if (col <= 15) system("sleep 0.06");
else if (col > 15) system("sleep 0.02");
hanoi(tab, fil, col, disc - 1, ultNum, A, O, D, name, caso, count);
};
};
int main(int argc, char *argv[]) {
int k; /* Value for the "-q" optional argument. */
time_t t = time(NULL);
struct tm *tm = localtime(&t);
char s[64];
strftime(s, sizeof (s), "%c", tm);
printf("%sn", s);
char name[64];
int fil = 3, col = 3, *tablero = NULL;
int j, c, disc = 1, ultNum;
int count = 0;
char caso;
int i;
/*
printf("Escoja nombre del fichero :");
scanf("%s", &name);
printf( "Indique el numero de discos: " );
scanf( "%i", &col );
printf("Seleccione operacion en fichero: n1. Añadir texto al archivon2. Reescribir archivo si existen3. No imprimir en archivon");
scanf ("%d", &caso);
*/
for (i = 0; i < argc; i++) {
if (strcmp(argv[i], "-d") == 0) {
col = atoi(argv[i + 1]);
}
if (strcmp(argv[i], "-f") == 0) {
sprintf(name, "%s.txt", argv[i + 1]);
}
if (strcmp(argv[i], "-o") == 0) {
caso = argv[i + 1];
}
}
printf("hace el forn");
FILE *f;
printf("hace el filen");
switch (caso) {
case 119:
f = fopen(name, "w");
printf("escribí la wn");
break;
case 97:
f = fopen(name, "a");
printf("escribi la an");
break;
default:
printf("no filen");
break;
};
printf("hace el switchn");
tablero = (int *) malloc(sizeof (int)*fil * col); //peta aqui
printf("hice el sizeof");
// Resetea las torres poniendo "los discos" en una de ellas y 0 en el resto.
for (j = 0; j < fil; j++)
for (c = col - 1; c >= 0; c--)
if (j == 0) {
tablero[col * j + c] = disc;
disc += 2;
} else
tablero[col * j + c] = 0;
ultNum = disc;
fprintf(f, " Comand line entered: rn Number of towers : %d nn Number of discs: : %d nn Output filename : %s rn rn Init time : %s rn rn rn", fil, col, name, s);
fclose(f);
printf(" n n Comand line entered: n Number of towers : %d n Number of discs: : %d n Output filename : %s n n Init time : %s n n n", fil, col, name, s);
// Se imprime el tablero antes de iniciar ningún movimiento:
system("clear");
imprime(tablero, fil, col, ultNum, name, caso, count, 0, 0);
system("sleep 1");
// Se llama a hanoi para comenzar "la partida":
hanoi(tablero, fil, col, col, ultNum, 0, 1, 2, name, caso, count);
f = fopen(name, "a");
fprintf(f, " rn rn Fin Time : %s", s);
fclose(f);
return (0);
};
尚不清楚您的意思是什么,如果是汇编错误,那么这与该特定行无意义,因为已经存在其他错误防止代码构建。
如果是运行时错误(运行时会崩溃),则没有任何意义,因为代码未构建。
编写特定行的更好方法是:
tablero = malloc(fil * col * sizeof *tablero);
这个
- 避免
malloc()
的返回值的演员 - 在目标指针上使用
sizeof
,避免重复该类型