Помощь - Поиск - Пользователи - Календарь
Полная версия: Избавление от Boost'a.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Krjuger
Уже более практическая часть проблемы.
Есть работающий код с использованием буста.Нужно избавитьс от буста и сохранить работоспособность.
У меня появилась проблема.

vector<double> p(spaceSize);
Negate(GradF(x),p);

void Negate(vector<double> x, vector<double> y)
{
for ( int i=0; i<x.size() ; i++)
y[i]=-x[i];
}


В Negate первый параметр подается правильно, в самом Negate y присваивается правильно,но на выходе p как было нулевым вектором, так и осталось.

Суть в том,что есть градиент некоторой функции,например.

vector<double> GradF1(vector<double> x)
{
vector<double> res(x.size() );
res[0] = 2 * (x[0] - 5) * ( (x[1] - 4) * (x[1] - 4) + 1);
res[1] = 2 * (x[1] - 4) * ( (x[0] - 5) * (x[0] - 5) + 1);
return res;
}

Мне надо переписать отричательный градиент в другую переменную.Размерности совпадают ,тут проблем нет.

А теперь самое главное,если я меняю

vector<double> Negate(vector<double> x)
{
vector<double> res(x.size() );
for ( int i=0; i<x.size() ; i++)
res[i]=-x[i];
return res;
}
.......

for (int i=0;i<x.size();i++)
p[i]=Negate(GradF(x))[i];



То все нормально,и опять таки,если я делаю процедуру Copy

void Copy(vector<double> x, vector<double> y)
{
for ( int i=0; i<x.size() ; i++)
y[i]=x[i];
}


И вызываю ее, как Copy(Negate(GradF(x)),p); то опять таки нифига не работает.Да и, исправив все на циклы в коде, в результате я получил абсолютно идентичный результат,что и с использованием Буста, но данное поведение меня просто убило.В Билдере тоже самое, но он хотябы мне сообщил о делении на ноль,а VS так кушал))
IUnknown
Вектор Y уже заполнен чем-нибудь?

// Если да, то:
void Negate(vector<double>& x, vector<double>& y)
{
transform(x.begin(), x.end(), y.begin(), negate<double>());
}
// если нет - то так:
void Negate(vector<double>& x, vector<double>& y)
{
// #include <iterators> для back_inserter-а
transform(x.begin(), x.end(), back_inserter(y), negate<double>());
}
Krjuger
Не работает, погуглив я наткнулся на Negate, но как метод из namespace System.Windows.Возникает вопрос, на данный момент у меня вообще консольное приложение,оно не скоро обрастет графической оболочкой, что мне подключить надо?Кстати там Negate с большой буквы, он не будет бодаться с моим?

Да и все таки из-за чего такая хрень вообще происходит,я про свой первый пост.
IUnknown
Цитата
Не работает
Не верю...

#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>

using namespace std;

const int spaceSize = 10;

void Negate(vector<double>& x, vector<double>& y)
{
// transform(x.begin(), x.end(), back_inserter(y), negate<double>());
transform(x.begin(), x.end(), y.begin(), negate<double>());
}


int main()
{
vector<double> one, two;
for(int i = 0; i < spaceSize; i++)
{
one.push_back(2.0 * i);
two.push_back(1.0 * i);
}

Negate(one, two);

copy(two.begin(), two.end(), ostream_iterator<int>(cout, "\n"));
return 0;
}

Компилируется и работает "на ура"...
Онлайн-компилятором тоже

Цитата
Кстати там Negate с большой буквы
"Там" - я не знаю. В Стандарте языка negate с маленькой буквы... Не используй тот неймспейс - не будет конфликтовать...

Цитата
из-за чего такая хрень вообще происходит
Передавайте векторы по ссылке, а не по значению. Ваш кэп smile.gif
Krjuger
Ну мне то врать незачем)))))VS говорит фиг вам))

Могу даже в ЛС сам файл скинуть, полностью светить не хочу,курсовая как никак.
IUnknown
Ну, файл-то пришли, попробую переделать его без буста...

Насчет того, что negate нет в Студии - это ты зря: negate Struct, просто, оказывается, она требует подключить еще и <functional>...
Krjuger
Цитата
Насчет того, что negate нет в Студии - это ты зря: negate Struct, просто, оказывается, она требует подключить еще и <functional>...

Ну я не сказал, что его там нет,просто с тем,что есть, писалось, что его нет)))Откуда мне знать,что нужен <functional> я его ниразу в жизни не видел и не использовал до этого)))

Переделать то я принципи переделал,но весьма кривовато, по скринам я думаю видно,хотя считает как ни странно.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.