【问题标题】:Undefined referenced to function when trying to print matrix in C尝试在 C 中打印矩阵时对函数的未定义引用
【发布时间】:2011-03-26 16:28:06
【问题描述】:

我有简单的打印矩阵的方法。

void printMatrix(int matrix){
   int i;
   for(i=0;i<sizeof matrix/sizeof matrix[0];i++){
      for(j=0; j<sizeof matrix[0]/sizeof matrix[0][0];i++){
           printf("%03d",matrix[i][j]);
      }
      printf("\n");
   }
   printf("\n");
}

主要我有电话:

printMatrix(matrix);

矩阵定义为:

int matrix[2][3] = {{1, 3, 4},
                    {2, 0, 1}};

问题是我得到“未定义的对'printMatrix'的引用”你知道问题可能出在哪里吗?它需要一些特殊的包含吗?我不这么认为,但我不知道,错在哪里。

【问题讨论】:

  • 在您的函数void printMatrix(int matrix) 中,您将参数定义为int。它永远不会有索引:matrix[i][j] 是非法的,因为 matrixint 参数

标签: c arrays function


【解决方案1】:

你是在函数定义之前调用它吗?如果是这样,请尝试将函数定义放在 main 之前。

【讨论】:

  • undefined reference to... 是一个链接器错误 - 发生在正确编译之后,所以这不是缺少原型的问题。
【解决方案2】:

您已将printMatrix 的参数声明为int。将 void printMatrix(int matrix){ 更改为 void printMatrix(int matrix[][3]){。请注意,您需要定义除第一个维度之外的所有维度的大小。

【讨论】:

  • @pmg OP 问道“你知道问题出在哪里吗?”这是一个问题,因此它是一个答案。如果您注意到我们其他人没有注意到的事情,请分享而不是神秘。
  • 谢谢 marcog - 现在我得到了 void printMatrix(int matrix[2][3]){ error - of conflicting types
  • OP 询问“您知道问题出在哪里吗?”在“未定义对'printMatrix'的引用”错误的上下文中。所以,pmg 是正确的。您提到了其他重要错误,OP 在纠正此问题后会遇到这些错误。所以,一切都很好! :) 没什么神秘的
  • OP 声明 问题是我收到“未定义的对 'printMatrix' 的引用”。如果这不能查明问题......以及哪些答案是相应的......我不知道是什么:)
【解决方案3】:

我已经修复了你的代码:

#include <stdio.h>

void printMatrix(int matrix[2][3])
{
    int i = 0, j = 0;

    for(i = 0 ; i < 2 ; i++)
    {
        for(j = 0 ; j < 3 ; j++)
        {
            printf("%03d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main(void)
{    
    int matrix[2][3] = {{1, 3, 4},
                        {2, 0, 1}};

    printMatrix(matrix);

    return 0;
}

代码不健壮也不美观。主要是我修正了你的编码风格。

注意,下面'for'循环中的最后一个“元素”不能增加i,而是增加j!

for(j=0; j<sizeof matrix[0]/sizeof matrix[0][0];i++){

它必须替换为(或者更好,由我上面的代码......)

for(j=0; j<sizeof matrix[0]/sizeof matrix[0][0];j++){

编辑:

您可以检索矩阵的大小:

leni = sizeof matrix / sizeof matrix[0][0];

矩阵大小 --> 8

矩阵大小[0][0] --> 4

leni --> 2

lenj = sizeof matrix[0] / sizeof matrix[0][0]

矩阵大小[0] --> 12

矩阵大小[0][0] --> 4

lenj --> 3

#include <stdio.h>

void printMatrix(int matrix[][3])
{
    int i = 0, j = 0, leni = 0, lenj = 0;

    leni = sizeof matrix / sizeof matrix[0][0];
    lenj = sizeof matrix[0] / sizeof matrix[0][0];

    for(i = 0 ; i < leni ; i++)
    {
        for(j = 0 ; j < lenj ; j++)
        {
            printf("%03d ", matrix[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main(void)
{
    int matrix[2][3] = {{1, 3, 4},
                        {2, 0, 1}};

    printMatrix(matrix);

    return 0;
}

【讨论】:

  • 谢谢,我重写得很糟糕,对不起。我还有一个 Q,这个打印只适用于矩阵[2][3],但我能以某种方式为每一种矩阵设置打印吗?
  • 好极了,还有一个,对不起你的时间......我现在上线 void printMatrix(int matrix[][3]) 警告不兼容类型......你呢知道为什么?我使用编译器 gcc 顺便说一句。
  • 我已经编辑了我的答案以改进代码。它并不完美,但它可以像你想要的那样工作......我认为。
  • 它只是在使用 gcc 编译期间发出警告 - printMatrix 的冲突类型和先前的隐式声明在这里......(在线,我从 main 调用这个函数)我只是想我必须忍受它:-) 打印运行得很好,谢谢
  • 好的 :-) 如果您的代码有一些警告,请尝试修复它!这对每个人都更好:-)
【解决方案4】:

这行不通,有几个原因:

(1) 你的函数签名错误:

void printMatrix(int matrix)

只需要一个整数,而不是一个矩阵

(2) 你不能在这样的函数中使用sizeof,因为数组在传递给函数时会衰减为指针。您需要传递其他参数才能让函数知道矩阵尺寸

但是,您提到的链接错误的原因在仅发布函数的源代码时并不明显 - 您需要更明确地了解您拥有哪些源文件以及如何构建代码。

【讨论】:

  • @Tadeusz:并非总是如此,但在这种情况下它可能确实如此
  • 正确...但不是问题的答案:)
  • @pmg:确实 - 没有足够的信息来诊断链接错误的原因,但此时可能没有实际意义,因为该功能无论如何都不会像现在这样工作。 ;-)
  • sizeof 将对象或 带括号的类型 作为操作数。 sizeof 不需要括号;它是需要它们的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2011-05-07
相关资源
最近更新 更多