Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Вниз

Определить тип данных   Найти похожие ветки 

 
Сергей   (2014-03-25 11:06) [0]

Var I:int64; B:Byte;W:word;
Procedure Proc1(e:int64); Begin {код}end;
Можно ли определить в коде самой процедуре что ей передаётся т.е. чиловое значение Proc1(34) или переменная какого типа Proc1(b);Proc1(w);Proc1(I);? Как это сделать ?


 
clickmaker ©   (2014-03-25 11:08) [1]

> Можно ли определить в коде самой процедуре что ей передаётся

нет


 
Германн ©   (2014-03-25 11:29) [2]

http://www.delphibasics.ru/Overload.php


 
sniknik ©   (2014-03-25 11:35) [3]

в коде можно определить тип у вариантов, а не у "жесткого" типа.
+ можно конечно сделать несколько "перекрытых" (overload)  процедур... но это не в коде будет определятся, а на этапе компиляции. какую процедуру подставить... ну весьма не надежно/не очевидно если хочешь писать так как написал - Proc1(34) .


 
Ega23 ©   (2014-03-25 11:37) [4]

Можно, но извращённо.

procedure TForm9.Button2Click(Sender: TObject);
var
 b: Byte;
 w: Word;
 i: Integer;
 i64: Int64;
begin
 Foo(b);
 Foo(w);
 Foo(i);
 Foo(i64);
 Foo("foo");
end;

procedure TForm9.Foo(Value: Variant);
begin
 case VarType(Value) of
   varByte   : ShowMessage("Byte");
   varWord   : ShowMessage("Word");
   varInteger : ShowMessage("Integer");
   varInt64  : ShowMessage("Int64");
   else
     ShowMessage("Unknown");
 end;
end;



 
Сергей   (2014-03-25 11:50) [5]

Ega23, спасибо это видимо то что нужно! попробую!
Вот только с числовыми жёсткими значениями как быть ? 2? 234? 34567? и т.д


 
Ega23 ©   (2014-03-25 11:53) [6]


> Вот только с числовыми жёсткими значениями как быть ? 2?
>  234? 34567? и т.д

ЕМНИП, они к ближайшему диапазону будут приведены.
Ну там, 2 - varByte, 234 - varWord и т.п.
Если только явно не приводить:
Foo(Integer(2));

Но на всякий ещё раз напоминаю: это - изврат, неоптимально, адъ и Израиль.


 
Сергей   (2014-03-25 11:58) [7]

Ega23, жаль! :-( Не то!
У меня вопрос стоит так:
"Жесткое" ли число (т.е. в виде чисел) или всё такие переменная? (типа int64).


 
clickmaker ©   (2014-03-25 12:05) [8]

> [7] Сергей   (25.03.14 11:58)

ты вообще представляешь, как параметры типа значение в функцию передаются?


 
Сергей   (2014-03-25 12:09) [9]

clickmaker, незнаю представляю или нет я вопрос задаю так как мне нужно.
=======================================
Попробую выразить еще так:
Const i64c:int64=0;
Var i64:int64;
{.....}
i64:=0;
Proc1(0); Proc1(i64); Proc1(i64c);
ноль “0” передавать в процедуру можно! Но если это переменная или константа то она не может быть нулём и нужно выдать ошибку. Реально ли такое сделать ?


 
Inovet ©   (2014-03-25 12:11) [10]

Можно. Нало пойти по стеку на адрес возврата и там поковырять на предмет константности переданного значения. Вот это будет уже полный
> изврат, неоптимально, адъ и Израиль.


 
Inovet ©   (2014-03-25 12:12) [11]

> [9] Сергей   (25.03.14 12:09)
> clickmaker, незнаю представляю или нет я вопрос задаю так как мне нужно.

А надо представлять. В хелпе всё описано. Дебагер имеется.


 
Ega23 ©   (2014-03-25 12:13) [12]


> У меня вопрос стоит так:


http://www.gunsmoker.ru/2008/10/x-y-z.html
Прочитай внимательно и подумай: не твой ли это случай?
Без обид.


 
Inovet ©   (2014-03-25 12:18) [13]

> [9] Сергей   (25.03.14 12:09)
> Но если это переменная или константа то она не может быть
> нулём и нужно выдать ошибку.

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

А вообще меняй подход, таких требований быть не должно, раз есть - значит что-то неправильно.


 
Сергей   (2014-03-25 12:20) [14]

Ega23, в 1 вопросе я получил ответ. Но не тот что нужно. Вот поэтому его поставил по другому.


 
Сергей   (2014-03-25 12:23) [15]

Inovet, ну хорошо! Бог с ней с константой. :) А переменную отличить от "страхомудия" типа числа (констаннты) можно?


 
sniknik ©   (2014-03-25 12:25) [16]

> делфийскую константу и извращёнными способами чаще всего не отловишь
+
"делфийская" типизированная константа в зависимости от настроек компиляции легко превращается в глобальную переменную.

т.е. в "извращенные способы" нужно еще "вкрутить"метод определения настроек с какими компилировалось.
это так, для "полного счастья".


 
clickmaker ©   (2014-03-25 12:31) [17]

> ноль “0” передавать в процедуру можно! Но если это переменная
> или константа то она не может быть нулём

Взаимоисключающие параграфы детектед


 
Inovet ©   (2014-03-25 12:33) [18]

> [15] Сергей   (25.03.14 12:23)
> А переменную отличить от "страхомудия" типа числа (констаннты) можно?

Ну вот сам подумай для чего нужна функция (подпрограмма) кроме того, чтобы не повторять один и тот же код в нескольких местах? А нужна она ещё и для того, чтобы работала одинакого независимо от способа вызова и способа передачи параметров. Ты же хочешь в точности обратного.


 
Сергей   (2014-03-25 12:34) [19]

clickmaker, не цепляйся к словам :-)
Ноль процедуре передавать можно, но если нулейвая переменная то процедура должна выдать что ПЕРЕМЕННАЯ НЕ МОЖЕТ БЫТЬ НУЛЕВОЙ, т.е. она считается "неопределена" для использования в программе (прецедуре). Так понятно ?


 
Inovet ©   (2014-03-25 12:35) [20]

> [17] clickmaker ©   (25.03.14 12:31)
> > ноль “0” передавать в процедуру можно! Но если это переменная
> > или константа то она не может быть нулём
>
> Взаимоисключающие параграфы детектед

Видимо, надо вопрос ставить так: как сделать, чтобы в переменной, которая там куда-то вдруг может быть передана в качестве значения параметра, нельзя было сохранить 0, потому что 0 для неё не имеет смысла.


 
Ega23 ©   (2014-03-25 12:44) [21]


> Ноль процедуре передавать можно, но если нулейвая переменная
> то процедура должна выдать что ПЕРЕМЕННАЯ НЕ МОЖЕТ БЫТЬ
> НУЛЕВОЙ, т.е. она считается "неопределена" для использования
> в программе (прецедуре). Так понятно ?


Это неправильная архитектура.
Процедура не должна ничего знать о природе входного параметра. У тебя вообще может быть в качестве входного параметра результат выполнения цепочки функций: Foo(Func1(Func2(Func3(Твоя_Константа))))
Как ты такое будешь отслеживать? Или геттер интерфейса, который реально реализован ХЗ где. В MSExcel каком-нибудь.


 
Сергей   (2014-03-25 12:47) [22]

Inovet. ДА!
И не только ноль для  неё бесмыслен но и другие числа диапазана Byte,word,Cardinal  и других всех доступных числел, КРОМЕ ЧИСЕЛ ДИАПАЗОНА Int64;
Можно выразить так:
Переменная должна быть Int64 и значение её должно быть
от -9223372036854775800 до (-9223372036854775800+100000), а если оно вне этих пределов, то это считается как обычное число(констанна), а не переменная Int64. НО БЕДА КОГДА "ЗАБЫВАЕШЬ" ПРИСВОИТЬ ПЕРЕМЕННОЙ ЗНАЧЕНИЕ НУЖНОГО ДИАПАЗАНА и она у тебя ноль или же 34 или 3455 нельзя ведь понять, что это переменная (int64),  а не просто чило или число другого типа (Byte, Word);


 
Inovet ©   (2014-03-25 12:47) [23]

> [21] Ega23 ©   (25.03.14 12:44)

Да много чего может быть. Элемент массива/структуры/класса в которых нельзя хранить 0, но мы будем хранить, а проверять в левой функции, ага.

Правильно проверять валидность там, где хранится/получается. Нельзя 0, значит сделать обёртку над этим и при присвоении поднимать исключение.


 
Inovet ©   (2014-03-25 12:50) [24]

> [22] Сергей   (25.03.14 12:47)

Когда забываешь присвоить, там будет чёрт лысый, а не ноль, кроме глобальных переменных, и то в самом начале.


 
Сергей   (2014-03-25 12:51) [25]

>обёртку над этим и при присвоении поднимать исключение.
поднимать исключение - Для меня это сложно. :-)
Я хотел проще:
В процедуре вписать: если Int64 не того диапазона что нужно ШовМессаг("неразмечаена переменная"). Типа того.


 
Inovet ©   (2014-03-25 12:56) [26]

> [25] Сергей   (25.03.14 12:51)

Поднять исключение не сложнее ШовМесаги, а толку значительно больше.


 
clickmaker ©   (2014-03-25 12:56) [27]

> если Int64 не того диапазона

ну и кто мешает написать?
if (param < min) or (param > max) then ШовМессаг("неразмечаена переменная")


 
Сергей   (2014-03-25 12:58) [28]

Inovet, но это если ты знаешь как это делать. а если я незнаю то с этим еще нужно разбираться.


 
Inovet ©   (2014-03-25 13:02) [29]

> [27] clickmaker ©   (25.03.14 12:56)
> if (param < min) or (param > max) then ШовМессаг("неразмечаена переменная")

Да, но для просто 123 не надо ШовМасаг делать. Вот ведь незадача.


 
Ega23 ©   (2014-03-25 13:04) [30]


> Inovet, но это если ты знаешь как это делать. а если я незнаю
> то с этим еще нужно разбираться.


Вот это и есть та самая классическая сага об XYZ.
Ты, когда задаёшь вопрос, описывай именно саму задачу, а не то, как ты считаешь, как её решать.


 
Сергей   (2014-03-25 13:06) [31]

clickmaker, КАК Я ПОЙМУ ЧТО В ПРОЦЕДУРУ ПЕРЕДАНА НЕРАЗМЕЧЕННАЯ ПЕРЕМЕННАЯ! ПОДЧЕРКИВАЮ ПЕРЕМЕННАЯ ТИПА int64, ЕСЛИ ОНА БУДЕТ НУЛЁМ ИЛИ ДРУГИМ ЗНАЧЕНИЕМ ? А самой процедуре передавать можно любые значения. А вот если это ИЗ(!) int64-переменной не того диапазона то она считается неразмеченной ("испорченной")
Summ1,Suuma2:int64;
Proc1(Summa1);
Если переменные размечены
Summ1 = -9223372036854775800+1
Suuma2 = -9223372036854775800+2
то можно понять что передалось соответсвующая переменная имеющая свой ИД, а не просто число какое нибудь. Или случайно битая Summ1 которая оказалась =0 или другого диапазона
Может так понятно ?! :-)


 
clickmaker ©   (2014-03-25 13:08) [32]

> то можно понять что передалось соответсвующая переменная
> имеющая свой ИД, а не просто число какое нибудь

так это и есть эти самые min и max
может, так понятно?)


 
sniknik ©   (2014-03-25 13:09) [33]

> а если я незнаю то с этим еще нужно разбираться.
не разбираться как сделать нафантазированное нужно, а учится, разбираться как оно работает на самом деле, и после "фантазировать" уже исходя из знаний.

однако есть разница.


 
sniknik ©   (2014-03-25 13:12) [34]

> Если переменные размечены
переменные не размечены, тип это не метка данных (если не вариант), а "трафарет" как на эти данные смотреть...
один и тот же байт может быть и отдельным и частью интеджера/ворда/... даже строки, причем в одно и то же время, в зависимости через какой "трафарет" на него смотрят.


 
Inovet ©   (2014-03-25 13:13) [35]

> [31] Сергей   (25.03.14 13:06)
> то можно понять что передалось соответсвующая переменная
> имеющая свой ИД, а не просто число какое нибудь. Или случайно
> битая Summ1 которая оказалась =0 или другого диапазона

Чем случайная последовательность битов отличается от неслучайной, если они находяться в одном разрешённом диапазоне?

Не занимайся ерундой - это тупиковый путь.


 
Ega23 ©   (2014-03-25 13:15) [36]


> clickmaker, КАК Я ПОЙМУ ЧТО В ПРОЦЕДУРУ ПЕРЕДАНА НЕРАЗМЕЧЕННАЯ
> ПЕРЕМЕННАЯ! ПОДЧЕРКИВАЮ ПЕРЕМЕННАЯ ТИПА int64


Никак.

var
 a,b: Int64;
begin
 a := ...;
 b := ...;
 // Типа, "разметили" обе.
 Proc(a+b);
end;


Это не на уровне процедуры нужно определять.


 
Inovet ©   (2014-03-25 13:16) [37]

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


 
Сергей   (2014-03-25 13:19) [38]

sniknik, а мне нужно чтобы Int64 иммела свой ИД нужного диапазона и далее их использовать как метки т.е если
Summ1 = -9223372036854775800+1
Suuma2 = -9223372036854775800+2
и в процедуру приходит  "первое значение" то программа "понимает" что это "первое" значение и другие процедуры тоже будут понимать эту привязку (метку). но беда если их забыть "разметить" нужным диапазоном или они будут =0 то как отличить Summ1 от Suuma2 от чилового значения ?


 
turbouser ©   (2014-03-25 13:19) [39]


> Сергей

А какая цель преследуется? Т.е. зачем надо определять тип данных?


 
sniknik ©   (2014-03-25 13:20) [40]

+
Procedure Proc1(a: word); Begin {код}end;
и
Procedure Proc1(a, б: byte); Begin {код}end;
не отличаются в стиле передачи параметра, и там и там будет задействован регистр AX, т.е. если подменить формальное описание при работе с dll например, то можно задать для первого 2мя переменным а для второго наоборот одной... для компа без разницы.
просто это МЫ ПРИНИМАЕМ что в первом случае с ним работаем как с целым, а во втором как с двумя половинками... НАМ, людям, так удобнее.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.072 c
2-1365077543
JohnKorsh
2013-04-04 16:12
2015.09.10
Иконка программы.


15-1412754599
ProstoTak
2014-10-08 11:49
2015.09.10
Программа CamFind - это нечто


15-1421265883
sysdmg4
2015-01-14 23:04
2015.09.10
Система тестирования ПО на основе виртуальных машин - нужен совет


15-1417298499
Pavia
2014-11-30 01:01
2015.09.10
Родить объект


15-1414791002
Юрий
2014-11-01 01:30
2015.09.10
С днем рождения ! 1 ноября 2014 суббота





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский