OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

配列の数を途中で増やすには?

  • 困ってます
  • 質問No.103991
  • 閲覧数596
  • ありがとう数2
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 24% (32/133)

はじめまして。

この度、以下のようなプログラムを作りました。
が、途中で配列の数を増やすことになってしまいました。
------------------------------------------------
struct a{
int int_a;
long int_b;
};

struct b{
a *aa;
};

void main(void){
b *bb;
bb = new b[3];
bb[0].aa = new a[5];
bb[1].aa = new a[4];
.
.
.

}
------------------------------------------------
具体的には、'bb'の配列を3から5に増やすようなやり方を探しています。
元の配列より大きい配列をつくり、そこにコピーすればいいと考えたのですが、
'bb'内の'aa'の配列も動的に作成しているため、それも出来ない状況です。

どなたかやり方を知っている方がいましたら、教えていただきたいです。

下手な説明ですいません。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル9

ベストアンサー率 40% (43/105)

今時の可変配列は、STLのvectorを使用します。
かなり楽になりますよ。

これだとサイズを変更しても、元の配列からのコピーは不要です。
STLは少し難しそうなイメージがありますが、慣れればそうでもないです。


#include <iostream>
#include <vector>

using namespace std;

struct a{
int int_a;
long int_b;
};


struct b{
vector<a> aa;
};

int main(int argc, char* argv[])
{

vector<b> bb(3);
bb[0].aa.reserve(5);
bb[1].aa.reserve(4);

return 0;
}
補足コメント
Ryo_Hyuga

お礼率 24% (32/133)

回答ありがとうございました。

しかし、C++Builder5で試してみたところ、エラーが発生してしまいました。
コンソールアプリケーションでは実行できたのですが、
Windowsアプリケーションでは実行が出来ませんでした。

下記に作成したアプリケーションを載せておきます。
-------------------------------------------------
void main(void)
{
int x=10,y=5;

vector<a> crd(5);
crd[0].int_a =5;
bb.reserve(x);
bb[0].aa.reserve(y);
bb[1].aa.reserve(y);
bb.reserve(y); //ココでエラーが発生します。
bb[0].matrix[0].int_a = crd[0].int_a;
}
-------------------------------------------------
投稿日時 - 2001-07-15 21:27:08
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル10

ベストアンサー率 50% (52/103)

この通りの要求仕様ならRyo_Hyugaさんの方針通り、大きな配列を作ってコピーする方法で問題ないと思われますが... もしさらに複雑 or 柔軟なデータ構造操作の必要があるのでしたら、リスト構造などをキーワードに調べてみることをお勧めします。
この通りの要求仕様ならRyo_Hyugaさんの方針通り、大きな配列を作ってコピーする方法で問題ないと思われますが...

もしさらに複雑 or 柔軟なデータ構造操作の必要があるのでしたら、リスト構造などをキーワードに調べてみることをお勧めします。


  • 回答No.2
レベル9

ベストアンサー率 71% (59/82)

> 元の配列より大きい配列をつくり、そこにコピーすればいいと考えたのですが、 > 'bb'内の'aa'の配列も動的に作成しているため、それも出来ない状況です。 それで出来ますよ。 bb[i].aaの長さがそれぞれ違うといっても実際には、 bb[i].aaはbbの配列とは全く別のメモリ領域上に作成され、 そこへのポインタがbb[i]. ...続きを読む
> 元の配列より大きい配列をつくり、そこにコピーすればいいと考えたのですが、
> 'bb'内の'aa'の配列も動的に作成しているため、それも出来ない状況です。

それで出来ますよ。

bb[i].aaの長さがそれぞれ違うといっても実際には、
bb[i].aaはbbの配列とは全く別のメモリ領域上に作成され、
そこへのポインタがbb[i].aaに入っているだけです。
ですから、"struct b"のサイズは、その中のaa配列の
長さに関係無く、ポインタ型"struct a *"が格納できる
だけのサイズ(sizeof(struct a *):4バイトなど)です。
したがって、bbの配列をより大きなメモリ領域に
コピーすれば、bbの配列サイズの拡張はできます。

また、reallocを使えばコピー作業なしで
配列の長さを増やせます。

ただその場合、配列の作成はnewではなく
mallocでやり、削除はdelete[]ではなく
freeでやります。

bb = (b *)malloc(sizeof(b) * 3);
...
bb = (b *)realloc(bb, sizeof(b) * 5);

newとdelete[]による配列作成/削除にも
reallocと同じような仕組みが
あるんでしょうか?私は知りません。
また、newで生成した配列にreallocを
適用したらどうなるかも知りません。
実装依存でしょう。
  • 回答No.4
レベル9

ベストアンサー率 40% (43/105)

C++Builder5を持っていませんので分かりませんが、 どのような内容のエラーなのでしょうか。 もしかしたら、 聞いた話によるとC++Builder5のvectorにはバグがあるそうなので、 それが原因なのかもしれません。 それが原因ならばC++Builder 5 アップデートで直るようですが… ...続きを読む
C++Builder5を持っていませんので分かりませんが、
どのような内容のエラーなのでしょうか。

もしかしたら、
聞いた話によるとC++Builder5のvectorにはバグがあるそうなので、
それが原因なのかもしれません。
それが原因ならばC++Builder 5 アップデートで直るようですが…
お礼コメント
Ryo_Hyuga

お礼率 24% (32/133)

C++Builder5のアップデートでは直りませんでしたが、
Builder3にダウングレードしたら成功しました。

ありがとうございました。
投稿日時 - 2001-07-18 22:38:03
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ