MATLAB Answers

アプリケーションコンパイラのエラーについて

10 ビュー (過去 30 日間)
Kaede
Kaede 2020 年 7 月 15 日
コメント済み: Kaede 2020 年 7 月 22 日
アプリケーションコンパイラを使用してアプリを作成しています.
使用しているプログラムは普通に実行するのには問題はないのですが,アプリを作成してインストールして開こうとするとインデックスが配列要素数(0)を超えていますとでで上手く実行できないのですが何が問題なのでしょうか.

  9 件のコメント

表示 6 件の古いコメント
Kaede
Kaede 2020 年 7 月 16 日
@Kojiro Saitoさん
コメントありがとうございます.
ログファイルの作成方法を教えていただきありがとうございます.
いただいたプログラムなのですが,Mushra.mを実行するときに'example_config.txt'が必要です.
function Mushra(varargin)
% Start a Mushra test
% deal with optional arguments
if length(varargin) > 1
flags = varargin{2:end};
else
flags = 0;
end
% test subject comments on or off
global commentsOn
if strmatch('comments', flags, 'exact')
commentsOn = 1;
else
commentsOn = 0;
end
% continue from previous save file or start afresh
if strmatch('continue', flags, 'exact')
continueOn = 1;
else
continueOn = 0;
end
% open the config file
config = varargin{1};
if ~exist(config, 'file')
errordlg('The configuration file you have requested does not exist.');
clear global;
return;
end
file = fopen(config, 'r');
[configFilePath configFileName configFileExtension] = fileparts(config);
コードの一部はこのような感じです.できるだけこのMushra.mを書き換えたくないのと,こちらは聴感実験に使用するので被験者側に負担がかからないようにしたいのですが,その場合はどの方法を使用するのが良いでしょうか.
Kaede
Kaede 2020 年 7 月 16 日
"その場合、ファイル名のパスをアプリ実行時に与える必要があります。"
ということなのですがこれは今実行しているような
Mushra('..\mashram1\example_config.txt')
コマンドが毎回アプリ実行時に必要ということでしょうか.
本格的に4月からMATLABを使い始めたのですが,ここ2ヶ月ぐらいほとんど触らない期間がありましてほとんど初心者なため理解が追い付いていないのですができるだけわかりやすく説明していただけるとありがたいです.
Kojiro Saito
Kojiro Saito 2020 年 7 月 16 日
@Kaedeさん
コメントありがとうございます。コードの一部をシェアしていただいて原因がわかりました。
vararginというのは可変入力なので、入力引数が0でも1以上でも実行できるようになっています。
ただ、コードの下記の部分で1つめの入力引数(varargin{1})がファイルパスが入力されるのが前提となっています。
config = varargin{1};
if ~exist(config, 'file')
errordlg('The configuration file you have requested does not exist.');
clear global;
return;
end
ですので、「ということなのですがこれは今実行しているような
Mushra('..\mashram1\example_config.txt')
コマンドが毎回アプリ実行時に必要ということでしょうか.」
の質問の回答としては、「必要です」となります。
「インデックスが配列要素数(0)を超えています」のエラーの原因が分かりましたので、後ほどコメント欄ではなく回答欄に解決策を書かせていただきます。

サインインしてコメントする。

採用された回答

Kojiro Saito
Kojiro Saito 2020 年 7 月 16 日
コンパイルしようとしているMushraの関数の一部を見せていただいたので、原因が分かりました。コンパイル後のMushra.exeをダブルクリックするなどして、入力引数無しで実行する場合、
config = varargin{1};
の部分で「インデックスが配列要素数(0)を超えています」のエラーが出ていると思われます。入力引数無しだとvararginが空なので、配列サイズは0ですのでvarargin{1}にアクセスしようとするとこのエラーが出ます
2つの解決策をご提示いたします。Mushra.mをあまり書き換えたくないとのことなので、先にMushra.mを変えない方法をご紹介します。
方法1
1) Windowsのバッチファイル(.bat)をテキストエディターで作成します。
ファイル名はここではcallExe.bat とします。
callExe.batの中身を記述します。Mushra.exeの入力引数にexample_config.txtを与えて実行してコマンドです。
Mushra.exe example_config.txt
2) アプリケーションコンパイラの「エンドユーザー用にインストールされるファイル」で「+」ボタンをクリックし、callExe.batと、コンフィグファイルのexample_config.txtの2つを追加します。下記の画面ではtestExeOrig.exeとなっていますが、ここはMushra.exeと読み替えてください。
3) アプリケーションが作成され、インストールされると、callExe.batとexample_config.txtの2つもインストールされます。下記の画面ではtestExeOrig.exeとなっていますが、ここはMushra.exeと読み替えてください。
4) callExe.batをダブルクリックして実行します。
exeの代わりにbatを実行することで、エンドユーザーの方がコンフィグファイルを指定しなくても入力に入れられます。
方法2
こちらの方法ではMushra.mの冒頭部分を少し修正します。
1) Mushra.mの冒頭部分に、入力引数が無い場合はexample_config.txtを使うような変更を追記します。
function Mushra(varargin)
% Start a Mushra test
% ここから追記
% 入力引数が無い場合は同じフォルダーにあるコンフィグファイルを指定する
if nargin == 0
varargin = {'example_config.txt'};
end
% 追記ここまで
% deal with optional arguments
% 以下はオリジナルと同じです
2) アプリケーションコンパイラの画面で、「エンドユーザー用にインストールされるファイル」で「+」ボタンをクリックし、example_config.txtを追加します。下記の画面ではtestExeV2.exeとなっていますが、ここはMushra.exeと読み替えてください。
3) 「パッケージ化」をクリックして実行ファイルを作成します。
4) アプリケーションをインストールするとアプリケーションフォルダーの中にexample_config.txtもインストールされます。下記の画面ではtestExeV2.exeとなっていますが、ここはMushra.exeと読み替えてください。
5) これで実行ファイルをダブルクリックだけで実行できるようになりました。
6) もし実行ファイルをWindowsのスタートメニューやデスクトップのショートカットから呼び出す場合は、作業フォルダがC:\Windows\System32となってしまうため、コンフィグファイルが見つからないというエラーが出てしまいます。そこで、ショートカットから「ファイルの場所を開く」をクリックし、
C:\ProgramData\Microsoft\Windows\Start Menu\Programsで、該当のショートカットを右クリック「プロパティ」をクリックし、「作業フォルダー」をアプリケーションのインストールフォルダーと同じにしておきます。
これでデスクトップやスタートメニューのショートカットから実行しても、インストールフォルダーにあるexample_config.txtのファイルが読み込まれるようになります。
参考になれば幸いです。

  0 件のコメント

サインインしてコメントする。

その他の回答 (1 件)

Kaede
Kaede 2020 年 7 月 16 日
ご丁寧にありがとうございます.
一つ目のやり方でcallExeを開くとMushra.mのプリグラムができました.
あと質問追加の質問が2つあります.
①for_redistribution_files_onlyを開くと上の画像のフォルダに入っているのと異なっているのですが大丈夫ですか.
②エンドユーザーには何を配ればよいでしょうか.
無知で申し訳ございません.
本当にありがとうございます.
丁寧で分かりやすかったです.

  6 件のコメント

表示 3 件の古いコメント
Kaede
Kaede 2020 年 7 月 17 日
コメントありがとうございます.
間違えて"この回答へのコメント"ではなく"その他の回答"へコメントしてしまって申し訳ございませんでした.
追加質問①for_redistribution_files_onlyを開くと上の画像のフォルダに入っているのと異なっているのですが大丈夫ですか.
追加質問②エンドユーザーには何を配ればよいでしょうか.
教えていただきありがとうございます.了解しました.
追加質問③もしエンドユーザーに配布するときにメールで送るためどうしても容量が大きくなってしまうのですが,やはり方法としては圧縮が一番良いでしょうか.
"もし、エンドユーザーの方にダウンロードやインストールをさせたくない場合、同じMATLAB Compilerを使ってWebアプリにするという方法もあります。 "
やはり私が求めているのはこれに近いような気がします.
自分でも調べてみようと思いますが詳しく教えていただけますでしょうか.
よろしくお願いいたします.
Kojiro Saito
Kojiro Saito 2020 年 7 月 17 日
Webアプリの手順ですが、こちらの動画(英語)に紹介があります。
・App DesignerでGUIアプリを作成
「新規作成」→「アプリ」をクリックし、App Designerツールを起動します。
ドラッグ&ドロップでGUIレイアウトを配置し、コールバックでGUIを操作したときの制御を記述します。
簡単な例はこちらにあります。
・GUIアプリを作り終えたら、「共有」から「Webアプリ」をクリックしてWebアプリ(ファイル拡張子はctf)に変換します。
・開発用MATLAB Web App Serverをインストール
下記のドキュメントの手順に沿って、MATLAB Compilerのインストールフォルダーに含まれている開発用MATLAB Web App Serverのインストーラーを展開先のマシンに持っていき、開発用MATLAB Web App ServerとMATLAB Runtimeをインストールします。
・開発用MATLAB Web App Serverのセットアップ
下記のドキュメントの手順に沿って開発用MATLAB Web App Serverをサービスに登録し、起動します。
・Webアプリを開発用MATLAB Web App Serverにデプロイ
Webアプリ(.ctf)を展開先のマシンのappsフォルダーに置きます。
例: C:\ProgramData\MathWorks\webapps\R2020a\apps
・エンドユーザーからWebブラウザでアクセス
エンドユーザーのPCやタブレットで、Webブラウザを開き、URLを入力します。
例えば、展開先のサーバー名がserverというホスト名の場合、
http://server:9988
でWebアプリを開けます。
必要に応じてエンドユーザーからのホスト名解決やファイアウォールでのTCPポートの開放を行う必要があります。
Kaede
Kaede 2020 年 7 月 22 日
ありがとうございます.やってみます!

サインインしてコメントする。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!