[英]Initializing a global 2D array in C from a function
float verticies[14][3];
init_mod(){
verticies = {{-0.5,-0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5, 0.5, 0.5},
{ 0.5, 0.5, 0.5},
{-0.5, 0.5,-0.5},
{ 0.5, 0.5,-0.5},
{-0.5,-0.5,-0.5},
{ 0.5,-0.5,-0.5},
{ 0.5, 0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5,-0.5,-0.5},
{-0.5,-0.5, 0.5},
{-0.5, 0.5,-0.5},
{-0.5, 0.5, 0.5}};
}
当我编译程序时,出现此错误:
topsecret.c: In function ‘init_mod’:
topsecret.c:12:14: error: expected expression before ‘{’ token
您所使用的语法仅用于初始化。 不允许进行分配。
将其移至全局数组的声明将解决此问题:
float verticies[14][3] =
{{-0.5,-0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5, 0.5, 0.5},
{ 0.5, 0.5, 0.5},
{-0.5, 0.5,-0.5},
{ 0.5, 0.5,-0.5},
{-0.5,-0.5,-0.5},
{ 0.5,-0.5,-0.5},
{ 0.5, 0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5,-0.5,-0.5},
{-0.5,-0.5, 0.5},
{-0.5, 0.5,-0.5},
{-0.5, 0.5, 0.5}};
如果以后需要重新分配数组,可以在函数内部初始化一个临时的“模板”数组,然后使用memcpy
将其内容放入全局数组。
由于它是data_type array_name [][];
数组,因此应像这样声明: data_type array_name [][];
请注意,您必须为last []
括号传递一些值。 即`float vertices [] [3] = _ ;
init_mod()
{
verticies [][3] = {{-0.5,-0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5, 0.5, 0.5},
{ 0.5, 0.5, 0.5},
{-0.5, 0.5,-0.5},
{ 0.5, 0.5,-0.5},
{-0.5,-0.5,-0.5},
{ 0.5,-0.5,-0.5},
{ 0.5, 0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5,-0.5,-0.5},
{-0.5,-0.5, 0.5},
{-0.5, 0.5,-0.5},
{-0.5, 0.5, 0.5}};
}
您不能直接分配数组,因此创建数组复合文字无济于事。 但是,可以通过复合文字来分配结构内部的数组。 因此,您可以考虑使用:
struct FloatArray
{
float verticies[14][3];
};
struct FloatArray vertices;
float (*verticies)[3] = vertices.verticies;
extern void init_mod(void);
void init_mod(void)
{
vertices = (struct FloatArray){
.verticies =
{
{-0.5,-0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5, 0.5, 0.5},
{ 0.5, 0.5, 0.5},
{-0.5, 0.5,-0.5},
{ 0.5, 0.5,-0.5},
{-0.5,-0.5,-0.5},
{ 0.5,-0.5,-0.5},
{ 0.5, 0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5,-0.5,-0.5},
{-0.5,-0.5, 0.5},
{-0.5, 0.5,-0.5},
{-0.5, 0.5, 0.5},
}
};
}
即使全局verticies
的类型已更改为指向数组的指针,该代码也会利用您的vertices
拼写错误,并使现有代码保持不变。 函数内部的代码使用复合文字来初始化结构,该结构具有初始化指针所指向的数组的(有益)副作用。
这段代码可以在Mac OS X 10.9.2 Mavericks上的GCC 4.8.2下使用以下命令行进行干净地编译:
gcc -g -O3 -std=c99 -Wall -Wextra -Werror -c crazy.c
我假设需要使用初始化函数将数组重置为已知状态,然后再开始使用和修改数组的某些代码的下一次迭代。 如果您只需要在程序启动时初始化一次数组,则可以使用简单的数组初始化程序以不同的方式进行操作。 但似乎您已经知道这一点。
此代码演示了等效性。 数组old_vertices
对应于您对verticies
的定义,但已初始化(一次)。
#include <stdio.h>
float old_vertices[14][3] =
{
{-0.5,-0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5, 0.5, 0.5},
{ 0.5, 0.5, 0.5},
{-0.5, 0.5,-0.5},
{ 0.5, 0.5,-0.5},
{-0.5,-0.5,-0.5},
{ 0.5,-0.5,-0.5},
{ 0.5, 0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5,-0.5,-0.5},
{-0.5,-0.5, 0.5},
{-0.5, 0.5,-0.5},
{-0.5, 0.5, 0.5},
};
struct FloatArray
{
float verticies[14][3];
};
struct FloatArray vertices;
float (*verticies)[3] = vertices.verticies;
extern void init_mod(void);
void init_mod(void)
{
vertices = (struct FloatArray){
.verticies =
{
{-0.5,-0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5, 0.5, 0.5},
{ 0.5, 0.5, 0.5},
{-0.5, 0.5,-0.5},
{ 0.5, 0.5,-0.5},
{-0.5,-0.5,-0.5},
{ 0.5,-0.5,-0.5},
{ 0.5, 0.5, 0.5},
{ 0.5,-0.5, 0.5},
{-0.5,-0.5,-0.5},
{-0.5,-0.5, 0.5},
{-0.5, 0.5,-0.5},
{-0.5, 0.5, 0.5},
}
};
}
int main(void)
{
init_mod();
double old_sum = 0.0;
double sum = 0.0;
for (int i = 0; i < 14; i++)
{
for (int j = 0; j < 3; j++)
{
old_vertices[i][j] *= (i * 14 + j);
old_sum += old_vertices[i][j];
verticies[i][j] *= (i * 14 + j);
sum += verticies[i][j];
}
}
printf("%f == %f\n", old_sum, sum);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.