• Как убедиться что атомарные операции будут выполнены точно правильно?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В данном исходнике нет проблемы атомиков. Но здесь есть проблема отсутсвия синхронизации потоков а и b.
    Нужно наладить синхронизацию и дальше атомики станут приносить ощутимую пользу.
    Ответ написан
    Комментировать
  • Как получить адрес памяти переменной в массиве, а не адрес индекса массива?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Все правильно: выводится адрес элемента в массиве. Они два не совпадают, потому что в figure_collection лежит копия line, со своим уникальным адресом в памяти.

    Edit: и вы через массив к исходному line никак не обратитесь, только если не смените тип массива на Figure*
    Ответ написан
    Комментировать
  • Почему вызывается исключение при считывании информации из файла?

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ремарка по поводу этого кода.
    void division(){
            int divi = static_cast <float> (a) / b;
            if(b != 0){
                cout << divi;
            }
        }

    В расчетах с floating point результат деления 0.0/0 вполне себе определен. Это неопределенность (NaN) и она вполне себе легальна в домене вещественных чисел. Или бесконечность разных знаков (Inf) если только знаменатель равен нулю. По неясным причинам автор отвергает этот результат.
    Более того в ответе будет напечатано

    cout<<"Деление:";

    и тишина. Неясно отработал метод или нет. Это дефект приложения.

    Как бороть такую проблему. В целых числах - никак. Нет легального способа. Я обычно делаю Optional
    std::optional<int> safe_div(int x, int y) {
       .....
    }

    Опционал - это коробочка в которой либо лежит число либо не лежит. Вызывающая сторона соотв
    обязана исполнить протокол вскрытия этой коробочки. Проверить что она непустая.

    Или можно попробовать монаду Either где можно указать причину ошибки.
    Не знаю есть ли это в С++ но должно быть. Во всех нормальных языках должно быть.

    Float/Double - это коварные типы данных. Они доставляют немало хлопот для bigdata. И с ними надо быть
    аккуратными. Главное правило - кастинг из floating point в целые числа в общем случае не работает. Нужно
    думать над отработой исключений всегда. Тоже самое касается диапазонов. Они коварны. И можно терять
    занчимые разраяды на конверсиях. Ответственность за эти действия ВСЕГДА лежит на программисте.
    Ответ написан
    Комментировать
  • Почему нет доступа к приватному атрибуту?

    У вас оператор является private членом класса. А надо public. О чем и говорит компилятор.
    Ответ написан
    3 комментария
  • Не получается вернуть строку. Как исправить?

    @res2001
    Developer, ex-admin
    1. Лучше бы вы использовали std::string, а не нативные ("сырые") строки.
    2. Нативные строки - это не строки в привычном для С++ смысле (и в смысле интерпретируемых ЯП). У них нет встроенных операций типа конкатенации, выделения подстрок и т.п. Все это реализуется функциями в стиле Си str*
    3. Если вы хотите вернуть сырую строку, то надо:
    3.1. Массив под строку выделять в динамической памяти (или передавать его как параметр в функцию и его заполнять). Сейчас у вас автоматический массив, а он исчезнет, как только отработает оператор return и строка по факту не вернется (хотя вернется указатель, но он будет указывать в место на стеке, в котором уже нет вашей строки).
    3.2. Возвращать char*. Сейчас тип возвращаемого значения в вашей функции char - а это один символ, а не строка.
    4. Размер строки явно будет больше, чем size байт. На сколько больше - нельзя сказать заранее. Поэтому обычно выделяют достаточно большой буфер с запасом, чтоб покрыть все возможные варианты и при добавлении в буфер очередной подстроки контролируют размер буфера - чтоб оставалось место для очередной добавляемого куска и завершающего нулевого символа. Строка может быть равна size только в случае, если все числа в массиве будут состоять из одной десятичной цифры. Да и в этом случае требуется дополнительный байт на нулевой символ. Так что минимальный размер буфера должен быть size+1, реально он должен быть еще больше.
    Ответ написан
    Комментировать
  • Как отдать строку?

    @dima20155
    you don't choose c++. It chooses you
    Если под строкой имеется в виду EffRange - тогда return его.
    Если std::string нет простого пути, так как это не имеет смысла (сложение obj+obj возвращает строку в половине случаев, а в половине obj?)
    Пишите дополнительный метод.
    Также operator+, обычно, возвращает ссылку на объект
    Ответ написан
    2 комментария
  • Аварийное прекращение создания объекта из класса, который является родителем?

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

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

    Но этот метод не так легко обобщается на цепочки наследников. Надо чтобы все они одинаково интерпретировали этот флаг и меняли его при неудачной инициализации.
    Ответ написан
    3 комментария
  • Как сократить код с подпрограмой?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Эти три функции идентичны, с точностью до переименования локальных переменных. Вы три раза написали одно и тоже. Можно 2 функции просто удалить и использовать отсавшуюся три раза.

    Ну какая разница, как у вас там переменная называется sA или sB - результат будет один и тот же.

    Да, может вы путаетесь, но аргумент в функции можно тоже переменовать. Хоть там и написано int masivA(int* a), этот a - это аргумент. Он никак не привязан к массиву a в main(). Туда можно передать и a и b и любой другой массив.
    Ответ написан
    4 комментария
  • Как вставить элемент в строку после определенного условия?

    find_first_of() возвращает либо позицию, либо string::npos. То есть будет срабатывать почти всегда (кроме первого элемента строки). Правильно: if (find_first_of(...) != string::npos).
    Ответ написан
    Комментировать
  • Какую легковесную IDE выбрать для C++?

    Wohlstand
    @Wohlstand
    Инженер-программист С++
    Я сам для себя использую Qt Creator. По мне очень удобная и шустрая среда. Однако, хочу предупредить: в последних версиях присутствует модуль clangd (модель кода CLang): штука очень полезная, позволяющая находить различные косяки на лету без необходимости собирать проект, однако, она жрёт оперативку очень знатно. Поэтому, если машина слабая, то лучше отключить эту штуку. Мне лично среда ОЧЕНЬ нравится не только за её легковесность, но и за встроенный функционал по рефактрорингу (умному переименованию элементов кода, например, быстрому созданию тел функций и методов из прототипов сразу в нужном месте, и т.п.). Сравнивал я с Clion: последняя удобная по части быстрых подсказок и некоторой автоматизации по исправлению косяков, но по большей части менее удобная и невероятно тяжеловесная (да "здравствует" Java).
    Ответ написан
    Комментировать
  • Как исправить ошибку "main: функция не может быть перегружена"?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Ну у вас main() дважды объявлена, так делать нельзя.
    Ответ написан
    4 комментария
  • Как вернуть массив из структуры?

    В данном случае в вашей программе нет необходимости использовать массив, лучше завести 3 переменные в структуре ivector3d
    struct ivector3d {
      int x = 0;
      int y = 0; 
      int z = 0;
    };

    Затем обращаться к ним из функции scale.
    Если вас интересует возвращение массива из функции, то вам нужно вернуть указатель на первый элемент массива
    int* get() {
        return array;
      }

    Но это плохой способ, т.к. при таком подходе теряется информация о размере массива. Эту проблему можно решить возвращая размер массива в параметрах функции.
    int* get(int& size) {
        size = 3;
        return array;
      }

    Но, согласитесь, это не очень удобно. В таком случае предлагается изменить код на использование контейнера std::array.
    struct ivector3d {
    
      std::array<int, 3> array;
      std::array<int, 3> get() {
        return array;
      }
    };

    По итогу, программа будет выглядеть следующим образом
    #include <iostream>
    #include <array>
    
    using namespace std;
    
    struct ivector3d {
    
      std::array<int, 3> array;
      std::array<int, 3> get() {
        return array;
      }
    };
    
    void scale(ivector3d* v, int k) {
      for (int i = 0; i != 3; ++i)
        v->array[i] *= k;
    }
    
    
    int main() {
    
      ivector3d iv3d = {1,1,1};
      scale(&iv3d, 2);
    
      auto b = iv3d.get();
      for(auto i : b)
      {
          cout << i << " ";
      }
    }
    Ответ написан
    1 комментарий
  • Почему в С++ появляется Segmentation fault?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    head - указатель, который вы инициализируете 0. Потом вы пытаетесь обратиться к полю sizeOfChild по этому указателю, вот тут все и падает. Потому что поля нет, как нет и всего head - вы же под него память не выделяли.
    Ответ написан
    Комментировать
  • Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Никак не пойму что за ошибка, и что она хочет от меня.

    Ошибка -- обращение к памяти, к которой нельзя обращаться, первая ссылка по запросу sigsegv в гугле.
    Хочет она от тебя чтобы ты веделил память для colonies[i].aparts перед тем как к ним обращаться.
    Ответ написан
    Комментировать
  • Как построить график функции в c++?

    GavriKos
    @GavriKos
    Делайте на Qt.
    Ответ написан
    Комментировать
  • Генератор double в определённом диапазоне?

    @pfemidi
    Тут могло бы быть краткое описание меня
    [pfemidi@pfemidi tmp]$ cat foobar.cpp
    #include <iostream>
    #include <random>
    #include <chrono>
    
    int main() {
        const double from = 1.0;
        const double to = 1.19;
        std::default_random_engine engine(
            std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()));
        std::uniform_real_distribution<> distr(from, to);
        auto gen_number = [&engine, &distr] () { return distr(engine); };
        std::cout << gen_number() << std::endl;
    }
    [pfemidi@pfemidi tmp]$ g++ foobar.cpp -o foobar
    pfemidi@pfemidi tmp]$ ./foobar 
    1.07033
    [pfemidi@pfemidi tmp]$ ./foobar 
    1.12032
    [pfemidi@pfemidi tmp]$ ./foobar 
    1.14531
    [pfemidi@pfemidi tmp]$ ./foobar 
    1.1703
    [pfemidi@pfemidi tmp]$ ./foobar 
    1.00529
    [pfemidi@pfemidi tmp]$ ./foobar 
    1.03029
    [pfemidi@pfemidi tmp]$ ./foobar 
    1.00107
    [pfemidi@pfemidi tmp]$ ./foobar 
    1.02606
    [pfemidi@pfemidi tmp]$
    Ответ написан
    Комментировать
  • Почему при использовании переменной в методе, выдает ошибку Linker Tools Error LNK2001?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему при использовании переменной в методе, выдает ошибку
    class Test
    {
      static std::string question;


    Потому что статическое поле класса нужно определить, его упоминание в определении класса -- это не определение. Определить его можно например так в .cpp вне всех функций:
    std::string Test::question;
    Ответ написан
    Комментировать
  • Как записать в переменную типа char строку неизвестной длины из файла?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    C++
    Нужно в двумерный массив char записать эти строки

    Если это С++, то строки -- это std::string, массив -- это std::vector, используй std::getline и например std::vector::push_back.
    Если это массив char, то это C и выделение памяти по мере надобности функцией realloc.
    Ответ написан
    3 комментария
  • Почему нельзя использовать ^ в коде?

    mayton2019
    @mayton2019
    Bigdata Engineer
    На всякий случай. Домик - это не возведение в степень а булева операция xor.
    Ответ написан
    2 комментария