Форум программистов, компьютерный форум CyberForum.ru

Не присваивается значение элементу массива LPWSTR - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Tolias28
202 / 117 / 2
Регистрация: 18.08.2010
Сообщений: 1,006
24.06.2011, 08:33     Не присваивается значение элементу массива LPWSTR #1
Есть кусок кода некоторой программы на C++
PHP
1
2
3
4
5
6
7
8
9
    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';" исчезает! И когда программа выполняется, то эту строку вообще пропускает, как будто там ничего нет.

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


P.S. Сама задача этого кода в следующем: получить полный путь к текущей программе и отбросить в пути имя программы, оставив таким образом только путь к папке программы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2011, 08:33     Не присваивается значение элементу массива LPWSTR
Посмотрите здесь:

Найти количество элементов в этих массива равных первому элементу массива S C++
C++ значение типа "char *" нельзя присвоить сущности типа "LPWSTR"
Неправильно присваивается значение массиву C++
Почему переменной присваивается произвольное значение("мусор")? C++
C++ Как назначить элементу коплексного массива определенное значение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
24.06.2011, 09:05     Не присваивается значение элементу массива LPWSTR #2
LPWSTR dir; у тебя пустой указатель куда по твоему будет записываться имя файла

C++
1
2
3
wchar_t  dir[255];
memset(dir, 0, sizeof(dir));
GetModuleFileName(NULL, dir, sizeof(dir));
Bers
Заблокирован
24.06.2011, 10:07     Не присваивается значение элементу массива LPWSTR #3
Tolias28,

Ваша главная ошибка - ужасный стиль написания кода. Если бы вы побольше внимания уделили стилю - вы бы не допустили ни "не_инициализированных указателей", ни "указателей, ссылающихся не_туда".

В вашем случае - неправомерная попытка записать по указателю данные.
правильнее было бы записать вот так:

WCHAR dir[256];
GetModuleFileName(NULL, dir, sizeof(dir));


А вот что делается в вашем цикле вообще не понятно.
Вы сами то хоть понимаете что делает этот код?

Я думаю, если бы вы потрудились поставить фигурные скобки где нужно, и соблюсти отступы - код стало бы очень легко читать. Соответственно меньше вероятности ошибок.

Добавлено через 22 минуты
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main (void)
{
    SetConsole(); using namespace std;    cout << "Привет!!!!"<<endl;
 
    WCHAR dir[256]; 
    GetModuleFileName(NULL, dir, sizeof(dir)); //dir теперь содержит полный путь к запускному файлу
   
    int Len;
    for(Len=0; dir[Len]!='\0'; Len++) {}  //выясняем длину dir
    for(; dir[Len]!='\\'; Len--) {} //начнём шагать с конца строки к началу, пока не отшагаем все имя файла
 
    //данные в массиве с dir[0] по dir[Len] - это как раз полный путь, только без имени файла.ехе
 
    return;
}
 Комментарий модератора 
Используйте теги форматирования кода!
Tolias28
202 / 117 / 2
Регистрация: 18.08.2010
Сообщений: 1,006
24.06.2011, 16:09  [ТС]     Не присваивается значение элементу массива LPWSTR #4
Признаюсь, я в самом начале память под dir выделял, но тогда компилятор ругался на невозможность преобразования:
IntelliSense: argument of type "LPWSTR *" is incompatible with parameter of type "LPWSTR"
потому я искусился объявить просто указатель, довольствовашись тем, что компилятор молча компилирует и не ругается.

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

Upd:
Выделил память под dir, но строка dir[j]='\0'; всеравно не исполняется(( Почему?
Bers
Заблокирован
24.06.2011, 16:53     Не присваивается значение элементу массива LPWSTR #5
Цитата Сообщение от Tolias28 Посмотреть сообщение
Признаюсь, я в самом начале память под dir выделял, но тогда компилятор ругался на невозможность преобразования:

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

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

Upd:
Выделил память под dir, но строка dir[j]='\0'; всеравно не исполняется(( Почему?
Можно и не вычислять длину строки. А просто с конца на начало бежать до первого слеша. Но так будит дольше.

Что касается вашего алгоритма - я его не понял. И даже не вникал.Расставьте фигурные скобки, и сделайте отступы. Читать ТАКОЙ код просто не хочется.

У вас в цикле заложено условие. Где заканчивается тело цикла?
Почему такая не очевидная запись?

Ничего удивительно, что она у вас не работает. Это - спагетти код. Очень скверная штука.
Сделайте по человечески, и сразу станет все ясно и понятно. Что происходит в этом коде, и почему он не работает, и что нужно что б заработал.


Что касается пошаговой отладки - возможно ваша версия продукта выставлена как релиз. Возможно, просто компилятор оптимизировал код, по выбрасывал из него половину всякой шняги, а оставшуюся - оптимизировал.

Релизную версию продукта брек-поинтами не отлаживают. Переключитесь на дебаг.
Tolias28
202 / 117 / 2
Регистрация: 18.08.2010
Сообщений: 1,006
24.06.2011, 17:54  [ТС]     Не присваивается значение элементу массива LPWSTR #6
Что касается пошаговой отладки - возможно ваша версия продукта выставлена как релиз. Возможно, просто компилятор оптимизировал код, по выбрасывал из него половину всякой шняги, а оставшуюся - оптимизировал.

Релизную версию продукта брек-поинтами не отлаживают. Переключитесь на дебаг.
Вот в чем она вся засада!!! А я же еще вчера переключился на релиз, но потом обнаружил некоторые ошибки и снова полез в среду и отладку исправлять, забыв перевести обратно в дебаг. Не думал, что это так может оказаться принципиально... Спасибо за ваш ответ, который на 100% известил корень проблемы. Сейчас все норм пашет. И кстати без скобок, за которые вы усиленно просили поставить

Цитата Сообщение от Bers Посмотреть сообщение
Расставьте фигурные скобки, и сделайте отступы. Читать ТАКОЙ код просто не хочется.
По правилам написания кода можно скобки упускать, если в теле выполняется только одна операция. И это ведь дело вкуса. Верно? Кто хочет, тот скобки и ставит. А я же предпочитаю их не ставить, если в цикле/условии содержится только одна операция. И чего же там непонятного без скобок. А сдвиги то придуманы для чего. Скажу по себе - мне читать одинаково удобно и з скобками, и без них, если там одна операция в теле.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2011, 18:58     Не присваивается значение элементу массива LPWSTR
Еще ссылки по теме:

Подскажите, почему значению функции присваивается true? Что сделать чтобы передавалось значение? C++
C++ Что быстрее? Обращение к элементу массива или к элементу структуры?
Строка string. Не присваивается новое значение C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
24.06.2011, 18:58     Не присваивается значение элементу массива LPWSTR #7
Цитата Сообщение от Tolias28 Посмотреть сообщение

По правилам написания кода можно скобки упускать, если в теле выполняется только одна операция. И это ведь дело вкуса. Верно? Кто хочет, тот скобки и ставит. А я же предпочитаю их не ставить, если в цикле/условии содержится только одна операция. И чего же там непонятного без скобок. А сдвиги то придуманы для чего. Скажу по себе - мне читать одинаково удобно и з скобками, и без них, если там одна операция в теле.
В этом "деле вкуса" чаше всего ошибки семантические находятся.

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

У вас блок цикла включает в себя блок ветвления. Это не просто одна операция, это блок в блоке, и ни одной скобки.
Куда прыгнет следующий шаг программы после true? А после false?
Сразу не очевидно. А если что-то не в порядке, то первое что вызывает подозрение - это самые непонятные места в коде (тем более в чужом). И вот такие места подвергаются перепроверке. Нужно убедится что после true программа окажется именно там, где ожидается, и именно так, как ожидается....

Время, которое могло бы быть потрачено на поиски ошибки, уходит только на то, что бы понять, что вообще происходит в программе. Это - пример некачественного кода, небрежного отношения к себе, и неуважение к товарищам.

Можно записать с++; а можно c=c+1;

Вот компилятору абсолютно пофегу, он все равно любые такие записи ещё может десять раз оптимизировать.

А человеку? Как легче читается?

А что происходит в этой строчке? c = a--+1;
Вот за такую запись нужно бить по рукам. Это - мина замедленного действия.
В соседней теме человек такую запись родил только для того, что бы сэкономить несколько символов текста. А впереццо можно так, что потом несколько суток из отладчика не вылезешь.
Yandex
Объявления
24.06.2011, 18:58     Не присваивается значение элементу массива LPWSTR
Ответ Создать тему
Опции темы

Текущее время: 17:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru