Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: на этот раз массив wchar_t* и структура  (Прочитано 7025 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mitia
Гость
« : 31-08-2005 11:26 » 

Вот создал глобально

struct generalInfo
{
   const wchar_t * model_name[15];
   const wchar_t * model_path[15];
   const wchar_t * model_pic[15];
   //int monster_num[15];
   
   char * level_path[15];
};

extern generalInfo gnrlNfo;

В проге в отдельной функции парсирую XML и вывожу:
for(...
gnrlNfo.model_name[ci]   = xml_m->getAttributeValue(L"model_name");
 printf("Names:\t\t<%S>\n", gnrlNfo.model_name[ci]);   

Выводит все отлично. Кстати, как через cout вывести, если без преобразований дополнительных?


А еще дальше в самой программе:
printf("%s", gnrlNfo.model_name[2]); уже ничего не выводит. Почему?



+  все ли тут грамотно?
char    *pmbbuf1[15];
wcstombs( pmbbuf1[1], gnrlNfo.model_path[1], sizeof(gnrlNfo.model_path[1]+1) );



Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 31-08-2005 12:07 » 

Не выводит, потому что во втором printf стоит "%s" -- вывод ASCII строк.  ТАк как в массиве хранятся юникодные строки, то они состоят из двухбайтных последовательностей.  В твоих строках первый символ строки -- латинский, в юникоде он начинается с нулевого байта.  При печати как ASCII этот байт воспринимается как конец строки и ничего не выводится.

Для вывода Unicode надо заменить на "%S"

На второй вопрос -- нет, не грамотно.  sizeof(gnrlNfo.model_path[1]+1) даст 4 на 32-х разрядном процессоре.  Именно: gnrlNfo.model_path имеет тип (упрощённо, отвлекаясь от const и массива) wchar_t **, gnrlNfo.model_path[1] имеет тип wchar_t *, gnrlNfo.model_path[1] + 1 тоже имеет тип wchar_t *.  Размер указателя равен 4.

Так как ты хочешь скопировать строку, то тебе надо определить её длину при помощи wcslen.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Mitia
Гость
« Ответ #2 : 31-08-2005 12:45 » 

поменял на %S - все равно ничего.

Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 31-08-2005 13:06 » 

Проверь, что тебе возрашает xml_m->getAttributeValue(L"model_name"); на каждом шаге цикла. Если один и тот же адрес, тогда понятно. Не может быть такого, чтобы в одном месте проги выводился результат нормально, а в другом нет. Но это при условии, если нет шаловливых ручек.
« Последнее редактирование: 31-08-2005 13:08 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 31-08-2005 14:17 » 

Есть ещё одна возможная засада.  Что возвращает getAttributeValue -- указатель на свой внутренний буфер или свежую (т.е. специально аллоцированную) строку?

Есть подозрение, что возвращается указатель на внутренний буфер, содержимое которого обновляется после каждого вызова getAttributeValue.  В таком случае все gnrlNfo.model_name[ci] равны (один и тот же указатель), последний вызов getAttributeValue вернул пустую строку, и все gnrlNfo.model_name[ci] пусты.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Mitia
Гость
« Ответ #5 : 31-08-2005 16:14 » 

Есть подозрение, что возвращается указатель на внутренний буфер, содержимое которого обновляется после каждого вызова getAttributeValue. В таком случае все gnrlNfo.model_name[ci] равны (один и тот же указатель), последний вызов getAttributeValue вернул пустую строку, и все gnrlNfo.model_name[ci] пусты.

эээ, как это равны??? Я же создал массив указателей и к каждому указателю присвоил свое значение.  Но при дебаге точкно адреса одинаковые в большинстве своем.... - картинку как-нить закину.
А че делать,  коли так ? Улыбаюсь
Записан
Mitia
Гость
« Ответ #6 : 31-08-2005 17:49 » 

вот и картинка, 84 кб

http://tempo.hut1.ru/crash.png
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 31-08-2005 18:33 » 

Все действия очень просты.
1. Узнаеш длину строки.   
2. С помошью оператора New выделяеш память под строку и присваиваеш указатель твоей переменной.
3. Копируеш строку.
Теперь у тебя есть свой собственный экземпляр строки не зависимый от класса xml_m. Эти все действия можно свести в одну функцию, и использовать ее уже.

Код:
wchar_t *CopyLine(wchar_t *wc)
{
int len=wcslen(wc);
wchar_t *res=new wchar_t[len+1];
res=wcscpy(res,wc);
return res;
}

Ее использование в твоей программе:
Код:
gnrlNfo.model_name[ci]   = CopyLine(xml_m->getAttributeValue(L"model_name"));

Да кстати, когда тебе уже не будет нужна строка, чтобы не было утечек памяти, не забудь удалить при помоши оператора delete []
« Последнее редактирование: 31-08-2005 19:24 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Mitia
Гость
« Ответ #8 : 01-09-2005 06:18 » 

Работает.
Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines