'error: expected expression before '{' token' - matrix as member of struct

'error: expected expression before '{' token' - matrix as member of struct

我对 C 还很陌生(想想一个月的经验),所以今天,为了一些练习,我一直在研究 matrix/vector 计算器。我试过谷歌搜索和 Whosebuging(以及查看一些 Github 回购),但我无能为力。题目中的错误——'error: expected expression before '{'token'——发生在dataSetA.matrix = {...}calc.c

中的代码

据我了解,我无法以这种方式声明和初始化数组;我尝试以不同的方式重新声明它 (rMatrix dataSetA[3][3] = {...}),但无济于事。

calc.c:

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

#include "matrix.c"

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

  // Set up sample rotation matrix
  rMatrix dataSetA;
  dataSetA.nRows = 3;
  dataSetA.mCols = 3;
  dataSetA.matrix = {
    {0.171822648222828f, 0.313110361222276f, -0.934044366854675f},
    {0.134340268046073f, 0.931840597647996f, 0.337084252014737f},
    {0.975925032950279f, -0.183398479465564f, 0.118047989354818f}
  };

...

这是 rMatrix 的结构定义:

typedef struct rotationMatrix
{
  int nRows;
  int mCols;
  float** matrix;
} rMatrix;

我哪里错了?

C 不能那样工作,您需要为矩阵分配内存,或者将其预定义为数组的数组,否则,您的矩阵只是指向指向点数组的指针的指针 - 作为实验 -做 sizeof(dataSetA.matrix) 看看你得到了什么。

提示:它不会是 float * mRows * nCols。

或者这个(堆栈分配):

typedef struct rotationMatrix
{
  int nRows;
  int mCols;
  float matrix[M][N];
} rMatrix;

或者这个(堆分配):

  rMatrix dataSetA;
  dataSetA.nRows = 3;
  dataSetA.mCols = 3;
  dataSetA.matrix = malloc(sizeof(float *)*dataSetA.nRows);
  for (int i = 0; i < dataSetA.nRows ;i++) { dataSetA.matrix[i] = malloc(sizeof(float)*dataSetA.mCols); }

无论哪种方式,都必须在编译时(即堆栈变量)或运行时(即堆变量)分配内存

从结构的外观来看,您正在寻找堆分配。

使用堆分配时要记住的事情:

Malloc 可能会失败,请始终检查 return 值是否不为 NULL。

完成后必须对所有分配的内存使用 free() 以避免内存泄漏。

您的 rMatrix 类型是可变大小矩阵。您不能从用于固定大小二维数组的静态初始化程序中初始化 matrix 成员。您需要从堆中或作为自动数组分配数组并手动初始化它,一次一个元素:

int main(int argc, char *argv[]) {
    // Set up sample rotation matrix
    float values[3][3] = {
        {0.171822648222828f, 0.313110361222276f, -0.934044366854675f},
        {0.134340268046073f, 0.931840597647996f, 0.337084252014737f},
        {0.975925032950279f, -0.183398479465564f, 0.118047989354818f} };
    rMatrix dataSetA;
    dataSetA.nRows = 3;
    dataSetA.mCols = 3;
    dataSetA.matrix = malloc(3 * sizeof(*dataSetA.matrix));
    for (int row = 0; row < 3; row++) {
        dataSetA.matrix[row] = malloc(3 * sizeof(**dataSetA.matrix));
        for (int col = 0; col < 3; col++) {
            dataSetA.matrix[row][col] = values[row][col];
        }
    }
    // your code here
}

这很麻烦。如果您的旋转矩阵具有固定的 3x3 大小,则可以大大简化此代码。