• Я зарабатываю 100 000 RUB / месяц на этом сайте!

    А знаешь как? Я всего-лишь публикую (создаю темы), а админ мне платит. Трачу деньги на мороженое, робуксы и сервера в Minecraft. А ещё на паль из Китая. 

    Хочешь так же? Пиши и узнавай условия: https://t.me/alex_redact
    Реклама: https://t.me/yougame_official

C++ Проверка

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

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

Вот код:


C++:
Expand Collapse Copy
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;
}
 
не совсем понял, где планируется несколько ветвлений
если вы про переменную packettype (это же перечисление?), то лучше добавить метки на все варианты (это лучше, чем много раз использовать if-else)
чтобы возвращать нужное значение, можно завести логическую переменную, и в конце каждого блока case выставить нужное значение зависимости от логики

C++:
Expand Collapse Copy
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, то в принципе логика такая же, только устанавливаете переменную в нужном месте
 
не совсем понял, где планируется несколько ветвлений
если вы про переменную packettype (это же перечисление?), то лучше добавить метки на все варианты (это лучше, чем много раз использовать if-else)
чтобы возвращать нужное значение, можно завести логическую переменную, и в конце каждого блока case выставить нужное значение зависимости от логики

C++:
Expand Collapse Copy
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? Как улучшить данный код в принципе
 
необязательно case 2 использовать, можно и просто дефолт
Ну у меня ограничение на том что только true , а нужно что мы было ещё false, ток я хз нужно ли реально его делать, по идее да
необязательно case 2 использовать, можно и просто дефолт
Наверное так и сделаю в default запихну false, а в case true
 
не совсем понял, где планируется несколько ветвлений
если вы про переменную packettype (это же перечисление?), то лучше добавить метки на все варианты (это лучше, чем много раз использовать if-else)
чтобы возвращать нужное значение, можно завести логическую переменную, и в конце каждого блока case выставить нужное значение зависимости от логики

C++:
Expand Collapse Copy
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++:
Expand Collapse Copy
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) получается?
 
а вот, бля забыл добавить короче к коду.


C++:
Expand Collapse Copy
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++:
Expand Collapse Copy
if(!ProcessPacket(index, packettype)) {
            break;
        }
т.е.если ProcessPacket вернула true, то цикл еще раз повторяется (записать тип пакета, обработать, и так до тех пор, пока (тут могу только гадать) не обработаешь все входящие по соединению пакеты), а если вернула false, то цикл прерываем break-ом.

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

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


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

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

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

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


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

        if(ProcessPacket(index, packettype)) {
            //обработка при возвращенном true
        }
        else{
            //дополнительная обработка false перед выходом из бесконечного цикла
            break;
        }
    }
Спасибо большое
 
Всем привет, такой вопрос.
Как сделать несколько ветвлений и в зависимости от ситуации возвращать то или иное значение ?( true или false)

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

Вот код:


C++:
Expand Collapse Copy
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:
все в порядке? сначала делаем свич а внутри кейс что за бред. Просто еще раз перечитай или посмотри ролик на томже ютубе что такое свич и почему нельля использовать кейс
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
за такое можно и с ноги по одному место получить даже от джуна

switch(packettype) {
case P_ChatMessage:
все в порядке? сначала делаем свич а внутри кейс что за бред. Просто еще раз перечитай или посмотри ролик на томже ютубе что такое свич и почему нельля использовать кейс
И что не так с ним?
C++:
Expand Collapse Copy
switch(expression) {
  case x:
    // code block
    break;
  case y:
    // code block
    break;
  default:
    // code block
}
 
И что не так с ним?
C++:
Expand Collapse Copy
switch(expression) {
  case x:
    // code block
    break;
  case y:
    // code block
    break;
  default:
    // code block
}
Вот в чем не так с ним! + к всему перегружать код этим перечислением бред полный. Есть намного лучшее решение. Дано уже в паблике разжёвано.
Как сделать несколько ветвлений и в зависимости от ситуации возвращать то или иное значение ?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Вот в чем не так с ним! + к всему перегружать код этим перечислением бред полный. Есть намного лучшее решение. Дано уже в паблике разжёвано.
Как сделать несколько ветвлений и в зависимости от ситуации возвращать то или иное значение ?
Ну так тогда помоги человеку. В чем проблема то?
 
  • Мне нравится
Реакции: dota
Если после switch-а не будет обязательных для выполнения операций, то можно воспользоваться прекрасным свойством return для досрочного выхода из функции:
C++:
Expand Collapse Copy
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;
    }
}
 
Если после switch-а не будет обязательных для выполнения операций, то можно воспользоваться прекрасным свойством return для досрочного выхода из функции:
C++:
Expand Collapse Copy
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;
    }
}
Спасибо, буду знать
 
Назад
Сверху Снизу