Ошибки Microsoft'а!!!
Нашёл такую ошибку:
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
А вот во втором случае поведение компилятора совершенно правильно. Оператор доступа по индексу имеет более высокий приоритет, чем оператор разыменовывания, т.е. в
*str[*dwIndex]
оператор [] применяется к str, а не *str.
Например, вас же не удивляет, что в
*str++
инкрементироваться будет сам указатель str, а не то, на что он указывает?
Проблема решается элементарно (*str)[*dwIndex].
Так что не надо на нашу любимую Студию наезжать на танке :)
Цитата:
Originally posted by srd
Про первый случай ничего сказать не могу - в асме я не силен. Хотя могу предположить, что виновата неудачная реализация менеджера кучи, раз она зависит от значения флага DF. Это скорее фича, а не баг.
Про первый случай ничего сказать не могу - в асме я не силен. Хотя могу предположить, что виновата неудачная реализация менеджера кучи, раз она зависит от значения флага DF. Это скорее фича, а не баг.
Нифига себе фича - столько нервово мне измотала!!!
Цитата:
Originally posted by srd
Так что не надо на нашу любимую Студию наезжать на танке :)
Так что не надо на нашу любимую Студию наезжать на танке :)
А второй случай звучал вообщет-то как вопрос, а не как наезд, темболее на танке!!! Мне студия очень даже нравится!!!