在没有参数的情况下更改 void 函数中的变量
Change variables in place in void function without arguments
TLDR:我想找到一种方法来全局声明可动态分配的数组,由于需要根据方程的数量更改数组的长度,因此不能将其声明为常量数组,但很可能不会数组数据。这些数组需要由构成我正在编写的程序的源文件中包含的各种函数访问。
我目前正在将一个程序从 Fortran 移植到 C,我想为整个程序声明一些全局变量,它由几个 .c
和 .h
文件组成,所以说变量不仅可以在声明它们的文件中使用,也可以在其他文件中使用。 [实际上它们是 "semi-variables" 因为会改变的是数组的长度,这取决于方程的数量,这个问题的真正目的是声明包含常量数据的数组,但数据可以是包含在更多数组槽中,因此数组必须是可动态分配的。] 问题是这些变量是可动态分配的数组,并且这些数组必须填充一些数字。
这就是我声明变量的方式:
在文件中 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函数更改全局变量而无需传递任何参数,这绝对是有道理的。
如果您的数组是全局数组,则无需将它们作为参数传递。任何函数都可以毫无问题地使用它们,并修改它们的值。
简而言之,这就是您在 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] = ...;
}
}
TLDR:我想找到一种方法来全局声明可动态分配的数组,由于需要根据方程的数量更改数组的长度,因此不能将其声明为常量数组,但很可能不会数组数据。这些数组需要由构成我正在编写的程序的源文件中包含的各种函数访问。
我目前正在将一个程序从 Fortran 移植到 C,我想为整个程序声明一些全局变量,它由几个 .c
和 .h
文件组成,所以说变量不仅可以在声明它们的文件中使用,也可以在其他文件中使用。 [实际上它们是 "semi-variables" 因为会改变的是数组的长度,这取决于方程的数量,这个问题的真正目的是声明包含常量数据的数组,但数据可以是包含在更多数组槽中,因此数组必须是可动态分配的。] 问题是这些变量是可动态分配的数组,并且这些数组必须填充一些数字。
这就是我声明变量的方式:
在文件中 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函数更改全局变量而无需传递任何参数,这绝对是有道理的。
如果您的数组是全局数组,则无需将它们作为参数传递。任何函数都可以毫无问题地使用它们,并修改它们的值。
简而言之,这就是您在 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] = ...;
}
}