はじめまして。
この度、以下のようなプログラムを作りました。
が、途中で配列の数を増やすことになってしまいました。
------------------------------------------------
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'の配列も動的に作成しているため、それも出来ない状況です。
どなたかやり方を知っている方がいましたら、教えていただきたいです。
下手な説明ですいません。
No.4
- 回答日時:
C++Builder5を持っていませんので分かりませんが、
どのような内容のエラーなのでしょうか。
もしかしたら、
聞いた話によるとC++Builder5のvectorにはバグがあるそうなので、
それが原因なのかもしれません。
それが原因ならばC++Builder 5 アップデートで直るようですが…
参考URL:http://www.borland.com/devsupport/bcppbuilder/pa …
C++Builder5のアップデートでは直りませんでしたが、
Builder3にダウングレードしたら成功しました。
ありがとうございました。
No.3ベストアンサー
- 回答日時:
今時の可変配列は、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;
}
-------------------------------------------------
No.2
- 回答日時:
> 元の配列より大きい配列をつくり、そこにコピーすればいいと考えたのですが、
> '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.1
- 回答日時:
この通りの要求仕様ならRyo_Hyugaさんの方針通り、大きな配列を作ってコピーする方法で問題ないと思われますが...
もしさらに複雑 or 柔軟なデータ構造操作の必要があるのでしたら、リスト構造などをキーワードに調べてみることをお勧めします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Excel(エクセル) エクセルデーターの並び替え 5 2022/08/06 09:59
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- Java Java・配列の問題です。 int 「」nums = new int「5」 ⤴︎ この5の事を言葉で 2 2023/06/21 22:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
C言語初心者 構造体 課題について
-
ExcelVBAで質問です。離れた二...
-
配列で格納したものをmsgboxで...
-
C# Listを使わずに2次元配列の...
-
配列を含む構造体の初期値について
-
unsigned char配列への入力の仕方
-
C言語で特定列だけを抽出して配...
-
配列の参照渡しで型が一致しま...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
スマホの数字キーをISOの配置に...
-
VBでC言語のポインタみたい...
-
C言語初心者 ポインタについて...
-
配列をEraseしてもメモリが開放...
-
C言語 配列の再初期化
-
VB.NET 構造体の配列の検索機能...
-
擬似コード 長さがmの配列でな...
-
【速いブラインドタッチ】手を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列の参照渡しで型が一致しま...
-
配列を使わずに、変数名を動的...
-
VBで構造体の配列を関数に渡す...
-
配列で格納したものをmsgboxで...
-
unsigned char配列への入力の仕方
-
C# Listを使わずに2次元配列の...
-
C# 配列の変数宣言について。
-
擬似コード 長さがmの配列でな...
-
【速いブラインドタッチ】手を...
-
パイソンの
-
C言語初心者 ポインタについて...
-
ExcelVBAで質問です。離れた二...
-
配列を含む構造体の初期値について
-
複数の選択範囲の行番号を個別...
-
Functionの戻り値を2次元配列...
-
C++ vectorに配列をプッシュしたい
-
先頭アドレスとは何ですか?
-
テキストファイルから文字列を...
-
Redimした動的配列はEraseする...
おすすめ情報