Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дыры в Delphi 
:(
    Опции темы
Frikazoid
Дата 14.1.2004, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 29.3.2002

Репутация: 1
Всего: 2



Код

function Proc1Len : Cardinal;
begin
Result := Cardinal(@Proc1Len);
Dec (Result, Cardinal(@Proc1));
end;

Я бы не стал так писать! У меня часто бывает, что операции с Result оканчиваются интернал еррором! т.е. по возможности надо пользовать доп. переменные и только по концухе Result:=....
Может я и ошибаюсь, но это ИМХО!


--------------------
RTFM - "Всё для программиста" Это уменя есть сайт! Урыл в профайле!
А там.... Ну всё что надо по PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic и многое другое.
PM MAIL WWW ICQ   Вверх
Петрович
Дата 14.1.2004, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
Может я и ошибаюсь, но это ИМХО!

И очень глубоко (прошу не рассматривать как наезд). Дело в том, что Result, это ни что иное как локальная переменная, содержимое которой возвращается как результат функции.
Сам я очень часто использую Result как локальную переменную. Вот пару примеров из моей библиотеки, которая работает у меня уже несколько лет:
Код
function RublesToText (N :Currency) : String;
begin
 Result := FormatFloat('.00',N);
 Result := Copy(Result,Pos('.',Result)+1,2);
 Result := Format('%s %s %s',[
                   NumberToText(N,tgMale,'рублей','рубль','рубля'),
                   Result,
                   Trail(StrToInt(Result),'копеек','копейка','копейки')
                   ]);
 Result[1] := AnsiUpcase(Result[1]);
end;

это совсем просто.
Код
function IndexOfStr (const S :String; Strings: array of string; const CaseSensitive: Boolean=True): Integer;
// Возвращает индекс строки S в массиве Strings. Если строка не найдена
// возвращает -1. Первая строка имеет индекс 0. Если CaseSensitive равно True
// то проверяется точное совпадение, иначе регистр символов игнорируется.
begin
 if CaseSensitive then begin
   for Result := Low(Strings) to High(Strings) do
     if S = Strings[Result] then Exit;
   end
 else begin
   for Result := Low(Strings) to High(Strings) do
     if awCompareText(S,Strings[Result]) = 0 then Exit;
 end;
 Result := -1;
end;

тут посложнее.
Ну и из совсем старых smile.gif
Код
function CenterCh(const S : string; Ch : Char; Len : Integer) : string;
{-Return a string centered in a string of Ch with specified width}
var SLen : Integer;
begin
 Result := S;  SLen := Length(S);
 if Len <= SLen then  Exit;
 SetLength(Result,Len);  FillChar(Result[1], Len, Ch);
 Move(S[1], Result[Succ((Len-SLen) shr 1)], SLen);
end;

Так что не сомневайтесь, а смело используйте.



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
p0s0l
Дата 14.1.2004, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Frikazoid, даже сам Borland частенько юзает Result как обычную переменную...
Загляни в SysUtils или StrUtils...
Вот пример: (из StrUtils)
Цитата
function SoundexWord(const AText: string): Word;
var
  LResult: string;
begin
  LResult := Soundex(AText, 4);
  Result := Ord(LResult[1]) - Ord('A');
  Result := Result * 26 + StrToInt(LResult[2]);
  Result := Result * 7 + StrToInt(LResult[3]);
  Result := Result * 7 + StrToInt(LResult[4]);
end;



--------------------
С уважением, г-н Посол.
PM   Вверх
Frikazoid
Дата 14.1.2004, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 29.3.2002

Репутация: 1
Всего: 2



Сори перепутал с паскалем! smile.gif


--------------------
RTFM - "Всё для программиста" Это уменя есть сайт! Урыл в профайле!
А там.... Ну всё что надо по PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic и многое другое.
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 14.1.2004, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
Ещё можно создавать переменные следующего вида integer:string; Тоесть давать имена переменным типа iteger, write и т.д.

Нельзя использовать в качестве имен зарезервированные слова типа case, string, короче которые жирным пишутся.
Про типы: интересно, почему string - зарезервированное слово, а byte, integer, word, boolean, real, pointer и др. типы - нет ?



--------------------
С уважением, г-н Посол.
PM   Вверх
Петрович
Дата 14.1.2004, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
Сори перепутал с паскалем!

smile.gif Дык в паскале переменной Result небыло, а жаль, очень не хватало.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
December
Дата 14.1.2004, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Цитата
интересно, почему string - зарезервированное слово, а byte, integer, word, boolean, real, pointer и др. типы - нет ?
Каждый раз, когда смотрю на жирный стринг, об этом думаю. smile.gif


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
stab
Дата 14.1.2004, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Цитата(December @ 14.1.2004, 20:21)
Цитата
интересно, почему string - зарезервированное слово, а byte, integer, word, boolean, real, pointer и др. типы - нет ?
Каждый раз, когда смотрю на жирный стринг, об этом думаю. smile.gif


Аналогично... было бы круто если бы можно было писать:

Код

var
 var1: string of Int64;


может это и было в планах у Борланд? hehe.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 15.1.2004, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата(cully @ 14.1.2004, 23:31)
Цитата(December @ 14.1.2004, 20:21)
Цитата
интересно, почему string - зарезервированное слово, а byte, integer, word, boolean, real, pointer и др. типы - нет ?
Каждый раз, когда смотрю на жирный стринг, об этом думаю. smile.gif


Аналогично... было бы круто если бы можно было писать:

Код

var
 var1: string of Int64;


может это и было в планах у Борланд? hehe.gif

cully, вот ты почти и ответил... Integer и др. типы - простые типы, ничего кроме имени типа не надо указывать. А у стринга можно еще длину указывать...



--------------------
С уважением, г-н Посол.
PM   Вверх
Mpak
Дата 18.1.2004, 03:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
МРак, интересно, что приходится тут объяснять, как же получился такой код... Только когда я тебе расскажу смысл кода, ты мне скажешь, чем же это спасает ситуацию...

Смысл в том, что мне надо вычислить ТОЧНЫЙ размер кода процедуры Proc1.
Первоначальный вариант:
Код
procedure Proc1;
begin
.......
end;

function Proc1Len : Cardinal;
begin
 Result := Cardinal(@Proc1Len) - Cardinal(@Proc1);
end;

Этот способ мог давать погрешность до 3 байт, т.к. начало тел процедур выравнено по 4-байтной границе.


Остальные извращения с инструментом не предназначенным для системного программирования покипаны.

Всего пара глупых вопросов
1. На кой его знать точно? С чего вдруг погрешность от выравнивания стала критична?
2. На кой это нужно определять в рантайме?






  Вверх
p0s0l
Дата 18.1.2004, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



2. На кой это нужно определять в рантайме? [/QUOTE]

Цитата
2. На кой это нужно определять в рантайме?

На той, что при компиляции никак не узнать размер. А если вначале засунуть это в константу, то будет не то, т.к. эту процедуру я меняю часто, и каждый раз переузнавать размер как-то в лом.

Цитата
Всего пара глупых вопросов
1. На кой его знать точно? С чего вдруг погрешность от выравнивания стала критична?

Мрак, как видно, ты и дальше пытаешься лезть в дебри... Вот глупый вопрос - а зачем тебе знать это ?
Разве это что-то изменит ? У меня была такая задача, и всё, неважно, зачем это нужно было. Но это было нужно. Точка.

Цитата
Остальные извращения с инструментом не предназначенным для системного программирования покипаны.

Ну-ну... В книжке, наверное, вычитал словечки "Компилятор", "Оптимизатор", "Системное программирование" ? Продолжай в том же духе.



--------------------
С уважением, г-н Посол.
PM   Вверх
Guest
Дата 18.1.2004, 20:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Цитата

2. На кой это нужно определять в рантайме?

На той, что при компиляции никак не узнать размер. А если вначале засунуть это в константу, то будет не то, т.к. эту процедуру я меняю часто, и каждый раз переузнавать размер как-то в лом.


Ясно. Про MAP файлы никто не слышал.....

Цитата

Цитата
Всего пара глупых вопросов
1. На кой его знать точно? С чего вдруг погрешность от выравнивания стала критична?

Мрак, как видно, ты и дальше пытаешься лезть в дебри... Вот глупый вопрос - а зачем тебе знать это ?
Разве это что-то изменит ? У меня была такая задача, и всё, неважно, зачем это нужно было. Но это было нужно. Точка.


Тоже ясно. Как ... задача была сформулирована так .... она и решается.
Пропущеный наречия по тексту каждый волен расставить сам.

Вот бы всеж узнать на кой. А то кроме хакерского пальцегнутия и
представить то не могу ЗАЧЕМ в дельфях узнавать размер
процедуры, с точностью до байта, да еще и такими способами.

Цитата
Цитата
Остальные извращения с инструментом не предназначенным для системного программирования покипаны.

Ну-ну... В книжке, наверное, вычитал словечки "Компилятор", "Оптимизатор", "Системное программирование" ? Продолжай в том же духе.


Ну я хоть читаю... Мне хоть не стыдно за свой код.

smile.gif


  Вверх
p0s0l
Дата 23.1.2004, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Ладно, Мрак, высказывание про map-файлы (и некоторые другие предыдущие моменты) поставило точку в определении твоего истинного уровня знаний:
map-файле Delphi, как ты мог бы заметить, если бы хоть раз их видел в живую, а не в умной книжке, не указан размер процедуры, а указан только адрес... Увы...

Других способов решения моей задачи ты не представил, а только допытываешься до вопроса: зачем это надо ?
Короче продолжать это бессмысленно.



--------------------
С уважением, г-н Посол.
PM   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.