Форум: "Начинающим";
Текущий архив: 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.069 c