0

この問題の答えを見つけるのに苦労しています。私はこれの同様の例をオンラインで見つけましたが、私の問題に対処するものはありません。

私はstruct会社のデータ用に会社を持っており、会社structのコレクションのために2番目のコンソーシアムを持っています。2番目には、最初の会社データstructの可変長配列が含まれます。可変長配列の要素の数は、コンソーシアム内の企業の数によって異なります。structstruct

必要なものを動的に割り当てたいのですが、少し迷っています。これらは構造体です:

typedef struct {
    char  code[];
    double sharePrice;
    int numShares;
    double totalVal;
    double totalDebts;
} Company;

typedef struct {
    int numCore;
    int numAssoc;
    Company core[];
    Company assoc[];
} Consortium;

コア企業は多数存在し、この数はコンソーシアムのコアアレイのサイズになりますstruct。関連会社についても同様です。

私はこの表現を思いついたが、何が欠けているのかわからない:

Consortium *consort=((Consortium*)malloc((numCore+numAssoc)*(sizeof(Consortium));
4

2 に答える 2

3

ポインタを使用して、配列を個別に割り当てる必要があります。

typedef struct
{
    char  *code;
    double sharePrice;
    int numShares;
    double totalVal;
    double totalDebts;
} Company;

typedef struct
{
    int numCore;
    int numAssoc;
    Company *core;
    Company *assoc;
} Consortium;

Consortium *c = malloc(sizeof(*c));    // Error check
c->numCore = 4;
c->core = malloc(sizeof(*c->core) * c->numCore);    // Error check
c->numAssoc = 3;
c->assoc = malloc(sizeof(*c->assoc) * c->numAssoc);    // Error check

for (int i = 0; i < c->numCore; i++)
    c->core[i].code = malloc(32);    // Error check

for (int i = 0; i < c->numAssoc; i++)
    c->assoc[i].code = malloc(32);    // Error check

// Worry about other data member initializations!

Companyタイプを次のように変更する方が簡単で、おそらくより良いでしょう。

typedef struct
{
    char   code[32];
    double sharePrice;
    int    numShares;
    double totalVal;
    double totalDebts;
} Company;

これにより、コード要素を割り当てるループが節約されます。

于 2012-10-21T03:50:08.983 に答える
0

コンソーシアムの構造を少し単純にしたと考えるかもしれません。タイプ、コア、およびassocごとにカウントがあるため、単一の配列のみを使用できます。最初の部分はコア用で、2番目の部分はassoc用です。

したがって、構造体は次のソースのようになります(コンパイルされておらず、テストされているのではなく、書き留められているため、エンプターに注意してください)。

typedef struct {
    int numCore;    // number of core companies, first part of m_companies
    int numAssoc;   // number of assoc companies, second part of m_companies
    Company m_companies[1];
} Consortium;

次に、次のような方法で実際のデータ構造を作成します。

Consortium *makeConsortium (int numCore, int numAssoc) {
  Consortium *pConsortium = malloc (sizeof(Consortium) + sizeof(Company) * (numCore, numAssoc));
  if (pConsortium) {
      pConsortium->numCore = numCore;
      pConsortium->numAssoc = numAssoc;
  }
  return pConsortium;
}

この後、成功したかどうかを示すいくつかの関数で入力できます。

int addCompanyCore (Consortium *pConsortium, int index, Company *pCompany) {
  int iRetStatus = 0;
  if (pConsortium && index < pConsortium->numCore) {
    pConsortium->m_companies[index] = *pCompany;
    iRetStatus = 1;
  }
  return iRetStatus;
}
int addCompanyAssoc (Consortium *pConsortium, int index, Company *pCompany) {
  int iRetStatus = 0;
  if (pConsortium && index < pConsortium->numAssoc) {
    index += pConsortium->numCore;
    pConsortium->m_companies[index] = *pCompany;
    iRetStatus = 1;
  }
  return iRetStatus;
}

次に、別のヘルパー関数のセットを使用してそれらにアクセスします。

Company  *getCompanyCore (Consortium *pConsortium, int index) {
  Company *pCompany = 0;
  if (pConsortium && index < pConsortium->numCore) {
    pCompany = pConsortium->m_companies + index;
  }
  return pCompany;
}
Company * getCompanyAssoc (Consortium *pConsortium, int index) {
  Company *pCompany = 0;
  if (pConsortium && index < pConsortium->numAssoc) {
    index += pConsortium->numCore;
    pCompany = pConsortium->m_companies + index;
  }
  return pCompany;
}
于 2012-10-21T03:56:47.653 に答える