Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Aleks
Зарегистрирован: 17.01.2007 Сообщения: 3 Откуда: СПб
|
Добавлено: Ср Янв 17, 2007 1:56 pm Заголовок сообщения: Ошибки при выполнении функции mdlLevel_getName |
|
|
Подскажите, плз!
Занялся переписыванием приложений из под версии 7 для новой 8 и столкнулся с такой странной проблемой.
Хочу по LevelID определить его название, вызываю функцию mdlLevel_getName, компилируется всё нормально, но при выполнении или зависает или снимается приложения и пишет fault 5, или ещё бывает выдаёт имя но в этот момент портятся значения переменных, ну а затем зависает. Всё вроде делаю как написано в их примерах но нифига не выходит, может кто сталкивался или есть идеи как с этим бороться подскажите, пжлста!
Версия MicroStation 08.05.02.27 |
|
Вернуться к началу |
|
|
Leonid давно здесь сидим
Зарегистрирован: 28.01.2006 Сообщения: 598 Откуда: С.-Петербург
|
Добавлено: Ср Янв 17, 2007 3:20 pm Заголовок сообщения: |
|
|
В восьмерке имена слоев идут в юникоде, на каждый символ там два байта, поэтому со стрингами надо внимательней
Вот работающий код:
Код: |
MSWChar sLevelName[250];
ULong pLevelId;
mdlLevel_getActive (&pLevelId);
mdlLevel_getName(sLevelName, 250, mdlModelRef_getActive(), pLevelId);
|
|
|
Вернуться к началу |
|
|
Aleks
Зарегистрирован: 17.01.2007 Сообщения: 3 Откуда: СПб
|
Добавлено: Ср Янв 17, 2007 7:18 pm Заголовок сообщения: |
|
|
Цитата: |
В восьмерке имена слоев идут в юникоде, на каждый символ там два байта, поэтому со стрингами надо внимательней
Вот работающий код:
MSWChar sLevelName[250];
ULong pLevelId;
mdlLevel_getActive (&pLevelId);
mdlLevel_getName(sLevelName, 250, mdlModelRef_getActive(), pLevelId);
|
Такие строки я уже писал приводит к зависанию и System fault:5
Может это глюкозная версия MicroStation |
|
Вернуться к началу |
|
|
laggi
Зарегистрирован: 07.11.2006 Сообщения: 28 Откуда: WashDC
|
Добавлено: Чт Янв 18, 2007 1:21 am Заголовок сообщения: |
|
|
MS v08.05.02.35
Всё работает.
Попробуй скомпилить отдельную ma-ку только с чтением level name и посмотри будет падать или нет.
Есть подозрение что ты где-то память перепахиваешь. |
|
Вернуться к началу |
|
|
Aleks
Зарегистрирован: 17.01.2007 Сообщения: 3 Откуда: СПб
|
Добавлено: Пт Янв 19, 2007 12:25 am Заголовок сообщения: |
|
|
Цитата: | Попробуй скомпилить отдельную ma-ку только с чтением level name и посмотри будет падать или нет.
Есть подозрение что ты где-то память перепахиваешь. |
Пробовал, не помогает.
Вот тект mc
Код: |
#include <leveltable.fdf>
#include <msdialog.fdf>
#include <mssystem.fdf>
#include <stdio.h>
#include <cmdlist.h>
Public int main
(
int argc, /* => Number of arguments passed in argv */
char *argv[] /* => Array of pointers to arguments */
)
{
ULong levelCode,i;
MSWChar levelName[512];
i=1;
if (mdlLevel_getCode (&levelCode,NULL,i)==SUCCESS)
if(mdlLevel_getName (levelName, sizeof (levelName),NULL,i)==SUCCESS)
printf("-- Level ID %d - Code: %d, Name: %S --\n",i,levelCode,levelName);
mdlDialog_cmdNumberQueue (FALSE, CMD_MDL_UNLOAD,mdlSystem_getCurrTaskID(), TRUE);
return TRUE;
}
|
Слой с ID=1 точно есть, если получаешь только код, то всё ОК, а имя программа вылетает. Это точно ошибки в памяти, но с какого фига?
На двух машинах пробовал - одна фигня, на одной XP Home Rus, на другой Win2000 Prof. Eng.
А где можно взять MS v08.05.02.35 ? |
|
Вернуться к началу |
|
|
vikk
Зарегистрирован: 13.09.2006 Сообщения: 88
|
Добавлено: Пт Янв 19, 2007 10:03 am Заголовок сообщения: |
|
|
fault 5 - однозначно затирание памяти.
В приведенном коде сразу видны три ошибки.
levelCode - нигде не используется
sizeof (levelName) != 512
функция printf в качестве последнего параметра ожидает текстовую строку, а не строку типа MSWChar
Должно быть что-то вроде этого:
Код: |
void XXX(void)
{
ULong levelCode,i;
MSWChar levelName[512];
char strLvlName[512];
char strMessage[512+64];
i=1;
if (mdlLevel_getCode (&levelCode,mdlModelRef_getActive(),i)==SUCCESS)
{
if (mdlLevel_getName(levelName, 512,mdlModelRef_getActive(),levelCode)==SUCCESS)
{
mdlCnv_convertUnicodeToMultibyte (levelName, -1,strLvlName, 512);
sprintf (strMessage, "Level Name is: %s\n", strLvlName);
mdlDialog_dmsgsPrint (strMessage);
}
}
}
|
!!!!!!
Функции типа mdlCnv_convertUnicodeToMultibyte() с русскима буквами плохо работают, к сожалению, поэтому придется писать свою. |
|
Вернуться к началу |
|
|
laggi
Зарегистрирован: 07.11.2006 Сообщения: 28 Откуда: WashDC
|
Добавлено: Пт Янв 19, 2007 7:16 pm Заголовок сообщения: |
|
|
Aleks писал(а): |
Слой с ID=1 точно есть, если получаешь только код, то всё ОК, а имя программа вылетает. Это точно ошибки в памяти, но с какого фига?
|
у тебя:
MSWChar levelName[512];
но:
sizeof (levelName) что на самом деле = 1024 (байта). Размер же тут предполагается не в байтах, но в 2х байтовых словах.
mdlLevel_getName перез записью имени чистит levelName (target) нулями, затирая соответсвенно что там у тебя дальше лежит на 1024 байт.
Ну и printf не берет MSWChar (как тебе уже сказали). Каждый символ в MSWChar - это два байта. Для английского это: первый байт - буква, второй байт - ноль.
Aleks писал(а): | А где можно взять MS v08.05.02.35 ? |
В принципе оно лежит у бентлей на сайте. Единственно я не знаю какой уровень доступа нужен чтобы взять. |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
Powered by phpBB © 2001, 2005 phpBB Group
|