![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.170.176] |
![]() |
|
Страницы: (4) « Первая ... 2 3 [4] все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
MemChunkNew был в правильной куче?
|
Сообщ.
#47
,
|
|
|
Вот код. Память просто не выделяется, если запросить (1<<31). Если просить меньше максимально возможного - выделяется.
![]() ![]() UInt32 free;UInt32 max; MemHeapFreeBytes((1|0x8000),&free,&max); DrawLong("DbCache free",(free/1024L),0); DrawLong("DbCache max",(max/1024L),10); UInt32 size=(1L<<31); MemPtr chunk=MemChunkNew((1|0x8000),size,0x1203); MemHeapFreeBytes((1|0x8000),&free,&max); DrawLong("DbCache free",(free/1024L),20); DrawLong("DbCache max",(max/1024L),30,400); if(chunk!=NULL)MemChunkFree(chunk); Возможно неверно заданы флаги для MemChunkNew (0x1203) |
Сообщ.
#48
,
|
|
|
Новый прикол NVFS на TX.
Например нам надо прочитать все базы на девайсе. Вот упрощенный код, работающий на всем кроме TX: ![]() ![]() UInt16 count=0; LocalID db_id; do{ db_id=DmGetDatabase(0,(UInt16)count); if(db_id!=NULL) ExgDBWrite(Callback,NULL,NULL,db_id,0); count++; }while(db_id!=NULL); Callback ничего не делает, просто возвращая errNone. На TX вскоре после заполнения DbCache произойдет Fatal Alert. Но стоит нам добавить вызов DmDatabaseInfo, как все замечательно работает и на TX. Вот так: ![]() ![]() UInt16 count=0; LocalID db_id; do{ db_id=DmGetDatabase(0,(UInt16)count); if(db_id!=NULL) { DmDatabaseInfo(0,db_id,NULL,&attr,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); ExgDBWrite(Callback,NULL,NULL,db_id,0); } count++; }while(db_id!=NULL); |
Сообщ.
#49
,
|
|
|
а симулятор в репортер чего-нибудь пишет?
|
Сообщ.
#50
,
|
|
|
А на симуляторе разумеется все работает.
Кстати, кто знает как на TX посмотреть последний Fatal Alert? А то, похоже, так как на Treo - алерт не показывается в сразу soft-reset. |
Сообщ.
#51
,
|
|
|
работать-то оно может и работает на симуляторе, но вполне способно писать варнинги в репортер.
утилита debug prefs из пальмвановских тулзов на TX не работает? |
Сообщ.
#52
,
|
|
|
DebugPrefs работает, спасибо за наводку. Судя по всему ошибка генерируется системой (источник fatal alert - unknown application).
А Reporter не показывает никаких интересных сообщений - все в норме на симуляторе. |
Сообщ.
#53
,
|
|
|
unknown application - это когда SysCurAppDatabase возвращает err != errNone. Например, такое бывает при обработке нотификации hapl в procedure callback.
|
Сообщ.
#54
,
|
|
|
Откопал ещё одну фишку. Если в ARM коде создать битмапку (BmpCreate) с помощью родной функции (через R9, без PACE) и вернуть указатель на неё в 68K код, то в 68K коде эта битмапка с помощью BmpDelete не убивается, возвращается ошибка sysErrParamErr, хотя функции BmpGetBits и WinDrawBitmap работают. Я, конечно, понимаю, что поля структуры BitmapType скорее всего в LE, но какого х.... работает, скажем WinDrawBitmap. А может я в чём-то туплю...
![]() |
Сообщ.
#55
,
|
|
|
я так понимаю, что BitmapType в 68k - это теневая структура. А ты создал только оригинальную структуру. Не исключено, что некоторые 68к функции ( особенно read only) жуют оригинальные структуры, но для изменения требуют наличия двух структур.
|
Сообщ.
#56
,
|
|
|
Цитата igor_n @ но для изменения требуют наличия двух структур Всё равно не понимаю, зачем нужна теневая структура, чтобы убить битмапку, я же не меняю поля, я просто хочу освободить память ![]() |
Сообщ.
#57
,
|
|
|
PACE ожидает указатель на 68К версию, а ты ему отдаешь ARM версию. Не работает, увы. Нужно убивать там где создавал, т.е. из ARM. Знакомые грабельки
![]() |
Сообщ.
#58
,
|
|
|
![]() |
Сообщ.
#59
,
|
|
|
![]() |
Сообщ.
#60
,
|
|
|
![]() |