• Что должна вернуть функция NULL, если ничего не найдено?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Так... давай-ка немного поправим твое понимание предмета.

    В С/С++ существует такой тип даных, как указатель на данные. Его синтаксис выглядит так:
    int* value;

    Запись буквально означает что 'value' у нас будет хранить адрес на область данных с предположительной типизацией в четырехбайтовое знаковое целое. Внимательно! 'value' хранит только указатель, никаких данных о размере блока этих данных нет, никаких строгих оговорок о типе этих данных нет (только предположение что это 'int').

    При формировании переменной оная, обычно, ничем никак не инициализируется. То есть, после определения нашего 'value' в его значении лежит любой немыслимый мусор. Внимательно! Нет никаких способов (кроме как обратиться и словить AV/SIGSEGV) определить что значение 'value' ссылается на правильный адрес. Поэтому этот самый мусор, который в 'value' и содержится, можно спокойно использовать как адрес блока данных и при обращении по этому адресу получить от ОСи по рукам.

    Вопрос! Как этого избежать?
    Есть очень простой и очень старый выход - определить некую магическую константу, которая точно смогла бы символизировать чистоту указателя (что указатель не одержит адреса). Именно такой константой 'NULL' и является.
    Адрес на блок данных может быть абсолютно любым! Он может быть даже 0xA0L. Но если в значении указателя записан 0 (это и есть NULL), значит указатель чист - он не содержит в себе адрес на блок данных.

    Итак! NULL - это не зло. NULL - это признак чистоты указателя!

    Теперь перейдем к "тонкостям и нюансам нолика"...

    Попробуй собрать такой код:
    typedef int* p_int;
    
    p_int value = p_int();
    printf( "ptr : 0x%08x\n", value );

    Вывод в консои будет : "ptr : 0x00000000". О чем это говорит? Это говорит о том, что возвращаемое инициализатором указателя значение (вот эта вот запись: "p_int()") всегда эквивалентно NULL.

    Можно было бы с точно таким же холоднокровием написать вот так:
    p_int value = NULL;
    И все осталось бы по прежнему.

    Дело в том, что NULL имеет тип "void*", а этот тип можно преобразовать абсолютно к любому иному указателю.
    И NULL самостоятельно приводится к нужному типу в операторе присвоения указателя этого типа. Ноль - он и в Африке ноль.

    Попробуй собрать такой код:
    int* value = NULL;
    delete value;


    Если бы 'value' небыл инициализирован, то с превеликой вероятностью оператор delete привел бы к падению приложения. 'delete' воспринял бы мусор как правильный указатель и попробовал бы освободить память по этому указателю, а так как это мусор, ОСь эту попытку забрила бы, выдав программе красную карточку. Вместе с тем, оператор delete спроектирован так, чтобы не обращать внимания на NULL. Оператор просто тихо завершается если видит нулевой адрес.
    Вывод: чистота NULL не нуждается в большей очистке! :)

    Вот так. Надеюсь, моя простыня текста хоть немного да поможет тебе.

    А по вопросу о функции - да возвращай NULL! Так все делают, чем ты хуже? ;)
    Ответ написан
    Комментировать
  • Что должна вернуть функция NULL, если ничего не найдено?

    GavriKos
    @GavriKos
    Если функция на выходе должна вернуть указатель на что то, но этого чего то нет - то возвращается NULL в общем случае. Это нормальное поведение для с/с++. Никакого зла тут нет. NULL - это не тип данных, так что int* foo = NULL - корректно. А "забывают проверить" - это признак непрофессионализма.

    Если вас так пугают эти проверки - можно поступить чуть чуть по другому. Сделать функцию
    bool find(int* array, int value, int* output).
    Функция возвращает true если было что то найдено, или false, если небыло. Результат в случае нахождения помещается в output. Если ничего не найдено - Output не трогается.
    Ответ написан
    Комментировать
  • Что должна вернуть функция NULL, если ничего не найдено?

    kumaxim
    @kumaxim
    Web-программист
    Если значение в массиве на найдено и без него продолжать невозможно, тогда самый лучший вариант
    throw new Exeption('Элемент ' + find_element + ' в массиве не найден');

    Выше, где ты вызываешь функцию поиска, в try {} catch(...) {} ловишь это исключение и обрабатываешь, иначе в коде ты задолбаешься обрабатывать свой NULL или -1.
    Ответ написан
    Комментировать
  • Как в С++ генерировать последовательность чисел без повторов?

    donkaban
    @donkaban
    Умею рисовать тени
    Стоит почитать здесь - www.cplusplus.com/reference/random
    И перестать "использовать стандартный random". Ну и seed надо задавать вне функции, само собой. Получить же случайную последовательность нулей и единиц проще, наверное в bitset, чем в массив
    Если попроще, то :
    #include <random>
    template <typename T>
    T random()
    {
       static std::mt19937 rng;
       std::uniform_int_distribution<T>
           dist(std::numeric_limits<T>::min(),std::numeric_limits<T>::max());
       return dist(rng);
    }
    Ответ написан
    Комментировать
  • Как в С++ генерировать последовательность чисел без повторов?

    gbg
    @gbg Куратор тега Linux
    Любые ответы на любые вопросы
    Этот вариант подойдет, если не требуется криптостойкий ГСЧ.
    Используйте bitset:
    #include <iostream>
    #include <bitset>
    #include <stdlib.h>
    using namespace std;
    int main()
    {
        const auto slen=8*sizeof(rand());
        bitset<slen> a(rand());
        for(auto i=0;i<slen;i++)
        {
           cout << a[i] << ' ';
        }
    }
    Ответ написан
    Комментировать
  • Как организовать переход с Windows на Linux на предприятии?

    @RADDyomin
    Я бы поставил Debian с Xfce. из минимума Firefox, LO, все.
    Mint выбран неправильно - слабый проц, тормоза, все дела.
    Процесс - я бы установил по PXE на все машины сразу.
    Ответ написан
    2 комментария
  • Как организовать переход с Windows на Linux на предприятии?

    @brutal_lobster
    Первое о чем нужно подумать - это о процессах внедрения и сопровождения,а не о выборе дистрибутива.
    Подумайте о том, как вы будете их устанавливать, обновлять, решать проблемы пользователей.
    Как вы будете интегрировать с текущей инфраструктурой и как это проще сделать.

    Проще поднять foreman/katello/pulp (автоматический деплой и централизованная настройка рабочих станций), настроить freeipa (централизованная аутентификация а-ля active directory), мониторинг/логи по вкусу.
    После чего одним кликом установить рабочие станции с нужным софтом.

    А выбор дистрибутива - практически не важен. Софт почти одинаковый. В случае rpm-based centos/fedora у вас больше вариантов централизованного управления (katello/pulp).
    Рекомендую ставить fedora! ;)
    Ответ написан
    3 комментария
  • Занятия по робототехнике для школьников должны быть платными или бесплатными?

    Стоимость такая же, сколько стоят любые другие секции и кружки, находящиеся в вашем районе/занимающиеся аналогичным видом деятельности.

    Бесплатно... ну мы же взрослые люди, давайте реальнее на мир смотреть. Вы хотите есть, детишкам нравятся роботы. Если вы будете вести бесплатно, то либо помрете от голода, либо закроете кружок, в любом из этих случаев детишки останутся без своего любимого занятия, так пожалейте их и установите такую стоимость, которая будет покрывать ваши расходы на это хобби и обеспечит вас средствами к существованию. При этом никто не мешает вам открыть группу в вк или сайт и бесплатно делиться там схемами, программами для контроллеров и прочим интересным материалом - это даже на пользу бизнесу.

    Из дополнительного - можете наколотив живой заинтересованный паблик открыть магазин с необходимыми компонентами, но это так, для примера.
    Ответ написан
    Комментировать
  • Архаично ли обучать школьников программированию в консольном режиме?

    BacCM
    @BacCM
    C++ почти с рождения
    Библиотека GUI это почти всегда "надстройка" над языком. Притом часто достаточно сложная для новичков. Поэтому для начала лучше использовать консоль.\
    PS: функции работы с консолью, часто тоже надстройка, это я понимаю, но более простые и стандартизированные.
    Ответ написан
    Комментировать
  • Верна ли форма регистрации на python?

    @s1dney
    Ну в целом-то оно, конечно, верно все. Но при повторном запуске переменная db будет в первоначальном состоянии.
    Значит надо это дело куда-то сохранять, например писать в файл. Сценарий такой: открываем файл, читаем базу. Это ок.
    Когда добавляется юзер надо добавить запись в базу + добавить запись в файл. Это уже не ок, потому что может вызвать несогласованность данных в этих 2-х словарях.
    А если программа вылетит с ошибкой во время добавления пользователя? Значит надо предусмотреть срочный дамп текущего экземпляра словаря в файл при выходе. Это тоже не ок.

    Можно продолжать так еще много, но я тут остановлюсь и просто скажу, что идея плохая. Бородатые дядьки почти 50 лет назад придумали классные штуки для работы с данными и сейчас они называются "традиционными", не нужно изобретать велосипед.
    Ответ написан
    2 комментария
  • Как написать драйвер клавы под Mac, Win и Linux?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    5 комментариев
  • Архаично ли обучать школьников программированию в консольном режиме?

    Tiendil
    @Tiendil
    Разработчик ПО.
    Работать в консоли и писать для консоли — это разные вещи. Работать в консоли, безусловно, полезнее — это позволяет понять некоторые «подкапотные» вещи. Знающий консоль, гуи освоит, обратное не всегда верно. А вот писать под консоль, на мой взгляд, детей учить не обязательно.

    Графика и дорогие роботы — это же всегда «круто», на них куда проще объяснять свои достижения сторонним людям. Вот небольшой пример, пусть мы учим алгоритмы на графах, делаем простой поиск пути по заранее заданной карте. Его можно сделать в виде:

    - консольного рогалика где буковка @ бегает по клеточному полю.
    - графического 2д, где картинка героя бегает по тайлам травки.
    - графического 3д, с трёхмерным персонажем и т.д.
    - программы для крутого робота, который ходит по квартире (с заранее заданным планом).

    Алгоритм поиска пути будет почти одинаковый (везде может быть двухмерное клеточное поле). Сил и времени от ребёнка каждый вариант тоже требует примерно одинаковое количество. Пара вопросов:

    1. Какой из вариантов будет выглядеть круче для мамы/друга/девушки?
    2. Какой из вариантов ребёнок (да и взрослый) захочет дорабатывать?
    3. Какой из вариантов даёт больший простор для оригинальной доработки и изучения технологий/алгоритмов?

    Я бы сказал, что вариант с роботом (и далее в обратном порядке). Я учился программировать именно на консольных примерах, поэтому по своему опыту скажу, что даже если ты понимаешь «крутость» проделанной работы, другим это проще объяснить на роботах и графике.

    По поводу программирования непосредственно GUI… Это то, чем занимается большая часть программистов, поэтому для среднего программиста эти навыки потребуются с бОльшей вероятность. Вопрос в том, готовите ли Вы средних программистов.
    Ответ написан
    Комментировать
  • Архаично ли обучать школьников программированию в консольном режиме?

    risik
    @risik
    Программист
    В процессе обучения программированию, особенно на ранних стадиях, GUI вреден. Лично я, категорически против его использования. Под обучением программированию понимаю, в первую очередь:
    - изучение базовых алгоритмов
    - принципы ООП (класс, объект, полиморфизм, наследование, агрегация и т.д.).

    Однако, я говорю про обучение студентов. За школьников ничего не скажу.

    На всякий случай: стаж разработчика: 20 лет, стаж преподавателя: 15 лет.
    Ответ написан
    Комментировать
  • Архаично ли обучать школьников программированию в консольном режиме?

    @slvABTOP
    Архаично, но иначе они не будут понимать как все работает
    Ответ написан
    Комментировать
  • Архаично ли обучать школьников программированию в консольном режиме?

    @vdem
    Лично у меня клавиатурой получается совершать необходимые действия намного быстрее, чем мышкой (которую использую практически только при работе в браузере). Окошки-менюшки просто выглядят проще и нагляднее, но запомнив пару десятков команд и сочетаний клавиш можно вполне (и быстрее) справляться с задачами используя клавиатуру. Конечно, все это актуально только для программеров :)

    P.S. Само собой, я о консоли говорю. Пока работал в Windows, использовал Far Manager, сейчас - Midnight Commander, сборка проектов - командами в консоли.
    Ответ написан
    1 комментарий
  • Как быть дальше с обучением веб-разработке?

    Disassociative
    @Disassociative
    Странные вы вопросы задаете. Возьми да попробуй весь основной букет фреймворков и учи тот который понравился больше. Если же у тебя в принципе не на что не стоит и мучает желание заколачивать бакс, сходи на сайт с вакансиями и выбери тот за который платят больше.
    Ответ написан
    1 комментарий
  • Какие технологии использовать для частого обновления большого количества строк в БД?

    @AlekseyKuzmin
    SPB
    вариант 1. изменить структур хранения. Рейтинг хранить в другой таблице. Разнести комментарии не несколько шардов.
    вариант 2. апдейтить рейтинг конкретного пользователя когда он оставит комментарий, а не всех пользователей подряд.
    вариант 3. - вариант 1 + 2 и задания на обновления рейтинга ставить в очередь в том же редисе с замещением старых заданий. Так рейтинг будет обновляться, но не чаще чем раз в 5 мин (например). Если юзер за 5 мин оставить 10 комментариев - рейтинг обновиться только 1 раз. Система будет устойчивее. будут задержки в обновлении рейтинга, но главное все остальное будет работать.
    Ответ написан
    Комментировать
  • Обязательно ли изучать python фреймворк для разработки сайта или игры?

    @s1dney
    Для игры - я как-то даже не могу себе представить, как вы будете использовать python в связке + JS/CSS3. То есть зачем вообще там python?
    По поводу сайта - django скорее больше принесет вреда, это платформа для быстрой разработки типовых сайтов, прямо таки конвеер, там много всего готового и удобного, и в плане обучения это плохо, если обобщить.
    Любой другой "мини"-фреймворк типа bottle/webpy - напротив, очень облегчит вам жизнь, но позволит многое осмыслить и написать самостоятельно, разобраться с ними проще пареной репы если hello, world на питоне уже освоен.
    Flask тоже сам по себе довольно простой и осваивается за 1 вечер, но если накормить его стеройдами, не намного уступает тому же django.
    Ответ написан
    3 комментария
  • Обязательно ли изучать python фреймворк для разработки сайта или игры?

    sim3x
    @sim3x
    Вначале стоит поиграться с консолью
    - интерактивы типа вопрос-ответ, сохранить в бд/текст
    - псевдографика
    - таблички сортировки
    - примешать туда sqlalchemy

    В конце, добавить flask. Он простой как 5 копеек, но в тоже время, может стать базой для приожения любой сложности
    ИМО добавлять сходу еще один язык - JS будет перебор. А если добавлять, то добавлять уже что-то модерновое - типа ангуляра

    Без фреймворков - придется освоить werkzeug и/или wsgi протокол. Те это круче в разы чем уметь флепать на фрейме, но и отдельная сложность для преподавателя
    Ответ написан
    3 комментария