Не присваивается значение элементу массива Lpwstr

Тема в разделе "Общие вопросы по С и С++", создана пользователем Tolias, 24 июн 2011.

  1. Tolias

    Tolias Гость

    Есть кусок кода некоторой программы на C++

    Код (Text):
        LPWSTR dir;
    GetModuleFileName(NULL, dir, 300);
    //dir[3]='!';
    int i, j=0;
    for(i=0;dir[i]!='\0';i++)
    if(dir[i]=='\\')
    j=i;
    dir[j]='\0';
    j++;
    Пишу в Visual Studio 2010.
    Вопрос такой: Почему строка dir[j]='\0'; игнорируется и не выполняется как будто в коде ее вообще нет?
    Вот поставил я брекпоинты на всех строках этого кода, запустил, и брекпоинт со строки "dir[j]='\0';" исчезает! И когда программа выполняется, то эту строку вообще пропускает, как будто там ничего нет.

    В коде, что я привел выше, вы видите третью строку закоментированной. Если ее раскоментировать, то эта строчка выполнится без проблем. Но как только ее поместить ниже цикла, так тут же она игнорируется! :confused:
    Я вообще не въежаю, как объяснить такое странное поведение?? Объясните пожалуйста, а то у меня от этого странного поведения уже мозг кипит.


    P.S. Сама задача этого кода в следующем: получить полный путь к текущей программе и отбросить в пути имя программы, оставив таким образом только путь к папке программы.
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Ты думаешь память для dir функция выделит? Меняй на wchar_t dir[300];

    Добавлено: Да еще, ты с Unicode работаешь? Если да то ты не можешь сравнивать элемента массива в стиле if(dir=='\\') и т.п.
     
  3. Tolias

    Tolias Гость

    Признаюсь, я в самом начале память под dir выделял, но тогда компилятор ругался на невозможность преобразования:
    потому я искусился объявить просто указатель, довольствовашись тем, что компилятор молча компилирует и не ругается.

    Спасибо за работающий пример) Но я все же более посматриваю на свой алгоритм, так как он по идее должен быть быстрее. Там не подсчитывается длина массива(а это уже нету лишнего прохода по массиву). Проход осуществляется лишь один раз в цикле, где там же вычисляется последний слеш.

    Upd:
    Выделил память под dir, но строка dir[j]='\0'; всеравно не исполняется(( Почему?
     
  4. Tolias

    Tolias Гость

    А проблема то оказалась в том, что я все эти отладки и правки кода делал в релиз, а не в дебаг! Элементарно то как... Никогда не думал, что при отладке в релизе могут быть такие приколы. Теперь буду знать.
     
  5. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Потому что это Unicode.

    Ой как ты заблуждаешься........
     
  6. Tolias

    Tolias Гость

    ага, только тогда получается Visual Studio тоже заблуждается :ya_lamo:
     
  7. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Ты зря улыбаешься. Ты вообще в курсе что в Unicode один символ имеет размер два байта? А ты пишешь то, что по определению работать не должно.
    Например это - for(i=0;dir!='\0';i++) для строки Unicode недопустимо.
    Желаю удачи :ya_lamo:
     
  8. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    Ну-ну. Компилятор её просто выкинул, потому что она "не правильная". Новое слово в компиляторописании :))
    Более того, он вполне себе правильная - char кастится до wchar_t. Для символов ASCII это будет правильно.

    Скорее всего компилятор выбросил dir[j]='\0', поскольку dir больше нигде не используется. У меня правда это не повторяется, видимо другое окружение кода, зато выбрасывает последнюю строку j++.
     
  9. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    А почему ты решил что
    ?
    Что ты хотел сказать своим комментарием вообще не понятно.
     
  10. a0z

    a0z Well-Known Member

    Регистрация:
    15 мар 2011
    Сообщения:
    109
    Симпатии:
    0
    Если прочитать предложение полностью, то оно становится вполне понятным:

    Скорее всего компилятор выбросил dir[j]='\0', поскольку dir больше нигде не используется.

    Выделеное - ответ на вопрос, почему на эту строку не попадает дебагер и не может поставить бряку.
     
Загрузка...

Поделиться этой страницей