Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибки Microsoft'а!!!

2.1K
23 февраля 2004 года
Stanky
48 / / 06.12.2003
Для всех кто юзает Visual Studio, особенно .NET просьба проверить!!!

Нашёл такую ошибку:
main()
{
__asm std
int *lpValue=new int [1];
}

Причём пробовал через malloc такая же фигня получается:-( - необрабатываемое исключение и всё тут!!!
Не буду рассказывать сколько было мата при поиске, а темболее, когда я это нашёл - эт здесь 2 строчки, а у меня 2000 было, причём грешить на студию даже мысли не было!!!

Эт только у меня или студия корявая?



И ещё:
typedef unsigned short int WORD;
typedef unsigned long int DWORD;
typedef WORD STRING;

#define UNICODE
#define TEXT(String) L##String

DWORD Proc(STRING **str, DWORD *dwIndex)
{
if (*str[*dwIndex]=='a')
return 0;
}

main()
{
DWORD dwIndex=3;
STRING *str=TEXT("qwerty");
Proc(&str, &dwIndex);
}

Долго не мог понять почему он не хочет правильно получить адрес по которому надо значение взять в итоге нашёл такое решение:
if (*(*str+*dwIndex)=='a')
return 0;

При первом варианте он работал как с массивом указателей на STRING'и!!!

Что меня больше всего в этой ситуации весилит, дык это то, что при компиляции строки STRING *str2=*str[*dwIndex]; компилятор радостно сообщит, что не может преобразовать STRING к STRING*, тоесть *str[*dwIndex] интерпретируется, как символ, но символ этот получается так, что сперва по индексу в массиве указателей он получает указатель на строку и первый символ этой строки и предоставляет!!!
А вот при втором варианте он сперва получает адрес начала строки и уже работает с индексом, как будто это индекс в строке, а не в массиве указателей (умножает его на 2, а не на 4)!!!
Это логика языка такая чтоли?

Полученные коды:
if (*str[*dwIndex]=='a')
mov eax,dword ptr [dwIndex]
mov ecx,dword ptr [eax]
mov edx,dword ptr [str]
mov eax,dword ptr [edx+ecx*4]
movzx ecx,word ptr [eax]
cmp ecx,61h

if (*(*str+*dwIndex)=='a')
mov eax,dword ptr [dwIndex]
mov ecx,dword ptr [eax]
mov edx,dword ptr [str]
mov eax,dword ptr [edx]
movzx ecx,word ptr [eax+ecx*2]
cmp ecx,61h
3.2K
23 февраля 2004 года
srd
50 / / 31.08.2003
Про первый случай ничего сказать не могу - в асме я не силен. Хотя могу предположить, что виновата неудачная реализация менеджера кучи, раз она зависит от значения флага DF. Это скорее фича, а не баг.

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

*str[*dwIndex]

оператор [] применяется к str, а не *str.
Например, вас же не удивляет, что в

*str++

инкрементироваться будет сам указатель str, а не то, на что он указывает?

Проблема решается элементарно (*str)[*dwIndex].

Так что не надо на нашу любимую Студию наезжать на танке :)
2.1K
23 февраля 2004 года
Stanky
48 / / 06.12.2003
Цитата:
Originally posted by srd
Про первый случай ничего сказать не могу - в асме я не силен. Хотя могу предположить, что виновата неудачная реализация менеджера кучи, раз она зависит от значения флага DF. Это скорее фича, а не баг.



Нифига себе фича - столько нервово мне измотала!!!



Цитата:
Originally posted by srd
Так что не надо на нашу любимую Студию наезжать на танке :)



А второй случай звучал вообщет-то как вопрос, а не как наезд, темболее на танке!!! Мне студия очень даже нравится!!!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог