Форум: "Прочее";
Текущий архив: 2010.10.17;
Скачать: [xml.tar.bz2];
ВнизЭто правильно, что этот код компилируется... Найти похожие ветки
← →
Дмитрий С © (2010-07-15 13:27) [0]... еще и адекватно выполняется?
program Project2;
{$APPTYPE CONSOLE}
uses
Classes;
procedure EchoArray(Arr: array of Integer);
var
I: Integer;
begin
for I := 0 to Pred(Length(Arr)) do
Writeln(Arr[I]);
end;
var
Int: Integer;
begin
Int := 7;
EchoArray(Int);
Readln;
end.
Embarcadero® Delphi® 2010 Version 14.0.3513.24210
← →
@!!ex (2010-07-15 13:28) [1]и что не нравится?
← →
Дмитрий С © (2010-07-15 13:29) [2]Причем если добавить
EchoArray(Int+1);
или
EchoArray(7);
компилятор выдаст ошибку:
[DCC Error] Project2.dpr(17): E2010 Incompatible types: "Array" and "Integer"
(Очевидно, ошибка в 17 строке :)) шутка)
← →
stas © (2010-07-15 13:30) [3]А что смущает, что в процедуру передаем не массив а integer?
Нормально, просто посчитается как массив с 1 элементом.
← →
Дмитрий С © (2010-07-15 13:30) [4]
> @!!ex (15.07.10 13:28) [1]
Не нравится, что он принимает переменную Integer, а как массив
← →
RWolf © (2010-07-15 13:31) [5]D7, полёт нормальный. Число рассматривается, как массив длины 1 из самого себя.
← →
stas © (2010-07-15 13:34) [6]EchoArray(7);
компилятор выдаст ошибку:
EchoArray([7]);
← →
Дмитрий С © (2010-07-15 13:34) [7]В cpu таки разница есть:
Project2.dpr.16: Int := 7;
004050C4 C705789B40000700 mov [$00409b78],$00000007
Project2.dpr.17: EchoArray(Int);
004050CE B8789B4000 mov eax,$00409b78
004050D3 33D2 xor edx,edx
004050D5 E8E2F5FFFF call EchoArray
Project2.dpr.18: EchoArray([Int]);
004050DA A1789B4000 mov eax,[$00409b78]
004050DF 8945EC mov [ebp-$14],eax
004050E2 8D45EC lea eax,[ebp-$14]
004050E5 33D2 xor edx,edx
004050E7 E8D0F5FFFF call EchoArray
> D7, полёт нормальный. Число рассматривается, как массив
> длины 1 из самого себя.
А почему тогда так нельзя вызвать: EchoArray(123) ?
← →
Дмитрий С © (2010-07-15 13:35) [8]
> stas © (15.07.10 13:34) [6]
> EchoArray(7);
> EchoArray([7]);
Так это я знаю. Вопрос не в этом.
← →
Двенадцать © (2010-07-15 13:37) [9]D7
тоже работает
но
EchoArray(int);
и
EchoArray([2,2,3,4]);
разный код кажет по ctrl-alt-c
← →
Двенадцать © (2010-07-15 13:38) [10]> [7]
да-да именно так и кажет
← →
Anatoly Podgoretsky © (2010-07-15 13:41) [11]> Дмитрий С (15.07.2010 13:27:00) [0]
Да все правильно, у тебя открытый массив, в него можно передавать
переменную, но нельзя константу
← →
Anatoly Podgoretsky © (2010-07-15 13:42) [12]> Дмитрий С (15.07.2010 13:30:04) [4]
А как еще принимать, если формальный параметр array of Integer
← →
RWolf © (2010-07-15 13:45) [13]
> Дмитрий С © (15.07.10 13:34) [7]
> А почему тогда так нельзя вызвать: EchoArray(123) ?
Потому чтоf(a:array of integer)
означает «передать в функцию первым параметром адрес переменной, вторым — длину массива». А от константы адрес взять не получится. Придётся размещать массив в памяти явно, т.е. окружать константу скобками.
← →
Дмитрий С © (2010-07-15 14:04) [14]
> Потому что f(a:array of integer) означает «передать в функцию
> первым параметром адрес переменной, вторым — длину массива».
> А от константы адрес взять не получится. Придётся размещать
> массив в памяти явно, т.е. окружать константу скобками.
Если он так молчаливо принимает переменную int вместо массива, почему, тогда молчаливо не принимает эту же переменную сюда procedure EchoPtr(p: Pointer); ?
Понятно что он должен делать и что принимает, не понятно почему?
← →
@!!ex (2010-07-15 14:18) [15]> [14] Дмитрий С © (15.07.10 14:04)
Потому что массив из одного элемента - это сам элемент.
А указатель - это указатель.
← →
Deltas © (2010-07-15 14:25) [16]
> Дмитрий С © (15.07.10 14:04) [14]
Так устроен компилятор Delphi. Одни преобразования типов он может выполнить неявно, а другие - нет.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.10.17;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c