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
      };

intnと2つの配列を返したいと思います。配列xとwの長さがわかれば、簡単な構造を使用してこれを行うことができます。ただし、入力に依存する関数は、長さ2、4、6、15などの配列xと長さ2、4、6、15などの配列wを返すことができます。配列wとの長さはわかりません。バツ。

構造を作成しました:

 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つの価値を追加していることに気づきました。配列全体を構造内のさまざまな長さの配列に割り当てることは可能ですか?または、構造体の配列を1つずつ埋めることに制限されていますか?これはforループを使用して実行できますか?もしそうなら、私は定義する必要がありますか

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

構造体配列への新しい追加を説明するために毎回異なる方法で?

ご協力ありがとうございました。私はCを初めて使用し、MATLABの知識に制限されています。

編集:

私はそれらの大きなアレイに問題があることに気づきました。変数xとwに異なるサイズの配列を割り当てるために、switchcase構文を使用しています。しかし、最初にそれらの配列のサイズを指定する必要があり、それらはforループ内でのみ表示されることに気付きました。配列をforループの外側に表示して、構造体に保存できるようにするにはどうすればよいですか?以下は私のコードの短縮版です。以前の定義がここまたは再定義であったため、doublex[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));

そして、配列を埋めます。[関数の外で]使用し終わったら、忘れずに free() してください。

もう 1 つの間違いは、構造体ポインターで malloc() を使用する必要があることです。

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

また、メモリ リークを避けるために、コードが不要になったら 3 行のコードが必要になります。

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