Вопрос о синтаксисе C ++ - PullRequest
4 голосов
/ 06 июля 2011

Я работаю над программой обмена файлами на основе UDP.Позвольте мне опубликовать пример кода перед тем, как объяснить проблему.

while (true) 
{
    Data toRecv;
    int bytesRead = recvfrom(s->_UPDsock, (char*)&toRecv, sizeof(toRecv), 0,(SOCKADDR*)&remoteAddress, &remoteAddresslength);
    if(bytesRead > 0)
    {
        string temp(toRecv.chunk,(bytesRead-sizeof(int)));
        if(!checker)
        {
            //total packet amount.
            totalChunkAmount = toRecv.ACK;
            checker = true;
        }
    }
}

Как вы можете видеть в строке "13", я инициализирую totalChunkAmount, используя переменную, полученную из функции recvFrom UDP.Мне нужно инициализировать это значение только ОДИН РАЗ, поэтому я использую его в проверке bool if().и после инициализации я переворачиваю значение bool на true, чтобы оно не было инициализировано снова.Есть ли другой способ добиться того же результата, но не используя уродливый bool метод переключения.

Ответы [ 5 ]

2 голосов
/ 06 июля 2011

Установите totalChunkAmount в недопустимое состояние перед его инициализацией и проверьте это состояние. Например, если totalChunkAmount является int, тогда

totalChunkAmount = -1; // say -1 is invalid value
while(true)
{
 ...
 if(-1 == totalChunkAmount)
   totalChunkAmount = toRecv.ACK; // ACK can never be -1
}

Аналогично, если totalChunkAmount является указателем, вы можете установить его на NULL (0).

[Edit Note: Мне просто интересно, в вашем цикле while вы в основном инициализируете переменную, тогда почему бы после этого ваш break не вышел из цикла? Если вы можете это сделать, это намного чище, и такие проверки не нужны.]

1 голос
/ 06 июля 2011
totalChunkAmount = totalChunkAmount == [uninitialized_value_here] ? toRecv.ACK : totalChunkAmount;
0 голосов
/ 07 июля 2011

Элегантное решение - использовать boost :: необязательный <>. Он идеально подходит для таких случаев и довольно легкий. Если вы не можете или не хотите использовать boost ::, вы можете довольно легко написать свой собственный подобный класс.

0 голосов
/ 06 июля 2011

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

Единственное изменение, которое я хотел бы сделать, - переименовать безликое bool checker в bool totalChunkAmountInitialized.

0 голосов
/ 06 июля 2011

Единственное, что я могу придумать, было бы инициализировать totalChunkAmount равным -1 (или некоторому другому значению, не относящемуся к реальному миру), а затем проверить это (избегая дополнительного объявления bool).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...