Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определить тип данных [D7]


Страницы:   1 2 3 4

Сергей ©   (2014-03-25 11:06:00) 

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


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

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


Ega23   (2014-03-25 13:04:00) [42]


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


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


Inovet   (2014-03-25 13:02:00) [43]

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

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


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

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


clickmaker   (2014-03-25 12:56:00) [45]

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

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


Inovet   (2014-03-25 12:56:00) [46]

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

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


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

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


Inovet   (2014-03-25 12:50:00) [48]

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

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


Inovet   (2014-03-25 12:47:00) [49]

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

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

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


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

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


Ega23   (2014-03-25 12:44:00) [51]


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


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


Inovet   (2014-03-25 12:35:00) [52]

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

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


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

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


Inovet   (2014-03-25 12:33:00) [54]

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

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


clickmaker   (2014-03-25 12:31:00) [55]

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

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


sniknik   (2014-03-25 12:25:00) [56]

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

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


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

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


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

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


Inovet   (2014-03-25 12:18:00) [59]

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

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

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


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


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


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


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо