'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 大小,则可以大大简化此代码。
我对 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 大小,则可以大大简化此代码。