Azzera filtri
Azzera filtri

Making an executable with input arguments using codegen

15 visualizzazioni (ultimi 30 giorni)
I'm trying to compile a Matlab code using codegen and making an executable. The thing is that after compilation, I can't seem to successfully call the app from matlab along with the relevant input. I'll explain:
To make things simple, let's assume that the purpose of my program is to create a '.txt' file named 'my_text.txt' and print an input string inside, like so:
function PrintMyString(input_str) %#codegen
fid = fopen('my_text.txt','w');
fprintf(fid,'My input string is: %s',input_str);
fclose(fid);
end
Now, I tried to compile the code above using the following script:
str = 'pre_defining_the_input_variable_by_example';
codegen -config config_obj PrintMyString -args {str}
when config_obj is the code generation configuration defined somewhere earlier.
The compilation was successful, but as I mentioned before, when I tried to activate the program it didn't go as planned. I tried various options for calling, such as:
system(['PrintMyString.exe ',str]);
The text file was created, but no input string was printed (all that appeared was the line "My input string is: ").
I also tried adding a main function that calls the original PrintMyString function, like so:
function main() %#codegen
str = 'some_string';
PrintMyString(str);
end
I compiled it like that:
str = 'pre_defining_the_input_variable_by_example';
codegen -config config_obj main PrintMyString -args {str}
And that worked, but obviously it doesn't help because the input string has to be sent to the program from outside.
Any ideas? What am I doing wrong?

Risposta accettata

Titus Edelhofer
Titus Edelhofer il 4 Set 2018
Hi,
it's probably not a question of the code generation but your main file: you compile to an executable, so probably your config_obj carries the information about the main file that you have to have. This main file should be able to take string input and pass it to the generated C code.
Maybe you can share your main file and we can take a look.
Titus
  5 Commenti
Titus Edelhofer
Titus Edelhofer il 5 Set 2018
Hi,
this is what I did: I used the coder app as well and
  • specified myself the input to be char of size 1x:Inf(to have strings of undefined length as input).
  • Selected executable
  • Generated code
  • Copied the generated example\main.c, main.h to mymain.c, mymain.h
  • Made some changes (here the changed lines):
#include "mymain.h" // instead of #include "main.h"
static void main_PrintMyString(const char* str) // add str as input
input_str = emxCreateWrapper_char_T(str, 1, strlen(str)); // rows=1, cols = length of the input string
main_PrintMyString(argv[1]); // second input is the input parameter (first is the name of the executable)
  • and added mymain.c on the "More Settings"->Custom Code->Additional Source files
  • and generated code again
  • and if everything works fine, call the executable :)
Titus
Yuval Geyari
Yuval Geyari il 5 Set 2018
Modificato: Yuval Geyari il 5 Set 2018
It works great, thank you! Althougth I used a different input argument in the last line you mentioned:
main_PrintMyString(input_str);
And also, how exactly did you know to use the emxCreateWrapper_char_T function? It wasn't in the original example main.c file.

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Input Specification in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by