• ベストアンサー

テーブル展開について

はじめまして! 今、テーブル展開について非常に悩んでいます。 ファイルに記述されている文字列(可変長)を 共有メモリに展開するにはどうしたらいいのか 知っている方がいらしたら教えてもらえませんか? ちなみに言語はC言語です。 宜しくお願いします。

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

  • ベストアンサー
  • pasta500g
  • ベストアンサー率46% (30/65)
回答No.1

勘違いしてたらゴメンナサイ。 テーブル展開でお悩みとは、要するに可変長列/可変長行のファイルの内容をメモリ上に展開したいがどういうデータ構造にすれば良いか?という意味ですか? 多次元の可変長データならリスト構造が定石かなぁ? ファイルから1行読んだ後、lengthを取って見合う長さのエリアをallocし、そこにstrcpy、さらにリスト構造体をallocしてそこに前述の文字列の先頭ポインタを代入、次行以降これを繰り返してリスト構造体を繋げていく。 1charづつリスト構造体に入れて2次元リストにする手もありますが、1行分の文字列の登録/抽出処理が面倒になるので、行方向は1本の文字列として上記の様にlengthを見てallocしてしまうのが簡単かと。 こんな文章ではイメージできない!(もっともだ)様でしたら、下記URLなどを参考にして下さい。 最後に、リスト構造はゴミ掃除が大変なのでご注意を。

参考URL:
http://www.st.rim.or.jp/~phinloda/cqa/cqa4.html#Q14
makoto_s
質問者

お礼

有難う御座いました。 非常に勉強になりました。 又、解らない事があった時は宜しくお願いします。

その他の回答 (1)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

用途によっていろいろやり方があると思うので, 何をしたいかによると思います。 文字列が可変長でも文字列の数が固定かどうかとか、 あとで中身を別の物に長さも変えて入れるかどうかとか、 …。 また、共有メモリを使う場合、単一の領域のみ使うか, 複数使ってもよいか、大きさはどのぐらいにするかでも 違ってくると思います。 OSによっても多少事情がことなるかも知れませんし, その共有メモリを使うのはどういうプログラムであるか、 いくつのプロセスがそれを同時に使うのかとか。 一応どんな場合でも共通と思うのは,ある程度の大きさを 一度にまとめてとる必要があることです。 malloc()を使う場合は数バイトのを沢山とっても あまり気にする必要はありませんが、共有メモリの場合は そうはいきません。 たとえば、256Kbyte領域をとって、その中を自分で 管理して使う、つまり、malloc(),free()に相当する ことを自分でやる必要があります。 まあ、固定の大きさのテーブルをとるなら、そこまで やる必要はありませんけど。 これは、共有メモリを管理するのはOSにとっては かなり負荷の大きいことによります。 だから、領域はまとめて少ない数を使う必要があるわけです。

関連するQ&A

  • AテーブルからBテーブルへの展開

    表題のとおりAテーブルのデータを展開し、 BテーブルへINSERTするというPLSQLを考えています。 以下ような感じです。 Aテーブル No 列A1 列B1 列C1 列D1 列A2 列B2 列C2 列D2 列A3 列B3 列C3 列D3 -------------------------------------------------------------- 上記表のデータを Bテーブル No 列BA 列BB 列BC 列BD ------------------------- No 列A1 列B1 列C1 列D1     ←列名の末尾が1のもの No 列A2 列B2 列C2 列D2     ←列名の末尾が2のもの No 列A3 列B3 列C3 列D3     ←列名の末尾が3のもの と、いう感じでBテーブルへ。 Aテーブルの列名は”列A1”のように末尾に数字がついておりBテーブルへは 末尾が同じものを1レコードとしてINSERTします。 これを実現する方法として CURSOR csr IS SELECT * FROM ( SELECT 列A1 ,列B1 ,列C1 ,列D1 FROM Aテーブル UNION SELECT 列A2 ,列B2 ,列C2 ,列D2 FROM Aテーブル UNION SELECT 列A3 ,列B3 ,列C3 ,列D3 FROM Aテーブル ); 上記のようにカーソルで処理してINSERTする以外に方法がありますでしょうか 因みにこの例では1~3項目ですが実際には1~15項目まであります。 BテーブルへINSERTする列数も13列存在します。 DBはORACLE9iです

  • エクセルのMID関数は、C言語では?

    最近C言語を始めたものです。 エクセルでは文字列の3文字目~5文字目を切り取る際に MID("文字列",3,2) と記述できますが、C言語の場合、はどのような記述方法になりますか?ご教授お願いいたします。 いま悩んでるのが、CHAR型の変数:aaaに"abcdefghi"を格納して、 aaaの3文字目~7文字目を抜き出したいというC言語での方法です。

  • 複数のテーブルのうち一つに外部CSSを適用したい

     今HTMLファイルを作っているのですが、テーブルAの中にテーブルBが入っているとき、外部CSSをテーブルBだけに適用する方法はあるのでしょうか? テーブルBのソースに直接スタイルを記述すれば一応出来るのですが、たくさんのファイルで同じスタイルを使用するので、出来れば共有できる外部ファイルで解決したいのです。分かる方がいらっしゃいましたら、ぜひ教えてください。

    • ベストアンサー
    • HTML
  • テーブルのサイズについて

    HP作成のとき、 table width (height) の設定をしますが、ウィンドーを縮めたときに1列の文字が2列になるのがいやで、widthを%で指定せず固定(px)でいつもやります。 ただわたしはA4ノートPCでフルサイズで見てバランスがいいと思ってても、これより大きいサイズではえらく余白ができると思います。 そこで質問なのですが、一般的にテーブルのサイズは固定でやるものなのでしょうか?それとも可変でやるものなのでしょうか?

  • PHPのcurlの結果が展開されない

    PHPのcurlやsnoopyといったライブラリを使用して、外部サイトと自動で連携できるようなツールをつくりたいと思っています。 自動でログインさせるところまではできたのですが、ログイン後遷移したページの結果文字列(html)がテンプレートファイルのまま返ってきてしまっており、内容が取得できません。 結果の文字列は <script type="text/x-handlebars-template"> ~ </script> で囲まれており、中身は <div class="header"> <div class="header_aa"> {{#user}}{{> profile}}{{/user}} </div> などとなっており、テンプレートファイルの記述のままで、変数が展開されていない状態です。 欲しいのはこれが展開(解釈)された後の結果文字列です。 名前からしてhandlebars.jsのテンプレートファイルを使用しているのは分かるのですが、なぜこれは展開されないのでしょうか? PHPプレーンのcurlでアクセスしても、snoopyを使用してアクセスしても結果は同じです。 オプションでもこれを解決するようなものが見当たらず、行き詰まっております。 どうすれば展開後の結果が取得できるのか、ヒントがあれば教えて下さい。 なにとぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • C言語中でunixのコマンドを使いたい

    c言語でプログラムを作ってるんですが、カレントディレクトリ名や、ある名前のファイルが存在するかどうかや、あるファイル中にある文字列があるかどうかなどの判定を行いたいんですが、cで一から記述すると長くなりそうなので、pwcやfind、grepといったコマンドをc言語中で実行でると便利だと思ったんですが、そんな事ってできますかね?

  • テーブルを使った置換

    Access2002 Accessでクエリ実行時に特定の文字列を置換したいと思っています。 今までは置換する文字列が1つだけだったので、replace関数を使って直接置換する文字列を書いていたのですが、置換する文字列が今後増えてきそうなのでテーブルで管理したいと思っています。 置換用テーブル 元 ,置換後 000022,002078 000218,002403 000447,002703 クエリは単純な選択クエリなのですが、上記のようなテーブルを使ってクエリ実行時に文字を置換する方法がわかりません。 よろしくお願いします。

  • mallocの使い方

    すいません初心者な僕に教えて頂きたいことがあるます。 1行64バイトのファイル(行数可変)のデータに何回も文字列の検索を行ういアウトプットするプログラムを作っています。 fgetsを使い何回もファイルを読み込んで一行ずつ比較するというようにできたにはできたのですが、 行数可変で多い場合100000行超えたりするファイルに対してはえらい時間がかかります。 mallocが良いとはわかったのですが、なかなかうまく組めません。 ご教示願えませんでしょうか。 ↓のような文字列があり 型番 要素1 要素2 要素3 A 1044 100 123 A 1055 277 155 B 100 115 224 C 115 277 885 B型番の要素2がB型番の要素と一致した時B型番の要素2と要素3に一致するC型番の文字列を探しだすというようなプログラムです。 これがA、B、C共にソートされずランダムに並んでいます。 検索する度に毎回ファイルを読み込まず、一括でメモリに溜め込み、その中から文字列を抜き出し比較したいと思っています。。 長くなりましたが宜しくお願いします。

  • ホスト言語でテーブル更新

    MySQL5.0で直接言語ではなくホスト言語で作ったデータベースを編集(更新)するにはどうすればいいですか? いま、データベースを作りテーブルもつくりました。 そこで、ホスト言語(C言語)でその作ったデータベースを編集(更新)しようと思うのですが、 main() { EXEC SQL BEGIN DECLARE SECTION;      :      :      : と、「.c」で保存したc言語のソースファイルがあります。 でも、作ったのはいいが、どうすればデータベースを 編集(更新)できるかわかりません。 教えてください。

    • ベストアンサー
    • MySQL
  • Accessでテーブルの値をテキストボックスに代入するには?

    [ID][文字列]の2つのフィールドからなる単純なテーブルがあり、削除クエリを併用して常に最新のデータしか格納されていない状態に工夫できました。(データは常に1つ) そこでフォーム上にあるテキストボックスにこのテーブルの[文字列]フィールドのデータを表示させたいのですが、 どうしたらよいでしょうか? また、このテーブルの[文字列]フィールドのデータを直接変数として使いたい場合はVBAでどのように記述すればよいのでしょうか?