У меня есть программа, которая должна быть отправлена следующие переменные:
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
.