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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Char To Unicode (C function)  (Прочитано 56340 раз)
0 Пользователей и 1 Гость смотрят эту тему.
npak
Команда клуба

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

« Ответ #30 : 19-01-2007 10:44 » 

Тебе не нужно пользоваться sizeofU, а надо пользоваться обычным sizeof.   sizeofU(SAP_UC *) в случае юникода даст тебе sizeofR(SAP_UC *)/sizeofR(SAP_UC), что далее разворачивается в sizeof(SAP_UC*)/sizeof(SAP_UC) == sizeof(SAP_UC*)/2.  То есть если argc==2, то будет выделена память не под два указателя, а только под один.  Первый указатель внешняя функция успешно скушает, а на втором подавится.
Записан

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

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #31 : 19-01-2007 11:28 » new

npak,

не совсем поняла, почему это так Ага, но попробовала Ага не помогло...
Хотя перед вызовом функции весь массив argv выглядит до неприличия здоровым! Т.е. все элементы правильно заполнены, память никуда не сдвинулась...
И что им не так, не знаю...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

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

« Ответ #32 : 19-01-2007 13:29 » 

Предлагаю внести несколько изменений.  Во-первых, при инциализации массивов пользоваться функцией calloc - так проще сразу по двум причинам: (1) явно указывается размер элементов и (2) автоматически обнуляется память.
Во-вторых, обеспечить ноль в конце каждой строки: mbstowcs не обязана строить строки с нулевым окончанием.
В-третьих, сделай argv на 1 больше и поставь в качестве последней строки NULL - стандарт POSIX требует, чтобы argv заканчивался такой строкой.

я попробовал твой пример (с такими изменениями) на Linux, и получилось вот что:
Код:
#include <wchar.h>
#include <stdlib.h>

//  SAP_UC - typedef,   wchar_t/char
    // #ifdef UNICODE (  unicode- RFC-)
    //    ..U
    //     :
typedef wchar_t SAP_UC;
#define CHAR_COUNT 25

int  main(int argc, char ** argv1)
{
    SAP_UC **argv = NULL;
    size_t argv_len = argc+1;
    size_t str_len = CHAR_COUNT + 1;

    argv = calloc(argv_len, sizeof(SAP_UC*));
    if (argv)
    {
        int count;
        for (count=0;count<argc;count++)
        {
            argv[count] = calloc(str_len, sizeof(SAP_UC));

            if (argv[count])
            {
                int res;
                memset( argv[count], 0, CHAR_COUNT * sizeof(SAP_UC) );

                printf("converting argv[%d] (%s) ...", count, argv1[count]);
                res = mbstowcs(argv[count], argv1[count], CHAR_COUNT);
                printf(" result %d\n", res);
            }
        }
        argv[argc] = NULL;
        for (count=0;count<argc;count++)
        {
            int pos;
            printf("argv[%d]: ", count);
            for (pos = 0; pos < str_len; pos ++)
            {
                printf("0x%04x ", argv[count][pos]);
            }
            printf("\n");
        }
    }
    return 0;
}
и вывод:
Код:
./some.exe -a DLG_TEST -g sap1 -x sapgw00
converting argv[0] (./some.exe) ... result 10
converting argv[1] (-a) ... result 2
converting argv[2] (DLG_TEST) ... result 8
converting argv[3] (-g) ... result 2
converting argv[4] (sap1) ... result 4
converting argv[5] (-x) ... result 2
converting argv[6] (sapgw00) ... result 7
argv[0]: 0x002e 0x002f 0x0073 0x006f 0x006d 0x0065 0x002e 0x0065 0x0078 0x0065 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[1]: 0x002d 0x0061 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[2]: 0x0044 0x004c 0x0047 0x005f 0x0054 0x0045 0x0053 0x0054 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[3]: 0x002d 0x0067 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[4]: 0x0073 0x0061 0x0070 0x0031 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[5]: 0x002d 0x0078 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
argv[6]: 0x0073 0x0061 0x0070 0x0067 0x0077 0x0030 0x0030 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000
Записан

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

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #33 : 19-01-2007 13:45 » 

npak,

спасибочки!!!!  Улыбаюсь Проблема была именно в последнем элементе массива, т.к. он не был обнулен! Я как-то вообще в этом направлении не думала, я искала ошибки в обнулениях, копированиях и т.д., а о том, что сам массив незакончен, вообще не подумала.  Скромно так...

Еще раз спасибо всем за помощь и терпение!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

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

« Ответ #34 : 19-01-2007 15:01 » 

Рад был помочь Улыбаюсь
Записан

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

http://www.unitesk.com/ru/
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines