Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2011, 08:46   #1
Tolias
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 41
По умолчанию Не присваивается значение элементу массива LPWSTR

Есть кусок кода некоторой программы на C++
PHP код:
    LPWSTR dir;
    
GetModuleFileName(NULLdir300);
    
//dir[3]='!';
    
int ij=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. Сама задача этого кода в следующем: получить полный путь к текущей программе и отбросить в пути имя программы, оставив таким образом только путь к папке программы.
Tolias вне форума Ответить с цитированием
Старый 24.06.2011, 09:40   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а компилятор умнее вас оказался

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

да и алгоритм не верен.(у вас либо нулевой символ обнулите, либо первый)
Код:
LPWSTR FileName; 
wchar_t dir[301];
dir[300]=0;//на всякий, привычка
GetModuleFileName(NULL, dir, 300);
int l=wcslen(dir);//или же lstrlenW
FileName=dir;
for(int i=l-1;i>=0;i--)if(dir[i]=='\\')
{
    FileName=dir;
    break;
}
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.06.2011, 16:05   #3
Tolias
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 41
По умолчанию

Цитата:
у вас нет памяти, выделеной для dir, указатель висит.
вот компилятор и убирает лишнее по его мнению.
Каюсь... Признаюсь, я в самом начале память под dir выделял, но тогда компилятор ругался на невозможность преобразования:
Цитата:
IntelliSense: argument of type "LPWSTR *" is incompatible with parameter of type "LPWSTR"
потому я искусился объявить просто указатель, довольствовашись тем, что компилятор молча компилирует и не ругается.

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

Upd:
Выделил память под dir, но строка dir[j]='\0'; всеравно не исполняется(( Почему?
Tolias вне форума Ответить с цитированием
Старый 24.06.2011, 17:54   #4
Tolias
Пользователь
 
Регистрация: 18.08.2010
Сообщений: 41
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обращение к предыдущему/следующему элементу массива feras Общие вопросы Delphi 1 08.06.2011 21:29
Не присваивается значение указателю в C++ Builder DaysOfGrace Помощь студентам 3 03.03.2011 18:17
нужно организовать обращение к элементу массива в классе! unsurpassed Помощь студентам 0 13.01.2011 11:53
Массиву класса не присваивается значения локального массива MoroZzz45 Общие вопросы C/C++ 7 06.06.2010 14:42
Получить массив B, присвоив его k-му элементу значение 0, если все элементы [Pascal] М@лышка Помощь студентам 10 12.10.2009 23:29