Форум: "Потрепаться";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизНашел одну вещь в Delphi Найти похожие ветки
← →
iZEN © (2004-11-14 02:41) [40]Напомните, пожалуйста, компилятор TurboPascal/Delphi отлавливает такую ситуацию:
unit Module1;
interface
procedure TestString(var s: String);
implementation
procedure TestString(var s: String);
begin
s := s + " in Module1";
end;
end.
И ещё один модуль:
unit Module2;
interface
procedure TestString(var s: String);
implementation
procedure TestString(var s: String);
begin
s := s + " in Module2";
end;
end.
Программа:
program DemoTest;
uses Module1, Module2;
var
s: String;
begin
s := "Test String";
TestString(s);(* Module1.TestString(s) или Module2.TestString(s)??? *)
end.
← →
iZEN © (2004-11-14 02:49) [41]Проверил тест (iZEN © (14.11.04 02:41) [40]) только что.
Delphi7 НЕ ОТЛАВЛИВАЕТ И КОМПИЛИРУЕТ БЕЗ ПРЕДУПРЕЖДЕНИЙ!!!
Даже не зависит от порядка объявления:
uses Module1, Module2;
и
uses Module2, Module1;
процедура TestString всегда вызывается из Module1.
Вот такая неоднозначность.
← →
iZEN © (2004-11-14 02:58) [42]Причём процедура какого модуля вызовется, зависит от очерёдности создания модулей в проекте Delphi, а не в объявлении uses, что не есть хорошо в плане определения языка. Выходит, что среда Delphi не слабо влияет на язык.
← →
iZEN © (2004-11-14 03:01) [43](iZEN © (14.11.04 02:58) [42])
Какие-то глюки пошли, всё равно вызывается Module1.TestString.
Я ОФИГЕВАЮ.
← →
GuAV © (2004-11-14 03:07) [44]2 iZEN
А может это потому что они перечисленны и в dpr и в модуле ? и где-то перестваил Module2 <-> Module1 а где-то нет ?
← →
iZEN © (2004-11-14 03:15) [45]uses Module1, Module2;
BuildAll, запускаю: Test String in Module1.
Вроде отлично.
Исключаю из проекта Modul1, затираю исходники Modul1, уничтожаю все dcu, убираю в uses ссылку на него: uses Module2;
Project -> BuildAll -> Run: Test String in Module2.
Вроде отлично.
File -> New -> Unit -> редактирую -> SaveAs "Module1"
Добавляю в uses ссылку: uses Module1, Module2;
BuildAll, запускаю: Test String in Module2.
Глюк? (1)
Комментирую в uses ссылку: uses Module1;//, Module2;
Project -> BuildAll -> Run: Test String in Module1.
Отлично.
Меняю местами в uses ссылки: uses Module2, Module1;
Project -> BuildAll -> Run: Test String in Module1.
Глюк? (2)
Что это? Где логика между Глюками (1) и (2)? Лично я не нахожу причин от чего зависит поведение программы.
← →
iZEN © (2004-11-14 03:18) [46]to GuAV © (14.11.04 03:07) [44]
АБСОЛЮТНО нет связи между порядком перечисления и выполнением.
← →
iZEN © (2004-11-14 03:34) [47]В консольном приложении есть связь между порядком перечисления в uses и выполнением: выполняется процедура, объявленная в модуле, стоящим последним в списке uses.
← →
iZEN © (2004-11-14 03:50) [48]В оконном приложении так же.
Так что прошу прощения за "глюки".
← →
Piter © (2004-11-14 14:47) [49]Игорь Шевченко © (14.11.04 1:20) [27]
> И ?
> IMHO это сюда не при чём. TestFunc(string("test")) всё равно
> вызовет PChar функцию.
Я надеюсь, это проверено, и все преобразования аргументов в случае такого вызова можно выложить в студию ?
Игорь, ну а вы опять не верите? Проверено, проверено. Вызывается PChar версия функции...
Игорь Шевченко © (14.11.04 1:23) [29]
делается ли в случае PChar(StringValue) уникальный экземпляз строки.
ух ты, странно что не помните. Не делается, конечно. PChar начинает указывать на первый символ AnsiString - @s[1]
А вот при обратном преобразовании конечно же создается копия, ибо AnsiString никак не может указывать просто на какой-то символ, должна быть еще структура служебная (ну там счетчик ссылок, длина, размер структуры...)
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.037 c