問題タブ [clp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - JNAを使用してJavaプリミティブ配列をC dllに渡す方法は?
JNA を使用して Java コードを DLL にマッピングする場合、C の関数引数がポインタの場合、C 呼び出しでJava 配列 ( int[]
、 )をどのように渡す/使用する必要がありますか? double[]
私はバグに直面しています.Cへの配列のマッピングのどこかにあると思います.
私が試したこと:そして私が修正しようとしているバグ
私のプロジェクトでは、clp-javaの背後にあるコードベースを再構築する必要があります。そうすることで、LP 問題の制約を追加する次の関数を含む C ヘッダー ファイルがあります (例: 2.25*x1 - 3.3*x2 =4
)。
Java では、、、、rowLower
およびrowUpper
JavarowStarts
配列(のいずれか) がありcolumnscolumns
ます。clp -javaは BridJ を使用し、上記の関数は経由で呼び出されますelements
int[]
double[]
プレーンな JNA を使用すると、JNA のドキュメントには、C 関数の呼び出しが次のようになるように、配列がポインターにマップされると記載されています。
残念ながら、両方のメソッドに同じ配列を渡してメモリ内のデータを取得すると、制約の2 番目の変数に対して異なる答えが得られます (最初の変数は問題ありません)。BridJ は -3.3 を生成し、私の JNA メソッドは 1.777E-307 を出力します。同じ DLL、同じマシン (Java 11)。
インターネットでこの例を見つけました。これは、Java の配列を JNA ポインターにマップし、このポインターを C 関数に渡します。これを使ってみました:
JNA関数呼び出しでこれを使用すると(そしてそれに応じてJNAインターフェースを変更すると)、「無効なメモリアクセス」というJavaエラーが発生します。この StackOverflow Q/Aに基づいてこれを修正します(のオフセットsetInt()
を でシフトする必要がありますNative.getNativeSize(Integer.TYPE)
。同じ誤った出力が明らかになります (x2 の係数は -3.3 ではなく 1.777E-307 です)。
追加情報:次の関数/メソッドで係数を確認します。
optimization - 時間割スケジュールと学生の割り当て
学生の希望を尊重して、学生へのコースの割り当てを最適化したい。すべての生徒はすべてのコースを数字で採点します (例: 1 ~ 6、多いほど良い)。コースの最適な時間割とコースへの学生の割り当てを探しているので、全体的な成績の合計が最大になります。
私の問題は、学生が同じ時間枠で2つのコースに参加できないという矛盾です。LP式では、2つのブール変数の積があります
これは明らかに線形ではなく、多くのスラック変数を持つスラック変数で解決する必要があります。そして、さらに多くの新しい制約。非常に小さな問題しか解決できません。モデルを改善するにはどうすればよいですか?