• Как найти отличия в двух файлах XML?

    @abcd0x00
    Лучше загрузить xml в дерево и сравнить эти деревья с выводом различий. По идее, тебе нужен хороший скрипт на питоне. Без знаний сложновато будет написать.
    Ответ написан
    Комментировать
  • Чистый С и переменное число аргументов?

    @abcd0x00
    Цель моей задачи овладеть макросами

    А при чём тут макросы? Ты, возможно, не знаешь, но getc() и getchar() тоже реализованы часто в виде макросов. Чтобы ими пользоваться, не нужно этого знать. Тут то же самое.

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

    Сначала ставится указатель на последний обязательный аргумент, а потом от этой позиции делаются переходы по аргументам в соответствии с размерами их типов.

    Чтобы адреса и размеры вручную не вычислять каждый раз, сделаны удобные макросы - va_start(), va_arg(), va_end().
    Ответ написан
    Комментировать
  • Python: format str float - как прятать дробную часть, если она равна нулю?

    @abcd0x00
    Цену надо хранить в виде целого числа, иначе из-за округления она может становиться недостоверной.
    Ответ написан
    Комментировать
  • Как проверить, пустой ли стек?

    @abcd0x00
    В самом начале создаем 1 элемент стека "top" (он же пока что и является верхним) при помощи конструктора с полями key = NULL, deeperElement = NULL;

    Зачем он там нужен, если в нём ничего нет? Бывает, учат так в вузах, добавляя лишние ненужные элементы.
    Сделай стек и инициализируй его вершину нулевым указателем и по этому значению проверяй. Ни один указатель на объект не может быть равен нулевому указателю, поэтому это надёжное средство.
    Ответ написан
    Комментировать
  • Непростая задача для vim?

    @abcd0x00
    В Emacs'е элементарно делается.

    Вставляешь начальную строку, переходишь на следующую строку и включаешь запись макроса.

    Записываешь макрос:
    1. вставить строку
    2. перейти на три слова влево
    3. выделить слово
    4. запустить встроенный калькулятор с нулевым аргументом
    5. добавить единицу
    6. выключить калькулятор
    7. вернуться в начало строки
    8. выделить строку до конца
    9. скопировать строку
    10. перейти на следующую строку

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

    У меня это всё занимает 20 секунд (если не спешить) от вставки первой строки до получения конечного списка.

    В Vim'е, наверное, тоже всё это есть. Лучше приучиться к макросам, потому что это тут повезло, что скрипт можно легко написать, так как строки не сильно отличаются. А бывает так, что нужно выделить какие-нибудь части из html-исходника, которые не всегда точно определены.
    Ответ написан
    Комментировать
  • Для чего нужен чистый репозиторий?

    @abcd0x00
    В чистом репозитории только папка .git, как люди будут работать с ним?

    Он нужен только для клонирования и обмена коммитами через pull/push. При клонировании из него создаются файлы в последнем состоянии и закачивается история изменений. А при обмене коммитами оттуда или туда скачиваются только коммиты.
    Ответ написан
    Комментировать
  • Какой стиль комментирования кода правильнее?

    @abcd0x00
    Лучшие из всех те комментарии, которые не нужны. А вообще, да, пиши комментарии на каждый чих, чтобы научиться просто их писать и знать, что в них писать надо, а что не надо. И тогда ты сможешь прийти к тому уровню, когда у тебя сам код станет комментарием самого себя.
    Ответ написан
    Комментировать
  • Как в g++ переименовать каталог и создать новый?

    @abcd0x00
    Это просто переименовать
    #include <cstdio>
    
    int main()
    {
        rename("t1", "t2");
        return 0;
    }


    Это создать новый
    #include <sys/stat.h>
    
    int main()
    {
        mkdir("t1", 0644);
        return 0;
    }
    Ответ написан
    Комментировать
  • Как правильно комментировать коммит?

    @abcd0x00
    Может есть какой-то стандарт, о котором я не знаю?

    Вообще, сам git скачай в виде исходников, там есть файл SubmittingPatches.

    Выдержка оттуда
    (1) Make separate commits for logically separate changes.
    
    Unless your patch is really trivial, you should not be sending
    out a patch that was generated between your working tree and
    your commit head.  Instead, always make a commit with complete
    commit message and generate a series of patches from your
    repository.  It is a good discipline.
    
    Give an explanation for the change(s) that is detailed enough so
    that people can judge if it is good thing to do, without reading
    the actual patch text to determine how well the code does what
    the explanation promises to do.
    
    If your description starts to get too long, that's a sign that you
    probably need to split up your commit to finer grained pieces.
    That being said, patches which plainly describe the things that
    help reviewers check the patch, and future maintainers understand
    the code, are the most beautiful patches.  Descriptions that summarise
    the point in the subject well, and describe the motivation for the
    change, the approach taken by the change, and if relevant how this
    differs substantially from the prior version, are all good things
    to have.
    
    Make sure that you have tests for the bug you are fixing.  See
    t/README for guidance.
    
    When adding a new feature, make sure that you have new tests to show
    the feature triggers the new behaviour when it should, and to show the
    feature does not trigger when it shouldn't.  Also make sure that the
    test suite passes after your commit.  Do not forget to update the
    documentation to describe the updated behaviour.
    
    Speaking of the documentation, it is currently a liberal mixture of US
    and UK English norms for spelling and grammar, which is somewhat
    unfortunate.  A huge patch that touches the files all over the place
    only to correct the inconsistency is not welcome, though.  Potential
    clashes with other changes that can result from such a patch are not
    worth it.  We prefer to gradually reconcile the inconsistencies in
    favor of US English, with small and easily digestible patches, as a
    side effect of doing some other real work in the vicinity (e.g.
    rewriting a paragraph for clarity, while turning en_UK spelling to
    en_US).  Obvious typographical fixes are much more welcomed ("teh ->
    "the"), preferably submitted as independent patches separate from
    other documentation changes.
    
    Oh, another thing.  We are picky about whitespaces.  Make sure your
    changes do not trigger errors with the sample pre-commit hook shipped
    in templates/hooks--pre-commit.  To help ensure this does not happen,
    run git diff --check on your changes before you commit.
    
    
    (2) Describe your changes well.
    
    The first line of the commit message should be a short description (50
    characters is the soft limit, see DISCUSSION in git-commit(1)), and
    should skip the full stop.  It is also conventional in most cases to
    prefix the first line with "area: " where the area is a filename or
    identifier for the general area of the code being modified, e.g.
    
      . archive: ustar header checksum is computed unsigned
      . git-cherry-pick.txt: clarify the use of revision range notation
    
    If in doubt which identifier to use, run "git log --no-merges" on the
    files you are modifying to see the current conventions.
    
    The body should provide a meaningful commit message, which:
    
      . explains the problem the change tries to solve, iow, what is wrong
        with the current code without the change.
    
      . justifies the way the change solves the problem, iow, why the
        result with the change is better.
    
      . alternate solutions considered but discarded, if any.
    
    Describe your changes in imperative mood, e.g. "make xyzzy do frotz"
    instead of "[This patch] makes xyzzy do frotz" or "[I] changed xyzzy
    to do frotz", as if you are giving orders to the codebase to change
    its behaviour.  Try to make sure your explanation can be understood
    without external resources. Instead of giving a URL to a mailing list
    archive, summarize the relevant points of the discussion.

    Ответ написан
    Комментировать
  • Как умножить каждый ДЕВЯТЫЙ элемент списка на 2?

    @abcd0x00
    >>> lst = [1, 2, 3, 4, 5] * 10
    >>> 
    >>> out = [n * 2 if i % 9 == 0 else n
    ...        for i, n in enumerate(lst, 1)]
    >>> out
    [1, 2, 3, 4, 5, 1, 2, 3, 8, 5, 1, 2, 3, 4, 5, 1, 2, 6, 4, 5, 1, 2, 3, 4, 5, 1, 4, 3, 4, 5, 1, 2, 3, 4, 5, 2, 2, 3, 4, 5, 1, 2, 3, 4, 10, 1, 2, 3, 4, 5]
    >>>
    Ответ написан
    Комментировать
  • Массовое уменьшение и обрезка картинок. Как?

    @abcd0x00
    Как правильно написать команду тут?

    Надо написать в виде функций: первая функция преобразует один файл, как надо; вторая функция подаёт файл в первую функцию и сохраняет результат, как надо.
    Ответ написан
    Комментировать
  • Как проигнорировать содержимое тегов?

    @abcd0x00
    Используй конечный автомат на три состояния: начало (S1), в середине без символа (S2) и в сердине с символом (S3).
    В S1 ты можешь принять только открывающую скобку и перейти в S2.
    В S2 ты можешь принять только простой символ и перейти в S3.
    В S3 ты можешь принимать простые символы и закрывающую скобку.
    Ответ написан
    Комментировать
  • Как назвать направление в программировании, занимающееся алгоритмами парсинга/разбора JSON, XML, др. языков?

    @abcd0x00
    Лексический анализ -> синтаксический анализ -> семантический анализ.

    Теория синтаксического анализа, перевода и компиляции.
    Альфред Ахо и Джеффри Ульман.
    Ответ написан
  • Бесплатный проект для портфолио превратился в бесконечный. Как быть?

    @abcd0x00
    Допиши его, преодолев бесконечность, но денег не получишь за него.
    Я так делал. Поэтому у меня никогда нет затычек в коде и хаков всяких (наскоряк обычно такие делают).
    Это не для портфолио хорошо, а для твоего мастерства.
    А когда программу пишешь, ей похеру на твоё портфолио, не умеешь - нет программы.
    Ответ написан
  • Указатель на указатель?

    @abcd0x00
    Вот в этой строке argv - это указатель на указатель на строку.
    int main(int argc, char *argv[])
    Аргументы программы представлены в виде массива указателей на строки, в котором последний указатель равен нулю (нулевому указателю).

    Бывает, что эту строку записывают и так
    int main(int argc, char **argv)
    Ошибки нет. Просто пишут скобки, чтобы напомнить, что там массив указателей, а не просто один указатель какой-то.

    И дальше что? Правильно, ты можешь делать argv++, переходя по массиву указателей вправо.

    А как сделать функцию, которая сама бы переставила argv?
    void func(char ***p) { (*p)++; }
    ...
        func(&argv);

    Пример
    #include <iostream>
    
    using namespace std;
    
    void func(char ***p)
    {
        (*p)++;
    }
    
    int main(int argc, char *argv[])
    {
        cout << argv << " " << *argv << endl;
        func(&argv);
        cout << argv << " " << ((*argv) ? *argv : "no") << endl;
        return 0;
    }

    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    0xbffc3114 ./t
    0xbffc3118 no
    [guest@localhost cpp]$ ./t a
    0xbf999594 ./t
    0xbf999598 a
    [guest@localhost cpp]$

    Ответ написан
    Комментировать
  • Что не так в скрипте по сбору информации о системе Ubnutu?

    @abcd0x00
    но при запуске в строке сбора данных о процессоре происходит ошибка:

    Эта ошибка происходит из-за выпадения скобок из двойных кавычек.
    Аналогичный вариант:
    [guest@localhost ~]$ s="abc"def(g)"hij"
    bash: syntax error near unexpected token `('
    [guest@localhost ~]$


    Исправить можешь так:
    [guest@localhost ~]$ s="abc'def(g)'hij"
    [guest@localhost ~]$
    Ответ написан
    Комментировать
  • Как правильно парсить utf-8 в lxml?

    @abcd0x00
    Если кодировка не объявлена, откуда он узнает, что там utf-8?
    Декодируй до передачи.
    >>> import lxml.html
    >>> 
    >>> s = b'<div>Hyv\xc3\xa4 juoni!</div>'.decode('utf-8')
    >>> 
    >>> doc = lxml.html.fromstring(s)
    >>> doc
    <Element div at 0xb744be3c>
    >>> doc.text
    'Hyvä juoni!'
    >>>
    Ответ написан
  • Как вернуть массив?

    @abcd0x00
    Пример передачи указателя в функцию и его возврата из функции
    Код
    #include <stdio.h>
    
    int *func(int a, int b, int *p)
    {
        p[0] = a;
        p[1] = b;
        return p;
    }
    
    int main(void)
    {
        int arr[4], *p;
    
        p = func(1, 2, arr);
        printf("%d %d\n", p[0], p[1]);
    
        p = func(3, 4, arr + 2);
        printf("%d %d\n", p[0], p[1]);
    
        p = arr;
        printf("%d %d %d %d\n", p[0], p[1], p[2], p[3]);
        return 0;
    }


    Вывод
    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    1 2
    3 4
    1 2 3 4
    [guest@localhost c]$


    Как раз в твоей ситуации у тебя недопонимание указателей.
    Ответ написан
    Комментировать
  • Чем отличается спецификатор от модификатора C/C++?

    @abcd0x00
    Есть квалификатор, спецификатор и модификатор.
    Квалификатор и модификатор - это одно и то же.

    Спецификатор - то, что задаёт тип:
    int
    short
    long
    struct x
    union y

    Модификатор - то, что меняет заданный тип:
    const
    volatile
    Ответ написан
    Комментировать
  • Struct - что это?

    @abcd0x00
    Структуры используются для создания составных типов данных. Раньше (в C) они ограничивались только данными, но потом (в C++) для этих составных данных добавили и создание операций над ними.

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

    То же самое касается и инициализации: если раньше можно было инициализировать одним способом, то теперь можно сделать разные способы инициализации путём создания разных конструкторов.
    Ответ написан
    Комментировать