Проблема заключается в том, что из C# проекта вызывается консольная С++ программка с ключами, и в некоторых случаях мне нужно вернуть число типа double из С++ проекта в C# проект как возвратное значение. Тип Int я умею получать. У меня полно вариантов с костылями типа через файл записать итп... но можно это как нормально сделать? или просто мне странного хочется?:)
Не путайте вывод команды и код выхода. Испльзуйте печать в stdout, к примеру, а из c# читайте.
"тандартная возможность передачи объекта через буфер между языками" - часто используют для этого очереди. zeromq, к примеру.
Вам хочется странного. Код возврата из приложения -- целое число, это жёстко закодировано во многих местах ОС. В POSIX это часть стандарта. В C и C++ это часть стандарта.
www.cyberforum.ru/csharp-net/thread714894.html ребята обсуждали похожую проблему, передавали через буфер. завтра попробую. Но я бы не хотел привязываться к winAPI, есть ли стандартная возможность передачи объекта через буфер между языками? Что то вроде сериализации.
Илья Бобков: невозможно никаким образом передать значение с плавающей запятой типа double, впихнув его вместо кода возврата. В стандарте написано - main возвращает int. Если бы int занимал столько же бит, сколько double - трюк бы удался. Но увы.
Даже если бы int занимал столько же байт, это не помогло бы. При возвращении double из main произошло бы преобразование к int с отбрасыванием дробной части. И только return reinterpret_cast(doubleValue), возножно, помог бы в таком случае.
Мне почему-то кажется, что для этого проще сделать новый класс/функцию, которая будет выполнять нужные вам действия. Не стоит выделять его в отдельную программу.
1. Если С++ программка написана более менее разумно, то должно быть возможно превратить её в dll.
И тогда спокойно возвращать double.
2. Костыль через арифметику с фиксированной запятой, где точность представления определена априори (или через ключи). И вместо x возвращать static_cast(x*precisionMultiplier).
static_cast(x*precisionMultiplier) - тоже частное решение, которое помогло бы мне именно в этой задачи. Но я решил сделать инструмент, чтобы в будущем нормально можно было его применять и не заморачиваться. Потратился по времени, но результат удовлетворил полностью!:)
Спасибо!
Я сделал аналог клиент - серверного приложения на стандартных потоках ввода вывода. Т.е. для Сишной проги написал маленький обработчик на си, который читает из cin и в зависимости от команды, то и выполняет. Результат пишет в cout, а потом строка интерпритируется как число double.