Убрать warning (return VALUE)

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

  1. snezhokusr

    snezhokusr New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2025
    Сообщения:
    9
    Уважаемые гуру программинга, прошу помочь.
    Есть взятый с одного проекта код, в котором компилятор ругается на строчку
    Код (C++):
    1. if (!handle)
    2.  return;
    выдаёт 2 предупреждения:
    Serial.c(273) : warning C4033: 'ThreadProc' must return a value
    Serial.c(290) : warning C4715: 'ThreadProc' : not all control paths return a value

    Насколько я понял, недостаточно return, а должен быть return с каким-то значением.
    Вопрос - С КАКИМ?

    Полный кусок кода.
    Код (C++):
    1. /**
    2.    Internal thread procedure function.  Polls the serial port for received characters,
    3.    and sends a MESS_SERIAL message when characters are received.
    4.  */
    5. DWORD WINAPI ThreadProc(void *p)
    6. {
    7.   int Cnt;
    8.   char buf[256];
    9.   // read serial port, signal any chars found
    10.  
    11.   if (!handle)
    12.     return;
    13.  
    14.   for ( ; ; )
    15.     {
    16.       // check for chars from port or kbd:
    17.       if (ReadFile(SerialPort,&buf,255,(LPDWORD)&Cnt,NULL) && Cnt)
    18.         {
    19.           // signal main thread
    20.           SendMessage(handle,MESS_SERIAL,(unsigned int)Cnt,(unsigned long)buf);
    21.         }
    22.       else
    23.         Sleep(50);
    24.    
    25.       if (StopThread)
    26.         break;
    27.     }
    28.   return 0;
    29. }
     
  2. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    569
    0 = OK
    иное - ошибrи
     
  3. snezhokusr

    snezhokusr New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2025
    Сообщения:
    9
    Спасибо.
    А для случая if (!handle) return;
    что нужно вписать, я не понимаю что должно стать результатом проверки if (!handle)
    ок или ошибка. Если представленной функции мало, могу весь исходник кинуть.
     
  4. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    547
    Этот случай - ошибка. Можно вернуть 1 например. Это значение потом в коде который поток запустил и в какой то момент должен дождаться его завершения и тогда он получить может этот результат.
    Почти наверняка в коде этот результат не получается и не используется, но если используется, то тогда значение 1 можно использовать для определения что фейл произошёл именно на той строке.
     
  5. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    193
    Возвращаемое из функции значение в данном случае зависит от caller'а, который вызывает функцию. Нельзя просто вернуть нули, будет ошибка.
     
  6. snezhokusr

    snezhokusr New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2025
    Сообщения:
    9
    Весь код этого файла.
    Исходя из этого можно понять, какое значение нужно вписать после return.
    Код (C++):
    1. /**
    2.   @file Serial.c This file implements a serial interface to Win32.
    3.   @defgroup serial Serial Interface
    4.   @section intro Introduction
    5.   This file implements a serial port connection in Win32.  It uses direct calls to the OS,
    6.   which makes it quite simple to understand and maintain.
    7.   Beware that the Win32 serial interface is somewhat broken, and that some of the code may seem
    8.   unnecessary.  In particular, GetCommState() does not initialize the DCB structure correctly.
    9.   So be careful to not delete any "unnecessary" code.
    10.  
    11.   @section using Using Serial.c as a General-Purpose Serial Port
    12.   You can use this file without the terminal application as a serial port driver under windows.
    13.   The interface is simple to use, involving just a few basic functions, in this order:
    14.   - OpenPort()
    15.   - PutSerialChar()
    16.   - SerialIsChar()
    17.   - SerialGetChar()
    18.   - CloseSerialPort()
    19.   If you create a Win32 program using this interface, it will be easier to simply pass the handle
    20.   of your main window to OpenPort, and then your main window will receive MESS_SERIAL messages
    21.   every time incoming characters are availble.  All you have to do is handle the MESS_SERIAL
    22.   message.  See the NewTerm application for details.  As a Win32 app, you would not need to call
    23.   SerialGetChar() directly.
    24.   Note that this implementation only allows one open serial port at a time.  Having multiple serial
    25.   ports open at once is left as an excerise to the reader.
    26.   @{
    27.  */
    28. #include "Serial.h"
    29. // Functions:
    30. HANDLE StartCommThread(void);
    31. DWORD WINAPI ThreadProc(void *p);
    32. // Variables:
    33. HANDLE SerialPort=NULL;  ///< Handle of SerialPort itself.
    34. HANDLE Thread;           ///< Handle to the Rx thread.
    35. HWND handle=NULL;        ///< Handle to window that receives MESS_SERIAL messages.
    36. int StopThread=0;        ///< Flag: set to non-zero to stop the Rx thread.
    37. int FlowControl=0;       ///< Flag: is hardware flow-control active?
    38. /**
    39.    Displays any error messages. Includes descriptive text, not just an error number.
    40.  */
    41. void ShowLastError(void)
    42. {
    43.   LPVOID lpMsgBuf;
    44.   int err = GetLastError();
    45.   FormatMessage(
    46.                 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    47.                 NULL,
    48.                 err,
    49.                 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    50.                 (LPTSTR) &lpMsgBuf,
    51.                 0,
    52.                 NULL
    53.                 );
    54.   // Display the string.
    55.   MessageBox( NULL, lpMsgBuf, "Error", MB_OK|MB_ICONINFORMATION );
    56.   // Free the buffer.
    57.   LocalFree( lpMsgBuf );
    58. }
    59. /**
    60.    Opens the COMM Port.
    61.    @param port Port number.  COMM1 = 1, COMM2 = 2, etc.
    62.    @param baud Baud rate, in BPS.  Commonly 9600, 38400, etc.
    63.    @param HwFc Set to non-zero to use hardware flow-control, or zero
    64.    for no flow control.
    65.    @param hwnd Window handle to recieve MESS_SERIAL messages.  If set to NULL,
    66.    you can still get characters using SerialGetChar().
    67.    [USER=25951]Return[/USER] TRUE if port was opened, FALSE if opening failed.
    68.  */
    69. BOOL OpenPort(int port,int baud,int HwFc, HWND hwnd)
    70. {
    71.   HANDLE Comport;
    72.   DCB myDCB;
    73.   COMMTIMEOUTS CTout;
    74.   char str[100];
    75.   FlowControl = HwFc;
    76.   // Open the serial port
    77.   if (port > 9)
    78.     sprintf(str,"\\\\.\\COM%d",port);
    79.   else
    80.     sprintf(str,"COM%d",port);
    81.   Comport = CreateFile(str,GENERIC_READ|GENERIC_WRITE,0,
    82.                        NULL,OPEN_EXISTING,0,NULL);
    83.   if (Comport == INVALID_HANDLE_VALUE)
    84.     return FALSE;
    85.   // Configure Serial port (Setup Comm)
    86.   if (!SetupComm(Comport,350,20)) // Buffer sizes
    87.     return FALSE;
    88.   // setup DCB using current values
    89.   if (!GetCommState(Comport,&myDCB))
    90.     return FALSE;
    91.   myDCB.fInX = FALSE;     // Turn off xon/xoff handler
    92.   myDCB.fOutX = FALSE;
    93.   myDCB.fOutxDsrFlow = FALSE;
    94.   if (HwFc)       // no flow control
    95.     {
    96.       myDCB.fOutxCtsFlow = TRUE;     // no hardware flow control.
    97.       myDCB.fRtsControl = RTS_CONTROL_HANDSHAKE;
    98.     }
    99.   else
    100.     {
    101.       myDCB.fOutxCtsFlow = FALSE;    // no hardware flow control.
    102.     }
    103.   myDCB.BaudRate = baud;
    104.   myDCB.DCBlength = sizeof(DCB);
    105.   myDCB.fBinary = 1;
    106.   myDCB.fParity = 0;
    107.   myDCB.fDtrControl = DTR_CONTROL_DISABLE;
    108.   myDCB.fDsrSensitivity = 0;
    109.   myDCB.fTXContinueOnXoff = 1;
    110.   myDCB.fNull = 0;
    111.   myDCB.fRtsControl = RTS_CONTROL_DISABLE;
    112.   myDCB.fDummy2 = 0;
    113.   myDCB.wReserved = 0;
    114.   myDCB.Parity = NOPARITY;
    115.   myDCB.StopBits = ONESTOPBIT;
    116.   myDCB.wReserved1 = 0;
    117.   myDCB.ByteSize = 8;
    118.   if (!SetCommState(Comport,&myDCB))
    119.     {
    120.       ShowLastError();
    121.       return FALSE;
    122.     }
    123.         // Set timeouts
    124.   CTout.ReadIntervalTimeout = 0xffffffff;
    125.   CTout.ReadTotalTimeoutMultiplier = 0;
    126.   CTout.ReadTotalTimeoutConstant = 0;
    127.   CTout.WriteTotalTimeoutMultiplier = 0;
    128.   CTout.WriteTotalTimeoutConstant = 5000;         // don't hang if CTS is locked, for example
    129.   SetCommTimeouts(Comport,&CTout);
    130.   EscapeCommFunction(Comport,SETDTR);
    131.   PurgeComm(Comport,PURGE_TXCLEAR | PURGE_RXCLEAR);
    132.   handle = hwnd;
    133.   SerialPort = Comport;
    134.   StartCommThread();
    135.   return TRUE;
    136. }
    137. /**
    138.    Closes the serial port.  Stops the Rx thread.
    139. */
    140. void CloseSerialPort(void)
    141. {
    142.   if (!SerialPort) return;
    143.   if (Thread)
    144.     {
    145.       StopThread = TRUE;
    146.       WaitForSingleObject(Thread,2000);
    147.       CloseHandle(Thread);
    148.       Thread = NULL;
    149.       StopThread = FALSE;             // reset for next time
    150.     }
    151.   PurgeComm(SerialPort,PURGE_TXCLEAR | PURGE_RXCLEAR);
    152.   CloseHandle(SerialPort);
    153.   SerialPort = NULL;
    154. }
    155. /**
    156.    Puts a serial character out the serial port.  This assumes that the port
    157.    is already opened.
    158.    @param c Character to send.
    159.  */
    160. void PutSerialChar(int c)
    161. {
    162.   int Cnt;
    163.   DWORD ModemStat;
    164.   DWORD ticks;
    165.   int Cts=1;
    166.   ticks = GetTickCount();
    167.   // check for flow control
    168.   if (FlowControl)
    169.     {
    170.       while (Cts)
    171.         {
    172.           if (!GetCommModemStatus(SerialPort, &ModemStat))
    173.             {
    174.               ShowLastError();
    175.               return;
    176.             }
    177.           Cts = !(ModemStat & MS_CTS_ON);
    178.           // timeout after 3 seconds
    179.           if (GetTickCount() > ticks + 1000)
    180.             break;
    181.         }
    182.     }
    183.   WriteFile(SerialPort,&c,1,(LPDWORD)&Cnt,NULL);
    184. }
    185. /**
    186.    Internal function to start the Rx thread.
    187.    [USER=25951]Return[/USER] Handle to new thread.
    188.  */
    189. HANDLE StartCommThread(void)
    190. {
    191.   int ThreadID;
    192.   StopThread = FALSE;
    193.   Thread = CreateThread(NULL,4096,ThreadProc,SerialPort,0,(LPDWORD)&ThreadID);
    194.   return Thread;
    195. }
    196. /**
    197.    Internal thread procedure function.  Polls the serial port for received characters,
    198.    and sends a MESS_SERIAL message when characters are received.
    199.  */
    200. DWORD WINAPI ThreadProc(void *p)
    201. {
    202.   int Cnt;
    203.   char buf[256];
    204.   // read serial port, signal any chars found
    205.  
    206.   if (!handle)
    207.     return;
    208.  
    209.   for(; ;  )
    210.     {
    211.       // check for chars from port or kbd:
    212.       if (ReadFile(SerialPort,&buf,255,(LPDWORD)&Cnt,NULL) && Cnt)
    213.         {
    214.           // signal main thread
    215.           SendMessage(handle,MESS_SERIAL,(unsigned int)Cnt,(unsigned long)buf);
    216.         }
    217.       else
    218.         Sleep(50);
    219.    
    220.       if (StopThread)
    221.         break;
    222.     }
    223.   return 0;
    224. }
    225. /**
    226.    Query function used to determine if serial port is open.
    227.    [USER=25951]Return[/USER] TRUE if serial port has been successfully opened, or FALSE otherwise.
    228.  */
    229. int SerialPortIsOpen(void)
    230. {
    231.   if (SerialPort)
    232.     return TRUE;
    233.   return FALSE;
    234. }
    235. /**
    236.    Query function used to determine if there are serial characters available.
    237.    This function is only needed if the handle parameter to OpenPort() was NULL.
    238.    [USER=25951]Return[/USER] TRUE if there are one or more characters in the serial input buffer,
    239.    FALSE if no characters are available.
    240.  */
    241. BOOL SerialIsChar(void)
    242. {
    243.   int Cnt,Avail,Remain;
    244.   int buf;
    245. /////  char str[100];
    246.   PeekNamedPipe(SerialPort, (LPVOID)&buf, (DWORD) 1, (LPDWORD)&Cnt,(LPDWORD)&Avail, (LPDWORD)&Remain);
    247.   if (Avail)
    248.     return TRUE;
    249.   return FALSE;
    250. }
    251. /**
    252.    Returns a character from the serial port buffer.  This function assumes that the port has
    253.    been already opened, and that characters have been detected with SerialIsChar().
    254.    [USER=25951]Return[/USER] Character from serial port, or EOF on error.
    255.  */
    256. int SerialGetChar(void)
    257. {
    258.   char ch;
    259.   int Cnt;
    260.   if (!SerialPort)
    261.     return EOF;
    262.   ReadFile(SerialPort,&ch,1,(LPDWORD)&Cnt,NULL);
    263.   if (!Cnt)
    264.     return EOF;
    265.   return (int) ch;
    266. }
     
  7. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    547
    Код выхода потока не проверяется в этом коде, поэтому возвращать можно что угодно.
     
  8. snezhokusr

    snezhokusr New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2025
    Сообщения:
    9
    Как вы это определили, как должна выглядеть проверка возвращаемого значения?
    я скинул полный файл, но это не единственный сишный файл.
    Может в других файлах производится проверка.
     
  9. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    547
    Там где WaitForSingleObject это место где он ждёт когда поток завершится. Здесь единственное место где он мог бы проверить на возвращаемый из потока код, но ничего такого там нет.
     
  10. snezhokusr

    snezhokusr New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2025
    Сообщения:
    9
    Вы про функцию CloseSerialPort?

    Так зачем эта строка
    if (!handle) return;
    может её закоментировать/удалить из кода вообще?
     
  11. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.029
    Гуглишь CreateThread, в нем находишь прототип ThreadProc, и там же сказано какими апями это возвращаемое значение может использоваться. У тебя хендл треда, возвращаемый StartCommThread, не присваивается ничему и скорей всего на этот тред остальному коду по барабану.
     
    M0rg0t нравится это.
  12. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    355
    Код (C++):
    1. /**
    2. Internal thread procedure function. Polls the serial port for received characters,
    3. and sends a MESS_SERIAL message when characters are received.
    4. */
    5. DWORD WINAPI ThreadProc(void *p)
    6. {
    7.     int Cnt;
    8.     char buf[256];
    9.     // read serial port, signal any chars found
    10.  
    11.     if (!handle)
    12.         return 1;  // Return error code when handle is NULL
    13.  
    14.     for ( ; ; )
    15.     {
    16.         // check for chars from port or kbd:
    17.         if (ReadFile(SerialPort,&buf,255,(LPDWORD)&Cnt,NULL) && Cnt)
    18.         {
    19.             // signal main thread
    20.             SendMessage(handle,MESS_SERIAL,(unsigned int)Cnt,(unsigned long)buf);
    21.         }
    22.         else
    23.             Sleep(50);
    24.  
    25.         if (StopThread)
    26.             break;
    27.     }
    28.     return 0;
    29. }
    Единственное изменение - добавление значения 1 после return в строке проверки handle.
     
    snezhokusr нравится это.
  13. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    193
    snezhokusr

    Используйте тэги, тут их довольно мощная штука, можно и интегралы всякие вставлять.
     
  14. snezhokusr

    snezhokusr New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2025
    Сообщения:
    9
    Спасибо за вразумительный ответ!

    А можете пояснить в каком случае эта ошибка может возникать?
    Код (C++):
    1.   if (!handle)
    2.   {
    3.     MessageBox(NULL,"Error handle","TEST",MB_OK|MB_ICONINFORMATION);
    4.     return 1;
    5.   }
    Я вставил рядом с return вывод сообщения и пытался получить ошибку открывая/закрывая СОМ-порт, потом указывал номер несуществующего порта.... Но ни разу сообщение не вывелось, то есть ни разу не удалось получить условия когда хендл = 0, чтобы я не делал.
     
  15. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    547
    Ну тут вам, батенька, надо просто грызть гранит программирования дольше и упорнее - в этом смысле программы открытая книга - видите название переменной - идите и смотрите какого она заявлена типа и что в неё присваивается.
    Это как представьте вы бы на форуме изучения иностранного языка зарегистрировались бы и начали там спрашивать как переводятся разные слова, хотя все переводчики под рукой.
    Тут просто надо вникать в программирование.
     
  16. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    355
    дальше платно :acute:
     
  17. snezhokusr

    snezhokusr New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2025
    Сообщения:
    9
    Ух, бизнесмен.... )))

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

    Может ваще // if (!handle) return 1;
    закомментировать как ненужный код?
     
  18. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    569
    можно весь код закменитровать тогда ниче вааще никогда не упадет!
     
    MaKsIm, Research и Mikl___ нравится это.
  19. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    165
    int main() { return 0; } придется все же оставить
     
  20. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    569
    спорно спорно :)