Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 766

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!

Прошу Вас помочь мне в следующем вопросе:

Имеются следующие типы данных:

 fann_type = double;
    PFann_Type = ^fann_type;
    PPFann_Type = ^pfann_type;
    Fann_Type_Array = array[0..65535] of fann_type;
    PFann_Type_Array = ^Fann_type_array;
    PPFann_Type_Array = array[0..65535] of ^Fann_Type_Array;
 
  PFann_Train_Data = ^TFann_Train_Data;
  TFann_Train_Data = packed record
    errno_f: cardinal;
    erro_log: PFile;
    errstr: Pchar;
    num_data: cardinal;
    num_input: cardinal;
    num_ouput: cardinal;
    input: PPFann_Type_Array;
    output: PPFann_Type_Array;
  end;
Имеется созданная и заполненная переменная:
var
ANN:PFann_Train_Data;
Теперь собственно вопрос:
как получить значения полей input и output в обычные массивы (array of array of Double) для дальнейшей работы.
Заранее благодарен

Сергей Мурзинов Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Сергей Мурзинов (статус: Посетитель)
Вопрос отправлен: 27 ноября 2010, 05:31
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: DNK

Здравствуйте, Сергей Мурзинов!
Да вы, батенька, маньяк! Представляешь сколько это данных? У меня получилось 64Гбайт. Если и имеется такая могучая переменная, то не думаю, что это хорошая идея копировать что-либо куда-либо. Лучше уж организовать удобный доступ к ним например с помощью функций:

function getInputValue(arg: PFann_Train_Data; x, y: integer): double;
begin
  Result := arg^.input[x]^[y];
end;
 
function getOutputValue(arg: PFann_Train_Data; x, y: integer): double;
begin
  Result := arg^.output[x]^[y];
end;

Ответ отправил: DNK (статус: Студент)
Время отправки: 2 декабря 2010, 14:49


Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 13 сентября 2011, 22:58; участников в обсуждении: 5.
min@y™

min@y™ (статус: Доктор наук), 27 ноября 2010, 08:21 [#1]:

Блин, пока пытался вникнуть во все эти указатели на указатели, голова разболелась и заслезились глаза... Зачем нужен такой брейнфакинг? Попроще никак нельзя?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 27 ноября 2010, 09:12 [#2]:

Да вы, батенька, маньяк! Представляешь сколько это данных? У меня получилось 64Гбайт. Если и имеется такая могучая переменная, то не думаю, что это хорошая идея копировать что-либо куда-либо. Лучше уж организовать удобный доступ к ним например с помощью функций:
function getInputValue(arg: PFann_Train_Data; x, y: integer): double;
begin
  Result := arg^.input[x]^[y];
end;
 
function getOutputValue(arg: PFann_Train_Data; x, y: integer): double;
begin
  Result := arg^.output[x]^[y];
end;
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 27 ноября 2010, 11:00 [#3]:

Дикая жуть! Зачем всё это надо, а?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Егор

Егор (статус: 10-ый класс), 29 ноября 2010, 18:01 [#4]:

а где здесь 34 Гб?
...
  PPFann_Type_Array = array[0..65535] of ^Fann_Type_Array;
  // то бишь 65536 указателей
  // имеем 65536*sizeof(^double)=256 kb
...
  PFann_Train_Data = ^TFann_Train_Data;
  TFann_Train_Data = packed record
  errno_f: cardinal;
    erro_log: PFile; // указатель? 4b
    errstr: Pchar;   // 4b
    num_data: cardinal;  // 4b
    num_input: cardinal; // 4b
    num_ouput: cardinal; // 4b
    input: PPFann_Type_Array; // 256 kb
    output: PPFann_Type_Array;// 256 kb
  end;
 
var
ANN:PFann_Train_Data;
сама переменная будет размером 4 байта, т.к. она - указатель.
структура, на которую будет показывать переменная, будет размером 4+4+4+4+4+4+512+512=524312 байт - чуть-чуть более 512 kb. кстати, столько же и показал дельфи по команде sizeof(TFann_Train_Data).

хотя...
вопрос-то был

Цитата (Сергей Мурзинов):

как получить значения полей input и output в обычные массивы (array of array of Double) для дальнейшей работы.

с помощью этой структуры можно адресовать данные:
  fann_type = double; // 8b
  Fann_Type_Array = array[0..65535] of fann_type; // 65536*8 b = 512 kb - данные
  PPFann_Type_Array = array[0..65535] of ^Fann_Type_Array; // 65536*512 kb = 32 Gb - данные
                                                  // 65536*4 = 256 kb - указатели
...
  input: PPFann_Type_Array; // 32 GB + 256 kb
  output: PPFann_Type_Array;// 32 GB + 256 kb
имеем, что объём адресуемых данных 64 Гб. Но указатели не обязательно должны показывать на разные области памяти - т.е. базовые издержки на память - чуть более 512 кб, а остальное - в динамической памяти.
и если переводить всё это в

Цитата:

array of array of Double

то...
array [0..65535,0..65535] of double
то как раз и получим два массива по 32 Гб каждый.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 29 ноября 2010, 18:20 [#5]:

и не получиться у вас на 32битной системе индексировать 32 Гб данных (если только эти массивы не перекрываются). 3 Гб в самых-самых затюнингованных настройках.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 29 ноября 2010, 18:28 [#6]:

Самое интересное - это мой вопрос "Зачем всё это надо, а?". Ответа от аффтара так и нету. :(
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 29 ноября 2010, 21:45 [#7]:

Очепятался. 64ГБ. Только данные, накладные расходы не считал.
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 29 ноября 2010, 21:56 [#8]:

Мне 1хрен не понятно, нафига нужны такие извращения? Ну есть же классы и динамические списки указателей (TList, TObjectList и пр.). Нахрена резервировать СТАТИЧЕСКИ такое количество памяти, когда можно:
а) клянчить память у системы динамически по мере необходимости;
б) смастырить БД и бед не знать.

Аффтар молчит, как белорусский партизан под Бобруйском и это не есть гут...
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
tonnelll

tonnelll (статус: Посетитель), 13 сентября 2011, 22:58 [#9]:

Такие извращения написал не автор статьи,а тот кто переводил, FANN с С++ на Дельфи, так что тут уж ничего не сделаешь

Столкнулся с тойже проблемой, нормального решения не нашел, пришел к выводу что проще всего использовать fann_save_train() и потом считывать, правда если нужно часто добавлять по чуть-чуть элементов или часто сохранять, то возникают проблемы

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.04 сек.