Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > While


Автор: arkonst 15.11.2007, 09:30
Всем привет!

Подскажите пожалуйста, как понять эту запись:

while (!mb.SendFc3(Convert.ToByte(txtSlaveID.Text), pollStart, pollLength, ref values)) ;

тут в общем то код мне понятен, не понятно для чего там стоит "!" перед mb???
Извеняюсь за тупой вопрос, я конечно понимаю что он символизирует NOT(НЕ) но не могу понять зачем он тут.Для лучшей читабельности ниже привожу полный код.

 //Read registers and display data in desired format:
            try
            {
                while (!mb.SendFc3(Convert.ToByte(txtSlaveID.Text), pollStart, pollLength, ref values)) ;
            }
            catch(Exception err)
            {
                DoGUIStatus("Error in modbus read: " + err.Message);
            }

Заранее спасибо за ответ.

Автор: QryStaL 15.11.2007, 09:45
Этот код эквивалентен следующему:

Код

while (mb.SendFc3(Convert.ToByte(txtSlaveID.Text), pollStart, pollLength, ref values) == false) ;

Автор: Wizard_Memfis 15.11.2007, 11:06
Я так понимаю, что вопрос несколько в другом: функция возвращает bool?Если да , QryStaL уже сказал!А вот если нет, то действительно не понятно!!!Он не ругается на это?

Автор: thomas 15.11.2007, 11:21
Всем привет
А мне не понятно, зачем вообще нужен этот while если у него нет сигнатуры.
Код

//Read registers and display data in desired format:
            try
            {
                while (!mb.SendFc3(Convert.ToByte(txtSlaveID.Text), pollStart, pollLength, ref values)) ;
                {
                       // а тут то что? Где сигнатура?
                 }
            }
            catch(Exception err)
            {
                DoGUIStatus("Error in modbus read: " + err.Message);
            }



Как гриться, на фига козе баян?  smile 

Автор: 1stain 15.11.2007, 11:30
видимо функция проверяет порт на наличие данных. Пока данных нет - крутиццо пустой цикл. Как только данные пришли - из цикла выходим.

з.ы. глянул сюда http://www.codeproject.com/csharp/modbuscs.asp

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

while(true)
{
      if (mb.SendFc3(Convert.ToByte(txtSlaveID.Text), pollStart, pollLength, ref values)) 
           break;
      else... // обрабатываем mb.modbusStatus и в зависимости от причины неудачного чтения делаем, что надо
      

Автор: thomas 15.11.2007, 11:34
1stain, 
 smile 
возможно

Автор: FREEDEV 15.11.2007, 11:38
thomas, Да вроде бы все корректно . smile 
while циклиться пока SendFc3 не вернет false, если в процессе цикла произойдет исключение – вываливаемся в Exception, выполняем  DoGUIStatus.

Добавлено через 57 секунд
оп, уже решилось smile

Автор: 1stain 15.11.2007, 11:45
Цитата(FREEDEV @  15.11.2007,  11:38 Найти цитируемый пост)
если в процессе цикла произойдет исключение


по данному поводу вопрос к ТС: ты читал мсходники того, что используешь?
исключения обрабатываются внутри функции SendFc3, а информацию об ошибке несет modbusStatus
таким образом, перехват исключений здесь не надобен

Автор: FREEDEV 15.11.2007, 11:52
1stain, я вообще не в курсе работы этой функции, просто выдвинул предположение.

Цитата(1stain @  15.11.2007,  11:45 Найти цитируемый пост)
таким образом, перехват исключений здесь не надобен

ну, тогда исключения от Convert.ToByte(txtSlaveID.Text) кто обработает smile

Автор: 1stain 15.11.2007, 12:04
FREEDEV, я тоже ввобще-то не в курсе работы этой функции
по-моему не стоит перехватывать все исключения, без исключения  smile 
перехват Exception от Convert.ToByte(txtSlaveID.Text) и вывод его message в этом контексте 
DoGUIStatus("Error in modbus read: " + err.Message);
мало чем поможет в плане понятия причины ошибки чтения данных, только собъет с толку.

Автор: FREEDEV 15.11.2007, 12:49
Цитата(1stain @ 15.11.2007,  12:04)
перехват Exception от Convert.ToByte(txtSlaveID.Text) и вывод его message в этом контексте 
DoGUIStatus("Error in modbus read: " + err.Message);
мало чем поможет в плане понятия причины ошибки чтения данных, только собъет с толку.

это да, но ятак понимаю что код уже написан кем-то, остается разбираться зачем оно так  smile 

Автор: arkonst 16.11.2007, 10:31
Привет всем!

Смотрю тут такое обсуждение организовалось))

Проясню некоторые моменты...код этот уже готовый и работает вроде нормально...я его вырезал и вставлял в свою программу....

если нужен исходник то прикрепляю

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)