Delphiで簡単な線形計画を解きたいです

解決


理系大学4年、卒業研究進まない  2022-09-21 08:57:08  No: 150448

Delphiで簡単なLPを解きたいのですが、上手くコンパイル出来ませんでした。どのように直せばいいかアドバイス頂きたいです。

エラーの内容としては
①AnsiStringからPwideCharへの型キャストは見たがっている可能性があります。
②nvarsに代入された値は使われてない。

と表示されています。

以下のサイトのサンプロコードを参考にしながら書いてみました。http://delphiforfun.org/programs/delphi_techniques/LPDemo.htm

procedure Button1Click(Sender: TObject);

var

 i:integer;

 s:AnsiString;

 nvars:integer;

 colData:PFloatArray;

 

begin

 with memo1 do

 begin {delete any previous solution display}

 for i:=lines.count-1 downto 0 do

 begin

 if (length(lines[i])>=2) and (copy(lines[i],1,2)= '--')

 then break

 else lines.delete(i);

 end;

 end;

 

 begin

 lp := make_lp(0,2);

 set_col_name(lp, 1, 'x');

 set_col_name(lp, 2, 'y');

 if (lp <>0) then

 begin

 s:= '120' + ' ' + '210';

 str_add_constraint(lp,PChar(s),1,15000);

 s:= '110' + ' ' + '30';

 str_add_constraint(lp,PChar(s),1,4000);

 s:= '1' + ' ' + '1';

 str_add_constraint(lp,PChar(s),1,75);

 s:= '143' + ' ' + '60';

 if str_set_obj_fn(lp, pchar(s)) then

 begin

 set_maxim(lp);

 if solve(lp)=0 then

 with memo1, lines do

 begin

 add('');

 add('Solved');

 add('Optimum variable values are:');

 //:=get_nColumns(lp);

 get_variables(lp,colData);

 add(format('%s: %f', [get_col_name(lp, 1), colData^[0]]));

 add(format('%s: %f', [get_col_name(lp, 2), colData^[1]]));

 add(format('Objective value: %f', [get_objective(lp)]));

 end;

 end;

 end;

 end;

 delete_lp(lp);

end;


たこ  2022-09-21 11:04:28  No: 150450

回答でなくて申し訳ありませんがインデントがないため著しく可読性に欠けます。
インデントをつける癖をつけましょう。


理系大学4年、研究進まない  2022-09-21 11:40:59  No: 150451

配慮が足りず、申し訳ありませんでした。
もう一度下に書かせていただきます。
試行錯誤して自分なりに直してみたのですが、次はPAnsiCharとPWideCharに互換性がないと表示されました。何を言われているのかは理解できますが、どうすればいいのかわかりません。

procedure TFormWaypointTracker.ButtonLPClick(Sender: TObject);
 var
   i:integer;
   s:AnsiString;
   nvars:integer;
   colData:PFloatArray ;
   lp:THandle ;

begin
  with memo1 do
  begin {delete any previous solution display}
    for i:=lines.count-1 downto 0 do
    begin
      if (length(lines[i])>=2) and (copy(lines[i],1,2)= '--')
      then break
      else lines.delete(i);
    end;
  end;

  begin
    lp := make_lp(0,2);
    set_col_name(lp, 1, 'x');
    set_col_name(lp, 2, 'y');
    colData:=AllocMem(SizeOf(Double)*2) ;
    if (lp <> 0) then
    begin
       s:= '120' + ' ' + '210';
       str_add_constraint(lp,PAnsiChar(s),1,15000);
       s:= '110' + ' ' + '30';
       str_add_constraint(lp,PAnsiChar(s),1,4000);
       s:= '1' + ' ' + '1';
       str_add_constraint(lp,PAnsiChar(s),1,75);
       s:= '143' + ' ' + '60';
       if  str_set_obj_fn(lp, PAnsiChar(s)) then
        begin
        set_maxim(lp);
        if solve(lp)=0 then
       with memo1, lines do
        begin
        add('');
        add('Solved');
        add('Optimum variable values are:');
        nvars:=get_nColumns(lp);
        get_variables(lp,@colData);
        add(format('%s: %d', [get_col_name(lp, 1), colData^[i]]));
        add(format('%s: %d', [get_col_name(lp, 2), colData^[1]]));
        add(format('Objective value: %d', [get_objective(lp)]));
        end;
       end;
    end;
  end;
  delete_lp(lp);
 end;


HFUKUSHI  2022-09-21 16:18:30  No: 150454

コンパイルエラーはコピペで正確に書いたほうが適切な回答が付きやすいと思います(特に提示したコードが最小限の再現コードではない場合は)。

でちょっとだけエスパーしてみると、エラーはstr_add_constraint(...)のところで出てます?でお使いのDelphiのバージョンは2009よりも新しいものです?
だとすると、str_add_constraintの第2引数がPChar=PWideCharとして定義されているにもかかわらず、PAnsiChar(<ANSI文字列>)を渡しているからではないでしょうか。
解決策としては、ローカル変数sをAnsiStringではなくStringで定義して、str_add_constraintの第2引数に渡すときにPChar(s)とする、という感じでしょうか。


AAAAA  2022-09-21 18:20:40  No: 150458

lpsolve51 のソース見れば

function str_add_constraint(lp: THandle; row_string : PChar;constr_type: integer; rh: double): boolean; stdcall; external LPSOLVELIB name 'str_add_constraint';

>PAnsiCharとPWideCharに互換性がないと表示されました

str_add_constraint(lp,PAnsiChar(s),1,15000);

row_string : PChar; の所に  PAnsiChar(s) しているので
※ PChar は PWideChar


au  2022-09-22 08:47:48  No: 150460

cのソースの方を見ると定義が下のようになってるのでこれにWideChar渡すのはまずそうな気がする
MYBOOL __EXPORT_TYPE __WINAPI str_add_constraint(lprec *lp, char *row_string, int constr_type, REAL rh);
ので、Delphi2009移行で使うならlpsolve51の定義でPCharとなってる部分は全部PAnsiCharに置換した方が良いのかも知れません。


  2022-09-22 12:34:57  No: 150469

皆様ありがとうございました!!
何とか下の部分は理解することが出来ました。

次の問題として、

for i:=lines.count-1 downto 0 do 

の部分がfor文はローカル変数でなければいけないとエラーが出たのですが、こちらはどの部分が間違いなのでしょうか?
古いソースコードだから、Delphi10.2に対応してないと言った類の話でしょうか??


AAAAA  2022-09-22 17:31:59  No: 150476

var
  Form1: TForm1;
  I: Integer; //警告

implementation
var
  I: Integer;    //警告

procedure AAAA;
var
    I: Integer; //ここにしないと警告が出る
begin
  for I:=0 to 99 do

>procedure TFormWaypointTracker.ButtonLPClick(Sender: TObject);
> var
 >  i:integer;

でも定義しているから警告出ないはずなんだけど


  2022-09-25 20:23:05  No: 150487

無事にコンパイルできました。
しかし、実行を押してもbutton"クリックしても、memoに答えが表示されませんでした。
コードの部分に何か問題があるのでしょうか??
それともbuttonとmemoを連動?させるような設定があるのでしょうか??


igy  2022-09-26 10:09:26  No: 150489

> しかし、実行を押してもbutton"クリックしても、memoに答えが表示されませんでした。 

>  with memo1 do
>  begin {delete any previous solution display}

の下に
ShowMessage('1');

>    if (lp <> 0) then
>    begin

の下に
ShowMessage('2');

>       if  str_set_obj_fn(lp, PAnsiChar(s)) then
>        begin

の下に
ShowMessage('3');

>        if solve(lp)=0 then
>       with memo1, lines do
>        begin

の下に
ShowMessage('4');

をそれぞれ追加して、コンパイル&実行し、クリックしたら、メッセージは表示されますか?


  2022-09-26 11:10:26  No: 150491

はい!メッセージは表示されます。
しかし、用意したmemoにではなく、勝手に別のが表示されました!
説明できなくてごめんなさい。


  2022-09-26 11:43:20  No: 150493

説明不足でごめんなさいm(_ _)m

Formにはbuttonとmemoを設計して、buttonをクリックしたら上記の計算の答えがmemoに表示されるのをイメージしていたのですが、可能でしょうか??


igy  2022-09-26 11:48:27  No: 150494

>用意したmemoにではなく、勝手に別のが

“用意したmemo”と“別の”が、
主 さん以外の人には、わからないかと思います。

挙げられたコードでは、memo1 に格納しているようなのですが・・・


  2022-09-26 14:09:47  No: 150498

言語化できなくて申し訳ありません。
用意したmemoに表示されるのではなくて、HelloWorldのように新しいのが表示されました、


igy  2022-09-26 14:15:43  No: 150499

> HelloWorldのように新しいのが表示されました、

ボタンをクリックしたら、
MessageBoxが4回(1~4まで)表示後、Memo1には“HelloWorld”が格納されるのですか?


  2022-09-26 14:43:06  No: 150500

私が言いたかったのはMessageBoxです。知識足らずで申し訳ありませんでした。

MessageBoxで1-4まで表示された後に、buttonをクリックしたら、再びMessageBOXで0.1と表示されました。

memoには何も表示されませんでした。


HFUKUSHI  2022-09-26 15:32:32  No: 150501

想定されている動作としては、フォーム上に置いたMemo1に、(igyさんの指示による追加の後では”4”までメッセージボックスが表示されてそれぞれOKボタンをクリックした後に)
---
Solved
Optimum variable values are:
...(解析結果)
Objective value: ...
---
と表示されるはずが、何も表示されない、ということですね?
2022-09-21 11:40:59  No: 150451で提示されたソースコードはDelphiのIDEからのコピペですか?
もしそうでないなら、もう一度、現状のソースコードをコピペで提示してもらえますか?


AAAAA  2022-09-26 17:54:58  No: 150503

>     add(format('%s: %d', [get_col_name(lp, 1), colData^[i]]));
 >    add(format('%s: %d', [get_col_name(lp, 2), colData^[1]]));
 >    add(format('Objective value: %d', [get_objective(lp)]));

こうじゃない?

      for I:=0 to Nvars - 1 do
      begin
         add(format('%s = %.3f',[get_col_name(lp,i+1),colData[i]]));
         add(format('Objective value: %f', [get_objective(lp)]));
     end;


  2022-09-27 23:59:58  No: 150504

HFUKUSHI様

想定していることはHFUKUSHI 様の仰る通りです。
線形計画を解けるか確認したいだけなので、この際ボタンを使用しなくても構わないのです。解けるかの結果だけでも知りたいのですが、可能でしょうか。

上記のコードはコピペしたものになりますが、一応現在のコードを再度下記に記します。

procedure TForm2.Button1Click(Sender: TObject);

var
  i:integer;
  s:String;
  nvars:integer;
  colData:PFloatArray ;
  lp:THandle ;

begin
  with Memo1 do
  begin
    for i:=lines.count-1 downto 0 do
    begin
      if (length(lines[i])>=2) and (copy(lines[i],1,2)= '--')
      then break
      else lines.delete(i);
    end;
  end;

  begin
    lp := make_lp(0,2);
    set_col_name(lp, 1, 'x');
    set_col_name(lp, 2, 'y');
    colData:=AllocMem(SizeOf(Double)*2) ;
    if (lp <> 0) then
    begin
       s:= '120' + ' ' + '210';
       str_add_constraint(lp,PChar(s),1,15000);
       s:= '110' + ' ' + '30';
       str_add_constraint(lp,PChar(s),1,4000);
       s:= '1' + ' ' + '1';
       str_add_constraint(lp,PChar(s),1,75);
       s:= '143' + ' ' + '60';
       if  str_set_obj_fn(lp, PChar(s)) then
       begin
       set_maxim(lp);
       if solve(lp)=0 then
       with memo1, lines do
        begin
        add('');
        add('Solved');
        add('Optimum variable values are:');
        nvars:=get_nColumns(lp);
        get_variables(lp,@colData);

         add(format('%s: %d', [get_col_name(lp, 1), colData^[i]]));
         add(format('%s: %d', [get_col_name(lp, 2), colData^[1]]));
         add(format('Objective value: %d', [get_objective(lp)]));
          for I:=0 to Nvars - 1 do
         begin
            add(format('%s = %.3f',[get_col_name(lp,i+1),colData[i]]));
            add(format('Objective value: %f', [get_objective(lp)]));
         end;
        end;
       end;
    end;
  end;
  delete_lp(lp);
 end;
end.


  2022-09-28 00:18:42  No: 150505

オブジェクト インスペクタの設定の問題でしょうか??
イベントのOnClickは、ButtonとMemoともにButton1Clickに設定しているのですが、この辺の設定で上手く連動していない場合はありますでしょうか??


AAAAA  2022-09-28 10:07:11  No: 150506

① PChar を PAnsiChar にしてない (lpsolve51 内もすべて PAnsiChar にかえる)
②  s:String; は S: AnsiString
③ get_variables(lp,@colData); は get_variables(lp,colData);

       for I:=0 to Nvars - 1 do
         begin
            add(format('%s = %.3f',[get_col_name(lp,i+1),colData[i]]));
            add(format('Objective value: %f', [get_objective(lp)]));
         end;
にかえたのに

     add(format('%s: %d', [get_col_name(lp, 1), colData^[i]]));   
         add(format('%s: %d', [get_col_name(lp, 2), colData^[1]]));
         add(format('Objective value: %d', [get_objective(lp)]));
消してない


  2022-09-28 11:20:51  No: 150507

AAAAA様 回答ありがとうございます。
アドバイス通りに直したらエラーが発生してしまいました。
  s:= '120' + ' ' + '210';
       str_add_constraint(lp,PChar(s),1,15000);
       s:= '110' + ' ' + '30';
       str_add_constraint(lp,PChar(s),1,4000);
       s:= '1' + ' ' + '1';
       str_add_constraint(lp,PChar(s),1,75);
       s:= '143' + ' ' + '60';
上記の部分に[dcc32 エラー] lp.rennshuu.pas(62): E2010 'PWideChar' と 'PAnsiChar' には互換性がありません とエラーが出ました。


AAAAA  2022-09-28 11:23:53  No: 150508

なんで PChar なんだよ


  2022-09-28 11:28:13  No: 150509

コピペする部分を間違えました。
 s:= '120' + ' ' + '210';
       str_add_constraint(lp,PAnsiChar(s),1,15000);
       s:= '110' + ' ' + '30';
       str_add_constraint(lp,PAnsiChar(s),1,4000);
       s:= '1' + ' ' + '1';
       str_add_constraint(lp,PAnsiChar(s),1,75);
       s:= '143' + ' ' + '60';

の部分です


AAAAA  2022-09-28 11:29:50  No: 150510

上記の部分に[dcc32 エラー] lp.rennshuu.pas(62): E2010 'PWideChar' と 'PAnsiChar' には互換性がありません とエラーが出ました。
出るってことは
(lpsolve51 内もすべて PAnsiChar にかえる)をやってないだろ


  2022-09-28 11:30:58  No: 150511

現在のコードです↓
procedure TForm2.Button1Click(Sender: TObject);

var
  i:integer;
  s:AnsiString;
  nvars:integer;
  colData:PFloatArray ;
  lp:THandle ;

begin
  with Memo1 do
  begin
    for i:=lines.count-1 downto 0 do
    begin
      if (length(lines[i])>=2) and (copy(lines[i],1,2)= '--')
      then break
      else lines.delete(i);
    end;
  end;

  begin
    lp := make_lp(0,2);
    set_col_name(lp, 1, 'x');
    set_col_name(lp, 2, 'y');
    colData:=AllocMem(SizeOf(Double)*2) ;
    if (lp <> 0) then

    begin
       s:= '120' + ' ' + '210';
       str_add_constraint(lp,PAnsiChar(s),1,15000);
       s:= '110' + ' ' + '30';
       str_add_constraint(lp,PAnsiChar(s),1,4000);
       s:= '1' + ' ' + '1';
       str_add_constraint(lp,PAnsiChar(s),1,75);
       s:= '143' + ' ' + '60';
       if  str_set_obj_fn(lp, PAnsiChar(s)) then
       begin
       set_maxim(lp);
       if solve(lp)=0 then
       with memo1, lines do
        begin
        add('');
        add('Solved');
        add('Optimum variable values are:');
        nvars:=get_nColumns(lp);
        get_variables(lp,colData);
  
        for i:=0 to nvars-1 do  {display variable values}
        begin
         add(format('%s = %.3f',[get_col_name(lp,i+1),colData[i]]));
         add(format('Objective value: %f', [get_objective(lp)]));
         end;
        end;
        end;
       end;
    end;
  end;
  delete_lp(lp);
end.


  2022-09-28 11:37:19  No: 150512

無知で申し訳ありませんでした。
コンパイルはできたのですが、実行したら以下のデバッガ例外通知が出ました。
プロジェクト lp.dennshuu.exe は例外クラス $C00000FD (メッセージ 'stack overflow at 0x00dbe0eb')を送出しました。


AAAAA  2022-09-28 11:38:23  No: 150513

lpsolve51.pas

function str_add_constraint(lp: THandle; row_string : PChar;constr_type: integer; rh: double): boolean; stdcall; external LPSOLVELIB name 'str_add_constraint';

function str_add_constraint(lp: THandle; row_string : PAnsiChar;constr_type: integer; rh: double): boolean; stdcall; external LPSOLVELIB name 'str_add_constraint';

PChar は PWideChar なので PWideChar と PAnsiChar は互換が無いと言われる

PChar は全部 PAnsiChar に変更する
(※) LPDemo2.exe のアイコンから 元は DELPHI 7 で作ったみたいで 
DELPHI 7 は PChar は PAnsiChar 
最近(どっからか忘れた) は PChar は PWideChar


  2022-09-28 11:38:43  No: 150514

あと、こちらの例外通知も発生してしまいました。
プロジェクト lp.dennshuu.exe は例外クラス $C0000005 (メッセージ 'access violation at 0x76ad62c5: write of address 0x01200e90')を送出しました。


AAAAA  2022-09-28 11:43:04  No: 150515

delete_lp(lp); の場所がおかしいのを移動させれば動くけど?

Solved
Optimum variable values are:
x = 21.875
Objective value: 6315.63
y = 53.125
Objective value: 6315.63


  2022-09-28 11:48:08  No: 150516

ホントですか???
delete_lp(lp); はどちらに移動させればよいのでしょうか??


AAAAA  2022-09-28 11:52:55  No: 150517

最後の end; と end. の間にあるっておかしいだろ?

宣言が必要な場所に識別子delete_lpがありますって出るはずなんだけど


  2022-09-28 11:54:39  No: 150518

はい、、でました。
理解はできてないですけど、一個ずつ動かして確認してみます。


AAAAA  2022-09-28 11:55:43  No: 150519

procedure TForm1.Button1Click(Sender: TObject);
var
begin
end;
delete_lp(lp);
end.

コンパイル通るはずなんだけど ソース抜き出して貼り付けてないか?


AAAAA  2022-09-28 11:56:02  No: 150520

通るはずないんだけど


  2022-09-28 12:07:59  No: 150521

はい。LPDemo2.exe のSolveButtonClickの部分を参考にしていたので、使えそうな部分はコピペしました。


AAAAA  2022-09-28 12:10:10  No: 150522

LPDemo2 実行すると文字化けすると思うけど
U_LPDemo2 と lpsolve51 両方 PChar -> PAnsiChar 変えて実行すれば正常に表示されるよ


  2022-09-28 12:12:36  No: 150523

delete_lp(lp);
はないと困るものなのですか??


AAAAA  2022-09-28 12:14:01  No: 150524

>はい。LPDemo2.exe のSolveButtonClickの部分を参考にしていたので、使えそうな部分はコピペしました。
そうじゃない
>プロジェクト lp.dennshuu.exe は例外クラス $C0000005 (メッセージ 'access violation at 0x76ad62c5: write of address 0x01200e90')を送出しました。
が出るっていってるけど

  end;
  delete_lp(lp);
end.
の時点でコンパイルが通らないので実行できるわけない。

現在のコードです↓ といってるが
>プロジェクト lp.dennshuu.exe は例外クラス $C0000005 (メッセージ 'access violation at 0x76ad62c5: write of address 0x01200e90')を送出しました。
でたときのソースでは無いということになるの

>プロジェクト lp.dennshuu.exe は例外クラス $C0000005 (メッセージ 'access violation at 0x76ad62c5: write of address 0x01200e90')を送出しました。
が出たときのソースをのせなきゃ判断できんでしょ


AAAAA  2022-09-28 12:16:52  No: 150525

delete_lp(lp);
はないと困るものなのですか??

    lp := make_lp(0,2); 
で確保したメモリを解放してるんだろうけど

 colData:=AllocMem(SizeOf(Double)*2) ; 
のメモリも解放してないみたいだけど
なければ
解放しないだけ


  2022-09-28 12:21:07  No: 150526

AAAAA様
親身になって相談に乗っていただきありがとうございます。研究室には相談に乗ってもらえる人もいなくて途方に暮れていました。
ここまで優しく最後まで面倒を見て頂けて本当に嬉しいです!!
現在のコードです↓

procedure TForm2.Button1Click(Sender: TObject);
var
  i:integer;
  s:AnsiString;
  nvars:integer;
  colData:PFloatArray ;
  lp:THandle ;

begin
  with Memo1 do
  begin
    for i:=lines.count-1 downto 0 do
    begin
      if (length(lines[i])>=2) and (copy(lines[i],1,2)= '--')
      then break
      else lines.delete(i);
    end;
  end;

  begin
    lp := make_lp(0,2);
    set_col_name(lp, 1, 'x');
    set_col_name(lp, 2, 'y');
    colData:=AllocMem(SizeOf(Double)*2) ;
    if (lp <> 0) then

    begin
       s:= '120' + ' ' + '210';
       str_add_constraint(lp,PAnsiChar(s),1,15000);
       s:= '110' + ' ' + '30';
       str_add_constraint(lp,PAnsiChar(s),1,4000);
       s:= '1' + ' ' + '1';
       str_add_constraint(lp,PAnsiChar(s),1,75);
       s:= '143' + ' ' + '60';
       if  str_set_obj_fn(lp, PAnsiChar(s)) then
       begin
       set_maxim(lp);
       if solve(lp)=0 then
       with memo1, lines do
         begin
         add('');
         add('Solved');
         add('Optimum variable values are:');
         nvars:=get_nColumns(lp);
         get_variables(lp,colData);
         for i:=0 to nvars-1 do  {display variable values}
          begin
          add(format('%s = %.3f',[get_col_name(lp,i+1),colData[i]]));
          add(format('Objective value: %f', [get_objective(lp)]));
          end;

          end;

        end;
       end;
     end;
    delete_lp(lp);
   end;
end.


  2022-09-28 12:24:07  No: 150527

これで実行すると
一つ目の例外通知に
プロジェクト lp.dennshuu.exe は例外クラス $C0000005 (メッセージ 'access violation at 0x76ad62c5: write of address 0x01200e90')を送出しました
そのまま続行をすると、二つ目の例外通知に
プロジェクト lp.dennshuu.exe は例外クラス $C0000005 (メッセージ 'access violation at 0x76ad62c5: write of address 0x01200e90')を送出しました
と表示されました。


  2022-09-28 12:26:51  No: 150528

一つ目はこっちでした
プロジェクト lp.dennshuu.exe は例外クラス $C00000FD (メッセージ 'stack overflow at 0x00dbe0eb')を送出しました。


AAAAA  2022-09-28 12:45:21  No: 150529

例外でないんだよね
画面にはどこまで表示されている?

ところで LPDemo2.exe は正常に動作するんだよね?


  2022-09-28 13:30:58  No: 150530

サイトからダウンロードしたのですが、開こうとすると
ファイルC:¥WINDOWS¥System32¥LPDemo2は開けません。指定されたファイルが見つかりません。
と表示されます。


  2022-09-28 13:32:04  No: 150531

何かの設定ができていないのでしょうか??
Delphi自体インストールしたばっかりなので、初期設定のままなのですが、、、


AAAAA  2022-09-28 14:57:47  No: 150534

http://delphiforfun.org/programs/Download/LPDemoSource.zip
をダウンロードして
LPDemoSource.zipを
....\Embarcadero\Studio\Projects\適当なフォルダ
に解凍

>ファイルC:¥WINDOWS¥System32¥LPDemo2は開けません。指定されたファイルが見つかりません。
なんで System32 なんだよ・・・・


  2022-09-28 15:04:36  No: 150535

System32は間違っているのですか?
64に変えるという子でしょうか?よろしければ変更の仕方も教えて頂きたいです。


  2022-09-28 15:12:39  No: 150537

AAAAA様
言われた通りにZipの解凍?をしてから開いたらできました。実行までできました!!!


AAAAA  2022-09-28 15:13:27  No: 150538

ダウンロードしたファイルがC:¥WINDOWS¥System32にあるってことはないだろ・・・・

ドライブ:\Users\ユーザー名\Downloads 
(エキスプローラーのクイックアクセスのダウンロード)
に LPDemoSource.zip ないか?


AAAAA  2022-09-28 15:16:21  No: 150539

>はい。LPDemo2.exe のSolveButtonClickの部分を参考にしていたので、使えそうな部分はコピペしました。

これどうやって手に入れた?


  2022-09-28 15:22:25  No: 150540

No.150539に関してはプロジェクトファイルは開けなくても、pas.は開けたのでそこから手に入れました。
しかし、AAAAA様の助言のおかげでLPDemo2.exeは開くことができ、実行もでき、実際に計算結果も表示できていました。
次は私が書いたコードの方なのですが、こちらも...\Embarcadero\Studio\Projects\適当なフォルダに入れたらできたりしますかね??


AAAAA  2022-09-28 15:46:22  No: 150541

procedure TForm1.Button4Click(Sender: TObject);
var
  i:integer;
  s:AnsiString;
  nvars:integer;
  colData:PFloatArray ;
  lp:THandle ;
  procedure ADD(TEXT: String);
  begin
    Memo1.Lines.Add(TEXT);
  end;

begin
  with Memo1 do
  begin
    for i:=lines.count-1 downto 0 do
    begin
      if (length(lines[i])>=2) and (copy(lines[i],1,2)= '--')
      then break
      else lines.delete(i);
    end;
  end;

  lp := make_lp(0,2);                       //**********
  ADD('#1');
  set_col_name(lp, 1, 'x');
  ADD('#21');                                //**********
  set_col_name(lp, 2, 'y');
  ADD('#22');                                //**********
  if (lp <> 0) then
  begin
    s:= '120' + ' ' + '210';
    str_add_constraint(lp,PAnsiChar(s),1,15000);
    ADD('#31');                                //**********
    s:= '110' + ' ' + '30';
    str_add_constraint(lp,PAnsiChar(s),1,4000);
    ADD('#32');                                //**********
    s:= '1' + ' ' + '1';
    str_add_constraint(lp,PAnsiChar(s),1,75);
    ADD('#33');                                //**********
    s:= '143' + ' ' + '60';
    if  str_set_obj_fn(lp, PAnsiChar(s)) then
    begin
      ADD('#4');                                //**********
      set_maxim(lp);
      ADD('#5');                                //**********
      if solve(lp)=0 then
      begin
        ADD('#6');                                //**********
        add('');
        add('Solved');
        add('Optimum variable values are:');
        nvars:=get_nColumns(lp);
        ADD('#7');                                //**********
        colData:=AllocMem(SizeOf(Double)*2) ;
        get_variables(lp,colData);
        ADD('#8');                                //**********
        for i:=0 to nvars-1 do  {display variable values}
        begin
          add(format('%s = %.3f',[get_col_name(lp,i+1),colData[i]]));
          ADD('#91');                                //**********
          add(format('Objective value: %f', [get_objective(lp)]));
          ADD('#92');                                //**********
        end;
        FreeMem(colData);
      end;
    end;
  end;
  delete_lp(lp);
  ADD('#10');                                //**********
end;

で例外でるとき Memo にどこまで表示されている?


  2022-09-28 15:52:27  No: 150542

今すぐやってみます!!
新しくプロジェクト作った方が良いですよね!


  2022-09-28 16:22:15  No: 150543

コンパイルは出来たのですが、実行するとシステムエラーが発生しました。

lpsolve51.dllが見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する場合があります。

lpsolve.dllはプロジェクトと同じファイルに入れておけば良いんですよね??
また、このdllはLPDemoのzipに入っていたものですよね!


AAAAA  2022-09-28 16:26:17  No: 150544

そう


  2022-09-28 16:41:54  No: 150545

同じファイルに入れても出てこないのですが、このdllもPCharとPAnsiCharで入れ替えなきゃとかはありますか??


  2022-09-28 17:18:12  No: 150546

..\Embarcadero\Studio\Projects\適当なフォルダに、作成したプロジェクトを保存したのに、dllが見つからないとエラーが出てしまいます。


六太  2022-09-28 17:40:51  No: 150547

付属している lpsolve51.dll は、32ビット用なのでEXEも32ビット用で作る必要がある。
初期値は多分64ビット用EXEだと思うので、コンパイルオプションを変える必要あるのでは?
設定方法は他の方、ヘルプ!。 LazarusならわかるんだがDelphiはわからん。


AAAAA  2022-09-28 18:14:59  No: 150548

..\Embarcadero\Studio\Projects\適当なフォルダ
lpsolve51.pas コピー( PChar -> PAnsiChar にかえる) というかいままで使ってたのコピーでも良い
..\Embarcadero\Studio\Projects\適当なフォルダ\win32\debug (EXEが作られるところ) (Releaseかも)
lpsolve51.dll をコピー


  2022-09-28 18:25:19  No: 150549

AAAAAさん!!!!
できました!!!
Embarcadero\Studio\Projects\適当なフォルダ\win32\debug (EXEが作られるところ) (Releaseかも) 
lpsolve51.dll をコピー

これをしたらできました!!
Memoに#10まで表示されました!!
本当にありがとうございましたm(_ _)mm(_ _)mm(_ _)m

直接お礼をさせていただきたいぐらい嬉しいです!!
まだ卒業研究のスタートラインに立ったばかりなのですが、これから頑張ります!!また何か疑問が生じたら、掲示板に来るかもしれないのでよろしくお願いしますm(_ _)m

本当にお世話になりました!!!
AAAAA様大好きです!!!


  2022-09-28 18:39:21  No: 150550

しかし、なぜ..\Embarcadero\Studio\Projects\適当なフォルダ\win32\debugにlpsolve51.dllを保存しただけで動いたのでしょうか??


AAAAA  2022-09-28 18:50:52  No: 150551

DLL は PATH の通ってる場所か EXE のある場所にないとダメなの


  2022-09-28 18:56:41  No: 150552

同じファイルに全部突っ込んどけばいいのかと思ってました。。
これからDelphiを使う時は、debugの部分を気をつけて見るようにします。
本当にに長い時間かけて教えて頂きありがとうございました!!


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加