在无参数的void函数中更改变量

seq*_*nce 6 c variables pointers function pass-by-reference

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

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

在文件中problemsize.h

extern double *GammaL;
Run Code Online (Sandbox Code Playgroud)

在文件中problemsize.c

double *GammaL;
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

然后从外部.c文件调用此函数。但事实是,我有许多这样的数组,这些数组必须作为参数传递给此函数。我想知道是否有可能具有上述功能来完成相同的工作(在适当的位置更改数组)而无需以这些数组作为参数来调用它?

还是有其他解决方案可以解决此问题?

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

Mar*_*lli 3

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

简而言之,您可以执行以下操作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] = ...;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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] = ...;
    }
}
Run Code Online (Sandbox Code Playgroud)