|
Вопрос # 6 469/ вопрос решён / |
|
Здравствуйте!
Метки в Delphi как работают? Мое устройство через порт пошлет в
var d:byte; {это число восьмибитное - и будет имя метки в программе}, ну если метка не может быть числом, тогда пошлю
var d:string;{это символ строкового типа из ASCII - и будет имя метки в программе}. Как перейти на выполнение программы с этой метки? И куда пойдет программа после выполнения фрагмента с этой меткой. Как в подпрограмме - вернется к тому месту где я прервал, или пойдет дальше до последнего end. ? Вариант с перебором case не люблю. Да и в Delphi, как он работает я все равно не знаю (знаю только на assembler).
Подскажите как это понятно спросить.
 |
Вопрос задал: zvygin1964 (статус: Посетитель)
Вопрос отправлен: 20 августа 2013, 23:16
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Перечитал вопрос 5 раз. Сломал мозг. Но жоп сердцем чую, что тут про оператор case. Ну, поскольку в футболе перерыв между таймами, напишу несколько строк.
Пример:
var
d: Byte;
begin
d:= Функция_Принятия_Байта_Из_Порта(аргументы);
case d of
$00: действия при d = 00h;
$01: действия при d = 01h;
$02, $03: действия при d = 02h или 03h;
$04..$80: действия при 04h <= d <= 80h;
$A0..$F0, $FF: действия при A0h <= d <= F0h или d = FFh;
// и т.д.
else действия при любых других значениях d; // необязательная секция
end; // case
end;
Цитата:
var d:string;{это символ строкового типа из ASCII - и будет имя метки в программе}
string - это не символ, а строка символов. Если ты имеешь в виду Char, case строится по такому же принципу.
var
d: Char;
begin
d:= Функция_Принятия_Символа_Из_Порта(аргументы);
case d of
'A': ...;
'B'..'H': ...;
#0..#31:...;
// и т.д.
else ...;
end; // case
end;
Цитата:
Как в подпрограмме - вернется к тому месту где я прервал, или пойдет дальше до последнего end.
Используй функции/процедуры (возможно, я неправильно понял
Цитата:
Вариант с перебором case не люблю. Да и в Delphi, как он работает я все равно не знаю (знаю только на assembler).
Теперь понял?
Аналог ассемблерных переходов в delphi - оператор goto. Не рекомендую! И не спрашивать почему!!!
Аналог оператора jmp A+@DPTR - это и есть case!
Но самое интересное - если знаешь ассемблер, юзай ассемблерные вставки.
З.Ы. Задолбался писать, 2-й тайм начался.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 20 августа 2013, 23:51
Оценка за ответ: 5
Комментарий к оценке: Спасибо за ответ. Проверяю...
|
Мини-форум вопроса
Всего сообщений: 12; последнее сообщение — 24 августа 2013, 19:51; участников в обсуждении: 4.
|
min@y™ (статус: Доктор наук), 21 августа 2013, 00:00 [#1]:
Да, забыл сказать...
Не надо писать вопросы, состоящие из нескольких вопросов. На каждый вопрос отдельную страницу создавай, ёмаё, а то чертовски трудно отвечать, лёжа на диване с ноутом на пузе.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Толяныч (статус: 4-ый класс), 21 августа 2013, 12:26 [#2]:
Я надеюсь, у спросившего ясное представление о том, что в откомпилированной программе уже нет никаких меток, только адреса переходов. И если в программе встречается, к примеру, label1, то добраться до нее нельзя даже через case, передавая это имя как строку, т.к.
selectorExpression is any expression of an ordinal type (string types are invalid)
|
|
zvygin1964 (статус: Посетитель), 21 августа 2013, 22:43 [#3]:
Вообще никакого представления. в примере: "
case d of
$00: действия при d = 00h;
$01: действия при d = 01h;
$02, $03: действия при d = 02h или 03h;// и т.д.
else ...;
end; // case
end;
",-
думалось что после двоеточия надо поставить номер строки в файле с расширением .pas или название функции. Но тогда после её выполнения выполнение программы пойдет дальше (типа подпрограммы), а это совсем не то! Мне надо ветвление по условию получения определенных данных.
Да и после их получения, их поступление не закончится, а будет продолжаться... с разумной скоростью.
|
|
min@y™ (статус: Доктор наук), 21 августа 2013, 23:08 [#4]:
Цитата (zvygin1964):
думалось что после двоеточия надо поставить номер строки в файле с расширением .pas...
Ну ты ваще! Ну представь, что ты вставил пару строк ВЫШЕ этого места. И всё, физкультпривет.
Цитата (zvygin1964):
или название функции.
Уже теплее. Вообще, после двоеточия может быть что угодно, хоть вызов функции, хоть выражение типа x:= a + b;, хоть целая куча кода, включая даже вложенный case.
case zzz of
0: begin
x:= a + b; // выражение
y:= SomFunc(zzz); // вызов подпрограммы
if x > y // оператор
then ...
end;
//...
end; // <--- case
Цитата (zvygin1964):
Но тогда после её выполнения выполнение программы пойдет дальше (типа подпрограммы), а это совсем не то!
А вот после того, как вся эта ботва выполнится, управление будет передано первому оператору после
end; // <--- case
Так устроит?
Учи матчасть! Сразу видно, что ты нихрена не читал даже про case.
Телепатор говорит мне, что ты хочешь что-то типа этого:
procedure Foo(...);
var
Data: Byte;
begin
// цикл с постусловием
repeat
Data:= Функция_Принятия_Байта_Из_Порта(аргументы);
case Data of
// анализ Data и действия
end; // case
// еще какие-то действия
// и вычисление условия выхода из цикла
until <условие выхода из цикла>;
// действия после цикла и выход
end;
Еще раз говорю, учи матчасть.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
zvygin1964 (статус: Посетитель), 21 августа 2013, 23:57 [#5]:
Нет. По результатам анализа
case Data of
// анализ Data и действия
мне нужно не делать расчёты, а надо выводить ТForm2 или ТForm3 поверх Form1 (график данных или панель управления прибором, соответственно.
А выходить из цикла мне и не нужно. До end; в ТForm1 я никогда доходить не должен: программа должна остановиться на одной из тех других ТFormN и ждать поступления новых данных из порта или моих действий с панелью прибора.
Матчасти не знаю, поэтому тут и задаю вопросы...
|
|
min@y™ (статус: Доктор наук), 22 августа 2013, 00:44 [#6]:
Цитата (zvygin1964):
По результатам анализа case Data of // анализ Data и действия мне нужно не делать расчёты, а надо выводить ТForm2 или ТForm3 поверх Form1 (график данных или панель управления прибором, соответственно.
Ну так и выводи. Какие проблемы?
Вообще, я пока не догоняю, ну напиши ты по-русски, что должна делать твоя основная подпрограмма.
Совет: разделяй в программе обмен с ВУ, расчёты и пользовательский интерфейс. Они должны быть МАКСИМАЛЬНО развязаны, иначе будет не код, дикое унылое говно (это я тебе как спец говорю - сам вляпывался, потом понял).
Пойми, вот эта твоя фраза
Цитата (zvygin1964):
А выходить из цикла мне и не нужно. До end; в ТForm1 я никогда доходить не должен: программа должна остановиться на одной из тех других ТFormN и ждать поступления новых данных из порта или моих действий с панелью прибора.
мне вообще ничего не говорит. Нахрена мне твоя специфика? Мне алгоритм нужен, типа: "У меня есть X и Y, хочу из них получить Z". Обязательно (!!!!!) прочти вот это! 10 раз прочти, 100 раз!!!!! А потом поговорим.
Цитата (zvygin1964):
Матчасти не знаю, поэтому тут и задаю вопросы...
Это очень плохо. Без МЧ ты ничего не напишешь. Никогда.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Мережников Андрей (статус: Абитуриент), 22 августа 2013, 01:01 [#7]:
Цитата (zvygin1964):
А выходить из цикла мне и не нужно
В смысле - программа никогда не должна завершиться?
|
|
zvygin1964 (статус: Посетитель), 22 августа 2013, 11:19 [#8]:
Прочитал :"Обязательно (!!!!!) прочти вот это!",- 1 раз.
Не хватайтесь за утюг! В обсуждении сказали:" Дай что просят. Если человек пытается сделать сам - это всегда лучше Ctrl+C Ctrl+V. Собственный опыт - знания, готовое решение - лишь знание о знаниях(в лучшем случае). Придет время, и человек сам поймет что делал через Ж".
Уточняю вопрос:
case d of
$00: действия при d = 00h; {открываем ТForm2}
$01: действия при d = 01h; {открываем ТForm3}.
|
|
zvygin1964 (статус: Посетитель), 22 августа 2013, 11:20 [#9]:
Как это написать?
|
|
min@y™ (статус: Доктор наук), 22 августа 2013, 16:44 [#10]:
Цитата (zvygin1964):
Как это написать?
Ну, примерно так:
case d of
$00: Form2.Show(); {открываем ТForm2}
$01: Form3.Show(); {открываем ТForm3}
end;
И как тебе не лень писать однострочные комментарии в фигурных скобках?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
zvygin1964 (статус: Посетитель), 23 августа 2013, 12:57 [#11]:
Ответ закрыт. Спасибо. Пиво выслал.
|
24 августа 2013, 11:02: Статус вопроса изменён на решённый (изменил автор вопроса — zvygin1964): Понял организацию ветвления по условию. В Delphi метки не используются, стек тоже. JMP на адрес не возможен.
|
min@y™ (статус: Доктор наук), 24 августа 2013, 19:51 [#12]:
Цитата (zvygin1964):
В Delphi метки не используются, стек тоже. JMP на адрес не возможен.
Да неужели?
В delphi и метки есть, и стек, и jmp. Только в прикладных программах эта вся ботва нахрен не нужна, т.к. стандартных средств всегда хватает на 99,9999%.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|