Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.23;
Скачать: CL | DM;

Вниз

Не работает AnsiStrUpper почему???   Найти похожие ветки 

 
LinkFly ©   (2004-01-10 03:01) [0]

Не работает AnsiStrUpper почему??? Вызывает EAccessViolation


 
Andy BitOff ©   (2004-01-10 03:08) [1]

У тебя ошибка в 17 строке.


 
REP ©   (2004-01-10 08:38) [2]

А AnsiUpperCase работает?


 
LinkFly ©   (2004-01-11 02:01) [3]

>REP
AnsiUpperCase - работает.

AnsiStrUpper в Delphi 6 не работает не только у меня. А в 7-ой кстати всё ОК
> Andy BitOff
Да нормальный код:
var p:pchar;
begin
p:="rty";
AnsiStrUpper(p);
end;
Вызывает нарушение доступа к памяти


 
VMcL ©   (2004-01-11 02:32) [4]

>> LinkFly © (11.01.04 02:01) [3]
>> Да нормальный код:

Неужели? Точно уверен, что нормальный?

AnsiStrUpper преобразовывает строку in-place, т. е. поверх исходной строки. Поскольку переменной p присвоено константное значение, то оно, вероятно, находится в области памяти, не имеющей доступа на запись => AV.

P.S. За такой код "расстреливать" надо.


 
Andy BitOff ©   (2004-01-11 02:57) [5]

ВОТ!!! Человек тебе хоть доступно объяснил (McL © (11.01.04 02:32) [4]). Но если ты все-таки настаиваешь, можешь посмотреть, что я тебе тут написал. Вот ТУТ все работает.
var p:pchar;
i:integer;
s:Pointer;
begin
p:="abcd";
i:=Length(p)+1;
s:=AllocMem(i);
asm
push edi
push esi
mov esi,[p]
mov edi,[s]
mov ecx,i
push edi
repne movsb
call CharUpper
pop esi
pop edi
end;
p:=s;
FreeMem(s);

И вот тут твое Р и получается UpperCase.


 
Andy BitOff ©   (2004-01-11 03:02) [6]

Да, некоторые пояснения, call CharUpper это потому, что AnsiStrUpper просто вызывает эту виндовую функцию, а я прямо к ней.


 
Германн ©   (2004-01-11 03:37) [7]

2 VMcL © (11.01.04 02:32) [4]
> За такой код "расстреливать" надо.

Ты уверен, что надо "расстреливать"?
Ведь в хелпе про AnsiStrUpper ничего не сказано про "in-place"! А что бы узнать про "CharUpper" нужно много копать, при том, что изначально нет никакой очевидной необходимости в копании.


 
Andy BitOff ©   (2004-01-11 03:50) [8]

Ну это он конечно погорячился, но ведь ясно, как божий день, что если ошибка доступа к памяти, то к памяти нельзя доступиться (во как!). А в справке по AnsiStrUpper написано; "The conversion uses the current locale." Насколько я могу понять (со своим знанием ангельского) здесь говориться о том, строка конвентируется на месте, а в справке по CharUpper написано;"If the operand is a character string, the function converts the characters in place.", что соответствует примерно тому же. За сим становиться ясно, что утверждение выдвинутое VMcL © (11.01.04 02:32) [4], как нельзя полно описывает создавшуюся ситуацию. Оставалось только подумать и обойти это ограничение, хотя на мой взгляд, нечего париться и надо использовать AnsiUpperCase.

P.S. А с "расстреливать", это он погорячился.


 
VMcL ©   (2004-01-11 03:51) [9]

>>Германн © (11.01.04 03:37) [7]

function AnsiStrUpper(Str: PChar): PChar;

Поскольку не написано, что функция выделяет сама память для хранения результата (Result), значит она может использовать только переданные параметры, а он всего один, и то по значению - адрес null-terminated строки. Вывод: изменяется строка, адрес которой мы передаем (Str).


 
VMcL ©   (2004-01-11 03:54) [10]

>> Andy BitOff © (11.01.04 03:50) [8]
>>The conversion uses the current locale.

Это не то. Это значит, что используются текущие ригиональные настройки ОС, если не ошибаюсь.

>>А с "расстреливать", это он погорячился.

Не погорячился. Я специально слово в кавычки заключил. Имеется в виду расстреливать в Q3 или CS, например :))


 
Германн ©   (2004-01-11 04:17) [11]

2 VMcL © (11.01.04 03:51) [9]
>Поскольку не написано, что функция выделяет сама память для хранения результата (Result), значит ...

А ничего это не значит! Мы же говорим о хэлпе, а не об уголовном кодексе.

2 VMcL © (11.01.04 03:54) [10]
Но даже и в Q3 ты сумей попасть, а уж потом говори о расстреле! :)))


 
LinkFly ©   (2004-01-11 18:46) [12]

Всем спасибо! Осознал своё заблуждение относительно pchar.
Вопрос к Andy BitOff ©
Я конечно понимаю, что код asm лишь для пояснения принципа, на всё-таки - Почему при вызове процедуры AnsiStrUpper вершина стека не изменяется, а при вызове CharUpper изменяется?
Не понятно, тогда получается как использовать Asm. Вот например я ничего не знаю и рещаю использовать эти ф-ии через ассемблер. Кладу в стек необходимую информацию, потом параметры ф-ии, вызываю ф-ию и что потом делать? Как изменять вершину стека? Не включать же код опознавания влияния процедуры на вершину стека. Интересно было бы узнать твоё мнение на этот счёт.


 
LinkFly ©   (2004-01-11 18:54) [13]

Ну или там ещё чьё-нибудь:)


 
Anatoly Podgoretsky ©   (2004-01-11 19:03) [14]

LinkFly © (11.01.04 18:46) [12]
Разные соглашения об вызове


 
Andy BitOff ©   (2004-01-11 19:24) [15]

В общем Anatoly Podgoretsky © (11.01.04 19:03) [14] ответил как всегда правильно и как всегда лаконично =). За дополнительной информацией сюда: http://www.yandex.ru:80/yandsearch?text=%D1%EE%E3%EB%E0%F8%E5%ED%E8%FF+%EE+%E2%FB%E7%EE%E2%E5+%EF%F0%EE%F6%E5%E4%F3%F0&n umdoc=100


 
Anatoly Podgoretsky ©   (2004-01-11 19:32) [16]

Зачем так далеко, Дельфи справка Calling Convention


 
LinkFly ©   (2004-01-12 01:35) [17]

Большое всем спасибо! Разобрался на том уровне на котором хотел.



Страницы: 1 вся ветка

Текущий архив: 2004.01.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
1-72731
Islander
2004-01-11 20:41
2004.01.23
Ускорить работу с Ini-файлом.


3-72655
Алекса
2003-12-26 07:51
2004.01.23
Создание индексов в таблицах Dbase


1-72831
Lexer
2004-01-12 10:50
2004.01.23
Как добавить картинку в ячейку DBGrid?


1-72786
Марат
2004-01-13 11:29
2004.01.23
Button1Click


14-72908
RDA
2004-01-02 18:19
2004.01.23
Перешел на Delphi 6