繁体   English   中英

通过函数在C中初始化全局2D数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM