Михаил
Кстати, что не так с goto?
Что из-за него может получиться "спагетти-код". Все запутано, код не читабельный
Warox
Кстати, что не так с goto?
а зачем он ?) ему просто нет применения
Алексей
Warox
Циклы)
чем готу лучше чем заранее готовые конструкции циклов ?
Andrii
а зачем он ?) ему просто нет применения
Ну... Если брать Linux Kernel, то, например, освобождение ресурсов в порядке занятия...
Daniil
Ну... Если брать Linux Kernel, то, например, освобождение ресурсов в порядке занятия...
там кстати nvidia выложила исходный код драйверов под linux
Andrii
я не удивлен что сишники балуются этим :)
void * ptr1 = kmalloc(100, GFP_USER); if (ptr1 == NULL) return; void * ptr2 = kmalloc(200, GFP_KERNEL); if (ptr2 == NULL) goto free_1; void * ptr3 = kmalloc(300, GFP_HIGHUSER); if (ptr3 == NULL) goto free_2; // Do something... final: free(ptr3); free_2: free(ptr2); free_1: free(ptr1);
Warox
void * ptr1 = kmalloc(100, GFP_USER); if (ptr1 == NULL) return; void * ptr2 = kmalloc(200, GFP_KERNEL); if (ptr2 == NULL) goto free_1; void * ptr3 = kmalloc(300, GFP_HIGHUSER); if (ptr3 == NULL) goto free_2; // Do something... final: free(ptr3); free_2: free(ptr2); free_1: free(ptr1);
void * ptr1 = kmalloc(100, GFP_USER); if (ptr1 == NULL) return; void * ptr2 = kmalloc(200, GFP_KERNEL); if (ptr2 == NULL) free(ptr1) void * ptr3 = kmalloc(300, GFP_HIGHUSER); if (ptr3 == NULL) free(ptr2) UDP понял в чем фича не эквивалетно
Ol
Как же в каждом если только в деффолте прописано
Так варокс сказал, что в кейсах можно считать только результат, а остальное вынести после свитча. А эта строчка универсальная, я и хотела ее вынести
Kenin
я чего-то не понимаю или что...
Ol
Не настолько же))
Понятно, значит, это невозможно))
Ol
Всем спасибо большое))
Ol
почему?
А как?
Vyacheslav
А как?
почему не вынести ее за кейс?
Andrii
void * ptr1 = kmalloc(100, GFP_USER); if (ptr1 == NULL) return; void * ptr2 = kmalloc(200, GFP_KERNEL); if (ptr2 == NULL) free(ptr1) void * ptr3 = kmalloc(300, GFP_HIGHUSER); if (ptr3 == NULL) free(ptr2) UDP понял в чем фича не эквивалетно
Можно, чисто из принципа, но получается неудобнее. Надо копипастить кучу free в каждой точке, где ты выходишь из метода. Тут хорошее решение, имхо defer из Golang, тогда goto уже не нужен
Ol
почему не вынести ее за кейс?
Пишет "обнаружен недостижимый код"
Vyacheslav
Пишет "обнаружен недостижимый код"
потому что result объявлен внутри свитча, да?)))
Andrii
Куда?
Ну... если ты уверена в том, что код достижимый, то придумай, как его достичь
Ol
потому что result объявлен внутри свитча, да?)))
Сама переменная объявлена до свитча. А вот считается внутри
Warox
Куда?
сразу после скобки кейса ))
Andrii
о5 же это сишная фича введу отсутствия сборщика
Ну.. Linux Kernel, GC неоправданно и дорого... Не говоря о том, что тут выделяется память из трёх разных пулов с разными флагами. Ну и ресурсы могут быть не только память.
Warox
недостежимый код
Warox
недостежимый код
нужно после свича ставить
Ol
нужно после свича ставить
А после свитча он тоже ругается, что резалту не присвоено значение. Он его не видит
Warox
А после свитча он тоже ругается, что резалту не присвоено значение. Он его не видит
присвой результату 0 по умолчанию А в дефолт нада брость исключение так как это неплановое поведение
Ol
Warox
вот так сделай
Kenin
Что такое левостороннее значение в C++?
Vyacheslav
А после свитча он тоже ругается, что резалту не присвоено значение. Он его не видит
при обьявлении переменных присваивай им 0, тоже можно делать через запятую
Andrii
Что такое левостороннее значение в C++?
Выражение, которому можно присвоить значения, может появляться слева от знака равенства
Andrii
Намример, a[5] или *a++
Andrii
А вот a[5] + b[5] уже rvalue
Алексей
вот так сделай
А он так не будет 0 выдавать
Warox
А он так не будет 0 выдавать
нельзя пользоватся переменными(! не свойствами классов, ими можно\) которым не прсвоенно значение
Vyacheslav
А он так не будет 0 выдавать
будет, но переменную все равно нужно инициализировать где-то перед печатью )
Warox
Вопрос спорный. Но в данном случае это не важно
в смысле спорный ? оно не сбилдится и не запуститься в c#))
Ol
Так ей нужен не 0, а результат
А выдает результат!!!
Warox
Так ей нужен не 0, а результат
так резульат посчитается в свиче
Vyacheslav
Так ей нужен не 0, а результат
так он нулем только в случае default-a в остальных там ответ будет а в дефаулте нужно придумать поведение, чтоб не попадать на вывод 0 при неправильном знаке ну или забить. сейчас это не так уж важно
Warox
А выдает результат!!!
потому что нужно бросать исключение в случае когда пользователь вводит фигню или просить ввести еще раз
Алексей
Странный яп. А в плюсах можно.
Warox
Странный яп. А в плюсах можно.
с ++ можно а си ты попробуй и офигей ))
Vyacheslav
Странный яп. А в плюсах можно.
но зачем? посмотреть что было в ячейках памяти при царе горохе? )
Алексей
с ++ можно а си ты попробуй и офигей ))
Расскажи пока Андрей не поразил нас своими познаниями😉
Борисов
Warox
Расскажи пока Андрей не поразил нас своими познаниями😉
давай начнем с другого что будет в с++ в переменной результат если туда не засунуть значение ?
Warox
А что такого с Си ?
в си будет мусор с памяти где переменная появилась тоесть рандомное значение
Алексей
но зачем? посмотреть что было в ячейках памяти при царе горохе? )
Слушай сам привык инициализировать переменные даже если ставлю в cin но главное можно
Warox
Почитаем мусор, иногда кстати прикольно
ну а чем это лучше чем когда тебе компилятор говорит - НЕЛЬЗЯ, присвой что то или не делай так
Vyacheslav
Почитаем мусор, иногда кстати прикольно
прикольно дебажить неинициализированные переменные особенно когда у тебя структурка на десяток полей с указателями и разными типами на борту )))
Warox
Мало ли может мне так надо было😉
нужен рандом - юзай рандом
Vyacheslav
Почитаем мусор, иногда кстати прикольно
и компилятор, кстати, выдаст предупреждение если чо)
Алексей
нужен рандом - юзай рандом
А тут даже рандом запускать не надо😉
Борисов
прикольно дебажить неинициализированные переменные особенно когда у тебя структурка на десяток полей с указателями и разными типами на борту )))
Это было прикольно, когда надо было написать драйвер виртуального com порта под Win и в одном месте я забыл проиниализировать переменную
Борисов
И очень забавно - работает, работает, а потом в синий экран )) Хотя на тот момент забавным не казалось 😆