| 
| 
 | Вопрос # 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™ (статус: Доктор наук), 27 ноября 2010, 08:21 [#1]:Блин, пока пытался вникнуть во все эти указатели на указатели, голова разболелась и заслезились глаза... Зачем нужен такой брейнфакинг? Попроще никак нельзя? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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™ (статус: Доктор наук), 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™ (статус: Доктор наук), 29 ноября 2010, 18:28 [#6]:Самое интересное - это мой вопрос "Зачем всё это надо, а?". Ответа от аффтара так и нету.   Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | DNK (статус: Студент), 29 ноября 2010, 21:45 [#7]:Очепятался. 64ГБ. Только данные, накладные расходы не считал. "Digital Networked Knight" |  
|   | min@y™ (статус: Доктор наук), 29 ноября 2010, 21:56 [#8]:Мне 1хрен не понятно, нафига нужны такие извращения? Ну есть же классы и динамические списки указателей (TList, TObjectList и пр.). Нахрена резервировать СТАТИЧЕСКИ такое количество памяти, когда можно: а) клянчить память у системы динамически по мере необходимости;
 б) смастырить БД и бед не знать.
 
 Аффтар молчит, как белорусский партизан под Бобруйском и это не есть гут...
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | tonnelll (статус: Посетитель), 13 сентября 2011, 22:58 [#9]:Такие извращения написал не автор статьи,а тот кто переводил, FANN с С++ на Дельфи, так что тут уж ничего не сделаешь 
 Столкнулся с тойже проблемой, нормального решения не нашел, пришел к выводу что проще всего использовать fann_save_train() и потом считывать, правда если нужно часто добавлять по чуть-чуть элементов или часто сохранять, то возникают проблемы
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |