Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с указателем на 8ми гиговую область памяти 
:(
    Опции темы
andrew_121
Дата 19.2.2010, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



в общем, есть файл объемом 8 гигов.
делаю его отображение в память, все гуд.
пытаюсь получить ссылку на элемент в массиве, получаю "Segmentation fault".
Код

const T& operator[] (int idx) const {
    if ( idx < 0 || idx > _count ) {
        throw bad_index();
    }
    return *(const T*)(_ptr+idx*sizeof(T));
}

Т - параметр шаблона.
_count - кол-во элементов в файле(file_size/sizeof(T)).
_ptr - указатель на начало массива.

я так понимаю, тут проблема именно в том что машина у меня не 64 битная?
если да, то каким образом можно все же решить вопрос на сем железе?


Это сообщение отредактировал(а) andrew_121 - 19.2.2010, 11:59


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
RatHat
Дата 19.2.2010, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: нет
Всего: 1



Хм...может действительно проблема в том, что 32-битная платформа способна адресовать до 4-х гб ?
Тогда сделай два сегмента по 4ГБ, и адресуйся по частям.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
NewDima
Дата 19.2.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата(RatHat @ 19.2.2010,  23:39)
Тогда сделай два сегмента по 4ГБ, и адресуйся по частям.

а оператор перепиши для int64
PM ICQ   Вверх
andrew_121
Дата 19.2.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(RatHat @  19.2.2010,  16:39 Найти цитируемый пост)
сделай два сегмента по 4ГБ, и адресуйся по частям. 

алгоритм усложнится. но если другого выхода не найду, так и придется сделать.

Цитата(NewDima @  19.2.2010,  16:44 Найти цитируемый пост)
а оператор перепиши для int64 

смысл? диапазона знакового целого хватает с запасом.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
artsb
Дата 19.2.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 1
Всего: 64



Del

Это сообщение отредактировал(а) artsb - 19.2.2010, 17:35


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
RatHat
Дата 19.2.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: нет
Всего: 1



Ну просто, насколько я помню (хотя я могу и ошибаться, потому что я тот еще нуб), 32-хбитная архитектура тебе не позволит адресовать больше чем 4 гб.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
NewDima
Дата 19.2.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



andrew_121, не позволит для адресации элементов однобайтного типа

Добавлено через 3 минуты и 46 секунд
Код

#define HI_INT(a) *((int*)&(a)+1)
#define LO_INT(a) *((int*)&(a))
const T& operator[] (__int64 idx) const {
    if ( idx < 0 || idx > _count ) {
        throw bad_index();
    }
    return *(const T*)((HI_INT(idx)?_ptr:_ptr2)+LO_INT(idx)*sizeof(T));
}
#undef HI_INT
#undef LO_INT

типа такого
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.