Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2008, 15:31   #1
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию Директивы компиляции

Пишу на Delphi 7, однажды, зайдя в свой проект, обнаружил вот такой списочек директив компиляции
Код:
{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE GUI}
{$WARN SYMBOL_DEPRECATED ON}
{$WARN SYMBOL_LIBRARY ON}
{$WARN SYMBOL_PLATFORM ON}
{$WARN UNIT_LIBRARY ON}
{$WARN UNIT_PLATFORM ON}
{$WARN UNIT_DEPRECATED ON}
{$WARN HRESULT_COMPAT ON}
{$WARN HIDING_MEMBER ON}
{$WARN HIDDEN_VIRTUAL ON}
{$WARN GARBAGE ON}
{$WARN BOUNDS_ERROR ON}
{$WARN ZERO_NIL_COMPAT ON}
{$WARN STRING_CONST_TRUNCED ON}
{$WARN FOR_LOOP_VAR_VARPAR ON}
{$WARN TYPED_CONST_VARPAR ON}
{$WARN ASG_TO_TYPED_CONST ON}
{$WARN CASE_LABEL_RANGE ON}
{$WARN FOR_VARIABLE ON}
{$WARN CONSTRUCTING_ABSTRACT ON}
{$WARN COMPARISON_FALSE ON}
{$WARN COMPARISON_TRUE ON}
{$WARN COMPARING_SIGNED_UNSIGNED ON}
{$WARN COMBINING_SIGNED_UNSIGNED ON}
{$WARN UNSUPPORTED_CONSTRUCT ON}
{$WARN FILE_OPEN ON}
{$WARN FILE_OPEN_UNITSRC ON}
{$WARN BAD_GLOBAL_SYMBOL ON}
{$WARN DUPLICATE_CTOR_DTOR ON}
{$WARN INVALID_DIRECTIVE ON}
{$WARN PACKAGE_NO_LINK ON}
{$WARN PACKAGED_THREADVAR ON}
{$WARN IMPLICIT_IMPORT ON}
{$WARN HPPEMIT_IGNORED ON}
{$WARN NO_RETVAL ON}
{$WARN USE_BEFORE_DEF ON}
{$WARN FOR_LOOP_VAR_UNDEF ON}
{$WARN UNIT_NAME_MISMATCH ON}
{$WARN NO_CFG_FILE_FOUND ON}
{$WARN MESSAGE_DIRECTIVE ON}
{$WARN IMPLICIT_VARIANTS ON}
{$WARN UNICODE_TO_LOCALE ON}
{$WARN LOCALE_TO_UNICODE ON}
{$WARN IMAGEBASE_MULTIPLE ON}
{$WARN SUSPICIOUS_TYPECAST ON}
{$WARN PRIVATE_PROPACCESSOR ON}
{$WARN UNSAFE_TYPE OFF}
{$WARN UNSAFE_CODE OFF}
{$WARN UNSAFE_CAST OFF}
Решил не убирать, коли сама дельфа сгенерила, но недавно столкнулся с интересной проблемой:
Передаваемая в процедуру

Код:
function TForm1.Hash(s: string): string;
begin
result:='';
len:=length(s);
data:=len;
if not CryptEncrypt(key,0,true,0,PByte(s),@data,len) then
\\\контекст уже открыт, и хэш создан в глобальных переменных
\\\функциями CryptoApi из wcrypt2.pas
begin 
 result:=#10#13; \\\типа код ошибки
 exit;
end;
result:=s;
end;
строка менялалась после попадания, то есть результат функции после
ее выполнения совпадал с передаваемым значением
после этого я написал так

Код:
function TForm1.Hash(const s: string): string;
не помогло, создал глобальную переменную-буфер, через которую передавал строку
в функцию, после функции менялись обе:и буфер и оригинал
вот так

Код:
.....
temp:=FPassword;
stripe:=DeHash(temp); \\\аналогична Hash по описанию
....
Так вот во всех трех переменных было одно и то же значение - расшифрованый пароль

Добавил переменную-буфер в самих процедурах, то же самое
Такое впечатление, что операция присвоения одной строки другой - это
все равно что наложение адресов.

только после замены
Код:
temp:=FPassword;
на
Код:
temp:=copy(FPassword,1,length(FPassword));
все заработало нормально

Отсюда вопрос: в чем дело? В директивах компиляции или это где-то в опциях дельфы настраивается?!

P.S. строки типа string в Ansi кодировке
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 09.06.2008, 16:27   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от joker Посмотреть сообщение
Отсюда вопрос: в чем дело? В директивах компиляции или это где-то в опциях дельфы настраивается?!

P.S. строки типа string в Ansi кодировке
Дело в реализации поддержки ANSIString в Delphi.

Код:
function TForm1.Hash(s: string): string;   
var S1:String;
begin  
    S1 := S;     // Обе переменные - указатели на одну и ту-же строку, 
                    // просто увеличивается счетчик использования
    UniqueString(S1);   // Явное указание установить счетчик использования в 1
                               // Теперь указатели ссылаются на разные области памяти 
    // S1 можно передавать как PByte и менять ее содержимое
    // Значение S при это не изменится
    ...
обычная работа со строками, например
S1[3] := 'A'
приводит к тому, что компилятор добавляет в код вызов UniqueString()
Поэтому проблем не возникает.
alexBlack вне форума Ответить с цитированием
Старый 10.06.2008, 04:20   #3
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

интересные у дельфы методы оптимизации работы со строками, это типа шоб меньше памяти занимать пока у строк одинаковое значение
А в последующих версиях дельф тоже такая тема?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 10.06.2008, 09:41   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от joker Посмотреть сообщение
интересные у дельфы методы оптимизации работы со строками, это типа шоб меньше памяти занимать пока у строк одинаковое значение

А в последующих версиях дельф тоже такая тема?
Насколько я знаю, во всех версиях одинаково. В последующих версиях нужно спрашивать у разработчиков. Мое мнение - требования совместимости со старым кодом не дадут внести существенных изменений в этот механизм.

Кроме того, есть же еще:

ShortString
array of char
PChar
...

С этими типами таких проблем не возникнет .....
будут другие
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Warning при компиляции... nighthack Общие вопросы C/C++ 3 06.06.2008 00:46
Ошибка при компиляции [QY]'~''LeK1[ee] Помощь студентам 2 28.05.2008 20:46
Директивы препроцессора в С++ alef Общие вопросы C/C++ 1 25.04.2008 01:36
директивы в MASM - INVOKE, PROTO, LOCAL fermat_c Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 05.04.2008 18:25
Ошибка при компиляции zak Общие вопросы C/C++ 2 11.12.2007 18:24