0

我正在尝试在 C 中编译此代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 100

void MARCAR(int L[MAX][MAX], int n, int m, int queijo_i, int queijo_j);
void GRAVAR(int L[MAX][MAX], int n, int m, int rato_i, int rato_j, int cam[], int   queijo_i, int queijo_j);
void push(int obj, int stack[], int *topo, int n, int m);
int pop(int stack[], int *topo);

void push(int obj, int stack[], int *topo, int n, int m)
{
    if(*topo + 1 < n * m)
    {
        stack[*topo] = obj;
        *topo = *topo + 1;
        printf("%i foi empilhado com sucesso", obj);
    }
    else
        printf("Stack Overflow");
}

int pop(int stack[], int *topo)
{
    int obj;
    if(*topo >=0)
    {
        obj = stack[*topo];
        *topo = *topo - 1;
        printf("%i foi desempilhado com sucesso", obj);
        return obj;
    }
    else
        printf("Stack Underflow");
    return -2;
}

void MARCAR(int L[MAX][MAX], int n, int m, int queijo_i, int queijo_j)
{
    int i, j;/*coordenadas da matriz*/
    int stack[MAX * MAX];
    int topo;
    int k;/*contador*/

    topo = 0;
    i = queijo_i;
    j = queijo_j;

    L[i][j] = 1;
    push(i, stack, &topo, n, m);
    push(j, stack, &topo, n, m);

    while(i < n && j < m)
    {
        k = 0;
        if(L[i][j + 1] == 0 && j < n)
        {
            push(i, stack, &topo, n, m);
            push(j + 1, stack, &topo, n, m);
            L[i][j + 1] = L[i][j] + 1;
        }
        else
            k++;
        if(L[i][j - 1] == 0 && j - 1 > 0)
        {
            push(i, stack, &topo, n, m);
            push(j - 1, stack, &topo, n, m);
            L[i][j + 1] = L[i][j] + 1;
        }
        else
            k++;
        if(L[i + 1][j] == 0 && i + 1 < m)
        {
            push(i + 1, stack, &topo, n, m);
            push(j, stack, &topo, n, m);
            L[i][j + 1] = L[i][j] + 1;
        }
        else
            k++;
        if(L[i - 1][j] == 0 && i - 1 > 0)
        {
            push(i - 1, stack, &topo, n, m);
            push(j, stack, &topo, n, m);
            L[i][j + 1] = L[i][j] + 1;
        }
        else
            k++;
        if(k >= 4)
            break;
        j = pop(stack, &topo);
        i = pop(stack, &topo);
        }

}

void GRAVAR(int L[MAX][MAX], int n, int m, int rato_i, int rato_j, int cam[], int queijo_i, int queijo_j)
{
    int k;/*contador*/
    int i, j; /*coordenadas da matriz L*/
    int l;/*cocomprimento do caminho*/

    k = 0;
    l = L[rato_i][rato_j];

    cam[0] = rato_i;
    cam[1] = rato_j;

   while( !(cam[k] == queijo_i && cam[k + 1] == queijo_j) && k < (n - 1) * (m - 1) )/*enquanto o rato nao chega no queijo ou o comprimento do caminho nao ultrapassa o tamanho da matrix*/
   {
       k++;
       i = cam[k];
       j = cam[k + 1];
       /*analisar as vizinhancas de (i, j)*/
       if( (L[i][j + 1] = l - 1) && (j + 1 < n) )
       {
           cam[k] = i;
           cam[k + 1] = j + 1;
       }
       if( (L[i][j - 1] = l - 1) && (j - 1 >= 0) )
       {
           cam[k] = i;
           cam[k + 1] = j - 1;
       }
      if( (L[i + 1][j] = l - 1) && (i + 1 < m) )
      {
          cam[k] = i + 1;
          cam[k + 1] = j;
      }
      if( (L[i - 1][j] = l - 1) && (i - 1 >= 0) )
      {
          cam[k] = i;
          cam[k + 1] = j + 1;
      }
      l = l - 1;
  }
}

int main(int argc, char *argv[])
{
        int i, j;/*coordenadas do labirinto*/
        int m, n; /*dimensoes da matriz*/
        int L[MAX][MAX];/*labirinto*/
        int cam[MAX * MAX]; /*menor caminho*/
        char *nomeEntrada;
        char *nomeSaida;
        FILE *arqEntrada;/*arquivo de entrada*/
        FILE *arqSaida;/*arquivo de saida*/
        int k;/*contador*/
        int rato_i;
        int rato_j;
        int queijo_i;
        int queijo_j;

        k = 0;

        if(argc != 3)/*não possui dois argumentos na linha de comando*/
        {
            printf("Digitar o nome do arquivo de entrada e de saida como parâmetros!\n");
            scanf("%s %s", nomeEntrada, nomeSaida);
            printf("Use o programa assim: %s arquivo_entrada arquivo_saida\n",argv[0]);
            exit(0);
        }
        else
        {
            nomeEntrada = argv[1];
            nomeSaida = argv[2];
        }

        if( (arqEntrada = fopen(nomeEntrada, "r")) != NULL) /*testar se o arquivo abre corretamente!*/
        {
            /*montagem do labirinto na matriz atraves de ENTRADA.txt*/
            while(!feof(arqEntrada))
            {
                fscanf(arqEntrada,"%i_%i %i", &i, &j, &L[i][j]);
                switch(k)
                {
                    case 1:
                        rato_i = i;
                        rato_j = j;
                        break;

                    case 2:
                        queijo_i = i;
                        queijo_j = j;
                        break;

                    default:
                        break;
                }
                n = i;
                m = j;
                k++;
            }
            fclose(arqEntrada);
            MARCAR(L, n, m, queijo_i, queijo_j);
        }


        if( (arqSaida = fopen(nomeSaida, "w")) != NULL)
        {
            if(L[rato_i][rato_j] != 0)
            {
                GRAVAR(L, n, m, rato_i, rato_j, cam, queijo_i, queijo_j);
                for(i = 0; i < n*m; i++)
                {
                    fprintf(arqSaida, "( %i , %i ) \t", cam[i], cam[i + 1]);
                }
            }
            else
            {
                printf("Caminho nao existe");
                fprintf(arqSaida, "Caminho nao existe");
            }

            fclose(arqSaida);
        }

        return 0;
    }

但是,在我输入文件名后它就停止了。在 Xcode 中,它显示为蓝色 (lldb) 和 0x7fff8ef27bcb: movb %dl, (%rsi)。我不知道这里有什么问题。

提前致谢。

4

1 回答 1

2

你还没有为你的 scanf 分配任何内存。您需要使用数组来扫描字符串,而不是指针,或者动态分配内存(使用 malloc)给指针 nomeEntrada 和 nomeSaida。

基本上,您正在创建可以指向内存位置的变量,但实际上您并没有将任何内存放入其中,例如将邮寄地址发送给尚未建造的房屋。

于 2013-09-15T09:36:33.870 回答