0

假设我在函数中调用了以下数组:

      int n = 20;
      double x[] = {
        0.003435700407453, 0.018014036361043, 0.043882785874337, 0.080441514088891,
        0.126834046769925, 0.181973159636742, 0.244566499024586, 0.313146955642290,
        0.386107074429177, 0.461736739433251, 0.538263260566749, 0.613892925570823,
        0.686853044357710, 0.755433500975414, 0.818026840363258, 0.873165953230075,
        0.919558485911109, 0.956117214125663, 0.981985963638957, 0.996564299592547
      };
      double w[] = {
        0.008807003569576, 0.020300714900193, 0.031336024167055, 0.041638370788352,
        0.050965059908620, 0.059097265980759, 0.065844319224588, 0.071048054659191,
        0.074586493236302, 0.076376693565363, 0.076376693565363, 0.074586493236302,
        0.071048054659191, 0.065844319224588, 0.059097265980759, 0.050965059908620,
        0.041638370788352, 0.031336024167055, 0.020300714900193, 0.008807003569576
      };

我想返回 int n 和两个数组。如果我知道数组 x 和 w 的长度,我可以使用一个很容易的结构来做到这一点。但是,取决于输入的函数可以返回长度为 2、4、6、15 等的数组 x 和长度为 2、4、6、15 等的数组 w。我不知道数组 w 的长度和X。

我创建了一个结构:

 struct quadpts{    //structure used to pass multiple values into roeFlux
    int n;  //The specific heat ratio
    double *x;
    double *w;
};
typedef struct quadpts Quadpts;

并使用:

Quadpts qpt = (Quadpts) malloc(size(Quadpts));

在数组 x 和 w 中分配不同的长度值。然而,我意识到在我看到和查找的许多示例中,人们一次只添加一个值。是否可以将整个数组分配给结构中的不同长度数组?或者我是否仅限于在结构 1 中填充数组。这可以使用 for 循环来完成吗?如果是这样,我是否必须定义

Quadpts qpt = (Quadpts) malloc(size(Quadpts));

每次都以不同的方式来解释结构数组的新增内容?

谢谢您的帮助。我是 C 的新手,仅限于 MATLAB 知识。

编辑:

我意识到我对那些大数组有问题。我正在使用 switch case 语法来为变量 x 和 w 分配不同大小的数组。但我意识到我需要指定这些数组的大小,并且它们只能在 for 循环中看到。我怎样才能使数组可以在 for 循环之外看到,以便我可以将它们保存到结构中?以下是我的代码的缩短版本。我经常在 double x[n] 处出错,因为之前的定义在这里或重新定义。

double quad1d(int pqOrder){
int n;
switch(pqOrder)
{
case 1:
    n = 1;
    double x[n] = {
        0.500000000000000
    };
    double w[n] = {
        1.000000000000000};
    break;

case 3:
      // Order 3 Gauss-Legendre points
      n = 2;
      double x[n] = {
        0.211324865405187, 0.788675134594813
      };
      double w[n] = {
        0.500000000000000, 0.500000000000000
      };
      break;
    }
int i;
Quadpts * qpt = (Quadpts*)malloc(sizeof(Quadpts));
for (i=0; i<n; i++){
    qpt->x = malloc(qpt->x_len * sizeof(double));
    qpt->w  = malloc(qpt->w_len * sizeof(double));
    qpt.x=x[i];
    qpt.w=w[i];


}
return &(qpt[0]);

}

4

1 回答 1

0

可能还有其他问题,但立即突出的一件事是在结构中拥有指针还不够好,在您的情况下,您必须对每个指针使用 malloc()。

而且,如果您在函数中声明那些大数组,它们将位于最终将被覆盖的堆栈中。

利用:

struct quadpts{    //structure used to pass multiple values into roeFlux
    int n;  //The specific heat ratio
    double *x;
    int x_len;
    double *w;
    int w_len;
};

在函数内部:

qpt->x = malloc(qpt->x_len * sizeof(double));
qpt->w  = malloc(qpt->w_len * sizeof(double));

然后填充你的数组。一旦你完成使用它们[在你的函数之外],不要忘记释放它们。

另一个错误是您应该将 malloc() 与结构指针一起使用:

Quadpts * qpt = (Quadpts*)malloc(sizeof(Quadpts));

一旦不再需要它,您还需要 3 行代码以避免内存泄漏。

free(qpt->x);
free(qpt->w);
free(qpt);
于 2013-03-23T19:26:32.520 回答