Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.17;
Скачать: CL | DM;

Вниз

Это правильно, что этот код компилируется...   Найти похожие ветки 

 
Дмитрий С ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
3-1246530307
Miau
2009-07-02 14:25
2010.10.17
create table жутко тормозит


15-1279120336
xayam
2010-07-14 19:12
2010.10.17
Изучаем Java


2-1274281038
Vass
2010-05-19 18:57
2010.10.17
Узнать Top предыдущего элемента в списке TList


8-1206823308
DoKi
2008-03-29 23:41
2010.10.17
приближение камеры


2-1279515617
Олег Крапивин
2010-07-19 09:00
2010.10.17
Работа с СОМ-портом через ЛВС