在没有参数的 void 函数中更改变量

Posted

技术标签:

【中文标题】在没有参数的 void 函数中更改变量【英文标题】:Change variables in place in void function without arguments 【发布时间】:2020-01-16 10:52:44 【问题描述】:

TLDR:我想找到一种方法来全局声明可动态分配的数组,由于需要更改数组的长度,因此不能将其声明为常量数组,具体取决于方程的数量,但很可能不是数组数据。这些数组需要由构成我正在编写的程序的源文件中包含的各种函数访问。

我目前正在将一个程序从 Fortran 移植到 C,我想为整个程序声明一些全局变量,该程序由几个 .c.h 文件组成,这样这些变量不仅可以使用在声明它们的文件中,但也在其他文件中。 [实际上它们是“半变量”,因为会改变的是数组的长度,这取决于方程的数量,这个问题的真正目的是声明包含常量数据的数组,但是数据可以是包含在更多的数组槽中,因此数组必须是可动态分配的。] 问题是这些变量是可动态分配的数组,这些数组必须填充一些数字。 这就是我声明变量的方式:

在文件problemsize.h

extern double *GammaL;

在文件problemsize.c:

double *GammaL;

然后我尝试创建一个函数来通过更改它们的值来填充数组。该函数将从#include problemsize.h 的其他一些.c 文件中调用。现在,我知道可以创建这样的函数:

void fill_array(double **GammaL, double **GammaR, double **GammaT, ...) 
    GammaL = malloc(arrayLength*sizeof(double));
    for (int i=0; i<arrayLength; i++) 
        (*GammaL)[i] = 0.1;
    
    GammaR = malloc(arrayLength*sizeof(double));
    for (int i=0; i<arrayLength; i++) 
        (*GammaR)[i] = 0.2;
    
    [...] // And so on

然后从外部.c 文件调用此函数。但问题是我有许多这样的数组必须作为参数传递给这个函数。我想知道是否有可能有一个像上面这样的函数来做同样的工作(改变数组到位)而不需要以这些数组作为参数来调用它?

或者有其他解决方案可以解决这个问题吗?

编辑:我的印象是在 C 中只能通过将指针作为参数传递给函数来更改指针。现在,经过一些澄清,很明显全局变量可以通过 void 函数更改而无需传递任何参数,这绝对是有道理的。

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 This question is being discussed on meta. 【参考方案1】:

如果您的数组是全局的,则无需将它们作为参数传递。任何函数都可以毫无问题地使用它们,并修改它们的值。

简而言之,这就是你在problemsize.c可以做的事情:

#define ARR_SIZE 4
double GammaL[ARR_SIZE];
double GammaR[ARR_SIZE];
double GammaT[ARR_SIZE];

void initialize_arrays(void) 
    size_t i;

    for (i = 0; i < ARR_SIZE; i++) 
        GammaL[i] = ...;
        GammaR[i] = ...;
        GammaT[i] = ...;
    

或者,如果您的数组没有固定大小:

size_t arr_size = 0;
double *GammaL;
double *GammaR;
double *GammaT;

void initialize_arrays(void) 
    size_t i;

    arr_size = /*... calculate somehow ... */;
    GammaL = malloc(arr_size * sizeof(double));
    GammaR = malloc(arr_size * sizeof(double));
    GammaT = malloc(arr_size * sizeof(double));

    for (i = 0; i < arr_size; i++) 
        GammaL[i] = ...;
        GammaR[i] = ...;
        GammaT[i] = ...;
    

【讨论】:

以上是关于在没有参数的 void 函数中更改变量的主要内容,如果未能解决你的问题,请参考以下文章

C语言学习笔记--void关键字

在没有参数的函数中使用 void?

8.函数

C进阶8goto和void分析

C关键字void的用法

Javascript的参数详解