C++ Вопрос Проверка

Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
360
Реакции[?]
21
Поинты[?]
0
Всем привет, такой вопрос.
Как сделать несколько ветвлений и в зависимости от ситуации возвращать то или иное значение ?( true или false)

Ветвления это - if,else я так понимаю.

Вот код:


C++:
bool ProcessPacket(int index, Packet packettype) {
    switch(packettype) {
    case P_ChatMessage:
    {
        int msg_size;
        recv(Connections[index], (char*)&msg_size, sizeof(int), NULL);
        char *msg = new char[msg_size + 1];
        msg[msg_size] = '\0';
        recv(Connections[index], msg, msg_size, NULL);
        for(int i = 0; i < Counter; i++) {
            if(i == index) {
                continue;
            }

            Packet msgtype = P_ChatMessage;
            send(Connections[i], (char*)&msgtype, sizeof(Packet), NULL);
            send(Connections[i], (char*)&msg_size, sizeof(int), NULL);
            send(Connections[i], msg, msg_size, NULL);
        }
        delete[] msg;
        break;
    }
    default:
        std::cout << "Unrecognized packet: " << packettype << std::endl;
        break;
    }

    return true;
}
 
Пользователь
Статус
Оффлайн
Регистрация
23 Авг 2020
Сообщения
77
Реакции[?]
157
Поинты[?]
56K
не совсем понял, где планируется несколько ветвлений
если вы про переменную packettype (это же перечисление?), то лучше добавить метки на все варианты (это лучше, чем много раз использовать if-else)
чтобы возвращать нужное значение, можно завести логическую переменную, и в конце каждого блока case выставить нужное значение зависимости от логики

C++:
bool ProcessPacket(int index, Packet packettype) {
    bool YourResult = false;
    switch(packettype) {
    case P_ChatMessage:
    {
        //...
        YourResult = true;
        break;
    }
    case метка2:
    {
        //...
        YourResult = false;//можно не присваивать false заново, т.к.инициализировали переменную как false, но для упрощения разбирания потом пусть будет
        break;
    }
    //и так по всем возможным значениям Packet
    default:
        std::cout << "Unrecognized packet: " << packettype << std::endl;
        YourResult = false;
        break;
    }
    return YourResult;
}
если же речь шла про ветвления внутри блока case P_ChatMessage, то в принципе логика такая же, только устанавливаете переменную в нужном месте
 
Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
360
Реакции[?]
21
Поинты[?]
0
не совсем понял, где планируется несколько ветвлений
если вы про переменную packettype (это же перечисление?), то лучше добавить метки на все варианты (это лучше, чем много раз использовать if-else)
чтобы возвращать нужное значение, можно завести логическую переменную, и в конце каждого блока case выставить нужное значение зависимости от логики

C++:
bool ProcessPacket(int index, Packet packettype) {
    bool YourResult = false;
    switch(packettype) {
    case P_ChatMessage:
    {
        //...
        YourResult = true;
        break;
    }
    case метка2:
    {
        //...
        YourResult = false;//можно не присваивать false заново, т.к.инициализировали переменную как false, но для упрощения разбирания потом пусть будет
        break;
    }
    //и так по всем возможным значениям Packet
    default:
        std::cout << "Unrecognized packet: " << packettype << std::endl;
        YourResult = false;
        break;
    }
    return YourResult;
}
если же речь шла про ветвления внутри блока case P_ChatMessage, то в принципе логика такая же, только устанавливаете переменную в нужном месте
Ок, а что можно дописать в case 2? Как улучшить данный код в принципе
 
Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
360
Реакции[?]
21
Поинты[?]
0
необязательно case 2 использовать, можно и просто дефолт
Ну у меня ограничение на том что только true , а нужно что мы было ещё false, ток я хз нужно ли реально его делать, по идее да
необязательно case 2 использовать, можно и просто дефолт
Наверное так и сделаю в default запихну false, а в case true
 
Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
360
Реакции[?]
21
Поинты[?]
0
не совсем понял, где планируется несколько ветвлений
если вы про переменную packettype (это же перечисление?), то лучше добавить метки на все варианты (это лучше, чем много раз использовать if-else)
чтобы возвращать нужное значение, можно завести логическую переменную, и в конце каждого блока case выставить нужное значение зависимости от логики

C++:
bool ProcessPacket(int index, Packet packettype) {
    bool YourResult = false;
    switch(packettype) {
    case P_ChatMessage:
    {
        //...
        YourResult = true;
        break;
    }
    case метка2:
    {
        //...
        YourResult = false;//можно не присваивать false заново, т.к.инициализировали переменную как false, но для упрощения разбирания потом пусть будет
        break;
    }
    //и так по всем возможным значениям Packet
    default:
        std::cout << "Unrecognized packet: " << packettype << std::endl;
        YourResult = false;
        break;
    }
    return YourResult;
}
если же речь шла про ветвления внутри блока case P_ChatMessage, то в принципе логика такая же, только устанавливаете переменную в нужном месте
а вот, бля забыл добавить короче к коду.


C++:
void ClientHandler(int index) {  
    Packet packettype;
    while(true) {
        recv(Connections[index], (char*)&packettype, sizeof(Packet), NULL);

        if(!ProcessPacket(index, packettype)) {
            break;
        }
    }
    closesocket(Connections[index]);
}
Вот вопрос вернулся, как в зависимости от ситуации выполнять значение true или false?

что мне нужно писать в ClientHandler в while(false) получается?
 
Пользователь
Статус
Оффлайн
Регистрация
23 Авг 2020
Сообщения
77
Реакции[?]
157
Поинты[?]
56K
а вот, бля забыл добавить короче к коду.


C++:
void ClientHandler(int index) {
    Packet packettype;
    while(true) {
        recv(Connections[index], (char*)&packettype, sizeof(Packet), NULL);

        if(!ProcessPacket(index, packettype)) {
            break;
        }
    }
    closesocket(Connections[index]);
}
Вот вопрос вернулся, как в зависимости от ситуации выполнять значение true или false?

что мне нужно писать в ClientHandler в while(false) получается?
смотри
как оно работает сейчас:
у тебя условно бесконечный цикл в обработчике( while(true) ). внутри цикла вызывается какая-то функция recv, в ней скорее всего устанавливается packettype. а потом ты эту переменную передаешь функции ProcessPacket. она возвращает логическое значение,и оно обрабатывается в
C++:
if(!ProcessPacket(index, packettype)) {
            break;
        }
т.е.если ProcessPacket вернула true, то цикл еще раз повторяется (записать тип пакета, обработать, и так до тех пор, пока (тут могу только гадать) не обработаешь все входящие по соединению пакеты), а если вернула false, то цикл прерываем break-ом.

то есть оно по сути уже обрабатывает оба варианта возвращаемого значения, так шо на добавлять обработку false ИМХО не надо

надеюсь правильно понял, чего ты хотел


UPD.
если же ты еще хотел чего-то в цикл обработки возвращаемого значения добавить, можно так например
C++:
while(true) {
        recv(Connections[index], (char*)&packettype, sizeof(Packet), NULL);

        if(ProcessPacket(index, packettype)) {
            //обработка при возвращенном true
        }
        else{
            //дополнительная обработка false перед выходом из бесконечного цикла
            break;
        }
    }
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
360
Реакции[?]
21
Поинты[?]
0
смотри
как оно работает сейчас:
у тебя условно бесконечный цикл в обработчике( while(true) ). внутри цикла вызывается какая-то функция recv, в ней скорее всего устанавливается packettype. а потом ты эту переменную передаешь функции ProcessPacket. она возвращает логическое значение,и оно обрабатывается в
C++:
if(!ProcessPacket(index, packettype)) {
            break;
        }
т.е.если ProcessPacket вернула true, то цикл еще раз повторяется (записать тип пакета, обработать, и так до тех пор, пока (тут могу только гадать) не обработаешь все входящие по соединению пакеты), а если вернула false, то цикл прерываем break-ом.

то есть оно по сути уже обрабатывает оба варианта возвращаемого значения, так шо на добавлять обработку false ИМХО не надо

надеюсь правильно понял, чего ты хотел


UPD.
если же ты еще хотел чего-то в цикл обработки возвращаемого значения добавить, можно так например
C++:
while(true) {
        recv(Connections[index], (char*)&packettype, sizeof(Packet), NULL);

        if(ProcessPacket(index, packettype)) {
            //обработка при возвращенном true
        }
        else{
            //дополнительная обработка false перед выходом из бесконечного цикла
            break;
        }
    }
Спасибо большое
 
Участник
Статус
Оффлайн
Регистрация
26 Апр 2018
Сообщения
851
Реакции[?]
181
Поинты[?]
0
Всем привет, такой вопрос.
Как сделать несколько ветвлений и в зависимости от ситуации возвращать то или иное значение ?( true или false)

Ветвления это - if,else я так понимаю.

Вот код:


C++:
bool ProcessPacket(int index, Packet packettype) {
    switch(packettype) {
    case P_ChatMessage:
    {
        int msg_size;
        recv(Connections[index], (char*)&msg_size, sizeof(int), NULL);
        char *msg = new char[msg_size + 1];
        msg[msg_size] = '\0';
        recv(Connections[index], msg, msg_size, NULL);
        for(int i = 0; i < Counter; i++) {
            if(i == index) {
                continue;
            }

            Packet msgtype = P_ChatMessage;
            send(Connections[i], (char*)&msgtype, sizeof(Packet), NULL);
            send(Connections[i], (char*)&msg_size, sizeof(int), NULL);
            send(Connections[i], msg, msg_size, NULL);
        }
        delete[] msg;
        break;
    }
    default:
        std::cout << "Unrecognized packet: " << packettype << std::endl;
        break;
    }

    return true;
}
за такое можно и с ноги по одному место получить даже от джуна

switch(packettype) {
case P_ChatMessage:
все в порядке? сначала делаем свич а внутри кейс что за бред. Просто еще раз перечитай или посмотри ролик на томже ютубе что такое свич и почему нельля использовать кейс
 
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
за такое можно и с ноги по одному место получить даже от джуна

switch(packettype) {
case P_ChatMessage:
все в порядке? сначала делаем свич а внутри кейс что за бред. Просто еще раз перечитай или посмотри ролик на томже ютубе что такое свич и почему нельля использовать кейс
И что не так с ним?
C++:
switch(expression) {
  case x:
    // code block
    break;
  case y:
    // code block
    break;
  default:
    // code block
}
 
Участник
Статус
Оффлайн
Регистрация
26 Апр 2018
Сообщения
851
Реакции[?]
181
Поинты[?]
0
И что не так с ним?
C++:
switch(expression) {
  case x:
    // code block
    break;
  case y:
    // code block
    break;
  default:
    // code block
}
Вот в чем не так с ним! + к всему перегружать код этим перечислением бред полный. Есть намного лучшее решение. Дано уже в паблике разжёвано.
Как сделать несколько ветвлений и в зависимости от ситуации возвращать то или иное значение ?
 
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Вот в чем не так с ним! + к всему перегружать код этим перечислением бред полный. Есть намного лучшее решение. Дано уже в паблике разжёвано.
Как сделать несколько ветвлений и в зависимости от ситуации возвращать то или иное значение ?
Ну так тогда помоги человеку. В чем проблема то?
 
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Если после switch-а не будет обязательных для выполнения операций, то можно воспользоваться прекрасным свойством return для досрочного выхода из функции:
C++:
bool ProcessPacket(int index) {
    switch(index) {
    case 0:
        // do sth
        return true;
    case 1:
        // do sth 2
        return false;
    default:
        // do sth 3
        return false;
    }
}
 
Начинающий
Статус
Оффлайн
Регистрация
22 Дек 2018
Сообщения
360
Реакции[?]
21
Поинты[?]
0
Если после switch-а не будет обязательных для выполнения операций, то можно воспользоваться прекрасным свойством return для досрочного выхода из функции:
C++:
bool ProcessPacket(int index) {
    switch(index) {
    case 0:
        // do sth
        return true;
    case 1:
        // do sth 2
        return false;
    default:
        // do sth 3
        return false;
    }
}
Спасибо, буду знать
 
Сверху Снизу