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

アプリケーションコンパイラを使用してアプリを作成しています.
使用しているプログラムは普通に実行するのには問題はないのですが,アプリを作成してインストールして開こうとするとインデックスが配列要素数(0)を超えていますとでで上手く実行できないのですが何が問題なのでしょうか.

9 comentarios

madhan ravi
madhan ravi el 15 de Jul. de 2020
Would you mind posting the code?
Kaede
Kaede el 15 de Jul. de 2020
Thank you for your comment.
What part of the code?
The program I'm using is always OK,but I get an error when I creat an app.
I'm not very good at English, but did you get the message?
Kaede
Kaede el 15 de Jul. de 2020
ちなみにこのプログラムを実行する際に実行のボタンを押すのではなく,
Mushra('..\mashram1\example_config.txt')
このようなコマンドを打たないと実行できないのですが,それはアプリ作成の際にどこに書いたら良いのでしょうか.
Kenta
Kenta el 15 de Jul. de 2020
how about sharing the file you made in app designer? it involves the code which returns the error.
Kaede
Kaede el 15 de Jul. de 2020
Thanks again for your comments.
I can't seem to send it even if I compress it because the folder is too large.
The folder on this image is the folder generated when the app was created, which one do I need?
Kojiro Saito
Kojiro Saito el 15 de Jul. de 2020
@Kaedeさん
「インデックスが配列要素数(0)を超えています」のエラーがコードのどこで起きているのかが特定できます。デバッグ用にログ出力を有効化してみてどこでエラーが起きているか教えていただけますか?
コンパイルする際に「ログファイルの作成」にチェックを入れてログファイル名を入力してからパッケージ化すれば、アプリを実行時にログファイルが出力されるようになります。
コンパイルしているMushraという関数は、入力引数にコンフィグファイル名が必要になっていたりしませんでしょうか?
たとえば
function Mushra(filename)
%
end
のように。
その場合、ファイル名のパスをアプリ実行時に与える必要があります。
実行時にコマンドでファイルパスを入力させたくない場合、入力引数のfilenameを外してuigetfileでエンドユーザーにコンフィグファイルのパスを選択させる方法、パス指定で直書きするなどの方法があります。
function Mushra
[file,path] = uigetfile('*.txt');
config = readtable(fullfile(path, file));
% TBD
end
とか
function Mushra
%#exclude example_config.txt
config = readtable('example_config.txt');
% TBD
end
とかですかね。%#excludeプラグマはR2020aから使えますが、配布先でファイルを変更したりする場合にアプリにファイルを含めなくするおまじないです。
Kaede
Kaede el 16 de Jul. de 2020
@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 el 16 de Jul. de 2020
"その場合、ファイル名のパスをアプリ実行時に与える必要があります。"
ということなのですがこれは今実行しているような
Mushra('..\mashram1\example_config.txt')
コマンドが毎回アプリ実行時に必要ということでしょうか.
本格的に4月からMATLABを使い始めたのですが,ここ2ヶ月ぐらいほとんど触らない期間がありましてほとんど初心者なため理解が追い付いていないのですができるだけわかりやすく説明していただけるとありがたいです.
Kojiro Saito
Kojiro Saito el 16 de Jul. de 2020
@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)を超えています」のエラーの原因が分かりましたので、後ほどコメント欄ではなく回答欄に解決策を書かせていただきます。

Iniciar sesión para comentar.

 Respuesta aceptada

Kojiro Saito
Kojiro Saito el 16 de Jul. de 2020

2 votos

コンパイルしようとしている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のファイルが読み込まれるようになります。
参考になれば幸いです。

Más respuestas (1)

Kaede
Kaede el 16 de Jul. de 2020

0 votos

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

6 comentarios

Kaede
Kaede el 16 de Jul. de 2020
もしエンドユーザーに配布するときにメールで送るためどうしても容量が大きくなってしまうのですが,やはり方法としては圧縮が一番良いでしょうか.
Kaede
Kaede el 16 de Jul. de 2020
私は普段容量の大きいデータを送るときはdropboxに上げ,リンクをコピーしてメールで送ります.ですのでいつものように今回もダウンロードしてもらって実行してもらおうと考えていたのですが,先生に被験者側にダウンロードからさせるのはやりすぎという風に言われました.
Kojiro Saito
Kojiro Saito el 16 de Jul. de 2020
コメントありがとうございます。新しい回答としてコメントが入ってしまっていますね。回答についての返信のときは、「この回答についてコメント」から書くと同じスレッドでコメントが入りますので、ご留意ください。
追加質問①for_redistribution_files_onlyを開くと上の画像のフォルダに入っているのと異なっているのですが大丈夫ですか.
については、ファイルの拡張子が表示されていないだけですので、大丈夫です。
Windowsのエクスプローラーから、「表示」タブを開き、「ファイル名拡張子」のチェックボックスにチェックを入れれば、.batや.exeなどの拡張子も表示されるようになります。
追加質問②エンドユーザーには何を配ればよいでしょうか.
については、for_redistributionフォルダーにある、アプリのインストーラー(MyAppInstaller_web.exeやMyAppInstaller_mcr.exeのようなファイル名)をエンドユーザーに渡して、エンドユーザー側でインストーラーを実行させれば良いです。
追加質問③もしエンドユーザーに配布するときにメールで送るためどうしても容量が大きくなってしまうのですが,やはり方法としては圧縮が一番良いでしょうか.
については、ものにもよりますが、WebからMATLAB Runtimeをダウンロードさせるタイプのインストーラー(MyAppInstaller_web.exe)でしたらファイルサイズは3~5MBぐらいで済みます。メールでも添付できるサイズかと。MATLAB Runtimeもインストーラーに含めるタイプのインストーラー(MyAppInstaller_mcr.exe)でしたら、数百MB~GBぐらいになってしまいます。この場合は、One DriveとかDropboxとかのファイル共有サービスを使ったほうが良いですね。
いずれにしても、インストーラーはバイナリファイルですので、圧縮してもそれほどファイルサイズは変わらないです。
もし、エンドユーザーの方にダウンロードやインストールをさせたくない場合、同じMATLAB Compilerを使ってWebアプリにするという方法もあります。
MATLAB本体のApp Designerというツールを使ってGUIアプリを作成し、それをMATLAB CompilerでWebアプリに変換し、サーバーアプリケーションとして動かします。エンドユーザーの方はWebブラウザでURLをクリックするだけでそのGUIアプリを使うことができます。
Kaede
Kaede el 17 de Jul. de 2020
コメントありがとうございます.
間違えて"この回答へのコメント"ではなく"その他の回答"へコメントしてしまって申し訳ございませんでした.
追加質問①for_redistribution_files_onlyを開くと上の画像のフォルダに入っているのと異なっているのですが大丈夫ですか.
追加質問②エンドユーザーには何を配ればよいでしょうか.
教えていただきありがとうございます.了解しました.
追加質問③もしエンドユーザーに配布するときにメールで送るためどうしても容量が大きくなってしまうのですが,やはり方法としては圧縮が一番良いでしょうか.
"もし、エンドユーザーの方にダウンロードやインストールをさせたくない場合、同じMATLAB Compilerを使ってWebアプリにするという方法もあります。 "
やはり私が求めているのはこれに近いような気がします.
自分でも調べてみようと思いますが詳しく教えていただけますでしょうか.
よろしくお願いいたします.
Kojiro Saito
Kojiro Saito el 17 de Jul. de 2020
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 el 22 de Jul. de 2020
ありがとうございます.やってみます!

Iniciar sesión para comentar.

Categorías

Más información sobre MATLAB Compiler en Centro de ayuda y File Exchange.

Productos

Preguntada:

el 15 de Jul. de 2020

Comentada:

el 22 de Jul. de 2020

Community Treasure Hunt

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

Start Hunting!