Ответы пользователя по тегу GCC
  • Скомпилированный в GCC exe файл вылетает досрочно?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Звучит в точности как симптомы Undefined Behavior. На самом деле программа вылетает из-за, например, доступа к неправильным указателям. Но во время отладки звезды выстраиваются так, что это некорректное действие не приводит к падению программы.

    Добавляйте больше отладочного вывода во всех функциях и между всеми важными кусками кода, например на каждой итерации цикла. Выводите разные строки везде, а в циклах еще и переменные цикла вставляйте.
    Выводите в stderr.

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

    Возможно, там где-то выход за границы массива, Попробуйте еще, например, увеличить все выделенные строчки и массивы в коде раз в 10. Если после этого программа отработает, ищите, где у вас ошибка в логике - почему массивов не хватает.
    Ответ написан
    32 комментария
  • Тонкости Компиляторов. Почему в классах с++ не требуется объявление функции до вызова?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Там явно больше одного прохода.

    Правила видимости функций растут еще из Си. Не знаю конкретно о чем думали, но сделали точно также и в Си++. Когда стали вводить классы от этого наследия отказались, ведь в Си никаких классов и методов нет.
    Ответ написан
    Комментировать
  • Есть ли флаг компиляции gcc, чтобы неявное приведение типов выводилась как ошибка?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    -Wconversion -Warith-conversion
    Ответ написан
    Комментировать
  • Как использовать socket в gcc на windows?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вы используете cygwin для компиляции, то можно и линуксовый socket использовать. Будет чуть менее эффективно из-за фактически эмуляции posix api.

    Ну или, если через visual studio компилируете, то используйте winsocket API
    Ответ написан
    Комментировать
  • Как скомпилировать c++ код через терминал на MacOS?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    И в чем проблема? Ставите command line developers tools, открываете терминал, запускаете g++, передаете параметром ваш исходник и ключи всякие.
    Ответ написан
    4 комментария
  • Как определить класс, которому принадлежит вызываемый метод, из C++ кода?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Попробуйте __pretty_function__ в gcc и __FUNCSIG__ в visual studio.
    Ответ написан
    1 комментарий
  • Как исправить ошибку invalid controlling predicate?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    OpenMP работает только со стандартными циклами. У вас же инициализация по i, условие по x, итерация i++. OpenMP просто не умеет понять, сколько там итераций и как их можно распаралелить вообще.

    Вам надо сделать так:
    const int num_iterations=1000000;
    const double h = (b-a)/num_iterations/2.0
    x = a;
    #pragma  omp  parallel  for  reduction (+:S)
    for (int i = 0; i < maxi; i++)
    {
        S = S + 1*(x/(x+1));
        x = x + h;
        S = S + 4*(x/(x+1));
        x = x + h;
        S = S + 1*(x/(x+1));
    }


    Удобнее, если зафиксировать сначала количество итераций, а не шаг h (шаг отсюда вычисляется). Потому что если отрезок нацело не делиться на h, то надо как-то это обрабатывать и вообще, а можно ли так считать?

    Я добавил reduction (+:S) в инструкцию openMP, потому что вам надо подсчитать общую сумму же. Без этого каждый поток что-то насуммирует отдельно. Шарить S между потоками сложно - может быть data race.
    Ответ написан
    Комментировать