• ベストアンサー

2ギガぐらい扱えるデータ型

C作成のDLLから引数で文字列を返すのですが 呼び出し元はVBで引数String型なので 2ギガまで文字列が格納できるのですが Cの方がそのような大きなデータを扱えず 内部エラーになり困っております。 CのDLLは複数の文字列を連続取得して ひとつの文字列にして返すという仕様です。 できたら今の仕様のままいきたいのですが もし他に代替案がありましたら そちらのほうもアドバイスいただきたいとおもいます。

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

  • ベストアンサー
  • honiyon
  • ベストアンサー率37% (331/872)
回答No.1

こんにちは、honiyonです。  大胆な仕様ですね笑  malloc で 2Gbyteとれませんか?  32bit環境だったらいけた気がしますが、ちょっと自信はありません。  もしそれが無理ならば、ストリーム形式をとるのが良い感じだと思います。(fopenのようなもの)  例えば、 StrReady; で文字列の送信を用意させ、 StrRead(Buf, sizeof(Buf));といった形で、指定されたバイト数を Bufに格納する。といった形です。  開発する側としては面倒な仕様ですが、後々の事を考えるとこうしておけば柔軟に扱えると思います。  参考になれば幸いです(..

nekosuzu
質問者

お礼

ご回答ありがとうございます。 malloc()または char a[max]で 領域を確保しようとおもいます。 いろいろネットでもみたんですが Cってメモリ管理結構大変なんですね 今まで気にしたことがなかったので びっくりです。 まぁ2Gのデータを扱うことはないとおもいますが VBのStringが2Gまで扱えるということで 書いてみました。 VBより検索パラメタをわたし 実際はCでTCP/IPの電文送受信 その電文のデータ部をひとつにつなげて VBに返すというものを作成しています。 すこしデータ数が多くなるだけでおちるので (現在40k程度でおちてます) もう少し取る方法がないものか 模索しておりましたところです(^^;;; 初Cでソケットはちときついですが(泣き言) もうすこしがんばります 本当にありがとうございました

その他の回答 (2)

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

将来のことはわかりませんが、現在のパソコンでやるには豪快というようり無茶苦茶な仕様ですね(^^;; そもそも何のためにそんなことをしているのか判らないので、代替案の出し様もありません。 現実的にはファイルを使うのでしょうが、それでも2Gを必要とするような仕様は現実的ではありませんね。 少し前に戻って何をしたいのかをはっきりさせ、 その為にはどういうのが実際使う上で不都合が生じ難いか考え直すべきでしょう。 いえ、お願いですから,そういう無茶な仕様を考えるのは止めてください(^^;;

nekosuzu
質問者

お礼

アドバイスありがとうございます。 実際の連携部の仕様をかいつまんでかきますと VBから検索のパラメタをCのDLLにわたし CのDLLはTCP/IPで電文を送信 クエリ結果がいくつかの応答電文でかえってくるので 応答電文のデータ部をひとつにつなげて VBにかえすというものです 本番データを確認しましたら十分見積もって 150kぐらいあればなんとかいけそうな感じです。 現在45kぐらいで落ちてしまうので もう少し取得できないものかと 模索しておりました。 質問を簡略に書きすぎて 伝わりにくくなってしまって ご迷惑をおかけしました。 本当にありがとうございました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

#1の方と同様、豪快な仕様だと思います。 で、はっきり言って、アウトです。 32bitアプリではメモリ空間は4Gまで使用可能ですが、その中で使用できない分があったりしますので、VBで2G、DLLで2Gなんて事をしたら間違いなくメモリ不足で落ちます。 どうしてもまとめて取りたいのであれば、ファイルに書くのが現実的だと思います。 NTFSでフォーマットされているのであれば、ギガなんて単位よりずっと大きなサイズでも扱えますし。

nekosuzu
質問者

お礼

アドバイスありがとうございます。 たぶん2Gのデータを扱うということは ないので大丈夫だとおもいます (現本番データだと150kぐらい あればいい感じです) 現在45kぐらいでABENDしてるため 困っておりました。 malloc()でとりあえず明示的に 領域を確保してやりたいとおもいます。 いろいろ複雑な処理をしてるので 質問を省略してかこうとして省略しすぎてしまったようで 伝わりにくくてご迷惑をおかけいたしました。

関連するQ&A