Задать вопрос
  • Как сохранить жизнь переменной стека?

    @abcd0x00
    kakker:
    А что не так со сложными объектами с деструктрами?

    Ты собрался скопировать какой-то объект в динамическую память. Но в этом объекте может быть ещё какой-то объект. При выходе из функции (блока) копируемый объект разрушается и у него запускается деструктор. Объект внутри объекта тоже разрушается и у него тоже запускается деструктор.

    Пример
    #include <iostream>
    
    using namespace std;
    
    class B {
    public:
        int *p;
        B() {
            p = new int;
            *p = 5;
        }
        ~B() {
            delete p;
            cout << "dest B" << endl;
        }
    };
    
    class A {
    public:
        B b;
    };
    
    int main()
    {
        A a;
    
        {
            A tmp;
            a = tmp;
            cout << *a.b.p << endl;
        }
        cout << *a.b.p << endl;
        return 0;
    }


    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    5
    dest B
    0
    *** Error in `./t': double free or corruption (fasttop): 0x09178018 ***
    ======= Backtrace: =========
    /lib/libc.so.6[0x4c7ba2f3]
    /lib/libc.so.6[0x4c7c1e52]
    ...


  • Как вернуть результат рекурсивной функции в переменную?

    @abcd0x00
    Сформулируй задачу правильно, а то по быдлокоду догадываться, в чём именно задача, - последнее дело.
  • В каких областях не используется ООП программирование?

    @abcd0x00
    ООП можно и в ANSI C применять. Платформа GTK сделана так, хотя полностью на C.
  • Новый алгоритм поиска самого частого элемента, возможен ли он?

    @abcd0x00
    Только на отсортированном массиве такое можно получить.
  • Как применить динамическую память для хранения соразмерного количества символов с ввода?

    @abcd0x00
    матрунич сергей:
    чтобы переменная не инициализировалась в обасти видимости блока

    Не, термины неправильные опять. Инициализация - это самое первое помещение значения в переменную, задание начального значения. Здесь идёт речь о присваивании переменной другого значения. Нужно просто в указатель (переменная, хранящая число адресного типа) записать другое число. А записывать можно как через операции с побочным эффектом (инкремент, например), так и через операцию присваивания.

    Инициализация - это когда ты самое первое значение записал. Тогда ты говоришь "переменная инициализирована". Initial - начальный.

    Нельзя этот термин применять там, потому что неправильное применение терминов приводит к путанице, а путаница приводит к ошибкам.
  • Как применить динамическую память для хранения соразмерного количества символов с ввода?

    @abcd0x00
    матрунич сергей:
    Честно не понял вообще этот пункт (а так спасибо за наводку).

    Это потому, что ты не понимаешь, что ты сделал. Многие, кто C не изучал (начал с C++), не знают, что существуют блоки (безымянные).

    Пример
    int a = 1;
    
    printf("%d\n", a);
    {
        int a = 2;
    
        printf("%d\n", a);
        {
            int a = 3;
    
            printf("%d\n", a);
        }
        printf("%d\n", a);
    }
    printf("%d\n", a);


    Вывод
    1
    2
    3
    2
    1


    Ты внутри блока сделал новую переменную str, которая живёт в пределах этого блока и имеет своё значение. Переменная блока создаётся в блоке, имеет в нём свою область памяти (в которой хранит значение) и разрушается сразу после блока.

    Нужно просто сделать str = <новый адрес> без всяких char * в начале.
  • Как дописать в sed "&" в конце строки?

    @abcd0x00
    Пример утроения
    [guest@localhost ~]$ echo x | sed 's/./&&&/'
    xxx
    [guest@localhost ~]$
  • Как дописать в sed "&" в конце строки?

    @abcd0x00
    Амперсанд имеет специальный смысл. Когда его в операторе подстановки вставляешь в поле замены, то на его место вставляется совпавшая строка из поля поиска.
  • Как применить динамическую память для хранения соразмерного количества символов с ввода?

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

    Во-вторых, у тебя там несколько ошибок:
    1) неправильно проверяется индекс
    В массиве из восьми байт нет восьмого индекса, есть индексы 0-7. Причём последний байт служебный, туда нельзя символ писать, там будет нулевой байт.
    2) неправильно перевыделяется память
    Надо использовать тот указатель, который у тебя есть уже. Указатель - это просто переменная, в которой хранится число. А число является адресом байта в памяти. Поэтому и используется указатель, как обычная переменная, - туда просто надо записать новое число.
    3) неправильно зануляется строка после всего
    Вот сколько у тебя байт есть, ты всегда должен оставлять один байт в конце под нуль-символ. И после всего ты туда и пишешь. Если у тебя восемь байт, то нуль-символ пишется в байт с индексом 7.

    Вот исправь их и добавь в конце под спойлером (пишешь его сам, так как в тегах его нет).
  • Как применять перечисляемый тип enum?

    @abcd0x00
    Егор Марчук:
    Моя main нифига не возвращает и через командную оболочку не запускается, поэтому нафиг мне писать int?

    Потому что там должен быть int по стандарту. Он либо пишется явно, либо неявно (если в C89), но никак не void. Если ты пишешь void, то это просто быдлокод. void писали тогда, когда стандартов ещё не было и каждый писал, что хотел.

    Если ты не пишешь int, то там от этого void не появляется, там int подразумевается. Но только в C89, потому что в C99 это отменили, как и неявное объявление функции.

    Я программировать умею. Просто никогда не пользовался enum. И еще, например switch никогда не использую. Многие goto боятся тоже. Просто есть есть вещи, которыми не пользуешься, а потом выясняется, что ты не знаешь как они работают.

    Вот читай книги приличные, потому что там как раз используют switch и enum, причём делают это правильно, а не как взбредёт через угадайку. Не надо экспериментировать, возьми профессиональную литературу и повторяй за ними. Как усвоишь, тогда и будешь отклоняться.

    enum - это enumeration (перечисление), это просто набор констант типа int, пронумерованных автоматически. enum пришёл на смену #define, так как enum компилируется и имеет область видимости и подобные вещи в отличие от #define'а.

    Дополнительная инфа

    Хочешь узнать, чем целочисленная константа отличается от целочисленного обозначения? Константа - это такая штука, которую можно менять с гарантией того, что код продолжит работать правильно после изменения. А обозначение - это такая штука, которая улучшает читаемость, но её изменение не гарантирует правильную работу кода после её изменения. Вот #define'ы как раз служат и в роли констант, и в роли обозначений, поэтому по ним непонятно, можно ли их менять, когда они определены, или нельзя. А когда смотришь на enum, то сразу можешь сказать, что их значения можно менять, потому что это константы, а не обозначения. Так что с появлением enum'ов, все константы принято обозначать скопом в enum'е, а все обозначения, как и раньше, пишутся в #define'ах и не подразумевают последующих изменений.

    Если нужны нецелочисленные константы, то ты используешь модификатор const. При этом const применим не только к простым типам, но и к составным вроде структур и объединений. То есть целую структуру можно создать один раз и зафиксировать через const, тогда программа не сможет поменять её никогда.


    Я тут смотрю, ты не понимаешь, где enum, а где переменная типа enum. Вообще, enum можно использовать без переменной, все константы доступны. Если же ты собрался сохранять эти константы, то надо сделать переменную такого типа и ей просто присваивать константу по имени. Если бы ты читал книги, ты бы всё это там увидел, а так мы тебе книги перессказываем просто.
  • Какие знания по математике для создания игр на C++?

    @abcd0x00
    Александр Скуснов: посмотришь в YouTube сталкер сетевой или бэтлфилд. Когда в сталкер играешь, так там ставится прицел на большинство автоматов и ты на расстоянии стреляешь, а снайперские - так тем более.

    Практически все понятия типа "скорость", "ускорение", "вес", "сила какая-то" - всё берётся из физики и максимально приближается через физические формулы к реальному миру. В математике таких понятий нет. Математика не знает, как связаны скорость и ускорение, например. Связь между ними описана в физике. Чтобы смоделировать, например, движение юнита в воде, нужно учитывать её физические свойства. А чтобы их учитывать, нужно их знать.
  • Какие знания по математике для создания игр на C++?

    @abcd0x00
    Александр Скуснов: видно, не играл в игры. Есть снайперка, во всех приличных играх на пулю действует сила притяжения к Земле. Если это константно задать, теряется ощущение реалистичности. Если же она вычисляется, то это более реально выглядит. На разных расстояниях прицел надо поднимать на разную высоту над головой. Есть ещё и подствольный гранатомёт.
  • Какие знания по математике для создания игр на C++?

    @abcd0x00
    С физики тоже немало всякого нужно знать. Формулы движений и всяких законов. Знаешь, полёт пули, например, в игре высчитывается с использованием физических законов (гравитационная сила (вектор) тянет пулю вниз на протяжении всей траектории полёта).
  • Как вырезать текст между двумя тэгами в xml?

    @abcd0x00
    bik:
    А вот на оригинальном файле слишком много удаляется:

    Посмотрел
    [guest@localhost t]$ head -1 feed.xml | wc -c
    999692
    [guest@localhost t]$

    Слишком длинные строки в файле, sed нельзя использовать для таких длинных строк. По стандарту он разрешает строки до 8Kb. Что он там дальше допускает - негарантированно (могут быть ошибки из-за обрезков).

    Скорее всего, это надо перегнать в базу данных какую-нибудь (вроде sqlite) и проделать операции с ней.
    (Можно, конечно, укоротить строки, а потом sed'ом обработать, но это не стоит того, он здесь просто не подходит.)
  • Как правильно отлавливать ошибки в urllib?

    @abcd0x00
    Вообще, в одном except можно отлавливать несколько исключений, указав кортеж исключений, а не писать except на каждое.
  • Как bash понимает какой переменной оперировать?

    @abcd0x00
    Алексей Тен:
    Можно даже так написать :)

    Часто так и делается, но только при использовании sed'а. У awk есть способ передачи данных внутрь (через переменные). А у sed'а нет, но переменные тоже надо передавать.

    Пример
    [guest@localhost ~]$ s="def"
    [guest@localhost ~]$ d="fde"
    [guest@localhost ~]$ echo "abc def ghi" | sed 's/'"$s"'/'"$d"'/'
    abc fde ghi
    [guest@localhost ~]$
  • Почему я не могу просто откатится в определенному коммиту в git?

    @abcd0x00
    Артур Черешнюк: значит, ты переходил на тот же коммит. Посмотри, на каком коммите у тебя указатель master, а потом перейди на другой коммит и там сделай branch или checkout -b.
  • Почему я не могу просто откатится в определенному коммиту в git?

    @abcd0x00
    Артур Черешнюк:
    а почему когда я создал новую ветку она визуально находится на том же уровне что и масте?

    Потому что когда ты её создавал, ты стоял там, на мастере. А что значит "стоял"? Это значит, что указатель HEAD был равен указателю master. Если ты перейдёшь на какой-то коммит (через checkout), то он туда установит указатель HEAD и тебе скажет, что ты оторван от веток. Но когда ты, стоя там, создашь ветку, она создастся там, где стоит HEAD - прямо на коммите.
  • Как подавить вывод функции, получив при этом код возврата?

    @abcd0x00
    При return bash ведь должен в любом случае возвращать код

    Он всегда возвращает код, независимо от наличия return.
  • Как bash понимает какой переменной оперировать?

    @abcd0x00
    Leks: да, с кавычками разберись, а то и awk у тебя неправильно записан. Фигурные скобки являются частью кода, который в awk передаётся через аргумент awk. Поэтому в кавычки надо брать весь код, который подаётся в awk.
    awk -F '|' '{print $1}'