Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
3-1246530307
Miau
2009-07-02 14:25
2010.10.17
create table жутко тормозит


2-1279861058
linuxoid
2010-07-23 08:57
2010.10.17
как передать данные массива с основного потока в параллельный?


15-1279474081
Пазитроныч
2010-07-18 21:28
2010.10.17
Ваше отношение к удаленным образовательным технологиям?


2-1279702293
beginner
2010-07-21 12:51
2010.10.17
Принадлежит ли точка четырехугольнику?


6-1213619893
Empleado
2008-06-16 16:38
2010.10.17
"Досадные недоразумения логики TClient/ServerSocket"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский