| 
| 
 | Вопрос # 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. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |