【问题标题】:Store N^(n*n) matrix in C在 C 中存储 N^(n*n) 矩阵
【发布时间】:2016-04-28 06:44:13
【问题描述】:

每次我在工作中找到一个很好的解决方案时,总是开始用 C 编码来破坏这种感觉......:D

所以我来了,正在学习一些简单的 C 代码,想知道为什么它不工作 o.O 我想用二维数组(数组数组)表示一个矩阵并从文本文件中填充它。代码很糟糕,代码很丑......我对我能从你那里得到的任何提示/技巧感兴趣,高级先生:)

我的逻辑有什么问题?引擎盖下是什么?我使用[] 操作符是否不如预期?我只是不知道如何遍历二维数组吗?我在 Windows 上使用 cl 编译这个源代码,使用 for() 中的声明,上帝知道还有什么不是严格类似于 C 的。

输入是一个文本文件,其中包含矩阵的大小和由空格分隔的元素。其语法:file := {n, A | n :-N, A := N^(n*n)}

例如:

3
1 3 2
4 5 2
7 0 1

所以这里是……躲起来!

#include <stdio.h>

int main(int argc, char **argv) {

打开文件,最小代码没有错误检查:)

    FILE *fp = fopen("mat_mul.test", "r");

现在,根据文件中的第一个整数分配数组...这样正确吗?有没有更好的分配数组的方法?

    int n = fgetc(fp) - '0';
    int **A = (int**) malloc(sizeof(int*) * n);
    for (int i = 0; i < n; i++)
        A[i] = (int*) malloc(sizeof(int) * n);

Aaand,这就是魔法,咒语已经背叛了它的主人:D

    char act;
    int i = 0, j = 0;
    while (EOF != (act = fgetc(fp)))
        if ('0' <= act && '9' >= act)
            A[j == n - 1 ? i++ : i][j == n - 1 ? j = 0 : j++] = act - '0';

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("A[%i][%i]=%i\n", i, j, A[i][j]);
        }
    }

清洁不彻底!

    if (fclose(fp)) {

    return 0;
}

【问题讨论】:

  • char act;开头-> int act;
  • 正如您所知,fgetc 也读取单个字符。猜猜第一行有多少个字符?不是一个,而是 两个,你忘记了换行符。我建议学习使用调试器,这样您就可以单步调试代码,同时能够监控所有变量的值。
  • 但是由于每次迭代中的 if() 都会被忽略,还是我错了?
  • 您的问题到底是什么?请注意,诸如“您对此代码有何看法”之类的开放式问题不适合 Stackoverflow。如果您提出具体的问题,SO 效果最好。
  • 完全同意这一点,并且已经发现了一个可能的错误:在填充数组时,我使用了后缀 ++ 运算符的荣耀,但是当我必须将第二维设为 0 时,它会这样做在 1-1 上。不是在分配之后。我的问题是:我的动态数组处理错误,还是算法错误。我认为算法:)

标签: c arrays matrix multidimensional-array


【解决方案1】:

当您尝试在此处一次进行行和列分配和前进时,您会调用未定义的行为:

A[j == n - 1 ? i++ : i][j == n - 1 ? j = 0 : j++] = act - '0';

您在第二对括号中分配给j,并在第一对中访问它的值。 (我的编译器警告我“对 'j' 的操作可能未定义”。)三元操作的各个部分之间有一个序列点,但在两个索引运算符[] 之间没有。

在我看来,除了未定义的行为之外,表达式也不必要地复杂。单独赋值并推进行列计数器:

    if ('0' <= act && '9' >= act) {            
        A[i][j] = act - '0';

        j++;
        if (j == n) {
            j = 0;
            i++;
            if (i == n) break;    // end outer while
        }
    }

您还应该在malloc 的声明中包含&lt;stdlib.h&gt;。 (这也是我的编译器在启用警告时告诉我的内容。)

【讨论】:

  • 感谢您对我的代码的解释和意见。编写正确的 C 代码对我帮助很大!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2014-05-21
  • 1970-01-01
  • 2013-03-13
相关资源
最近更新 更多