Работа с массивом данных

Тема в разделе "LANGS.C", создана пользователем RTY_IOP, 30 окт 2008.

  1. RTY_IOP

    RTY_IOP New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    2
    Всем привет
    есть структура

    struct A
    {
    char a[0xFFFFFFFF];
    char b[0xFFFFFFFF];
    char c[0xFFFFFFFF];
    ....
    }

    Размер структуры теоретически должен быть слишком большой (порядка 12-16 Гб)

    Подскажите, как оформить код так, чтобы например при действии

    MyStruct->a[0] = 1;

    Выполнялись следующие действия

    1. Открывался файл
    2. Находился нужный элемент
    3. Вносились изменения
    4. Происходила запись в файл
    5. Файл закрывался

    в принципе все по отдельности сделать могу, открыть файл, смэпить его часть, переписать и сохранить.
    Думал даже сделать как класс и методом оформить нужные действия...
    Но тогда код не сильно читабельный получается.


    Можно ли как-то переопределить для моего класса "->" и "."

    Заранее спасибо

    PS: структура предназначена для большой нейронной сети. И уйти от больших массивов, увы, не получится... Оптимизировал все по максимуму.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Архитектура жесть. Не советую мешать ООП и процедурный подходы. Вы думаете если засунуть кучу действий в оператор [], то это добавит читабельности?
     
  3. Ra!N

    Ra!N New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    111
    )
     
  4. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    мэпить зачем? прочитать, изменить и записать.
     
  5. RTY_IOP

    RTY_IOP New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    2
    Ra!N
    Большое количество нейронов по условию.
    Если реализовывать классические схемы (как в учебниках), расход памяти упирается в сотни Гигабайт.

    t00x
    Первый раз все-равно нужно выполнить CreateFile + CreateFileMapping
    А дальше танцы MapViewOfFile / UnmapViewOfFile
    но это все детали. Вопрос о другом.

    Booster
    Я вот и думаю на чистом ООП, с классами и методами.
    На чистом процедурном код становится слишком нечитабельным.

    Так все же, можно ли как-то переопределить "->" для моего класса?
    Ну или свой оператор внести?

    Или все-таки только как метод оформлять?
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Если необходимо следовать OOП принципам, то нужно сделать некую сущность и обращаться к ней с помощью методов, а не к полям. Переопределение оператора "->" делается для других целей.
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    что это за структура такая монструозная?? вы уверены что именно так и должно быть?
     
  8. Ra!N

    Ra!N New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    111
    RTY_IOP
    я бы на вашем месте сначала глубоко продумал всю архитектуру программы, а потом начал ее реализовывать. Потом сэкономите кучу времени и сил. В хорошо продуманной программе, независмо от ее сложности, 12-16гб структур не должно быть!
    Так писать нельзя:
    уверен, есть лучшее решение.
     
  9. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    -> - можно.
    "." - нельзя
    это "сколько битная" архитектура?
     
  10. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Привет. По сути требуется STL-like sequence container подобный std::vector
    Код (Text):
    1. struct MyClass {
    2.   typedef char value_type;
    3.   MyClass() { openFile(); }
    4.   ~MyClass() { closeFile(); }
    5.   value_type const operator[](size_t n) const { return getFileEelement(n); }
    6.   value_type & operator[](size_t n) { return getFileEelement(n); }
    7. };
    8. struct A
    9. {
    10. MyClass a;
    11. MyClass b;
    12. MyClass c;
    13. //....
    14. };
    В чём проблемы, если "все по отдельности сделать могу, открыть файл, смэпить его часть"? "переписать и сохранить" - это не надо, изменения в мапе прозрачно идут в файл.

    У тебя const версию getFileEelement реализовать просто, но обычная не дасат желаемого эффекта в
    Код (Text):
    1. f()
    2. {
    3.   A MyStruct;
    4.   MyStruct->a[0] = 1;
    5. }
    поскольку буде возвращать ссылку на локальный объект. value_type придётся делать не char, а прокти обектом, который будет записывать в деструкторе. Продолжать? :)