【问题标题】:matrix multiplication can't be compile矩阵乘法无法编译
【发布时间】:2012-07-05 23:31:19
【问题描述】:

编译时遇到了一些麻烦

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <time.h>

int perkalianMatriks(double ** A, double ** B, double ** C, int n);
int randomMatriks(double * m, int n);

int main(int argc, char *argv[]) {
    int n_order = 0 , i, j;
    double ** A, ** B, ** C;
    time_t time1, time2;
    double diff_sec;

    randomMatriks(double * m, int n)

    A = (double **) malloc(sizeof(double) * n_order);
    B = (double **) malloc(sizeof(double) * n_order);
    C = (double **) malloc(sizeof(double) * n_order);

    for (i = 0; i < n_order; i++) {
        A[i] = (double *) calloc(sizeof(double), n_order);
        B[i] = (double *) calloc(sizeof(double), n_order);
        C[i] = (double *) calloc(sizeof(double), n_order);
    }

    printf("\nMatrix Sizes : ");
    scanf("%d", %n_order);


    time(&time1);
    perkalianMatriks(A, B, C, n_order);
    time(&time2);
    diff_sec = difftime (time2,time2);


    printf ("Total time to execute %f seconds.\n", diff_sec);
    return 0;
}

int randomMatriks(double * m, int n) {
    int i;

    for (i = 0; i < n_order; i++) {
        m[i] = (double) (rand() % 10) + 1;
    }
}

int perkalianMatriks(double ** a, double ** b, double ** c, int n) {
    int i, j, k;

    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            c[i][j]=0;          
            for (k = 0; k < n; k++)
            {
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }

    return 0;
}

编译时出错

  1. sekuensial.c(16): 错误 C2143: 语法错误: 缺少 ')' 之前 '类型'
  2. sekuensial.c(16):错误 C2198:“randomMatriks”:参数太少 来电
  3. sekuensial.c(16):错误 C2059:语法错误:')'
  4. sekuensial.c(29):错误 C2059:语法错误:'%'
  5. sekuensial.c(45):错误 C2065:“n_order”:未声明的标识符

有人可以帮我解决这个问题吗?

【问题讨论】:

  • scanf("%d", %n_order);需要scanf("%d", &n_order);
  • 是的,我已经改过了。抱歉,错字.. 然后是错误?
  • randomMatriks 的 [不完整] 声明在您的 main 函数中间做了什么?你已经在main 之前声明了randomMatriks。你为什么决定在main里面再做一次???
  • @AndreyT 我的意思是调用函数randomMatriks(随机生成矩阵)
  • 程序现在编译。如果您在调试它时遇到问题,那就是另一个问题了。

标签: c visual-studio-2010 compiler-warnings


【解决方案1】:

您缺少一个分号。而且你不能命名一个变量double。我想这行应该被删除,因为它是上面声明的剪切和粘贴。如果你需要调用它,你应该用真正的参数调用它。我没有看到你定义了任何适合第一个参数的东西,我猜从后面的代码中,你打算使用n_order 作为第二个参数。

randomMatriks(double * m, int n)
              ^^^^^^            ^^^

这个scanf错了,你可能想要&amp;

scanf("%d", %n_order);
            ^^^

变量dif_sec 不存在。错字。

dif_sec = difftime (time2,time2);
^^^^^^^
printf ("Total time to execute %f seconds.\n", dif_sec);
                                               ^^^^^^^

变量n_order 不存在。 n 可能。

for (i = 0; i < n_order; i++) {
                ^^^^^^^

randomMatriks 应该返回一些东西。即使声明返回int,它也会在没有return 语句的情况下脱落。

你有一些未使用的变量和函数参数。

int main(int argc, char *argv[]) {
             ^^^^        ^^^^
    int n_order = 0 , i, j;
                         ^^^

【讨论】:

  • 那么,一定是randomMatriks(* m, int n);?
  • 是的,我已经改变了它.. 对不起,粗心。现在,还有 4 个错误
  • 好吧,我很抱歉.. :) 我会留下这个问题。哦,你能帮忙打电话给管理员删除这些问题吗?谢谢
  • @sinta:这个问题还不错,你只是不应该在问题中解决它。在您的机器上修复它。当您遇到新问题时,请提出新问题。
  • @sinta:好的,我为你回滚了这个问题。
【解决方案2】:

问题是你从未初始化你的C 数组,它是一个指向双精度指针的指针数组。在perkalianMatriks 中,它是被尊重的,在这一点上,所有关于指针是什么的赌注都被取消了(在你的例子中是 0xfdfdfdfd)。

(我猜你可能不明白 ** 类型到底是什么以及它应该如何使用?)

【讨论】:

  • 我的回答是基于你的代码的固定版本,现在已经回滚到原来的不可编译版本。 :)
  • 哦,哈哈,没问题。我也同意原来的问题不应该在这样的答案下改变,所以原来的版本应该是“现场”版本,这样答案就不会让未来的人“嗯??”当他们看到这个页面时。
【解决方案3】:

这不是为 *B 等分配内存的正确方法。 请参阅为双指针 (*B) 分配内存的示例,其余指针也是如此。 还要注意分号。

【讨论】:

    【解决方案4】:

    执行两个矩阵的乘法非常简单。

    你可以在solvedc.com得到一个简单的线索

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 2020-04-09
      • 2017-03-11
      • 2013-12-23
      • 2018-04-11
      • 2014-09-19
      • 1970-01-01
      相关资源
      最近更新 更多