Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];

Вниз

Не работает 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.006 c
3-72675
Шурик Ш
2003-12-25 13:17
2004.01.23
Создание таблицы в TADOQuery


7-72965
Ngobo
2003-10-28 16:15
2004.01.23
Как из Дельфи можно отключить Primary IDE Channel


1-72712
Yura
2004-01-09 15:41
2004.01.23
Web-сервис


11-72697
Boguslaw
2003-05-07 22:57
2004.01.23
How to implement smooth scrolling in TKOLMemo ?


4-72981
Dimaxx
2003-11-15 13:30
2004.01.23
DeviceIOControl + IOCTL_Disk_Format_Tracks_Ex





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский