• Как массив вокселей 16^3 разделить на массивы по 4*8*8 и получить один из них по id?

    i229194964
    @i229194964
    Веб разработчик
    #include <vector>
    
    const int voxel_size = 16;
    
    std::vector<short> get_voxels_from_chunk(short (*voxels)[voxel_size][voxel_size][voxel_size], int world_length, int chunk_size_x, int chunk_size_y, int chunk_size_z, int chunk_id) {
        std::vector<short> result;
        int chunk_count_x = world_length / chunk_size_x;
        int chunk_count_y = world_length / chunk_size_y;
        int chunk_count_z = world_length / chunk_size_z;
        int chunk_index_x = chunk_id % chunk_count_x;
        int chunk_index_y = (chunk_id / chunk_count_x) % chunk_count_y;
        int chunk_index_z = chunk_id / (chunk_count_x * chunk_count_y);
        int x_offset = chunk_index_x * chunk_size_x;
        int y_offset = chunk_index_y * chunk_size_y;
        int z_offset = chunk_index_z * chunk_size_z;
        for (int i = x_offset; i < x_offset + chunk_size_x; i++){
            for (int ii = y_offset; ii < y_offset + chunk_size_y; ii++){
                for (int iii = z_offset; iii < z_offset + chunk_size_z; iii++){
                    result.push_back(*(*(*(voxels + i) + ii) + iii));
                }
            }
        }
        return result;
    }
    
    int main() {
        short voxels[voxel_size][voxel_size][voxel_size]; // пример массива вокселей
        int world_length = voxel_size;
        int chunk_size_x = 4;
        int chunk_size_y = 8;
        int chunk_size_z = 8;
        int chunk_id = 3; // пример id чанка
        std::vector<short> chunk_voxels = get_voxels_from_chunk(&voxels, world_length, chunk_size_x, chunk_size_y, chunk_size_z, chunk_id);
        // обработка chunk_voxels
        return 0;
    }
    Ответ написан
    1 комментарий
  • Выдает ошибку «идентификатор не определен». Почему?

    YuriyVorobyov1333
    @YuriyVorobyov1333
    Software Developer
    Потому что в цикле for лишний символ ";"

    for (int i = 0; i < adj[u].size(); i++); {...}
    Ответ написан
    Комментировать
  • Как ускорить чтение строк из файла?

    egor_nullptr
    @egor_nullptr Куратор тега C
    mmap + ручной разбор, получилось примерно в 10 раз быстрее, чем fgets + sscanf
    Код

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <sys/mman.h>
    #include <unistd.h>
    
    int main(int argc, char** argv)
    {
        int fin = open(argv[1], O_RDONLY);
        struct stat finfo = {0};
        fstat(fin, &finfo);
        char *map = mmap(0, finfo.st_size, PROT_READ, MAP_SHARED, fin, 0);
    
        char src[4] = {0};
        char dst[4] = {0};
        int cost;
        int i;
        int off = 0;
    
        while (off < finfo.st_size)
        {   
            memcpy(src, map + off, 3); 
            memcpy(dst, map + off + 4, 3);
            i = 0; 
            cost = 0;
            while (map[off + 8 + i] != 10) { 
                cost = cost * 10 + map[off + 8 + i] - 48;
                ++i;
            };
            off += 9 + i;
        };
    
        munmap(map, finfo.st_size);
        close(fin);
    
        return EXIT_SUCCESS;
    }

    Ответ написан
    2 комментария
  • MSVCP140.dll, что делать sfml?

    @Belvarm
    Java TeamLead, интеграционные решения
    1) Устанавливать нужный VC++ Redist.
    2) Статическая линковка.
    Ответ написан
  • Почему вызывается исключение при считывании информации из файла?

    У вас переменная size в main не инициализирована. В ней находится мусор. А вы создаете массивы размера size.
    Ответ написан
    3 комментария
  • Как трансформировать 3d array в 2d array?

    Vindicar
    @Vindicar
    RTFM!
    Читай про метод reshape()
    Ответ написан
    Комментировать
  • Как инициализировать переменную?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Инициализировать переменную c перед использованием.
    Ваш К.О.
    Ответ написан
    Комментировать
  • Актуальны ли книги Александреску, Майерса и Саттера?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Да, книги Андрея Александреску, Скотта Майерса, Герба Саттера, Николая Джосаттиса, и, например, Девида Вандервуда имеют актуальность и по сей день вне зависимости от года издания или перевода.

    C++ развивается вот уже 38 лет. Новые стандарты сегодня приходят с достойной одобрения частотой, но начиная с C++11 изменения в стандартах до сих пор ничего кардинально не ломают. Даже новые возможности концептуально связаны с опытом прошлых стандартов.
    С другой стороны, трансляторы. Новые стандарты языка не приходят сразу, сперва требуется дождаться их поддержки в современных трансляторах. А это происходит не в одно время и не сразу по выходу нового стандарта. Да и когда появляется версия с поддержкой нового стандарта, эта поддержка не лишена ошибок, опознать которые способен только опытный инженер с экспертизой в новом стандарте.
    Разработка же и вовсе не поспевает за трендами. На собеседованиях я то и дело слышу как где-то кто-то еще только вчера и еще только решил перейти на C++11. В 23-м году.
    Самым широко используемым стандартом сейчас является C++17, большинство функций которого многими компаниями так до сих пор и не используется. Люди до сих пор еще только привыкают к нему.
    Книги представленных авторов в понятной форме передают читателю ценный базовый опыт, который можно применять вообще не привязываясь к стандарту языка. Главное - это не брать в рассмотрение книги до 2011 года.

    Чтобы быть на острие развития языка, нужно не книги читать, а быть сильным энтузиастом и иметь изначально глубокую экспертизу в стандартах языка. Авангард развивается за счет самостоятельных экспериментов и исследования пределов возможностей последних стандартов C++. Не за счет ожидания и чтения книг.
    Ответ написан
  • Почему цикл в C++ застревает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Больших отличий я не заметил


    Я удалил неважные части кода, чтобы большое отличие стало более заметно. Вот что получилось из твоего кода:
    while (num_bor_1 <= num_bor_2)
      {
        if ((num_bor_1 % 2) != 1)
        {
          num_bor_1++;
        }
      }


    А вот что получилось из решения:
    do
      {
        num_bor_1++;
      } while (num_bor_1 < num_bor_2);
    Ответ написан
    Комментировать
  • Как запускать и контролировать статус работы сторонних exe файлов в c++?

    @FaTTeST
    Для запуска внешней программы из кода на C++ можно использовать функцию system(). Эта функция позволяет выполнить команду в командной строке. Например, чтобы запустить программу installer.exe, можно использовать следующий код:

    #include <stdlib.h>
    
    int main()
    {
        system("installer.exe");
        return 0;
    }


    Функция system() блокирует выполнение программы, пока запущенный процесс не завершится. Если вам нужно запустить процесс асинхронно, то можно использовать функцию CreateProcess() из библиотеки Windows API.

    Чтобы определить, что внешняя программа завершила работу, можно использовать функцию WaitForSingleObject(). Эта функция блокирует выполнение программы до тех пор, пока указанный объект не перейдет в сигнальное состояние. В случае с внешней программой, этим объектом будет процесс, который она запустила. Например, чтобы дождаться завершения программы installer.exe, можно использовать следующий код:

    #include <windows.h>
    
    int main()
    {
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory(&si, sizeof(si));
        si.cb = sizeof(si);
        ZeroMemory(&pi, sizeof(pi));
    
        // Запускаем процесс
        CreateProcess("installer.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    
        // Ожидаем завершения процесса
        WaitForSingleObject(pi.hProcess, INFINITE);
    
        // Закрываем дескрипторы процесса и потока
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    
        return 0;
    }


    В этом коде мы используем функции CreateProcess() и WaitForSingleObject() для запуска процесса и ожидания его завершения. Функция CreateProcess() создает новый процесс и возвращает дескрипторы процесса и потока. Функция WaitForSingleObject() ожидает завершения процесса, используя дескриптор процесса, который мы передали ей в качестве параметра. После завершения процесса мы закрываем его дескриптор и дескриптор потока с помощью функции CloseHandle().
    Ответ написан
    Комментировать
  • Как вывести значение из массива если ключ совпадает с переменной?

    Stalker_RED
    @Stalker_RED
    Никакой цикл не нужен.
    $time = date("H", time());
    $os = [
      '14' => '1',
      '15' => '2',
      '16' => '3',
      '17' => '4',
    ];
    $val = $os[$time] ?: 'no value';
    echo $time .  "<br><br>" . $val;

    И у вас там внутри if вместо сравнения присваивание, потому он все и выводит.
    Ответ написан
    3 комментария
  • Как скрыть адрес вызываемой функции в C++?

    @rPman
    В коде, указанном в вопросе написана белиберда
    В конструкторе предлагаешь сделать присваивание
    vProtect = Protect;
    глобальной переменной vProtect имя класса Protect (потому что у тебя Protect и класс и переменная типа cProtect, (то что компилятор тебе это позволил уже бардак), если переименовать cProtect мембер Protect в protect (как рекомендует большинство code styling - имена классов с большой буквы, имена переменных - с маленькой, чтобы не запутаться), а еще тип vProtect у тебя - указатель, а Protect - нет, если будут оба указатели то само собой все будет собираться, но все равно смысла это иметь не будет.
    -----------------------

    Теперь про твой вопрос в заголовке, почти ничего не имеющий общего с текстом вопроса:
    Как скрыть адрес вызываемой функции в C++?
    в контексте обфускации, подразумевается что по декомпилированному исходному коду должно быть не ясно, какой именно метод будет вызываться (т.е. для анализа требуется отладка, что сложнее/дороже), значит хранить адреса методов нужно в каких то переменных, например массивах, а выбор следующего вызываемого метода делать на основе каких то вычислений по коду.

    В c++ для этого реализован класс std::function, пример использования для вызова именно метода класса (для простоты пример без аргументов но с аргументами все то же самое, надеюсь ты понимаешь, что у тебя должны быть одинаковые аргументы и типы во всех методах, или должны быть группы для разных типов, но чем больше групп тем проще анализ кода, иначе тупо по типам и количеству аргументов все можно будет понять)
    // определяем класс
    class MyClass
    {
      public:
      void myFunA(){std::cout<<"A";};
      void myFunB(){std::cout<<"B";};
    };

    однократно где то инициализируешь массив адресов функций (никто не мешает по коду это перемешивать)
    std::function<void(MyClass*)> functions[]={&MyClass::myFunA,&MyClass::myFunB};

    вызов метода по номеру x
    MyClass obj;
    functions[x](&obj);
    Ответ написан
    3 комментария
  • Почему при вводе программы, я могу вводить только единицы что бы выдало ответ?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    Сыграю в угадайку, раз уж ты не сказал, что ты дал на вход, что ожидал, и что получил.

    1. Ты вводил числа с точкой в качестве разделителя дробной части, а запускаешь ты программу в системе с русским языком. И ты соответственно получил FormatException. (По правилам русского языка в качестве разделителя целой и дробной части числа используется запятая, в отличие от точки, которая используется в английском)

    2. При определённых значениях твоё выражение выдаёт NaN вместо определённого числа. Это значит, что у тебя произошло деление на 0, число ушло в бесконечность, или в мнимые числа. Если такого не должно происходить - значит ты неправильно перенёс формулу из твоего задания в код

    По качеству кода

    1. Не нужно заворачивать в объект чистые функции.
    2. Вместо транслита лучше бы в переводчик закинуть более осмысленное название
    3. Не нужно вставлять лишние скобки
    4. Для удобства чтения длинных математических выражений, можно его разбить на несколько строк и расставить отступы.
    Console.WriteLine("Введите x: ");
    var x = double.Parse(Console.ReadLine());
    Console.WriteLine("Введите a: ");
    var a = double.Parse(Console.ReadLine());
    Console.WriteLine("Введите n: ");
    var n = double.Parse(Console.ReadLine());
    
    var result = Solution.Calculate(x, a, n);
    Console.WriteLine($"Ответ: {result}");
    
    public static class Solution {
      public static double Calculate(double x, double a, double n) =>
        Math.Pow(Math.Tan(Math.Exp(a+2)), 1.0/3.0) * 
        Math.Pow(
          Math.Pow(a*x*n, 3) * 
          Math.Sqrt(1.0 / Math.Tan(Math.Pow(x, Math.Exp(a+2)))),
         3);
    }


    Вариант с исправленной формулой

    public static class Solution {
      public static double Calculate(double x, double a, double n) =>
        // По заданию мы тут берём корень 3-ей степени и сразу возводим в 3ю степень. Убираем их, тк эти две операции отменяют друг друга.
        Math.Tan(Math.Exp(a+2)) *
        Math.Pow(
          Math.Pow(a*x*n, 3) * 
          //котангенс(x) = 1/тангенс(x)
          Math.Sqrt(1.0 / Math.Tan(Math.Pow(x, Math.Exp(a+2)))),
         3);
    }

    Ответ написан
    8 комментариев
  • Что за типы функций при импорте OpenCV DLL в Delphi?

    TrueBers
    @TrueBers
    Гуглю за еду
    не спрашивайте зачем мне это нужно
    действительно. C++ ABI -- это боль, сильная боль. Даже разработчики компиляторов страдают от неё. Если вам уж прям так важно поковыряться в его кишках, то изучайте исходники LLVM и спецификацию стандарта ABI. А если нет, то возьмите OpenCV C API и не выносите себе голову.

    но описан как функция
    А как он должен быть описан, как сферический код в вакууме?

    чем отличается от обычных деструкторов
    Стандарт определяет деструкторы:
    1. base object destructor
    2. complete object destructor
    3. deleting destructor
    4. trivial/non-trivial destructor

    Что из этого есть "обычный" деструктор?

    Здесь про деструкторы и псевдо-код порядка их вызовов. Здесь -- про общее устройство виртуальной таблицы.

    что на самом деле означает `vbase destructor`, в каких случаях он вызывается
    Есть предположение, что это имя экспортируемого complete object destructor для класса, базовым классом которого является класс с виртуальным деструктором. То есть, он выполняет часть процесса цепочки деструкторов, которая помимо вызова base object destructor, вызывает также все деструкторы для всех базовых виртуальных классов. Но при этом ещё не вызван deleting destructor, который собственно вызывает operator delete. Т.е. получается, что complete object destructorпо включённому в него списку действий, как бы "наследуется" от base object destructor. В свою очередь, deleting destructor "наследуется" от complete object destructor.

    Предполагаю, что вызывается автоматически в замыканиях. Но что на самом деле означает `default constructor closure'
    Для чего он может вызываться в замыканиях, просто чтоб было?

    Моё же предположение, что это замыкание -- некий адаптер-костыль чтоб привести нетривиальные параметры конструктора в удобоваримую ABI-форму, и вызывается когда default constructor имеет default non-trivial parameters, для которых надо сначала вызвать конструктор, либо когда это variadic конструктор, которому нужно привести список аргументов к Сишному `va_arg`, чтобы переслать их через границу ABI. Вот в этом случае он вызывается, как я понимаю.

    Один ценный никому не нужный совет: тебе НЕ НУЖНО в этом разбираться. Брось эту затею и возьми сишный API.
    Ответ написан
    3 комментария
  • В чем смысл do while? Как его можно использовать?

    @evgeniy_lm
    Как написано в инструкции. Тело такого цикла обязательно выполняется хотя бы один раз. Часто густо бывают ситуевины когда нужно выполнить некие действия и по их результату решить повторить их или продолжить выполнение проги далее
    Ответ написан
    Комментировать
  • Не работает деструктор. В чем ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Не работает деструктор

    "Не работает деструктор" -- это когда программу компилируешь, запускаешь, а деструктор не делает того, что в нём написано. У тебя же программа не компилируется. Из-за того, что в настройках компилятора стоит "трактовать предупреждения как ошибки" и "предупреждать о неэффективном коде С++". Ну и вдобавок, предупреждение тебе правильно говорит, что если ты не реализовал конструктор копирования и оператор присваивания для класса самостоятельно управляющего памятью, то жди проблем, когда начнёшь копировать объекты этого класса.
    Ответ написан
    6 комментариев
  • Как построить одинаковый отрезок вне зависимости от порядка точек?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А в чём проблема то? Отсортируйте отрезки по координатам.
    если xA > xB
      или (xA == xB и yA > yB)
      или (xA == xB и yA == yB и zA > zB)
        то T := A, A := B, B := T
    Ответ написан
  • Как создать кастомное кроссплатформенное окно на си?

    includedlibrary
    @includedlibrary
    Надо либо использовать библиотеки GTK, QT и т.п., либо писать свою реализацию под каждую ОС
    Ответ написан
    Комментировать
  • OSError: exception: access violation reading, ctypes, Python, что делаю не так?

    Vindicar
    @Vindicar
    RTFM!
    a = c_char_p(f'{getcwd()}\\file.txt'.encode())
    b = c_char_p(b'Help me pls')

    Тут есть проблема. Ты получаешь указатель на объект, но ты не хранишь ссылку на этот объект.
    Что, если Питон сразу же его подберёт сборщиком мусора? У тебя указатель будет указывать на адрес, где был объект, а что там сейчас - фз. Если память не будет освобождена, то обращение может быть удачным. Если страницу памяти освободят - то поймаешь access violation.
    Положи строку в переменнную, и бери указатель по переменной. Тогда объект будет жить, пока жива переменная.
    Во-всяком случае, я бы начал с этого.
    Ответ написан
    2 комментария