【问题标题】:Moving array of values from one function to another in C在C中将值数组从一个函数移动到另一个函数
【发布时间】:2021-01-20 22:06:02
【问题描述】:

我正在开发一个程序,该程序从 .dat 文件中读取 5x5 矩阵,执行少量任务并将这些任务的输出保存到单独的文件中。目前我有两个功能。一种用于从文件中读取并在控制台中显示值。还有一个用于将值保存在文件中。

我的问题是,当我将它们放在 main 中时,这两个工作正常,但是当我将它们作为函数调用时,只有 read_matrix() 正确,而 write_matrix() 只会创建空白 Result.dat。我认为这是因为当它们都在 main 中时,在读取矩阵后,所有值都在内存中并且可以写入文件。当我将它们称为函数时, write_matrix 在 A[] 中没有任何值,也没有给我任何东西。我尝试创建另一个数组来保存这些值,弄乱了指针(我对它们不太熟悉),但没有任何效果,而且我没有想法。

  1. 我该如何解决?如何将整个值数组从第一个函数传递给另一个函数?

  2. 如何让程序确定尺寸。我必须使用的矩阵是 5x5,但我希望能够将此程序与其他尺寸一起使用。目前我提示用户输入高度和宽度,但它远非完美,如果我输入不正确的尺寸输出是错误的。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


int read_matrix(FILE * fin, int ** A, int x, int y) {
  fin = fopen("mat_A.dat", "r");
  if (fin == NULL)
    printf("Error opening input file.  \n");

  else {
    printf("Number of columns:\n");
    scanf("%d", & x);
    printf("Number of rows:\n");
    scanf("%d", & y);
    // Read the matrix dimensions
    int ** A = (int ** ) malloc(sizeof(int * ) * x);
    for (int i = 0; i < x; i++) {
      for (int j = 0; j < y; j++) {
        A[i] = (int * ) malloc(sizeof(int) * y);
      }
    }

    // Allocate the memory
    for (int i = 0; i < x; i++) {
      for (int j = 0; j < y; j++) {
        fscanf(fin, "%d", & A[i][j]);
        printf("%d   ", A[i][j]);
      }
      printf("\n");
    }

    fclose(fin);
  }
}

int write_matrix(FILE * fout, int ** A, int x, int y) {
  fout = fopen("Result.dat", "w");
  // fprintf( fout, "%d %d \n", x, y );

  for (int i = 0; i < x; i++) {
    for (int j = 0; j < y; j++) {
      fprintf(fout, "%d ", A[i][j]);
    }
    fprintf(fout, "\n");
  }
  fclose(fout);
}

int main() {
  /*  declaration of variables  */
  int x,
      y,
      i = 0, 
      **A;
      FILE * fin,
           * fout;

  read_matrix(fin, A, x, y);

  write_matrix(fout, A, x, y);

  printf("\n\nlul");
  free(A);
  return 0;
}```

【问题讨论】:

  • read_matrix 中的指针A 是本地副本。在read_matrix 中更改Amain 中的指针A 没有影响。您要么需要将A 的地址传递给read_matrix,要么将A 的新值从read_matrix 返回并分配给A 中的A
  • 您应该使用&amp;A 或从read_matrix 返回int **
  • int ** A = (int ** ) malloc(sizeof(int * ) * x); 隐藏了read_matrix函数的第二个参数int **A
  • 谢谢@user3386109。你让我走上正轨,我找到了解决方案。我不知道如何给你 dem 声望点,但谢谢。

标签: arrays c function


【解决方案1】:

我找到了一个解决方案,它返回带有值的 Result.txt。在我的原始代码中,我不仅没有给write_matrix() 任何值,而且我也没有给它任何尺寸。 这是我为获取包含矩阵的文本文件所做的工作。

  1. 在第一个函数中,我添加了 return A;最后。
  2. 我将询问用户的维度从第一个函数移到了主函数。这样它们就不会在第一个函数结束后丢失。
  3. 在 main 中,我创建了另一个 int **B 指针。
  4. 我在调用第一个函数时使用了该指针,然后在调用第二个函数时将其用作参数。

以下是 write_matrix()main() 处理更改的方式。

int **read_matrix(int x, int y)
{
    int ** A = NULL;
    FILE * fin = fopen("mat_A.dat", "r");

    ...

        fclose(fin);
    }
    return A;
}

void write_matrix (int **B, int x, int y)
{
    FILE *fout = fopen( "Result.txt", "w" );

    for( int i = 0; i < x; i++ )
    {
        for( int j = 0; j < y; j++ )
        {
            fprintf( fout, "%d ", B[ i ][ j ] );
        }
        fprintf( fout, "\n" );
    }
    fclose( fout );
}

int main(void)
{
    /*  deklaracja i inicjalizacja zmiennych  */
    int x, y;
    int **B;

    printf("Number of columns:\n");
    scanf("%d", &x );
    printf("Number of rows:\n");
    scanf("%d", &y );
    printf("\n");

    B = read_matrix (x, y);

    if (B != NULL)
        write_matrix (B, x, y);

    printf("\n\nlul");
    free(B);
    return 0;
}

【讨论】:

  • 这是一个很好的进步。做得好。但是,有一个缺陷。 main 中的变量 A 未初始化。 read_matrix 函数不会改变这一点。所以free(A) 行无效。如果你很幸运,A 将是 0,而free(A) 将什么也不做。如果运气不好,free(A) 行会导致程序崩溃。
  • 对我来说,展示如何解决问题的最简单方法是编辑答案。您可以查看edit history 以查看更改。总之,read_matrix 函数不需要A 作为参数。它可以简单地将A 声明为局部变量。而main 根本不需要Afinfout 也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
相关资源
最近更新 更多