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

解決


理系大学4年、卒業研究進まない  2022-09-20 23:57:08  No: 150448  IP: 192.*.*.*

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 02:04:28  No: 150450  IP: 192.*.*.*

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

編集 削除
理系大学4年、研究進まない  2022-09-21 02:40:59  No: 150451  IP: 192.*.*.*

配慮が足りず、申し訳ありませんでした。
もう一度下に書かせていただきます。
試行錯誤して自分なりに直してみたのですが、次は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 07:18:30  No: 150454  IP: 192.*.*.*

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

でちょっとだけエスパーしてみると、エラーは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 09:20:40  No: 150458  IP: 192.*.*.*

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-21 23:47:48  No: 150460  IP: 192.*.*.*

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 03:34:57  No: 150469  IP: 192.*.*.*

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

次の問題として、

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

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

編集 削除
AAAAA  2022-09-22 08:31:59  No: 150476  IP: 192.*.*.*

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 11:23:05  No: 150487  IP: 192.*.*.*

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

編集 削除
igy  2022-09-26 01:09:26  No: 150489  IP: 192.*.*.*

> しかし、実行を押しても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 02:10:26  No: 150491  IP: 192.*.*.*

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

編集 削除
 2022-09-26 02:43:20  No: 150493  IP: 192.*.*.*

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

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

編集 削除
igy  2022-09-26 02:48:27  No: 150494  IP: 192.*.*.*

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

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

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

編集 削除
 2022-09-26 05:09:47  No: 150498  IP: 192.*.*.*

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

編集 削除
igy  2022-09-26 05:15:43  No: 150499  IP: 192.*.*.*

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

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

編集 削除
 2022-09-26 05:43:06  No: 150500  IP: 192.*.*.*

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

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

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

編集 削除
HFUKUSHI  2022-09-26 06:32:32  No: 150501  IP: 192.*.*.*

想定されている動作としては、フォーム上に置いた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 08:54:58  No: 150503  IP: 192.*.*.*

>     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 14:59:58  No: 150504  IP: 192.*.*.*

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-27 15:18:42  No: 150505  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 01:07:11  No: 150506  IP: 192.*.*.*

① 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 02:20:51  No: 150507  IP: 192.*.*.*

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 02:23:53  No: 150508  IP: 192.*.*.*

なんで PChar なんだよ

編集 削除
 2022-09-28 02:28:13  No: 150509  IP: 192.*.*.*

コピペする部分を間違えました。
 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 02:29:50  No: 150510  IP: 192.*.*.*

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

編集 削除
 2022-09-28 02:30:58  No: 150511  IP: 192.*.*.*

現在のコードです↓
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 02:37:19  No: 150512  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 02:38:23  No: 150513  IP: 192.*.*.*

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 02:38:43  No: 150514  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 02:43:04  No: 150515  IP: 192.*.*.*

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 02:48:08  No: 150516  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 02:52:55  No: 150517  IP: 192.*.*.*

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

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

編集 削除
 2022-09-28 02:54:39  No: 150518  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 02:55:43  No: 150519  IP: 192.*.*.*

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

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

編集 削除
AAAAA  2022-09-28 02:56:02  No: 150520  IP: 192.*.*.*

通るはずないんだけど

編集 削除
 2022-09-28 03:07:59  No: 150521  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 03:10:10  No: 150522  IP: 192.*.*.*

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

編集 削除
 2022-09-28 03:12:36  No: 150523  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 03:14:01  No: 150524  IP: 192.*.*.*

>はい。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 03:16:52  No: 150525  IP: 192.*.*.*

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

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

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

編集 削除
 2022-09-28 03:21:07  No: 150526  IP: 192.*.*.*

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 03:24:07  No: 150527  IP: 192.*.*.*

これで実行すると
一つ目の例外通知に
プロジェクト 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 03:26:51  No: 150528  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 03:45:21  No: 150529  IP: 192.*.*.*

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

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

編集 削除
 2022-09-28 04:30:58  No: 150530  IP: 192.*.*.*

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

編集 削除
 2022-09-28 04:32:04  No: 150531  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 05:57:47  No: 150534  IP: 192.*.*.*

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

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


編集 削除
 2022-09-28 06:04:36  No: 150535  IP: 192.*.*.*

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

編集 削除
 2022-09-28 06:12:39  No: 150537  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 06:13:27  No: 150538  IP: 192.*.*.*

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

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

編集 削除
AAAAA  2022-09-28 06:16:21  No: 150539  IP: 192.*.*.*

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

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

編集 削除
 2022-09-28 06:22:25  No: 150540  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 06:46:22  No: 150541  IP: 192.*.*.*

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 06:52:27  No: 150542  IP: 192.*.*.*

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

編集 削除
 2022-09-28 07:22:15  No: 150543  IP: 192.*.*.*

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

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

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

編集 削除
AAAAA  2022-09-28 07:26:17  No: 150544  IP: 192.*.*.*

そう

編集 削除
 2022-09-28 07:41:54  No: 150545  IP: 192.*.*.*

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

編集 削除
 2022-09-28 08:18:12  No: 150546  IP: 192.*.*.*

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

編集 削除
六太  2022-09-28 08:40:51  No: 150547  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 09:14:59  No: 150548  IP: 192.*.*.*

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

編集 削除
 2022-09-28 09:25:19  No: 150549  IP: 192.*.*.*

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

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

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

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

編集 削除
 2022-09-28 09:39:21  No: 150550  IP: 192.*.*.*

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

編集 削除
AAAAA  2022-09-28 09:50:52  No: 150551  IP: 192.*.*.*

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

編集 削除
 2022-09-28 09:56:41  No: 150552  IP: 192.*.*.*

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

編集 削除