Форум: "Основная";
Текущий архив: 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