Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 469

/ вопрос решён /

Здравствуйте!
Метки в Delphi как работают? Мое устройство через порт пошлет в
var d:byte; {это число восьмибитное - и будет имя метки в программе}, ну если метка не может быть числом, тогда пошлю
var d:string;{это символ строкового типа из ASCII - и будет имя метки в программе}. Как перейти на выполнение программы с этой метки? И куда пойдет программа после выполнения фрагмента с этой меткой. Как в подпрограмме - вернется к тому месту где я прервал, или пойдет дальше до последнего end. ? Вариант с перебором case не люблю. Да и в Delphi, как он работает я все равно не знаю (знаю только на assembler).
Подскажите как это понятно спросить.

zvygin1964 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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™

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

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™

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

zvygin1964 (статус: Посетитель), 21 августа 2013, 23:57 [#5]:

Нет. По результатам анализа
case Data of
// анализ Data и действия
мне нужно не делать расчёты, а надо выводить ТForm2 или ТForm3 поверх Form1 (график данных или панель управления прибором, соответственно.

А выходить из цикла мне и не нужно. До end; в ТForm1 я никогда доходить не должен: программа должна остановиться на одной из тех других ТFormN и ждать поступления новых данных из порта или моих действий с панелью прибора.
Матчасти не знаю, поэтому тут и задаю вопросы...
min@y™

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

zvygin1964 (статус: Посетитель), 22 августа 2013, 11:19 [#8]:

Прочитал :"Обязательно (!!!!!) прочти вот это!",- 1 раз.
Не хватайтесь за утюг! В обсуждении сказали:" Дай что просят. Если человек пытается сделать сам - это всегда лучше Ctrl+C Ctrl+V. Собственный опыт - знания, готовое решение - лишь знание о знаниях(в лучшем случае). Придет время, и человек сам поймет что делал через Ж".

Уточняю вопрос:
case d of
$00: действия при d = 00h; {открываем ТForm2}
$01: действия при d = 01h; {открываем ТForm3}.
zvygin1964

zvygin1964 (статус: Посетитель), 22 августа 2013, 11:20 [#9]:

Как это написать?
min@y™

min@y™ (статус: Доктор наук), 22 августа 2013, 16:44 [#10]:

Цитата (zvygin1964):

Как это написать?

Ну, примерно так:
case d of
  $00: Form2.Show(); {открываем ТForm2}
  $01: Form3.Show(); {открываем ТForm3}
end;
И как тебе не лень писать однострочные комментарии в фигурных скобках?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
zvygin1964

zvygin1964 (статус: Посетитель), 23 августа 2013, 12:57 [#11]:

Ответ закрыт. Спасибо. Пиво выслал.

24 августа 2013, 11:02: Статус вопроса изменён на решённый (изменил автор вопроса — zvygin1964): Понял организацию ветвления по условию. В Delphi метки не используются, стек тоже. JMP на адрес не возможен.

min@y™

min@y™ (статус: Доктор наук), 24 августа 2013, 19:51 [#12]:

Цитата (zvygin1964):

В Delphi метки не используются, стек тоже. JMP на адрес не возможен.

Да неужели?
В delphi и метки есть, и стек, и jmp. Только в прикладных программах эта вся ботва нахрен не нужна, т.к. стандартных средств всегда хватает на 99,9999%.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:53
Выполнено за 0.04 сек.