Список форумов Конференция САПР Bentley MicroStation Конференция САПР Bentley MicroStation
www.ustation.ru
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Ошибки при выполнении функции mdlLevel_getName

 
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Профессиональное
Предыдущая тема :: Следующая тема  
Автор Сообщение
Aleks



Зарегистрирован: 17.01.2007
Сообщения: 3
Откуда: СПб

СообщениеДобавлено: Ср Янв 17, 2007 1:56 pm    Заголовок сообщения: Ошибки при выполнении функции mdlLevel_getName Ответить с цитатой

Подскажите, плз! Sad
Занялся переписыванием приложений из под версии 7 для новой 8 и столкнулся с такой странной проблемой.
Хочу по LevelID определить его название, вызываю функцию mdlLevel_getName, компилируется всё нормально, но при выполнении или зависает или снимается приложения и пишет fault 5, или ещё бывает выдаёт имя но в этот момент портятся значения переменных, ну а затем зависает. Всё вроде делаю как написано в их примерах но нифига не выходит, может кто сталкивался или есть идеи как с этим бороться подскажите, пжлста! Sad
Версия 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);
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Aleks



Зарегистрирован: 17.01.2007
Сообщения: 3
Откуда: СПб

СообщениеДобавлено: Ср Янв 17, 2007 7:18 pm    Заголовок сообщения: Ответить с цитатой

Sad
Цитата:

В восьмерке имена слоев идут в юникоде, на каждый символ там два байта, поэтому со стрингами надо внимательней
Вот работающий код:

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 и посмотри будет падать или нет.
Есть подозрение что ты где-то память перепахиваешь.


Пробовал, не помогает.
Don't know
Вот тект 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
Сообщения: 87

СообщениеДобавлено: Пт Янв 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 ?


В принципе оно лежит у бентлей на сайте. Единственно я не знаю какой уровень доступа нужен чтобы взять.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Профессиональное Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group