C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: 可変する表のデータをメモリ確保するにはどうしたらいいか


(過去ログ 86 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■51046 / inTopicNo.1)  可変する表のデータをメモリ確保するにはどうしたらいいか
  
□投稿者/ おねガイ (1回)-(2010/06/24(Thu) 03:13:34)

分類:[C/C++] 

メモリの確保の仕方で質問です。

表のなってるデータを確保する時、
表のフィールドがわかっていたら構造体を宣言してリストでNEWして確保すればいいのだが、

表自体が毎回かわってフィールドの数や位置や文字か数字か日付なのかわからない状態で
それらをメモリ確保する為にはどうしたらいいのでしょうか?

例えば
番号/名前/点数/
1/山田/80/
2/花子/53/
3/上田/60/
だったら
struct table{
int namber;
String name;
int point;
}
table *a = new table[10];

これがもし表のフィールドがわからない状態でどうプログラムを組めばいいのでしょうか?
引用返信 編集キー/
■51051 / inTopicNo.2)  Re[1]: 可変する表のデータをメモリ確保するにはどうしたらいいか
□投稿者/ επιστημη (2520回)-(2010/06/24(Thu) 05:39:46)
επιστημη さんの Web サイト
> これがもし表のフィールドがわからない状態でどうプログラムを組めばいいのでしょうか?

表の各項目の"意味"を表自体に埋め込むことができるように表を設計します。
手がかりなしには手も足も出ませんから。

引用返信 編集キー/
■51053 / inTopicNo.3)  Re[1]: 可変する表のデータをメモリ確保するにはどうしたらいいか
□投稿者/ 渋木宏明(ひどり) (1374回)-(2010/06/24(Thu) 08:44:33)
渋木宏明(ひどり) さんの Web サイト
>これがもし表のフィールドがわからない状態でどうプログラムを組めばいいのでしょうか?

行を表すのにハッシュテーブル使うとか。
引用返信 編集キー/
■51088 / inTopicNo.4)  Re[2]: 可変する表のデータをメモリ確保するにはどうしたらいいか
□投稿者/ たてよこ (12回)-(2010/06/24(Thu) 17:41:40)
渋木宏明(ひどり)さん、ありがとうございます。
解決済み
引用返信 編集キー/
■51095 / inTopicNo.5)  Re[3]: 可変する表のデータをメモリ確保するにはどうしたらいいか
□投稿者/ επιστημη (2522回)-(2010/06/24(Thu) 19:34:16)
επιστημη さんの Web サイト
おねガイ = たてよこ ?

解決済み
引用返信 編集キー/
■51105 / inTopicNo.6)  Re[4]: 可変する表のデータをメモリ確保するにはどうしたらいいか
□投稿者/ れい (936回)-(2010/06/25(Fri) 01:07:28)
No51095 (επιστημη さん) に返信
> おねガイ = たてよこ ?
回答がたてよこさんに役に立ったということでしょう。
たてよこさんは野心的な試みをしているようなので応援しています。

解決してしまうのは問題でしょうから、はずしておきます。

No51046 (おねガイ さん) に返信
> 表自体が毎回かわってフィールドの数や位置や文字か数字か日付なのかわからない状態で
> それらをメモリ確保する為にはどうしたらいいのでしょうか?

毎回の「回」は何を指しているんでしょう?
コードを書く時、クラスなりなんなりを再利用するときに毎回変わるのか、
実行時に動的に変わるのか。

前者なら、templateを使うと楽です。
もちろん、後者に対応できるなら前者も対応できるはずなので、後者のやりかたでも。

後者の場合、全ての情報を記録したいと思うなら
フィールドの数・位置・型というメタ情報と表内部の情報の二つを記録する必要があります。
メモリは通常1次元で、標準ライブラリなどでは基本的に配列の確保という形になりますので、
メタ情報も全て1次元で表現し、表という2次元の構造も1次元に落とします。

これにも用途に応じていろいろなやり方があります。
「行列」という形で一気に2次元の表にしたり、
「配列の配列」という形で1次元を積み重ねたり、
ゲーデルの対角線論法っぽく1次元を一気に多次元に折りたたんだり、
広い1次元に多次元を投影したり。

「行列」という感じでやるなら例えば…

struct テーブル {
フィールドの総数
フィールド情報[]
行数
行情報[]
}

struct フィールド情報 {
フィールド名
フィールドタイプ
その他の情報
}

struct 行情報 {
列情報[]
}

というように。

これだと追加や削除・挿入でかなり大変なので、
配列部分に挿入可能なリストを用いたりします。

RDBMS作成を目指すたてよこさんのように、SQLライクにデータを抽出したいのでしたら
各列に対してハッシュを作って持たせておくと「インデックス」や「キー」として使えます。
特に「主キー」列を必須としてそこのハッシュを取っておくと
重複チェックも楽ですしリレーションを張る際にも楽になります。
引用返信 編集キー/
■51111 / inTopicNo.7)  Re[5]: 可変する表のデータをメモリ確保するにはどうしたらいいか
□投稿者/ みきぬ (930回)-(2010/06/25(Fri) 09:36:04)
> メタ情報も全て1次元で表現し、表という2次元の構造も1次元に落とします。

[壁]-`)oO(それって電文?
引用返信 編集キー/
■51159 / inTopicNo.8)  Re[6]: 可変する表のデータをメモリ確保するにはどうしたらいいか
□投稿者/ たてよこ (13回)-(2010/06/25(Fri) 22:24:42)
struct 行情報 {
列情報[]
}

Listにデータを入れるときに
std::list<int> intlist; と宣言すると
int型のデータした投入できない
short,long,double,float,Stringなど
さまざまな違った変数を同じListに投入するにはどうしたらよいのか?

引用返信 編集キー/
■51162 / inTopicNo.9)  Re[7]: 可変する表のデータをメモリ確保するにはどうしたらいいか
□投稿者/ επιστημη (2525回)-(2010/06/25(Fri) 23:52:54)
επιστημη さんの Web サイト
2010/06/25(Fri) 23:56:41 編集(投稿者)

> short,long,double,float,Stringなど
> さまざまな違った変数を同じListに投入するにはどうしたらよいのか?

たとえば

enum type { Tshort, Tlong, Tdouble, Tfloat, Tstring };
list<pair<type,void*>>

だとか。メンドクセーけど。

# てかスレッド乗っ取っていいのかね ^^;

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -