Убрать warning (return VALUE)

Тема в разделе "WASM.BEGINNERS", создана пользователем snezhokusr, 3 апр 2025.

  1. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    216
    Лучше закоментировать для достижения наибольшей скорости.
     
  2. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    171
    Может не взлететь. Некоторые версии для пустых файлов начинают ругаться про отсутствие main. Особенно, если без ключа -c скармливать.
     
  3. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    216
    Кстати в python такой проблемы нет. Можно с чистой душой создать например MainCode.py, и спокойно интерпретировать. Это в защиту python'а который все хают.
     
    Последнее редактирование: 9 апр 2025 в 01:13
  4. snezhokusr

    snezhokusr New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2025
    Сообщения:
    10
    шутка зачетная,
    но хоть намекните в каком случае может сработать условие if (!handle)
     
  5. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    171
    Нажимаем Ctrl+F и вводим handle
    Находим две строчки (больше, но остальное не интересно):
    1) 35: HWND handle=NULL; ///< Handle to window that receives MESS_SERIAL messages.
    2) 132: handle = hwnd;

    Отлично. Первая строка это объявление переменной, а вторая её инициализация. Теперь надо понять, когда же инициализация переменной может дать (!handle)

    Повторяем аналогичные действия для hwnd, чтобы понять откуда берется значение для инициализации переменной handle и находим от такую строчку
    69: BOOL OpenPort(int port,int baud,int HwFc, HWND hwnd)
    Таким образом мы выясняем, что (!handle) проверяет корректность переданного параметра в функцию при вызове.
    --- Сообщение объединено, 9 апр 2025 в 16:16 ---
    Можно было бы просто проверить его один раз в самой функции OpenPort, а не проверять каждый раз внутри функции потока (нити), но handle это глобальная переменная и она может быть изменена повторным вызовом OpenPort или другими средствами доступа к этой переменной. Поэтому приходится проверять корректность параметра каждый раз в новом потоке перед использованием.

    В идеале надо было бы создавать структуру с параметрами в динамической памяти, чтобы поток не зависел от глобальных переменных. Тогда, если вам понадобится обращаться с двумя и более экземплярами такого кода, то они не будут конфликтовать друг с другом из-за использования общих глобальных переменных.
     
    snezhokusr, alex_dz и Mikl___ нравится это.
  6. snezhokusr

    snezhokusr New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2025
    Сообщения:
    10
    Спасибо за подробный ответ.
    Но в каком случае может сработать условие if (!handle).
    Если это подвязано под открытие порта. То я и повторно открывал уже занятый порт
    и открывал несуществующий порт, но ни разу условие if (!handle) не выполнилось.
    Как или чем вызвать эту ошибку?
     
  7. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    171
    Перечитайте мой ответ. Там все есть
    --- Сообщение объединено, 10 апр 2025 в 14:51 ---
    Я не просто так вам привел две строки при поиске handle
     
  8. miilalex

    miilalex New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2024
    Сообщения:
    11
    тут как мне кажется не хватает базовых знаний о программировании и под виндой и на си в принципе.
    выше написали уже прям всё разжевано до геркулеса на молоке, но увы.

    хэндл (и переменная handle и тип данных) в конкретном куске кода и в винде вообще - это некий указатель на структуру данных в памяти = адрес набора переменных

    потроха в том месте, куда указывает указатель, каждый раз разные и зависят от конкретного типа/вида объекта, который хендл описывает.
    например хендл может относиться к открытому файлу и окну и шрифту и другим элементам, у разных элементов разные наборы свойств.

    хендл, равный нулю то есть указатель на адрес 0x00000000 считается недопустимым значением и поэтому в простейшем случае проверка корректной работы ПО опирается на факт, что у реально существующего объекта не может быть хендл, равный нулю.
    если известно, хендл чего именно мы ожидаем обнаружить в переменной, иногда доступны функции для более конкретной проверки IsWindow(HWND handle)

    иногда WinAPI возвращает значение INVALID_HANDLE_VALUE и тогда программист проверяет, например, после попытки вызвать CreateFile() что результат отличается от.

    если посмотреть, где/как в обсуждаемом коде используется handle, то можно обнаружить что программа посылает сообщение окну, используя SendMessage(handle ...)

    очевидно, что отправить сообщение несуществующему объекту т.е. окну с указателем на его данные равному 0 не получится, поэтому как простая проверка использована конструкция if (!handle) return;
    при любом отличном от нуля значении handle код продолжит выполняться вниз по тексту, а если по каким-то причинам в переменной 0, то произойдет досрочный возврат из процедуры в вызвавший ее кусок кода.

    просто убрать эту строку проверки нельзя, потому что ниже далее при попытке послать сообщение в NULL программа упадет.

    почему никогда, вроде бы, и не падает - потому что в переменную сохраняется хендл окна hwnd и пока он соответствует открытому существующему окну, ошибка в этом месте кода не возникнет.

    если в программе можно в произвольный момент закрывать окна, то обычно программист предусматривает обнуление и глобальных переменных в программе, если они хранят хендлы этих закрываемых окон.
    потому что после закрытия окна попытка отправить ему сообщения, пользуясь сохраненной копией хендла, приведет к обрушению программы.
     
  9. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    171
    Это индекс(зачеркнуто)смещение от начала в таблице указателей на структуры
    --- Сообщение объединено, 14 апр 2025 в 03:42 ---
    +окно может быть закрыто сторонней программой или же просто значение в глобальной переменной может быть затерто при повторном вызове функции до окончания предыдущей нити.
     
    miilalex нравится это.
  10. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    201
    > хэндл (и переменная handle и тип данных) в конкретном куске кода и в винде вообще - это некий указатель

    Да что угодно, только вы это дескриптором не назовите :sarcastic:
     
    miilalex нравится это.
  11. snezhokusr

    snezhokusr New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2025
    Сообщения:
    10
    Если я понял намек то ошибка может возникать при выполнении
    функции BOOL OpenPort(int port,int baud,int HwFc, HWND hwnd)

    Но передавая ей некорректные параметры, например, несуществующий номер порта
    или левую скорость передачи - все равно условие if (!handle) return; не выполняется.
    Как на практике воспроизвести этот переход?
     
  12. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    171
    А причем тут проверка BOOL OpenPort(int port,int baud,int HwFc, HWND hwnd) этих параметров, когда выделен BOOL OpenPort(int port,int baud,int HwFc, HWND hwnd) только последний. Или такой намек не понятен?
     
    miilalex нравится это.
  13. miilalex

    miilalex New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2024
    Сообщения:
    11
    не понятен:blush2:
    мне коллега напомнил меня же, только много лет назад, когда я все передачи параметров делал через глобальные переменные и тогда еще в DOS среде, а буковки эти в заголовке функций только мешались :crazy:

    тут мне кажется всё же можно спровоцировать незапись в handle значения hwnd, потому что это копирование происходит в конце функции, если предыдущие действия были выполнены без ошибок.
    а поскольку инициализируется handle значением NULL, то покувыркавшись с остальными параметрами, если заставить OpenPort завершиться на пол-пути, то можно достичь таки нуля в handle.

    другой вопрос, что тогда и программа не должна лезть немытыми руками в неоткрытый порт.
    --- Сообщение объединено, 14 апр 2025 в 18:09 ---
    если эту функцию приложение вызывает с валидным hwnd и выполнение доходит до последней строки функции, там hwnd сохраняется в handle и тем самым handle перестает быть NULL.
    поэтому дальнейшие проверки значения этой переменной не ведут к срабатыванию if

    если прям очень хочется пронаблюдать как выполнится return при проверке условия, можно отладчиком обнулить handle ручками, после открытия порта, либо закомментировать строку handle = hwnd в обсуждаемой функции и скомпилировать этот неработающий вариант.

    рационального ответа на вопрос зачем у меня нет, но попробовать почему бы и нет?
     
  14. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    171
    Только вызов функции запуска треда находится после записи в глобальную переменную. А проверка находится именно в функции этого треда. Поэтому сложно получить handle = hwnd = NULL и выпасть на if (!handle), если явно не передать BOOL OpenPort(int port,int baud,int HwFc, HWND hwnd) в последнем параметре NULL.

    А вот получить конфликт в глобальных переменных проще простого. Для этого достаточно for (int i = 0; i < 2; ++i) OpenPort(..., ..., ..., NULL);

    Достаточно вызвать OpenPort и передать NULL в последнем параметре. Это не контролируется ни где до функции нити.
     
    miilalex нравится это.
  15. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    216
    Если аффтару хочется чтобы логика исходного кода сохранялась

    Вместо:
    Код (Text):
    1. if (!handle)
    2.     return;
    Пишем:
    Код (Text):
    1. if (handle)
    2.     {
    3.  
    4. }
    В фигурные скобочки засовываем:
    Код (Text):
    1. for ( ; ; )
    2.     {
    3.       // check for chars from port or kbd:
    4.       if (ReadFile(SerialPort,&buf,255,(LPDWORD)&Cnt,NULL) && Cnt)
    5.         {
    6.           // signal main thread
    7.           SendMessage(handle,MESS_SERIAL,(unsigned int)Cnt,(unsigned long)buf);
    8.         }
    9.       else
    10.         Sleep(50);
    11.  
    12.       if (StopThread)
    13.         break;
    14.     }
    И потом как в исходном примере:
    Код (Text):
    1.  
    2. return 0;
    3. }
    4.  
     
    Последнее редактирование: 14 апр 2025 в 21:45