• Как правильно писать на с++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    По организации кода: 1 класс (MyClass) = MyClass.h + MyClass.cpp. friend классы и функции лучше не использовать.
    Наследованием не увлекаться. Если у вашего класса ровно 1 наследник, то наследование скорее всего не нужно. Шаблонные классы тоже скорее всего не пригодятся.
    Основной профит от класов -- инкапсуляция. Например вы создаете класс который должен качать что-то из интернета PackageUploader. Начинайте с его интерфейса (набор его public методов). Это то, что вам нужно от этого класса. Например он может скачать программу по имени и номеру версии:
    /// Скачать программу по имени с заданной версией.
    /// Возвращает путь до скачанного файла в локальном
    std::filesystem::path downloadPackage(const std::string &name, const std::string &versionString);


    Для того чтобы это сделать, ему потребуется информация о том, где нужно брать программу. Например можно в конструктор PackageUploader передать класс, который хранит такую информацию на диске или в реестре.
    /// Конструктор PackageUploader.
    /// Принимает PackageRegistry, который хранит информацию об адресах
    ///  на которых можно скачать различные программы.
    PackageUploader(const PackageRegistry &packageRegistry);


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

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Файл создают временный. Тут есть проблема, с падением приложения, в следствии чего этот файл не удаляется. Но можно например PID в этот файл написать и проверять наличие процесса.
    Ответ написан
    Комментировать
  • Олимпиадное программирование. c++ или python?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Python может работать в 10 раз медленнее. В некоторых олимпиадах для него увеличенные таймауты, но не везде. C++ пока более предпочтителен. Java тоже хороший выбор.
    Пишите на C++ а не на C. Пользуйтесь новыми возможностями C++ 11/14. Забудьте про явное выделение памяти через new (вместо этого используйте vector, unique_ptr, shared_ptr). Изучите stl, в нем много полезного для олимпиад. Пользуйтесь лямбдами. Тогда писать на C++ будет достаточно приятно.
    Ответ написан
    4 комментария
  • Как создать визуальный кодогенератор?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Можно на https://www.jetbrains.com/mps/ посмотреть. На нем можно относительно легко простой язык написать.
    Ну а так, если сделать python api, то с ним непрограммисты тоже справляются.
    Ответ написан
    1 комментарий
  • Как проранжировать числовой массив?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    std::vector indices(data.size());
    for (size_t i = 0; i < data.size(); ++i)
    {
        indices[i] = i;
    }
    
    std::sort(indices.begin(), indices.end(), [&data](int a, int b) {
            return data[a] < data[b];   
        });
    Ответ написан
    7 комментариев
  • Почему возникает ошибка при наследование классов С++?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Добавьте #pragma once в начале каждого .hpp файла. Препроцессор копипастит текст файла вместо соответствующей #include директивы. У вас получится, что файл содержащий Klass3 подставляется 2 раза. #pragma once выкидывает повторы.
    Ответ написан
    4 комментария
  • Как присвоить диапазон значений переменной в Python?

    tsarevfs
    @tsarevfs
    C++ developer
    Насколько я знаю, какого-то специального способа нет. Используйте пару переменных или кортеж.
    min_val, max_val = 1, 10
    
    if min_val <= x <= max_val:
        print("...")


    Либо писать свой класс:
    def BoundsChecker:
        __init__(self, min_val, max_val):
            self.min_val = min_val
            self.max_val = max_val
            
        def isBounded(self, val):
            return self.min_val <= val <= self.max_val
        
    checker = BoundsChecker(1, 10)
    
    if (checker.isBounded(x))
        print("...")
    Ответ написан
    1 комментарий
  • Как узнать, что тело сообщения начинается с точки?

    tsarevfs
    @tsarevfs
    C++ developer
    Можно встроеную функцию использовать. Плюс пробелы в начале вычистить.

    body = response['items'][0]['body']
    startsWithDot = body.strip().startswith('.')
    Ответ написан
  • Как в c++ сделать вывод звездочек вместо пароля?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Вы пишете на С а не С++.
    Предлагается читать посимвольно с помощью getch https://stackoverflow.com/a/6175522
    Ответ написан
    Комментировать
  • Можно ли вынести реализацию шаблонного класса в отдельный cpp файл?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Если кратко, то нельзя.

    Шаблонны в С++ генерируют свою версию кода для каждого варианта параметров, с которыми их используют. Если у вас есть класс A, и вы используете A и A, то будет создано 2 набора методов этого класса, для каждого типа.
    Вспоминаем, что cpp файлы компилируются отдельно.
    Мы можем собирать a.cpp -> a.obj, потом main.cpp -> main.obj, а потом слинковать их (a.obj, main.obj) -> main.exe.
    include же просто копипастит текст файла вместо строчки #include "..."
    Теперь представим, что мы определили класс A в a.cpp а используем main.cpp. Но в этом случае мы просто не узнаем о том что класс используют в main.cpp при компиляции a.cpp, и не сгенерируем нужные версии методов.
    Ответ написан
    Комментировать
  • Как прикрутить GUI к скрипту Python?

    tsarevfs
    @tsarevfs
    C++ developer
    Смотрите примеры тут www.rkblog.rk.edu.pl/w/p/simple-text-editor-pyqt4
    Вам достаточно первых двух по ссылке.
    # here we connect signals with our slots
    		QtCore.QObject.connect(self.ui.button_open,QtCore.SIGNAL("clicked()"), self.file_dialog)
    .
    Благодаря этой строчке в примере при нажатии на кнопку вызывается функция file_dialog.
    Ответ написан
    Комментировать
  • Какую тему выбрать для курсового проекта?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Можно взять какую-нибудь фишку из новых стандартов.
    Например рефлексию https://www.youtube.com/watch?v=ihpfu0TV3Q8, для которой есть эксперементальные реализации в clang.
    И запилить систему для конфигов, в виде структур, для которых работает автоматическая сериализация (загрузка и сохранение в json), и автоматическое создание ui для редактирования.
    Ответ написан
    Комментировать
  • Как написать код для определения суммарного объема вложенных друг в друга шаров?

    tsarevfs
    @tsarevfs
    C++ developer
    Объем стенок имеется в виду? Тогда, если вкладываем без зазоров, получаем большой шар со стенкой 12 * 5 мм и двркой как у маленького -- 10см.
    Получаем внешний диаметр 22см (10 дырка + 2 * 6 стенки).
    Объем = объем целиком - объем дырки.
    Ну и не забываем что литр = 1дм^3. Единицы измерений надо аккуратно привести.
    Ответ написан
    Комментировать
  • Как сделать обход в глубину на основе файловой системы?

    tsarevfs
    @tsarevfs
    C++ developer
    Для реальной задачи используйте os.walk.
    Пробел после запятой -- зло!

    def filegraph(current, last):
        
        if current in visited:
            print( visited, ' visited')
            print(node)
            for key in node:
                    print('%s -> %s' % (key, node[key]), end = ' \n')
            print(current, ' Посещено')
            return #*Сразу выходим, чтобы уменьшить вложенность кода*
    
        #spisok.clear()
        current_dir_items = [] #*это список файлов в текущей директории, то что он был глобальным создавало проблемы ниже*
    
        names = os.listdir(current)
        visited.append(current)
        
        print(current, ' Текущая директория')
        print(last, ' Последняя директория')
        
        for name in names:
            directory = os.path.join(current, name)            
            if os.path.isdir(directory) == True:
                current_dir_items.append(directory)
                print(directory, 'директория')
        print( current_dir_items,  ' список')
        
        print(last)
        node[current] = last, current_dir_items #Добавляем в словарь !!!список не копируется, мы помещаем в словарь ссылку на него!!!
        
        if (last in node) #*логика на исключениях -- плохая идея*
            print(node[last], ' last' )
        else
            print(' Ключа нет')
    
        print(node[current], ' current')
        if len(current_dir_items) != 0:
            #for a in range(0, len(current_dir_items)):
            #    if node[current][1][a] not in visited:
            for next_item in current_dir_items: #*по возможности не используйте for in range(len)*
                if next_item not in visited: 
                    time.sleep(3) 
                    os.chdir(next_item) #*код становится проще*
                    for key in node:
                        print('%s -> %s' % (key, node[key]), end = ' \n')
                    print(next_item, ' current ', '-' * 10 )
                    return filegraph(next_item, current) #тут происходил spisok.clear() и портил вам данные в словаре. 
                
        else:
            time.sleep(3)
            print(' Возвращение ' )
            print(node[current][0], ' current  0' )
            for key in node:
                print('%s -> %s' % (key, node[key]), end = ' \n')
    
            return filegraph(node[current][0], '')
    Ответ написан
  • Изучение математики через программирование, глупое решение?

    tsarevfs
    @tsarevfs
    C++ developer
    Я думаю это отличная идея. Правда это может оказаться не так просто, как кажется.
    Запрограммировать решение уравнений типа квадратных, операции над матрицами вполне можно.
    Ответ написан
    Комментировать
  • Как проверить принадлежность многоугольника к некоторой области координатной плоскости?

    tsarevfs
    @tsarevfs
    C++ developer
    Если окно это прямоугольник со сторонами паралельными осям координат (вертикальными и горизонтальными), то стоит этим пользоваться, это сильно упростит жизнь.
    Какие есть варианты:
    1 многоугольник попал в окно целиком
    2 многоугольник пересекает окно
    3 окно лежит внутри прямоугольника
    В первом случае все вершины многоугольника лежат внутри, пересечений по сторонам нет.
    Во втором, есть пересечения по сторонам. Вершины могут быть распределены по-разному(!)
    В третьем нет пересечений сторон, все вершины снаружи.

    Получается надо уметь проверять 2 факта:
    1 вершина внутри окна -- элементарно, x_min<=x<=x_max && y_min<=y<=y_max
    2 сторона многоугольника пересекается со стороной квадрата. Чуть сложнее, но учитывая что стороны квадрата паралельны осям, код будет несложный.
    Ответ написан
    2 комментария
  • Как обеспечить автономность программы от сервера?

    tsarevfs
    @tsarevfs
    C++ developer
    В оффлайне сохранять черновик договора без номера и даты. Регистрировать их при синхронизации с сервером.
    Ответ написан
    Комментировать
  • Как лучше организовать работу многих подключений к SOCKET в роли клиента?

    tsarevfs
    @tsarevfs
    C++ developer
    Создаем в клиенте 10 потоков. В каждом коннектимся к серверу. Со стороны сервера поддержка нескольких подключений тоже необходима. Сервер видит нас как отдельных клиентов.
    Но выглядит это странно.
    Если клиент однопоточный, то можно иметь "виртуальные" соединения. Каждое сообщение передается через одну пару сокетов, но в самом сообщении записан список id или имен получателей внутри клиента. Например если у нас игра с несколькими юнитами, то это не значит что действие каждого юнита передается через отдельное соединение.
    Так же можно разделить клиента на отдельные процессы, а обмен между ними организовать через локальные сокеты или пайпы.
    Ответ написан
    Комментировать
  • Как проверить запущен ли дочерний процесс?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Похоже вы получили зомби-процесс. Родительский процесс должен считать код возврата с помощью wait/waitpid.
    https://ru.stackoverflow.com/a/484142/221454
    Ответ написан
    Комментировать