Russian Qt Forum
Ноябрь 22, 2024, 22:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с памятью WinCE. 0x80000002  (Прочитано 7135 раз)
dd
Гость
« : Декабрь 07, 2010, 10:18 »

Два дня бьюсь, на ровном месте крашится программа.
WinCE SDK 5.0, MSVC 2005.

Если создать новый порект и  куда-нибудь в начало копирнуть кусок кода:

Код:
#include <QMap>
.......
{
QMap<QString, QString> map_hdr;
map_hdr["target"] = "test";

unsigned char *buf_out = new unsigned char[188];
memset(buf_out, 0, 188);

int counter_dd = 0;
for(QMap<QString, QString> ::const_iterator begin = map_hdr.constBegin(), end= map_hdr.constEnd(); begin != end; ++begin)
{
counter_dd += 1;
int a = 0x11223344;

//  *((unsigned int*)(buf_out + counter_dd)) = a;
((unsigned int*)(buf_out + counter_dd))[0] = a;

{ //// PRINT BUFFER IN HEX
QByteArray arr((const char*)buf_out, 188);
QString str_hex(arr.toHex());
QMessageBox::warning(this, "", str_hex);
}
}
delete [] buf_out;
}
то на девайсе будет краш с ошибкой 0x80000002.
MSDN говорит, что мол "Ran out of memory".
Сначала код был с использованием std::map.
Было также. Грешил на реализацию stl. Запустил с QMap.

Причем если вместо
Код:
counter_dd += 1;

Поставить:

Код:
counter_dd = 1;

Или другое число, ничего не падает.
Ума не приложу, в чем дело.
Если с stl я мог предположить, что std::map портит стек, то тут вообще идеи закончились.
(На других платформах - линукс, виндовс, фря - все порверено и работает).

Выручайте!


ДОБАВЛЕНО

Убрал QMap
Код:
	{
unsigned char *buf_out = new unsigned char[188];
memset(buf_out, 0, 188);

int counter_dd = 0;

for(int i = 0; i < 2; i++)
{
counter_dd += 1;
int a = 0x11223344;

//  *((unsigned int*)(buf_out + counter_dd)) = a;
((unsigned int*)(buf_out + counter_dd))[0] = a;


{ //// PRINT BUFFER IN HEX
QByteArray arr((const char*)buf_out, 188);
QString str_hex(arr.toHex());
QMessageBox::warning(this, "", str_hex);
}
}
delete [] buf_out;
}

Просто код на Си. Падает.
« Последнее редактирование: Декабрь 07, 2010, 10:47 от dd » Записан
BRE
Гость
« Ответ #1 : Декабрь 07, 2010, 10:50 »

А что это за платформа (устройство)?
На некоторых платформах просто не возможно обратиться (R/W) по не выравненному адресу, процессор, обнаружив такую попытку просто генерирует исключение.
Записан
dd
Гость
« Ответ #2 : Декабрь 07, 2010, 11:18 »

А можно поподробнее, что это такое и что с этим делать?
Девайс - Link 300, на борту winCE 5.0. SDK 5.0 (ARMV4I).
QT работает норм.

Вот нашел: http://www.gamedev.ru/terms/MemoryAlignment
Оно?
Посмотрел ошибку - адрес заканчивается на 0x....1C, то есть по 16 не выровнен, исходя из статьи.
« Последнее редактирование: Декабрь 07, 2010, 11:32 от dd » Записан
BRE
Гость
« Ответ #3 : Декабрь 07, 2010, 12:47 »

Поищи в гугле: ARMV4I+выравнивание

http://ru.osdev.wikia.com/wiki/Логическая_структура_памяти_(ARM)
http://ru.osdev.wikia.com/wiki/Исключения_(ARM)
Записан
dd
Гость
« Ответ #4 : Декабрь 07, 2010, 19:01 »

Спасибо за наводку.
Заюзал QByteArray, все работает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 20.