У меня есть программа, которая должна быть отправлена следующие переменные:
Bool int string vector<int> vector<string>
Это будет вызвано PHP вызовом, поскольку я рассмотрел здесь и здесь .
Глядя на этот вопрос о (int argc, char** argv[]) , я знаю, что вы можете передавать различные аргументы программе, которую нужно выполнить, но все они представлены в виде последовательности символов .
Поэтому мой вопрос: если это возможно, как вы собираетесь отправлять через несколько переменных переменных при вызове PHP на C++ программу?
EDIT (Вопрос продолжен) … и как будет выглядеть вызов функции?
Это так просто, как не использовать (int argc, char** argv[]) и просто делать:
int main(bool var1, int var2, std::vector<std::string> var3, std::string var4) { ... }
Потому что это, кажется, делает (int argc, char** argv[]) немного избыточным?
Вы можете выполнить свою C ++-программу на PHP с помощью exec :
exec("./your_program.exe $parameters", $output);
Это передаст содержимое $parameters в качестве аргумента командной строки для вашей программы на C ++. Внутри main(int argc, char** argv) вы можете получить доступ к этим данным через argc и argv .
Чтобы передать сразу несколько переменных, вы должны использовать некоторую сериализацию . Это преобразует содержимое ваших переменных в одну строку, которую вы затем можете передать в качестве аргумента командной строки. Вам просто нужно убедиться, что сторона C ++ знает, как снова неэтериализовать эту строку в правильные переменные / типы данных.
Существует множество возможностей: от разработки собственного формата (не делайте этого) до использования одного из установленных (сделайте это).
Форматы, такие как JSON, XML, MessagePack и т. Д., Приходят на ум. Вы даже можете реализовать что-то, используя собственный метод serialize PHP .
Чтобы сделать все более понятным, предположим, что вы хотите передать эти данные с PHP на C ++:
$var1 = false; $var2 = 123; $var3 = array("some","string","data"); $var4 = "anotherstring";
давайте предположим, что у вас есть функция PHP my_serialize() которая преобразует array($var1, $var2, $var3, $var4) в вымышленный формат сериализации false|123|<some,string,data>|anotherstring :
$serialized_data = my_serialize(array($var1, $var2, $var3, $var4)); // $serialized_data == "false|123|<some,string,data>|anotherstring" // invoke your program and pass the data exec("./your_program.exe '$serialized_data'", $output);
В вашей программе сериализованные данные теперь находятся в пределах argv[1] . Теперь вам понадобится функция my_deserialize() которая анализирует входные данные и преобразует их в соответствующий формат данных.
int main(int argc, char** argv) { std::cout << argv[1] << std::endl; MyData data = my_deserialize(argv[1]); std::cout << data.var4 << std::endl; // outputs "another string" }
Используйте один из методов сериализации, перечисленных выше, и вам не нужно заботиться о деталях реализации my_serialize и my_deserialize .