- char noarg[] = {'\0'};
- int argc = args.size();
- std::unique_ptr<char*[]> argv(new char*[argc + 1]);
- for (int i = 0; i != argc; ++i)
- argv[i] = args[i].empty() ? noarg : &args[i].front();
- argv[argc] = nullptr;
- char ** argvptr=argv.get();
- simgrid::smpi::ActorExt::init(&argc, &argvptr);
-#if defined(__GNUC__)
- _gfortran_set_args(argc, argvptr);
-#elif defined(__FLANG)
+ // copy C strings, we need them writable
+ std::vector<char*> args4argv(args.size());
+ std::transform(begin(args), end(args), begin(args4argv), [](const std::string& s) { return xbt_strdup(s.c_str()); });
+
+ // take a copy of args4argv to keep reference of the allocated strings
+ const std::vector<char*> args2str(args4argv);
+ int argc = args4argv.size();
+ args4argv.push_back(nullptr);
+ char** argv = args4argv.data();
+
+ simgrid::smpi::ActorExt::init(&argc, &argv);
+#if SMPI_IFORT
+ for_rtl_init_ (&argc, argv);
+#elif SMPI_FLANG