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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Tolias28
205 / 120 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
#1

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

24.06.2011, 08:33. Просмотров 1062. Ответов 6
Метки нет (Все метки)

Есть кусок кода некоторой программы на 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 (C++):

Присваивается элементу массива всегда 0 - C++
Не понимаю почему элементам массива y присваивается постоянно 0...Метод Симпсона, пока программа на этйо стадии, уже все перепробовал... не...

Первому элементу массива присвоить значение второго - C++
Люди добрые, объясните мне где я туплю. Нашел программу, все работает как надо. #include <iostream> #include <stdio.h> #define N...

Как назначить элементу коплексного массива определенное значение - C++
#include <complex> std::complex<double>* in=new std::complex<double> ; //Чтобы установить только real нужно: in= 1; //Как установить...

Как задать каждому элементу массива значение по умолчанию? - C++
Например я знаю что void max(int t=9){//значение по умолчанию переменой t++; } А как такую штуку сделать для каждого елемента...

Присвоить элементу одномерного массива значение другого элемента - C++
Доброе время суток! За ранее благодарен, тому кто откликнется!!! Задача, головоломка! А кому раз плюнуть!!!:) Начало сделал, а...

Не получается присвоить значение элементу массива указателей типа char *a[3] - C++
В попытках разобраться с массивами, указателями, массивами указателей и т.п. написал вот такой код: int main() { char *a = {...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
xAtom
914 / 739 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
24.06.2011, 09:05 #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 #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
205 / 120 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
24.06.2011, 16:09  [ТС] #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 #5
Цитата Сообщение от Tolias28 Посмотреть сообщение
Признаюсь, я в самом начале память под dir выделял, но тогда компилятор ругался на невозможность преобразования:

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

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

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

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

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

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


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

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

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

Цитата Сообщение от Bers Посмотреть сообщение
Расставьте фигурные скобки, и сделайте отступы. Читать ТАКОЙ код просто не хочется.
По правилам написания кода можно скобки упускать, если в теле выполняется только одна операция. И это ведь дело вкуса. Верно? Кто хочет, тот скобки и ставит. А я же предпочитаю их не ставить, если в цикле/условии содержится только одна операция. И чего же там непонятного без скобок. А сдвиги то придуманы для чего. Скажу по себе - мне читать одинаково удобно и з скобками, и без них, если там одна операция в теле.
Bers
Заблокирован
24.06.2011, 18:58 #7
Цитата Сообщение от Tolias28 Посмотреть сообщение

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

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

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

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

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

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

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

А что происходит в этой строчке? c = a--+1;
Вот за такую запись нужно бить по рукам. Это - мина замедленного действия.
В соседней теме человек такую запись родил только для того, что бы сэкономить несколько символов текста. А впереццо можно так, что потом несколько суток из отладчика не вылезешь.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2011, 18:58
Привет! Вот еще темы с ответами:

Не присваивается значение переменной - C++
Привет всем форумчанам! :) Собственно само задание в прикрепленных изображениях. Независимо от того, какое бы я значение ни ввел,...

Неправильно присваивается значение массиву - C++
Неправильно присваивается значение массиву Вот код: #include &lt;iostream&gt; using namespace std; int main() { int n,p =...

Строка string. Не присваивается новое значение - C++
Есть строка: string str_in = &quot;A&quot;; Она используется в созданной мной функцией как один из аргументов: ...

Что быстрее? Обращение к элементу массива или к элементу структуры? - C++
Обращение к элементу массива или к элементу структуры? Экспериментирую с кодом и получается примерно одинаково. Что интересно, время на...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.06.2011, 18:58
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru