Ну вот, решил написать софтинку, которая
а) вычисляет любое выражение,
б) ищет корни любого уравнения трёмя довольно прогрессивными способами.
Немного подумав, я решил, что анализировать это выражение я запарюсь и тут мне пришла в голову идея, что не зря добрые люди придумали vbscript. Поскольку задачу необходимо было выполнить на c++, я всё писал на Microsoft Visual C++ 6.0. Также неплохо принять во внимание, что с++ я изучаю месяц и такая безобидная вещь как заменить в строке x на x+0.000001 у меня выглядит довольно страшно.
Сначала я сделал программу, которая находит трёмя способами решение заданного уравнения. Она работала отлично. Например, если в прикреплённом ниже коде заменить содержимое функции fu на выражение f(p), а в функции ff написать (f(p+0.000001)-f(p))/0.000001 (численная производная в точке p), то можно получить корни уравнения f(x) с заданной точностью.
Потом я прикрутил к этому всему возможность работы с произвольным выражением, и начались проблемы. Собственно принцип понятен: под каждое выражение генерится скрипит, запускается на исполнение, а я его результат возвращается в прогу. Но из-за не особо хорошего знания си, мне пришлось сделать это через файлы. Именно поэтому поисходят накладки типа
1+1=0
2+3=2
3+7=5
4-7=10
Кроме того, это ещё и медленно. Идеальный вариант был бы, если бы прога писала в скрипт указатель на некоторую переменную, а скрипт бы про помощи copy memory писал бы в неё ответ. Однако, как выяснилось, указатель - не есть абсолютный адрес оперативки, для каждого процесса свои адреса и работать это не будет (так мне Хакер объяснил). Слышал про pipe, но как его реализовать не знаю.
Хотел бы попросить прокомментировать код и идею, а тык же помощи в борьбе с этой проблемой...
Вот что получилось в итоге: