【问题标题】:Undefined reference when passing 2D array to function将二维数组传递给函数时未定义的引用
【发布时间】:2021-09-24 11:59:43
【问题描述】:

我正在编写一个代码,它采用二维数组并将它们放入函数中。然后他们用它做一些事情并更新它。然而,由于我不知道的原因,即使我花了很多时间阅读人们解释如何正确链接 .cpp 和 .h 文件的线程,我仍然收到未定义的引用错误。让我给你看一下简化的代码:

header.h

#ifndef HEADER_H
#define HEADER_H

const int N = 2;
const int rows = 206;
const double ptoSI = 2;


void getEOS(double etable[206][N], double ptable[206][N], double c_stable[206][N]);
#endif // HEADER_H

header.cpp

#include <iostream>
#include <fstream>
#include <math.h>
#include "header.h"
 using namespace std;

void getEOS(double etable[206][N], double ptable[206][N], double c_stable[206][N]){

       for (int i = 0; i<rows; i++){
        for (int j = 0; j<N; j++){

         etable[i][j] = cache[i][j*3]*1.60218E-13*1E45*1.0/(ptoSI);
          ptable[i][j] = cache[i][j*3+1]*1.60218E-13*1E45*1.0/(ptoSI);
          c_stable[i][j] = cache[i][j*3+2];

        }
    }

    }

ma​​in.cpp

#include <iostream>
#include "header.h"

using namespace std;

int main()
{

double etable[rows][N];
double ptable[rows][N];
double c_stable[rows][N];

getEOS(etable,ptable,c_stable);


}

错误详细解读:

/usr/bin/ld: main.o: in function `main':
/home/tux/build-testtext-Desktop_Qt_5_15_2_GCC_64bit-Debug/../testtext/main.cpp:13: undefined reference to `getEOS(double (*) [2], double (*) [2], double (*) [2])'
collect2: error: ld returned 1 exit status
make: *** [Makefile:274: testtext] Error 1

即使我正确地声明和定义了函数,为什么他对此有问题?

任何帮助将不胜感激......

.pro 文件:

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += \
        header.cpp \
        main.cpp

HEADERS += \
    header.h

我正在使用以下套件: 桌面 Qt %{Qt:Version} GCC 64bit

【问题讨论】:

  • 您很可能没有将header.cpp 链接到main.cpp。你用的是什么编译器?
  • 我在 Qt Creator IDE 中使用 g++
  • 套件位于工具/选项/套件中。您必须选择一个来构建您的项目。您还可以从“编译器输出”选项卡中复制粘贴完整的错误文本。
  • 好的,我把它加到帖子里了
  • 如果将所有代码移到同一个文件中,是否会出现同样的错误?

标签: c++ arrays function compiler-errors undefined-reference


【解决方案1】:

对不起,

如果这个代码是专业的,我不会让它通过审查:

  1. 你没有使用 std::array
  2. 您使用的是随机常数 206,而不是这样声明
  3. 您正在迭代一个可能有 206xN 大的矩阵。但是,您正在迭代一些可能等于 206 的“行”数。因此,您可能应该相应地使用“行”。
  4. 您从“缓存”访问某些成员的代码块非常糟糕。我会解雇那些让我编写这样的代码的人。
  5. 1.60218E-13*1E45 可能是一些非常重要的物理常数。我会在一些合适的标题中定义它一次。它可能被描述为 1.60218e-32。
  6. 在您的主函数中:那个不祥的“行”参数从何而来?
  7. 通常,当你定义一个“Getter”函数时,你会得到一些东西。你的函数没有提供任何东西,它是无效的。

【讨论】:

  • 我一直很欣赏这样的直接反馈,谢谢。 (虽然我认为语气有点偏离,因为我从未声称自己是专业人士)。我认为的行参数来自标题,它也有效。你知道我得到的问题的本质是什么吗?为什么我使用缓存的块这么差?
猜你喜欢
  • 1970-01-01
  • 2012-08-05
  • 2010-09-29
  • 1970-01-01
  • 2020-11-01
相关资源
最近更新 更多