アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。

この度、以下のようなプログラムを作りました。
が、途中で配列の数を増やすことになってしまいました。
------------------------------------------------
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'の配列も動的に作成しているため、それも出来ない状況です。

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

下手な説明ですいません。

A 回答 (4件)

C++Builder5を持っていませんので分かりませんが、


どのような内容のエラーなのでしょうか。

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

参考URL:http://www.borland.com/devsupport/bcppbuilder/pa …
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2001/07/18 22:38

今時の可変配列は、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;
}

この回答への補足

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

しかし、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
    • good
    • 0

> 元の配列より大きい配列をつくり、そこにコピーすればいいと考えたのですが、


> '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を
適用したらどうなるかも知りません。
実装依存でしょう。
    • good
    • 0

この通りの要求仕様ならRyo_Hyugaさんの方針通り、大きな配列を作ってコピーする方法で問題ないと思われますが...



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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!