2016-06-17 6 views
-3

so ...私はハノイのタワーズプログラムで働いており、これはすべてのことを壊して...あなたが私を助けてもらえますか?これが私の最初の質問です、と私は本当にそれがその後、コンパイルエラーだ場合は、この作業は:(メイン機能でこれはなぜプログラムを破壊するのですか? (私はcで動作しています)t tablero =(int *)malloc(sizeof(int)* fil * col);

#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, "\r\n"); 

     printf("\n"); 
    }; 


    printf("\n \n \n \n \n"); 

    fprintf(f, " \r\n \r\n \r\n \r\n \r\n "); 

    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("%s\n", 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 archivo\n2. Reescribir archivo si existe\n3. No imprimir en archivo\n"); 
     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 for\n"); 
    FILE *f; 
    printf("hace el file\n"); 
    switch (caso) { 
     case 119: 
      f = fopen(name, "w"); 
      printf("escribí la w\n"); 
      break; 
     case 97: 
      f = fopen(name, "a"); 
      printf("escribi la a\n"); 
      break; 
     default: 
      printf("no file\n"); 
      break; 
    }; 
    printf("hace el switch\n"); 
    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: \r\n Number of towers : %d \n\n Number of discs: : %d \n\n Output filename : %s \r\n \r\n Init time  : %s \r\n \r\n \r\n", 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, " \r\n \r\n Fin Time : %s", s); 

    fclose(f); 
    return (0); 
}; 
+0

を繰り返し避け、ターゲットポインタにsizeofを使用します - d <ディスク数> -f -o <ファイルのオープン/リード方法> –

+4

[コンパイルできません](http://cpp.sh/67cm)。 [mcve]を投稿してください。 –

+0

''空白のimprime'まで読んで、ぼやけて、 'Puntero a una ...'に続き、読んでいなくなった。私はあなたの母国語であなたのコメントを書こうとする衝動を理解していますが、このような文脈では、その有用性を著しく低下させます。私が翻訳者なしで解読できるコードをガイドなしに、少なくとも最小限ではないことを見て(Kenのコメントを参照)、私はこれを掘り下げていません。建設的な批判としてそれを取る。英語のコメントが優先され、転記する前にこれらの問題が特定されます。 – DevSolar

答えて

1

を「tablero」を宣言するとき、それは壊れるそれは、あなたが何を意味するかは非常に不明確だんのか分かりません

実行時エラー(実行時にクラッシュする)の場合、それは意味をなさないものの、特定の行に接続するのは意味がありません。コードが構築されないためです。

その特定の行を書き込むより良い方法は次のとおりです。

tablero = malloc(fil * col * sizeof *tablero); 

この

関連する問題