Ответы пользователя по тегу C++
  • Стоит ли зацикливаться на непонятной теме?

    @abcd0x00
    Так вот, стоит ли мне зацикливаться сейчас на этом и правда ли то, что если я не пойму этого сейчас, то никогда не пойму?

    Ты поймёшь потом, когда пройдёшь весь материал, необходимый для понимания этого. Есть такие вещи, которые непонятны без промежуточных данных.
    Это как в пятиэтажном доме: чтобы подняться на третий этаж, нужно подняться на второй этаж, а чтобы подняться на второй этаж, нужно подняться на первый этаж.
    Вот ты как бы с площадки между первым и вторым пытаешься подняться на третий и сам этого не понимаешь, потому что тебе кажется, что ты уже на втором.
    Значит, что-то не прошёл, раз не понимаешь.
    Ответ написан
    Комментировать
  • Непонятная ситуация с iostream!?

    @abcd0x00
    Попробуй так
    int z(12345);
    std::cout << "Z: " << z << std::endl;
    Ответ написан
  • Какой результат будет?

    @abcd0x00
    Это вычисление в наборе ASCII.
    У каждого символа в наборе есть свой позиционный номер (нумерация с нуля).
    В ASCII символы 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 идут по порядку, поэтому и их числовые коды идут по порядку - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57.
    Какой бы цифровой символ мы не взяли, его значение в числовом виде можно узнать, отняв от его позиции позицию нуля.

    Большинство компиляторов базируются на таблице ASCII, но это нигде не закреплено. Если компилятор будет базироваться на другой таблице, то этот код может не сработать, если в ней цифры стоят не рядом или вообще идут не по порядку.
    Ответ написан
    Комментировать
  • [Большой txt ~1 гб] как обработать?

    @abcd0x00
    Я бы сначала разделил исходный файл на несколько разных файлов, где каждый файл хранит одинаковые x y.
    Потом каждый из этих файлов по очереди превращал в одну строку и сбрасывал её в общий файл вывода.
    Ответ написан
    Комментировать
  • Как работает функция rand()?

    @abcd0x00
    Не понимаю, что именно генерирует функция rand()

    rand() генерирует одно целое число.

    не понимаю зачем использовать остаток от деления

    Операция взятия остатка от деления используется для установки верхней границы числа.

    Если вычислить 12345 % 7, то результат будет меньше 7.
    Если вычислить 12346 % 7, то результат будет меньше 7.
    Если вычислить 123456789 % 7, то результат будет меньше 7.

    Операция взятия остатка от деления одного числа на другое никакого отношения к функции rand() не имеет.
    Ответ написан
    Комментировать
  • Разница работы с памятью С и С++?

    @abcd0x00
    Почитай про сериализацию. Вот по тому же принципу нужно преобразовать структуру в однозначный поток байт, передать его, а потом преобразовать поток байт обратно в структуру. Так у тебя структуры могут быть устроены по разному, но при этом будут заполнены одинаково.
    Ответ написан
    Комментировать
  • Как работать с однонаправленными списками?

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

    Голова нужна, чтобы получать доступ к элементам.
    Хвост нужен, чтобы добавлять новые элементы.

    Без хвоста, если у тебя, например, в списке есть миллион элементов, а тебе нужно добавить ещё три, ты будешь проходить миллион и добавлять первый, потом будешь проходить миллион один и добавлять второй, потом будешь проходить миллион два и добавлять третий.
    Чтобы не проходить каждый раз, делается этот хвостовой указатель.

    Функция addItem() у тебя плохо спроектирована. Правильнее будет передавать в неё добавляемое значение. Если ты вводишь внутри, то ты не можешь, например, взять элементы этого списка из файла или принять их по сети. Так тебе придётся писать много одинаковых списков с одинаковой функциональностью. Поэтому вводить надо снаружи, а потом введённое значение передавать на добавление.
    Ответ написан
  • Где в регулярном выражении ошибка?

    @abcd0x00
    Где накосячил?

    Пропустит
    a@..aa
    Ответ написан
    Комментировать
  • Какую можете посоветовать литературу, ресурсы по указателям и динамическим массивам?

    @abcd0x00
    Используй литературу по C. Много практики с указателями есть у Прата. Но много практики не нужно, нужно хорошее объяснение, а оно есть в основной книге по C.
    Ответ написан
    Комментировать
  • Что значить while(*from) и *to = »? До какой точки будет выполняться цикл?

    @abcd0x00
    Классическая запись этой функции
    void mystrcpy(char *to, char *from)
    {
        while((*to++ = *from++))
            ;
    }


    Код
    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    void mystrcpy(char *to, char *from);
    
    int main()
    {
        char str1[20], str2[20];
        cout << "enter string: ";
        gets(str1);
    
        mystrcpy(str2, str1);
    
        cout << "string copiet: " << str2;
        cin.get();
        return 0;
    }
    
    void mystrcpy(char *to, char *from)
    {
        while((*to++ = *from++))
            ;
    }



    А тот учебник, в котором ты это взял, лучше выкинуть на помойку. Потому что от использования gets() все отказались уже давным давно, так как у неё нет ограничителя длины.
    Ответ написан
  • Указатели. Как создать подобную конструкцию (в приложении)?

    @abcd0x00
    Код
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        double **p = 0;
    
        p = new double *;
    
        int size;
        cout << "Input size: ";
        cin >> size;
    
        *p = new double[size];
    
        for (int i = 0; i < size; i++)
            *(*p + i) = 0;
    
        **p = *(*p + size - 1) = 2;
    
        cout << "size: " << size << endl;
        for (int i = 0; i < size; i++)
            cout << *(*p + i) << " ";
        cout << endl;
    
        delete [] *p;
        delete p;
        p = 0;
    
        return 0;
    }



    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    Input size: 10
    size: 10
    2 0 0 0 0 0 0 0 0 2 
    [guest@localhost cpp]$
    Ответ написан
    Комментировать
  • Правильное не закрывающиеся консольное окно windows?

    @abcd0x00
    Как это решается в серьезных проектах ?

    Поставь себе Linux.

    Раньше просто писал
    cin.get()
    cin.get()
    достало
    system(“pause”)
    getch()
    тоже костыли !

    Это нужно только в винде.
    Ответ написан
  • Какой смысл типа union?

    @abcd0x00
    Можно делать универсальные объекты для хранения.

    Пример:
    Код
    #include <stdio.h>
    
    struct a {
        int a, b, c;
    };
    
    struct b {
        double a, b, c, d;
    };
    
    struct c {
        char s[100];
    };
    
    struct d {
        int a, b, c;
        double n[10];
    };
    
    union x {
        struct a a;
        struct b b;
        struct c c;
        struct d d;    
    };
    
    typedef struct {
        enum { A, B, C, D } type;
        union x value;
    } Obj;
    
    int main(void)
    {
        Obj objects[100], *pobj;
        int n;
        int i;
    
        objects[0].type = A;
        objects[0].value.a.a = 1;
        objects[0].value.a.b = 2;
        objects[0].value.a.c = 3;
    
        objects[1].type = B;
        objects[1].value.b.a = 1.5;
        objects[1].value.b.b = 2.5;
        objects[1].value.b.c = 3.5;
        objects[1].value.b.d = 4.5;
    
        objects[2].type = C;
        sprintf(objects[2].value.c.s, "abc");
    
        objects[3].type = A;
        objects[3].value.a.a = 4;
        objects[3].value.a.b = 5;
        objects[3].value.a.c = 6;
    
        n = 4;
        
        for (i = 0; i < n; i++) {
            pobj = objects + i;
            switch (pobj->type) {
            case A:
                printf("A: %d %d %d\n",
                       pobj->value.a.a,
                       pobj->value.a.b,
                       pobj->value.a.c);
                break;
            case B:
                printf("B: %g %g %g %g\n",
                       pobj->value.b.a,
                       pobj->value.b.b,
                       pobj->value.b.c,
                       pobj->value.b.d);
                break;
            case C:
                printf("C: %s\n", pobj->value.c.s);
                break;
            case D:
                printf("D: %g\n", pobj->value.d.n[0]);
                break;
            }
        }
    
        return 0;
    }



    Вывод
    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    A: 1 2 3
    B: 1.5 2.5 3.5 4.5
    C: abc
    A: 4 5 6
    [guest@localhost c]$
    Ответ написан
    Комментировать
  • Ставить ли фигурные скобочки?

    @abcd0x00
    Руководствоваться нужно тем, что хорошо видно, и тем, что легко менять. Опыт показывает, что фигурные скобки для этого подходят лучше.

    if (cond)
        ;
    else
        statement;

    if (cond) {}
    else {
        statement;
    }

    Когда нужно добавить операторы в любую ветвь, то в первом случае нужно добавить фигурные скобки, а во втором случае фигурные скобки там уже есть.

    Также фигурные скобки не дают частям конструкций приклеиться не туда. Представь, что кто-то незнакомый писал код, который тебе нужно дописывать.
    Ты быстро пробегаешь его глазами и понимаешь неправильно, потому что такого кода три тонны.
    if (cond)
        if (cond)
            if (cond) {
                statement;
            statement;
            }
        else
            statement;
    else
        statement;


    А вот он же
    if (cond) {
        if (cond) {
            if (cond) {
                statement;
            statement;
            }
        else {
            statement;
        }
    }
    else {
        statement;
    }
    }

    Ты поставил курсор на скобочку в случае сомнений - и редактор тут же тебе подсветил парную скобку.
    Ответ написан
    Комментировать
  • Как отсортировать и вывести чётные элементы списка?

    @abcd0x00
    Можешь сделать бинарное дерево указателей на чётные элементы и потом его вывести.
    Но я бы сделал просто вектор указателей на чётные элементы, отсортировал его и вывел.
    Ответ написан
    Комментировать
  • Как правильно перевести из 16СС в 2СС?

    @abcd0x00
    Как правильно перевести из 16СС в 2СС?

    0 - 0000
    1 - 0001
    2 - 0010
    3 - 0011
    4 - 0100
    5 - 0101
    6 - 0110
    7 - 0111
    8 - 1000
    9 - 1001
    A - 1010
    B - 1011
    C - 1100
    D - 1101
    E - 1110
    F - 1111
    
    1A - 0001 1010
    AB - 1010 1011
    FF - 1111 1111
    
    ABFEC - 1010 1011 1111 1110 1100
    Ответ написан
    Комментировать
  • Как перенести алгоритм вычисления хеша на lua?

    @abcd0x00
    Или хотя бы расскажите, что он делает.

    1. Он добавляет 8-битное значение к 32-битному значению.
    2. Затем берёт у этого 32-битного значения 13 бит слева и переставляет их направо.
    3. Потом из исходного 32-битного значения вычитается полученное 32-битное значение.
    4. Потом всё повторяется, пока есть 8-битные значения.

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

    @abcd0x00
    Основное отличие от символических констант в том, что перечисления имеют другую область видимости
    #include <stdio.h>
    
    int main(void)
    {
        enum { A, B, C };
        {
            enum { A = 10 };
            printf("%d\n", A);
        }
        printf("%d %d %d\n", A, B, C);
        return 0;
    }


    [guest@localhost c]$ .ansi t.c -o t
    [guest@localhost c]$ ./t
    10
    0 1 2
    [guest@localhost c]$

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

    @abcd0x00
    Вообще, там есть средства для проверки сокета на активность. Можно поставить временной порог для отличия частей одной записи от разных записей. Но теоретически это ненадёжно.

    Так что используй TLV
    https://en.wikipedia.org/wiki/Type-length-value
    Ответ написан
    Комментировать
  • Библиотека для чтения директорий?

    @abcd0x00
    Системный вызов stat() даёт структуру, в которой указаны все свойства.

    man stat.h

    The  following  symbolic names for the values of type mode_t shall also
    be defined.
    
    File type:
    
    S_IFMT Type of file.
    
    S_IFBLK
           Block special.
    
    S_IFCHR
           Character special.
    
    S_IFIFO
           FIFO special.
    
    S_IFREG
           Regular.
    
    S_IFDIR
           Directory.
    ...
    
    The following macros shall be provided to test whether a file is of the
    specified  type.  The  value  m  supplied to the macros is the value of
    st_mode from a stat structure.  The macro shall evaluate to a  non-zero
    value if the test is true; 0 if the test is false.
    
    S_ISBLK(m)
           Test for a block special file.
    
    S_ISCHR(m)
           Test for a character special file.
    
    S_ISDIR(m)
           Test for a directory.
    
    S_ISFIFO(m)
           Test for a pipe or FIFO special file.
    
    S_ISREG(m)
           Test for a regular file.
    
    S_ISLNK(m)
           Test for a symbolic link.
    
    S_ISSOCK(m)
           Test for a socket.
    Ответ написан
    Комментировать