LINUX.ORG.RU

передача массивов «на лету»

 ,


0

1

Доброго времени суток!

Есть огромный двумерный вектор вида

vector<vector<Vector3D> >(n, vector<Vector3D>(N));

Но одна из стандартных структур библиотеки GSL (gsl_monte_function) просит на вход функцию, которая в переменных принимает массив типа double *.

Есть ли способ, не переписывая стандартную функцию под себя и не создавая дополнительный одномерный массив «на лету», переправлять обращения (чтение/запись) к двумерному вектору?

★★

Нельзя.

Но можно изначально организовать хранение матрицы в массиве double, а потом «натянуть» на нее интерфейс вектора векторов (через кастомный аллокатор). Будет кровь и кишки.

annulen ★★★★★
()
Ответ на: комментарий от annulen

А если создать вспомогательный класс, в котором перегрузить оператор [] для доступа к элементам двумерного вектора, а затем в ту функцию передавать переопределенный по типу (reinterpret_cast<double*>) указатель на этот класс? Этот извращенный костыль будет работать?

aido ★★
() автор топика
Ответ на: комментарий от aido

Такой костыль мог бы сработать, если бы внутренняя структура этого класса была эквивалентна непрерывному массиву double. А так под видом элементов массива double будут считываться приватные поля векторов

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от annulen

А это чем плохо с точки зрения памяти, быстродействия и, вообще, верности решения? Вроде бы всяко лучше, чем выделять дополнительный гигабайт памяти и переписывать библиотеку...

aido ★★
() автор топика
Ответ на: комментарий от aido

Что именно плохо?

Описанный вариант с reinterpret_cast просто неработоспособен, так как перегрузка операторов не меняет представление данных в памяти. Коду, использующему double*, глубоко наплевать на операторы.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Эх... значит все-таки переписывать функции из GSL....

aido ★★
() автор топика
Ответ на: комментарий от annulen

и значит встроить прямыми способами перенаправление к другим элементам массива - никак?

aido ★★
() автор топика
Ответ на: комментарий от aido

Чтобы передать в функцию double*, нужно его иметь. В твоей структуре непрерывного массива double нет.

annulen ★★★★★
()
Ответ на: комментарий от aido

В пространстве ядра можно (теоретически) перепрограммировать на ходу MMU, и таким образом перенаправить виртуальные адреса внутри диапазона массива в нужные ячейки. С точки зрения железа этот способ действительно прямой :)

annulen ★★★★★
()
Ответ на: комментарий от annulen

В пространстве ядра можно (теоретически) перепрограммировать на ходу MMU, и таким образом перенаправить виртуальные адреса внутри диапазона массива в нужные ячейки. С точки зрения железа этот способ действительно прямой :)

Это можно сделать и в пространстве пользователя, mmap(2). Но только с данными размером кратным размеру страницы.

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.