• 締切済み

C言語とFortranで記された補間関数から、VB6で使用可能なDLLの作成について御教授願います。

 Scilabのcshep2d、eval_cshep2d関数(3次元のshepard補間関数)に相当する機能、即ち、複数の(x,y,z)の値が記されたn x 3の行列ファイルを読み込み、ある特定の格子点上にない離散的な(x,y,z)から3次元曲面z=F(x,y)を推定し、任意の(x,y)におけるzの値を返す機能、をDLL化してVB6で使用したいと考えています。  WinのCやFortranのコンパイラは高価故、Linuxのgccやgfortranを用い、Scilabの補間モジュールのソースからVB6で使用可能なDLLの作成を考えていますが、その方法を順を追って御教授願います。  支出不要の他の方法で上記の機能が実現出来るのであればScilabに限定はしておりません。以下は参考リンクです。何卒宜しくお願い致します。  cshep2d関数 http://www.scilab.org/product/man/cshep2d.html  Scilabソース http://www.scilab.org/download/5.1.1/scilab-5.1.1-src.tar.gz

みんなの回答

回答No.4

 質問を投稿した、HopeAceAnsです。  禁止事項ガイドラインの「【その他迷惑行為】■マルチアカウントによ る自作自演投稿」にやや抵触するかもしれませんが、質問者自身で何とか 解決できそうな場合で、コメントを記しながらの質問の締め切り方が分か りませんでしたので、敢えて、もう一つFindAceAnsというアカウントを作 成して回答しております。  質問に記したScilabソースの中で私が必要としているのは結局のところ /scilab-5.1.1/interpolation/src/fortran/cshep2d.f のみと分かりました。cshep2d関数の数学的な話に関してはこのソース内に 詳細が書かれておりますし、またこのソースファイルからVB6で利用するま での道筋についてはなんとか自分で開拓できそうです。それ故、この質問 を締め切ることに致しました。  ご回答をして下さったlv4u様、necomimi様どうもありがとう御座いまし た。また機会がございましたらご助言いただけると幸いでございます。

HopeAceAns
質問者

お礼

 質問を投稿した、HopeAceAnsです。  この質問を読んでいる皆様に対して、回答者に対するお礼がコメントとし てホームページ上に記されることを知らず、FindAceAnsというアカウントを 新たに作って上記のようなコメントをしてしまったことをお詫び致します。  

  • necomimi
  • ベストアンサー率41% (633/1540)
回答No.3

Windowsコンパイル条件がそう指定されてるってことは その辺のライブラリが必要なんでしょうね。 圧縮ソースで50MB以上ってことは20万行を超えてませんかね!? さすがに書き換えは… お力にはなれそうにないですね orz

HopeAceAns
質問者

お礼

 質問を投稿した、HopeAceAnsです。  質問に記したScilabソースの中で私が必要としているのは結局のところ /scilab-5.1.1/interpolation/src/fortran/cshep2d.f のみと分かりました。cshep2d関数の数学的な話に関してはこのソース内に 詳細が書かれておりますし、またこのソースファイルからVB6で利用するま での道筋についてはなんとか自分で開拓できそうです。それ故、この質問 を締め切ることに致しました。  ご回答をして下さったnecomimi様どうもありがとう御座いました。 また機会がございましたらご助言いただけると幸いでございます。

HopeAceAns
質問者

補足

早速のご回答有り難う御座います。 補間関数のモジュール部分は、非圧縮で702.6 KB(計147アイテム)で、 /scilab-5.1.1/modules/interpolation/ コアとなる補間関数のソースは、非圧縮で239.8 KB(計23アイテム)です。 /scilab-5.1.1/modules/interpolation/src/ 折角のご回答に質問でお返事をしてしまい申し訳御座いませんが、逆に、 VS2008の90日評価版などを導入すればDLLの作成が出来て、晴れてVB6で cshep2d、eval_cshep2d関数が使用出来るようになりますでしょうか?

  • necomimi
  • ベストアンサー率41% (633/1540)
回答No.2

C言語やFortranで作るのはいいとしても Linux上でコンパイル、リンクするんですよね? 共有できるリソースが違うから それをWinに持ってきても動かないと思うけど…

HopeAceAns
質問者

補足

 参考意見有り難うございます。  DLLの最終的な機能としては、x,yの二つの値を受け取り、適当な計算の 後、zという値を出す、というものを考えて居りましたが、その過程はOSの 依存が避けられない程複雑なものとなってしまうのでしょうか。。。  scilab-5.1.1-src.tar.gz\Readme_Visual.txtによりますと、Scilab全体 をWindowsでコンパイルする場合は、   * Visual Studio C++ .NET 2008 Pro   * Intel Fortran 10.1.020 (or more)   or   * Visual Studio C++ .NET 2008 Express が必要とあります。当方のWindows環境は、VisualStudio6です。モジュー ルのみの利用の場合、ソースやvcprojファイル、その他のファイルを書き 換えるなどして対応出来ないか模索しましたが、挫折しました。  もし、VS6に対応した書き換え等が対応出来そうでしたら、それについて 御教示頂けると幸いです。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>WinのCやFortranのコンパイラは高価故、Linuxのgccやgfortranを用い、Scilabの補間モジュールのソースからVB6で使用可能なDLLの作成を考えていますが、その方法を順を追って御教授願います。 それは、できないと思います。なんでそれが可能と思えたのですか?なにかの本やサイトに可能だと載っていたのでしょうか?

HopeAceAns
質問者

お礼

 質問を投稿した、HopeAceAnsです。  質問に記したScilabソースの中で私が必要としているのは結局のところ /scilab-5.1.1/interpolation/src/fortran/cshep2d.f のみと分かりました。cshep2d関数の数学的な話に関してはこのソース内に 詳細が書かれておりますし、またこのソースファイルからVB6で利用するま での道筋についてはなんとか自分で開拓できそうです。それ故、この質問 を締め切ることに致しました。  ご回答をして下さったlv4u様、どうもありがとう御座いました。 また機会がございましたらご助言いただけると幸いでございます。

HopeAceAns
質問者

補足

 早速のお返事有り難うございます。こんなにも早くお返事を頂けるもの とは思ってもいませんでしたので、幾分驚いて居ります。  さて、ご質問の件ですが、下記サイトに、gfortranは現在DLLEXPORT等の 機能はサポートしてないが、DLLをビルドするための強力なアプローチがあ る、との記述があります。 http://gcc.gnu.org/ml/fortran/2009-06/msg00199.html  また、gfortran使用上の問題を幾らか抱えつつもDLLを作ったとの報告も 幾らかあるようです。 http://gcc.gnu.org/ml/fortran/2005-04/msg00401.html http://gcc.gnu.org/ml/fortran/2009-01/msg00164.html http://www34.atwiki.jp/yonetti/pages/15.html  Scilabはソースが公開されている上Linuxでも動作可能であり、上記の方 法と組み合わせることで、DLLを作成してVB6に組み込めるのではないかと 考えました。  当方では最終的に、Scilabのcshep2d、eval_cshep2d関数に「相当する」 機能のVB6での実現、を目指しております故、もしそれが可能な他の方法が あれば、それでも問題はありません。

関連するQ&A

  • Cで作成したDLL関数をVBから呼ぶ

    以前にあった「Cで作成したDLL関数をVBから呼び 引数渡し方法」を試したのですがVB側でデータが受け取れません。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=711327 C側での値設定がわるいのでしょうか? VB側 Public Declare Function testAP Lib "C:\bin\test.dll" (ByVal lpKeyData As String) As Long --------------------------------------------------------------------------- Dim lngRc As Long Dim keydata As String * 128 keydata = String$(128, Chr(0) & Chr(0)) lngRc = testAP(keydata) VC側 __declspec(dllexport) long __stdcall testAP(char *lpdata){ →C側でlpdataに値を設定する lpdata="ABCDEF"; }

  • VBのBooleanはCではどんな方でしょうか? DLL

    元々、VB6のソースをCに書き直している最中ですが、 VBでintegerは Cではshortでよいのですが、VBでBooleanはCではどのように記述したらよいのでしょうか? 確かCは真が-1で偽が0だったと思いますが、それならば shortで定義して・・・ でうまくいくのでしょうか? VBから呼び出すCの関数のDLLを書いた事のある方、教えていただけますか? また、今の時代、DLLは古いでしょうか? だいぶ前のソースをいじくっております。

  • C言語で電卓を作成する。

    C言語を用いて三項まで計算できる電卓を作りたいのですが、どうも上手くいきません。 四則演算(+、-、×、÷)の優先順位を用いたプログラミング方法が分かりません。 以下に自分で作成したソースを添付します。 このソースに修正や追加して3項までの四則演算できるプログラミングを教えていただけますか? 宜しくお願いします。 #include <stdio.h> int main(void) { int answer; /*答え*/ int x,y,z; /*x=第一項,y=第二項,第三項*/ char op1,op2; /*演算子1、演算子2*/ while(1){ printf("式を入力してください\n"); printf("式:"); scanf("%d %c %d %c %d" ,&x,&op1,&y,&op2,&z); if((op1=='+'|'-'|'*'|'/') && (op2=='+'|'-'|'*'|'/')){ switch(op2){ case '+': answer=y+z; break; case '-': answer=y-z; break; case '*': answer=y*z; break; case '/': if(z==0){ printf("ERROR\n"); return 0; } answer=y/z; break; default: printf("ERROR\n"); return 0; } switch(op1){ case '+': answer=x+answer; break; case '-': answer=x-answer; break; case '*': answer=x*answer; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/answer; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } else { switch(op1){ case '+': answer=x+y; break; case '-': answer=x-y; break; case '*': answer=x*y; break; case '/': if(y==0){ printf("ERROR\n"); return 0; } answer=x/y; break; default: printf("ERROR\n"); return 0; } printf("答え:%d\n",answer); } } } 左辺に×、÷が来ても優先的に計算されません。

  • DLL VBとC++

    VBAからVC++2005のDLLを呼び出すプログラムを書いています。 VB側で作成したcpp_proc関数を呼ぶとVBアプリ自体が落ちました。 DLLのreturnの直前に以下のMessageBoxで表示させるとそこまでは表示され、 リターンを押すと、落ちました。 VB側の引数の値 String * 8192が悪いのでしょうか? return直前まで動作していたので、DLLの戻り値に何か原因があるのでしょうか? ついでの質問ですが、DEFの @1は無くても動くのでしょうか? 意味が知りたいです。 // ----- C++ (DLL側) ----- int __stdcall cpp_proc(LPCSTR inp, LPSTR out) { ... 省略 MessageBox(0, "ここまで通過", "debug", MB_OK); return 0; } // ----- DEF ----- LIBRARY "example" DESCRIPTION 'テスト' EXPORTS ; 明示的なエクスポートはここへ記述できます cpp_proc @1 '----- VB側 ----- Public Declare Function cpp_proc Lib "example.dll" _ (ByVal inp As String, ByRef out As String) As Integer Public Sub Test() Dim ret As Integer Dim inp As String Dim out As String * 8192 ret = cpp_proc(inp, out) MsgBox("ret=[" & Cstr(ret) & "]"); End Sub

  • C言語のプログラムを作成して下さい。

    C言語で以下のような機能を持つプログラムを作成してください。 3つの文章X.txt,Y.txt,Z.txtでY,ZのうちどちらがXに近いか判定するプログラム。X.txtを読み込んでXに出現する単語からなる単語の木を作成する。次にY,Zを読み込み単語の木と単語の出現頻度をもとにXとY、XとZの類似度を測るための統計的データを計算する。そしてY,ZのどちらがXに近いか、とその根拠となる統計データを出力する。

  • VB2008でクラスライブラリー(DLL)を作成中なのですが、旨く出来

    VB2008でクラスライブラリー(DLL)を作成中なのですが、旨く出来ません。 それは、マウスでクリックした座標(X,Y)を取得したいのです。 ご存じの方がいらっしゃいましたらご教授下さいませ。 サンプルリストを書いて戴けると非常に嬉しいです。 以上 宜しくお願い致します。

  • Win32APIで作成したDLLをC#.NETで使用した時のDLL内の関数の動作について

    いつもお世話になっております。 今回ご教授頂きたい内容なのですが、 Win32APIで作成したDLLをC#.NETで使用した時のDLL内の関数の動作についておききします。 下記サイトで公開されている「ビットマップ形状に合わせてリージョンを作成する」CreateRgnFromBitmap関数についてなのですが、 http://orangeknowledge.jpn.org/tips/sdk001.html Win32APIでこの関数をDLL化したものをWin32APIで暗黙的リンク、明示的リンクで利用した場合は正常にCreateRgnFromBitmap関数が正常に動作するのですが、C#.NETで同DLLを利用した時に、関数を呼ぶ事はできますがなぜか正常に動作しません。 デバッグモードで処理内容をみてみたのですが、 // 一行分画像データを DIB で取り出す(bmpなので下から取り出す) GetDIBits(hDC, hBitmap, bm.bmHeight - y, 1, pScanData, (LPBITMAPINFO)&bi, DIB_RGB_COLORS); の部分でpScanData配列に一行分の画像データが正常に入っていませんでした。 そのためGetDIBitsの次に行う判定 // 一行分の透明/非透明の変化点を調査する for (int x = 0; x < bm.bmWidth; x++){ if (pScanData[x] != dwTransColor){ // 透明色でなければ ・・・省略・・・ で正常に判定が行われず引数としてわたされている「DWORD dwTransColor」透明色部分を正常に判定できていませんでした。 なぜWin32APIでは正常に動作するのにC#.NETでは正常に動作しないのでしょうか? 色々と試してみたのですがいっこうに分かりません。 ご教授よろしくお願い致します。

  • 曲面の一般式

    あることで、2つの要素からひとつの数値を導くことを考えています。 それを単純化すると以下のようになりますが、曲面の一般式(公式)を知らないので、悩んでいます。 xyzの3次元の曲面で、xとyを与えるとzが決まるようにしたいです。ただし、yが一定の値のとき、Z=ax^2+bx+cのようにxの二次関数で、xが一定の値の時、z=dy+eのようなyの一次関数です。(xが変わるとdとeも変化します。) このような曲面の一般式を教えて下さい。

  • VS2010C#からのDLL使用について

    VS2010 C#からVC6で作成したDLLへint配列を引数として渡したい。 VC++6で作成されたDLLがあります。 ここで定義されている int test(char*fname,int* x,int* y); ファイルのフルパスを渡すと 返り値が関数の成否のコードを返す。 処理内で x,y にファイルから読み込んだ値が それぞれ上限100個としてセットして返す といったような関数を C#から呼び出したいのですが 1 [DllImport("dll名", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int test(IntPtr fname, ref int* x,ref int* y); 2 [DllImport("dll名", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int test(IntPtr fname, ref IntPtr x,ref IntPtr y); と2種類の呼び出し方法をこころみました。 ファイルのフルパスは IntPtr fnamePtr = Marshal.StringToHGlobalAnsi(string型ファイルフルパス); としております。 1の場合は int[] resX = new int[100]; int[] resY = new int[100]; fixed(int* x= resX) fixed(int* x= resY) として呼び出そうとすると : エラー CS1657: '固定変数' であるため、'x' を ref または out 引数として渡せません となり失敗してしまいます。 2 で試みた場合 int size = sizeof(int)*100; IntPtr x = Marshal.AllocHGlobal(size); IntPtr y = Marshal.AllocHGlobal(size); と引き渡したところ ビルドは通りますが 実行時に System.AccessViolationException' のハンドルされていない例外が 発生しました。 追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 となってしまいます。 どのようにすれば思惑通りの結果を得られますでしょうか。

  • VB2005でVC6.0で作成したDLLから値を取得するには

    VB6からVB2005にコンバートをしたのですがVCで作成したDLLの関数の箇所で下記エラーが出てしまいました。(VCのDLLは他で使用の為変更できず。) エラー内容 「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」 いろいろサイト等を調べたのですがうまくいきません。 Marshal.AllocCoTaskMem、Marshal.Copyなどを使用すればできるらしいのですが難しすぎて挫折しました。。 どなたかご教授下さい。 よろしくお願い致します。 VC側ソース(XXX.DLL) GetData( unsigned char far *pRec,   //データ short int *pRecLen,  //サイズ { Char cbBuf[1024]; //バッファ memset(cbBuf, ' ', 1024); //初期化 Call GetBuf(cbBuf); memcpy(pRec, cbBuf, *pRecLen); return(0) ; } VB2005のソース <StructLayout(LayoutKind.Sequential)> Structure St Dim A () As Byte Dim B () As Byte End Structure Declare Function GetData Lib "XXX.DLL" (Byref RecData As St , ByRef Reclen As Short) As Short Sub Dim TmpData As St Dim TmpLen As short =100 Dim X As Byte Dim Y As Byte Redim TmpData.A(49) Redim TmpData.B(49) Call GetData(TmpData, TmpLen) X =TmpData.A(0) Y =TmpData.B(1) ・ ・ End Sub