はじめまして。

この度、ちょっとした計算プログラムを作ることになったのですが、
タイトルにもありますように、
『動的に作成した構造体配列の中に、さらに動的に構造体配列を作る』
方法がわからずに困っています。
実際には下記のようにプログラムしたいのですが...

-------------------------------------------------
'a'の構造体の中に作られる'b'の配列数は、下記のように
'a'の配列の番号により違い、また'a'の配列数も最初の段階では未定です。

構造体'a'←配列数未定 構造体'b'←配列数未定
a[0]-----b[0]
 |    b[1]
 |    b[2]
 |
a[1]-----b[0]
 |    b[1]
 |
a[2]-----b[0]
 |    b[1]
 .    b[2]
 .    b[3]
 .

-------------------------------------------------
new演算子で'a'の配列は作れたのですが、その中の'b'の数の分だけ
配列を動的に作成する方法がわかりませんでした。

最初は'b'の配列を多めに取って計算すればよいと思っていましたが、
計算過程で'b'の配列数が10000を越えてしまう場合があり、
また'b'の構造体のサイズも大きめなので、断念せざるをえませんでした。

どなたか、このように配列を作成する方法を知っている方がいましたら、
是非教えていただきたいです。

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

A 回答 (2件)

struct typDataB{


 long lData1;
 long lData2;
};

struct typDataA{
 typDataB* uDataB;
};

void main()
{
 typDataA* uDataA;
 uDataA = new typDataA [10];
 uDataA[0].uDataB = new typDataB [20];
 uDataA[0].uDataB[2].lData1=0;
 uDataA[0].uDataB[2].lData2=2;
}
では、外しているかも

この回答への補足

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

ですが、またしても問題が発生してしまいました。
上でいうところの'uDataA'の配列を途中で増やす必要が出てきてしまいました。
もし、動的に配列を増やすことができるようであれば、そのやり方も教えていただきたいです。

よろしくお願いいたします。

補足日時:2001/07/12 23:28
    • good
    • 0

構造体'a'の中で配列bを直接指定せずにポインタ型で指定し、


構造体'b'の宣言は構造体'a'の外に出し、別立てにしたらいかがですか。

つまり、a[0]の次にb[0],b[1],...,b[a[0]],を配置し、
その次にa[1]をメモリ配置しようとしても位置が決まらないわけですから。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q動的配列の構造体の受け渡しについて

動的配列の構造体の受け渡しについて教えていただきたいです。
typedef struct{
int class;
int **matrix;
}pattern_struct;
という構造体を用意しました。
メイン側で
int main(){
pattern_struct *sample,*prototype;
省略
for(k=0;k<9;i++){
for(i=0;i<height;i++){
for(j=0;j<width;j++){
prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j];
}
}
for(i=0;i<height;i++){
for(j=0;j<width;j++){
prototype[1].matrix[i][j]=sample[k].matrix[i][j]+prototype[1].matrix[i][j];
}
}
    ~9まで続きます~
}
省略
}

少し変えていますが、このようなプログラムを記述しました。
記述を省略するためにmallocで作成した構造体配列の足し算をする関数を作りたいのですが、どのように記述するべきなのでしょうか。

動的配列の構造体の受け渡しについて教えていただきたいです。
typedef struct{
int class;
int **matrix;
}pattern_struct;
という構造体を用意しました。
メイン側で
int main(){
pattern_struct *sample,*prototype;
省略
for(k=0;k<9;i++){
for(i=0;i<height;i++){
for(j=0;j<width;j++){
prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j];
}
}
for(i=0;i<height;i++){
for(...続きを読む

Aベストアンサー

>switch の立場はいったいどこへとは?

#2でちゃんと説明してありますけど。

>prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j];

switch (sample[k].class)
{
case 0:
prototype[0]~ // prototype[0] の 0 はsample[k].classの値と一緒
break;
case 1:
prototype[1]~// prototype[1] の 1 はsample[k].classの値と一緒
break;
~ これを9まで繰り返し
}

これは次に書き換えられるわけで

switch (sample[k].class)
{
case 0:
prototype[sample[k].class]~
break;
case 1:
prototype[sample[k].class]~
break;
~ これを9まで繰り返し
}

さらにswitchも意味がないので

prototype[sample[k].class].matrix[i][j]=sample[k].matrix[i][j]+prototype[sample[k].class].matrix[i][j];

になるわけですが。
なのでswitchの立場がない。

変えたのは少しのつもりなんでしょうけど質問に書かれてるのと処理的には別物になってますが、これであってるんですか?

>switch の立場はいったいどこへとは?

#2でちゃんと説明してありますけど。

>prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j];

switch (sample[k].class)
{
case 0:
prototype[0]~ // prototype[0] の 0 はsample[k].classの値と一緒
break;
case 1:
prototype[1]~// prototype[1] の 1 はsample[k].classの値と一緒
break;
~ これを9まで繰り返し
}

これは次に書き換えられるわけで

switch (sample[k].class)
{
case 0:
prototype[sample[k].class]~
break;
...続きを読む

Qchar *name1[4] とchar name2[][4] の違いについて

C言語のことで質問があります。

char *name1[4]は
char *name1[4] = {"abcdefghi","jkl","l","mn"};
と宣言でき,ポインタを4つ確保した形となりました。

char name2[][4]は
char name2[][4] = {"abc","def","ghi","jkl","mno","pqr","stu","vwx"};
と4文字以内の文字列を初期化した数だけ確保した形となりました。

この結果からchar *name1[4]の意味は,char name2[][4]ではなくchar name2[4][]に近いと思いました。
しかし,char name2[4][]ではポインタを4つ確保した事にはならないみたいでコンパイルが通りません。
*name1[4]では4つのポインタを確保できるのに~と思ってしまいます。

ポインタと配列は別物と考えるべきなのでしょうか?
訳の分からない質問かもしれませんが,
何卒ご指導いただくようよろしくお願いします。

Aベストアンサー

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり、この場合のa1は、
変数ではなく、定数のようなものなのです。

複合的なケースについて見てみましょう。
char **q1; ポインタへのポインタ
 q1,*q1,**q1,q1[0],*q1[0],q1[0][0] のいずれも変数として
 扱うことができます。(値を代入することが文法的に許されます。
 ただし、実行時にはアクセス違反になる場合もあります。)
char q2[4][4]; 二次元配列
 q2,q2[0]は変数として扱うことができません。q2[0][0]のように
 して、初めて変数として扱えるようになります。
char *q3[4]; ポインタの配列
 q3は変数として扱うことができませんが、q3[0],*q3[0],q3[0][0]
 はいずれも変数として扱うことができます。
 なお、この定義は char *(q3[4]); とした場合と全く同じ意味です。
char (*q4)[4]; 配列へのポインタ
 q4,(*q4)[0],q4[0][0]はいずれも変数として扱うことができます。
 しかし、*q4,q4[0]は変数として扱うことができません。

char *name1[4]; と char name2[4][]; は確かに似ています。しかし
違うところもあります。それは、name1[0] が変数として扱えるのに
対し、name2[0] には値を代入できないという点です。(データの
具体的な構造については、inthefloiさんが書いておられる通りです。
> char name2[4][]ではポインタを4つ確保した事にはならないみたい
というのも、全くその通りで、配列の定義では、ポインタ変数の領域
を確保する余地はないのです。

ポインタと配列の違いというのは、変数と定数の違いのようなものです。

話を簡単にするために、一次元配列から考えましょう。

char *p1; と定義した時のp1は、いうまでもなくポインタで、
これは変数です。p1は任意の文字列を指すことができます。
char a1[4]; と配列の形で定義した場合のa1については、
a1[0]やa1[1]等を、通常のchar型の変数と全く同じように扱うことが
できます。しかし、a1自体は、例えば a1 = p1; のように値を代入する
ことができません。(逆の p1 = a1; は可能。)つまり...続きを読む

Q[VC++][MFC][SDI]ダイアログコントロールもしくわツールバー!!詰まってます!!

現在VC++6.0でMFCを使いSDIのプログラムを作っているのですが、フォームにダイアログバーを張っています。

これをツールバーのように自由に動かしたり、左右上下にドッキングさせたり。
これって実現可能でしょうか?

色々ためしてみたんですが無理でした。
やっぱ不可能ですかね?

これが無理なんであればデフォルトで作成されるツールバー([新規作成][開く][保存]等が入ってる)にコントロール(ボタンやリストボックス)を追加して使用、と考えているのですがこれも難しい!!!


まだまだ未熟者なのですがどうかご存知の方おられましたらご教授ください!!
よろしくお願いします!!

Aベストアンサー

Dannerです。
参考URL(英語)を載せておきます。

参考URL:http://www.codeguru.com/Cpp/controls/toolbar/placingcontrolsintoolbars/article.php/c2505/

Q共用体の配列 [C言語]

今C言語のプログラムを組んでいたのですが、共用体の配列あるわけないと思いつつ共用体の配列を宣言したソースをコンパイルして見ました。そしたら普通にコンパイルできてしまったんです。びっくりしてその配列に値を代入したのですが、それはコンパイルエラーが出ました。共用体の配列なんてあるのでしょうか?回答よろしくお願いします。

Aベストアンサー

あります。

Q[動的配列]C言語の勉強で簡単な単語帳プログラム

C言語の勉強として以下のような簡単なプログラムを作りました。
テキストファイルからユーザが入力した単語を検索し、ヒットしたものだけ
その単語とその説明を表示するというプログラムです。

正常に動いているようなので、
つぎはループごとに、読み込んだ文字数に合わせて
配列(mean)の要素数を動的に確保するということを
しようと思うのですがどのタイミングでmallocやreallocを入れればよいのか
いまいちよくわかりません。

また、このプログラムの欠点などありましたら教えていただけると助かります。
よろしくお願いします。

---------------------------------------------------------------------
//マイ単語帳プログラム
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

main(){

char input[100];//ユーザが入力した文字列を格納
char tango[200];//ファイルの単語
char mean[1000];//ファイルの説明
char conti;//検索を続けるかどうかの入力
int flag;//検索単語がヒットした場合に立てるフラグ
FILE *fp;

//単語ファイルのopen
if((fp=fopen("tango.txt","r"))==NULL){
printf("ファイルが開けません。");
exit(1);
}

/*******************ファイルからの文字列読み込み****************************/
//Yが入力されるまで検索を続ける
do{
printf("検索する単語を入力してください。\n");
scanf("%s",input);
printf("検索対象:%s\n\n",input);

flag=0;//ヒットしたかどうかのフラグの初期化
while((fscanf(fp," %s %s",tango,mean))!=EOF){//fscan 書式を指定して読み込める。
if(strcmp(tango,input)==0){//strcmpは2つの引数が同じ時0を返す
printf("%s\n%s\n\n\n",tango,mean);
flag=1;//ファイル内に単語があった場合にフラグを立てる。
}
}

rewind(fp);

if(flag==0){
printf("その単語は登録されていません。\n");
}

printf("検索を終了しますか? ==> Y\n");
printf("検索を続けるにはY以外の文字を入力してください。\n");
scanf(" %c",&conti);//scanfの問題点を回避するために読み込み前に半角スペース
}
while(conti!='Y');

/**************************************************************************/
fclose(fp);
return;
}
----------------------------------------------------------------
tango.txt

apple リンゴ
SMTP 電子メールの送信や転送を行うためのプロトコル。
rewind 形式:rewind(ファイルポインタ); C言語のファイルシステム関数。ファイルの現在位置をファイルの先頭に置くことができる。

C言語の勉強として以下のような簡単なプログラムを作りました。
テキストファイルからユーザが入力した単語を検索し、ヒットしたものだけ
その単語とその説明を表示するというプログラムです。

正常に動いているようなので、
つぎはループごとに、読み込んだ文字数に合わせて
配列(mean)の要素数を動的に確保するということを
しようと思うのですがどのタイミングでmallocやreallocを入れればよいのか
いまいちよくわかりません。

また、このプログラムの欠点などありましたら教えていただけると助かります。
...続きを読む

Aベストアンサー

>やはりできないのですかね?(^_^;)

meanを読み込む前にmeanのサイズを取得する方法がないと…無理でしょうね。

あるいは…1文字(1バイト)ずつ読み込んで、改行位置に到達しなかったらrealloc()で拡張して、さらに1文字(1バイト)読み込む…とか。
realloc()自体は1バイト単位でやる必要は無いかも知れませんけどね。
# そこらヘンは http://oshiete.goo.ne.jp/qa/6961996.html 辺りでも話題になってますが。

>要するにヒットしたらすぐに抜け出す方が効率がいいということですかね?
>テキストファイルのインデックスは重複しないように作成するつもりです。

仕様次第…です。
 man (成人の)男,男子
 man [無冠詞で総称的に] (女と対比して)男
 man オンラインリファレンスマニュアルのインターフェース
とか、複数の意味があるものを無視するかどうか…でしょう。
最初にヒットしものだけ。重複はない。というのであれば、ヒットした時に読み込みループを抜けた方が動作としては軽い…かと。

>strcmpする前にワンクッションおいて大文字小文字を区別しないような動作を入れるといいということでしょうか?

stricmp()を使う。なんて方法もあります。
input[]に入るのが、ASCIIの場合に限るかも知れませんけど。
# shift-jisが入った場合にstricmp()が正しく動作するかは…ライブラリ次第でしょうな。

>やはりできないのですかね?(^_^;)

meanを読み込む前にmeanのサイズを取得する方法がないと…無理でしょうね。

あるいは…1文字(1バイト)ずつ読み込んで、改行位置に到達しなかったらrealloc()で拡張して、さらに1文字(1バイト)読み込む…とか。
realloc()自体は1バイト単位でやる必要は無いかも知れませんけどね。
# そこらヘンは http://oshiete.goo.ne.jp/qa/6961996.html 辺りでも話題になってますが。

>要するにヒットしたらすぐに抜け出す方が効率がいいということですかね?
>テキストファイルのインデッ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報