Ответы пользователя по тегу C++
  • Нужно ли изучать автоматизацию сборки?

    @abcd0x00
    Если сейчас все так просто, то нужно разбираться в make/cmake?

    Вообще, make - это старое, проверенное средство, которое везде есть. И практика показывает, что когда у тебя есть проект, его надо не только компилировать, но и всячески обслуживать (запускать тесты, чистить ненужные файлы, устанавливать, деустанавливать). И для всего этого может быть сделан всего один Makefile, так как в нём не только сборку можно делать, но и задавать серии команд.
    Пример самодельного Makefile
    # Build section
    
    CC = gcc
    CFLAGS = -ansi -pedantic -Wall
    
    TARGET = ntow
    OBJS = main.o noun.o triple.o number.o cmdline.o errors.o input.o
    
    BASEDIR = .
    TESTDIR = $(BASEDIR)/tests
    
    # Install section
    
    prefix = /usr/local
    
    PREFIX = $(prefix)
    BINDIR = $(PREFIX)/bin
    
    # Rules
    
    all: $(TARGET)
    
    $(TARGET): $(OBJS)
    	@$(CC) $(CFLAGS) $^ -o $@ && echo "$(TARGET) has built"
    
    main.o: cmdline.h number.h input.h errors.h
    triple.o: triple.h
    number.o: number.h
    cmdline.o: cmdline.h errors.h
    
    # Commands
    
    help:
    	@echo "usage: make [ test | install | uninstall | clean | cleanall ]" 1>&2
    
    test: $(TARGET)
    	@$(MAKE) -C $(TESTDIR) run
    
    clean:
    	@rm -f $(OBJS) $(TARGET) && echo "$(TARGET) cleaned"
    
    cleanall: clean
    	@$(MAKE) -C $(TESTDIR) clean
    
    install:
    	install -d $(BINDIR)
    	install $(TARGET) $(BINDIR)/$(TARGET)
    
    uninstall:
    	rm -f $(BINDIR)/$(TARGET)
    
    .PHONY: help all test clean cleanall install uninstall

    Ответ написан
    Комментировать
  • Как в C++ увеличить число символов, занимаемых числом?

    @abcd0x00
    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    int main()
    {
        cout << 300 << endl;
        cout << setw(3) << 3 << endl;
        cout << setfill('0') << setw(3) << 3 << endl;
        return 0;
    }


    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    300
      3
    003
    [guest@localhost cpp]$
    Ответ написан
    2 комментария
  • Как использовать "гибкость" двумерного массива, перед одномерным?

    @abcd0x00
    Тут тебе набросал пример разделения большого массива на подмассивы.
    Код
    #include <iostream>
    
    using namespace std;
    
    class Student {
        char *name;
        char *surname;
        int age;
        char phone[12];
        double average;
    public:
        Student() {};
        ~Student() {};
        // methods
        void set_age(int n) {
            age = n;
        }
        void print_age() {
            cout << age << endl;
        }
    };
    
    class AcademyGroup {
        enum { LINES = 10, ONE_LINE = 50 };
        Student ***pSt;
        int count;
    public:
        AcademyGroup();
        ~AcademyGroup();
        // methods
        void add(Student *p);
        void print();
    };
    
    AcademyGroup::AcademyGroup()
    {
        pSt = new Student **[LINES];
        for (int i = 0; i < LINES; i++)
            pSt[i] = new Student *[ONE_LINE];
        count = 0;
    }
    
    AcademyGroup::~AcademyGroup()
    {
        for (int i = 0; i < LINES; i++)
            delete [] pSt[i];
        delete [] pSt;
        count = 0;
    }
    
    void AcademyGroup::add(Student *p)
    {
        pSt[count / ONE_LINE][count % ONE_LINE] = p;
        count++;
    }
    
    void AcademyGroup::print()
    {
        for (int i = 0; i < count; i++) {
            pSt[i / ONE_LINE][i % ONE_LINE]->print_age();
        }
    }
    
    int main()
    {
        AcademyGroup group;
    
        for (int i = 0; i < 200; i++) {
            Student *p = new Student;
            p->set_age(i + 1);
            group.add(p);
        }
        group.print();
        return 0;
    }


    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    [guest@localhost cpp]$


    По поводу ёмкости: вот эту часть, отвечающую за двумерность, можно перевыделять. То есть изначально, например, было 10 строк по 50 элементов, а потом на 501 элементе ты просто берёшь эти 10 строк перевыделяешь с сохранением того, что там было, и продолжаешь в том же духе. Перевыделение у тебя должно быть в функции добавления элемента.
    Ответ написан
    Комментировать
  • Наиболее красивый и правильный способ передачи параметров сквозь другой класс?

    @abcd0x00
    Допустим самой камере для работы нужен общий класс для всех камер OutputBuffer

    То, что он общий, ничего не значит. Работать с ним надо так, будто он индивидуальный для каждой камеры.
    Передаёшь его каждой камере при её инициализации. А уже готовая камера (которая знает, куда выводить) добавляется в список камер.
    Ответ написан
  • Динамическая структура данных. Что это?

    @abcd0x00
    Динамическая структура данных - это структура данных, количество элементов которой может меняться в процессе. Никакого отношения к динамической памяти и new это понятие не имеет.

    Стек, очередь, дек, последовательность, множество, нагруженное множество, Л1-список, Л2-список, динамический вектор, дерево, хеш-таблица и другие - это всё динамические структуры данных.

    А вот просто вектор, матрица - это нединамические структуры данных, потому что количество элементов в них фиксировано.
    Ответ написан
    Комментировать
  • Как повысить свои навыки программирования на С/С++?

    @abcd0x00
    Зачастую в моём коде встречается очень много логических ошибок, которые очень тяжело находить и исправлять. Как повысить мне свои навыки программирования ?

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

    Тебе нужно научиться:
    1) Словесно описывать алгоритм от начала до конца.
    2) По словесному описанию алгоритма рисовать блок-схему.
    3) По нарисованной блок-схеме писать псевдокод.
    4) По псевдокоду писать уже конкретный код на конкретном языке.

    Вот это всё и вырабатывает правильное мышление, когда ты ещё только думаешь над программой.

    Немного про псевдокод

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

    @abcd0x00
    #include <iostream>
    
    using namespace std;
    
    struct package {
        int status;
        unsigned char data[20];
    };
    
    int main()
    {
        package pkg = { 0, { 0x01, 0x02, 0x03 } };
    
        cout << pkg.status << int(pkg.data[0]) << endl;
        return 0;
    }
    Ответ написан
    2 комментария
  • Как построить гистограмму?

    @abcd0x00
    Это сложное задание для новичка.

    1. Сначала нужно сделать лексический анализатор, который разделяет текст на лексемы. А ещё циклы могут быть вложенными - лексема в лексеме.

    2. Вот, а потом уже, когда у тебя есть поток лексем, ты можешь посчитать соответствующие лексемы - получить массив количеств.

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

    Построить гистограмму - это самое простое во всём этом задании.
    Ответ написан
    Комментировать
  • Как правильно спроектировать программу?

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

    Нужно построить иерархию исполнителей. А для этого нужно знать, что такое исполнитель.

    Как разложить

    Допустим, тебе надо удалять файлы - значит, тебе нужен исполнитель "удаляльщик файлов". Там у него несколько действий есть типа "проверить файл", "удалить файл". То есть удалением файлов занимается только он. Бывает, что при удалении файла, нужно его имя как-то составить, проверить, можно ли его удалять. Вот этим всем занимается этот "удаляльщик".

    Допустим, тебе надо очистить журнал - значит, тебе нужен исполнитель "обработчик журнала". Там у него несколько действий есть типа "найти запись", "добавить запись", "удалить запись". То есть операциями с журналом занимается только он.

    Допустим, тебе надо перебирать ключи в реестре - значит, тебе нужен исполнитель "обработчик реестра". Там у него несколько действий есть типа "найти ключ", "добавить ключ", "удалить ключ", "изменить ключ". То есть операциями с реестром занимается только он.

    И вот этим всем у тебя управляет исполнитель "дирижёр". Там у него несколько действий есть типа "поработать с файлами", "поработать с журналом", "поработать с реестром так", "поработать с реестром сяк". То есть он управляет этими другими исполнителями, каждый из которых умеет делать что-то своё.

    Дальше ты пишешь функцию, которая управляет этим "дирижёром".

    А вообще всё делается наоборот: сначала пишешь функцию управления "дирижёром", потом реализуешь этого "дирижёра" и в его методах реализуешь управление нужными исполнителями, а потом уже реализуешь сами исполнители. Это называется "метод разработки сверху вниз".
    Ответ написан
    Комментировать
  • Как прочесть фрагмент стандарта языка Си?

    @abcd0x00
    Прочитай ещё это, потом пригодится
    rfc. ABNF
    Ответ написан
    Комментировать
  • Почему execl выходит из процесса?

    @abcd0x00
    Просто завершается форкнутый процесс.

    Он не завершается, он заменяется на то, что в execl(), и завершается то, что запустилось там.
    Ответ написан
    Комментировать
  • Как пользоваться QDataStream?

    @abcd0x00

    1: (это метод добавления одной строки в конец другой, верно?) append() используется таким вот образом:

    В моем же примере из учебника вот так append("Sent:" + dt.toString()); и не ясно что к чему в этом участке кода

    Это разные методы. В твоём примере используется метод append() у QTextEdit, так как от этого класса наследуется твой UdpServer.


    2: Мне не понятно что и как выводит оператор outТ.к если убрать <<dt и вообще исключить из кода, оставив просто out;
    то на выходе будет просто "Sent:". Если я объявляю Qstring str = "123" и пишу out << str , вывод не меняется

    out - это не оператор, а переменная типа QDataStream. У класса QDataStream переопределена (говорят перегружена, но это неправильно) операция побитового сдвига влево.

    Ты бы изучил сначала основы C++, потому что вопросы у тебя именно по ним, а не по Qt. Надо сначала изучить C++, а потом Qt, а не наоборот.

    Ты когда делаешь
    out << x
    переменная x пишется в out, потому что у out запускается метод <<, в который передаётся значение x. И этот метод понимает, как это значение сохранить, и знает, куда его там сохранить.

    QDataStream - это сериализатор, он принимает любые объекты и приводит их к определённому виду, чтобы потом на любой другой системе из этого определённого вида можно было эти объекты обратно прочитать и получить те же самые данные тех же самых типов.

    Почему у тебя что-то куда-то не пишется? Потому что ты не понимаешь, что ты делаешь. Зачем, например, ты наследуешь сервер от текстового окна? Если тебе нужен вывод сервера, сервер должен его передавать в отдельное окно, используя сигнальную систему.
    Ответ написан
  • Как правильно читать спецификацию (C/C++)?

    @abcd0x00
    1. Как правильно читать спецификацию? Люди, которые знакомы с ней, непосредственно брали в руки документ и читали его от корки до корки?

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

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

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

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

    @abcd0x00
    Во-первых, не надо ставить фигурные скобки в case'ах, выучи основы C++ для начала.
    Во-вторых, то, что ты спрашиваешь, делается с использованием new. Получаешь данные, делаешь под них new, потом сохраняешь данные туда и прицепляешь эту память к структуре.
    Ответ написан
  • Как быстро разобратся в сишном коде?

    @abcd0x00
    Пошел я значит смотреть как там устроен клиент и обнаружил что заюзали кучу библиотек и зачем я так и не понял.

    Скорее всего, это каша-малаша из разных компонентов, которые надёрганы из разнородных проектов, оттуда и разные библиотеки. А чтобы всё работало, они включены в сам проект.

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

    @abcd0x00
    Что нужно изучать, чтобы стать системным программистом на С++?

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

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

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

    Если хочешь быть программистом, готовься к тому, что придётся изучать самую обычную математику и самую обычную физику.
    Ответ написан
    Комментировать
  • Можно ли писать на чистом Си под Qt? Или для этого нужно именно Си++?

    @abcd0x00
    Из C++ там нужно не много - классы и пространства имён. Всё остальное делается там средствами самого Qt. Так что какого-то глубокого знания C++, которое используется в других cpp-шных программах, там не требуется. Можешь писать по-сишному, просто привязывая код к окнам через cpp-шные средства.
    Ответ написан
    Комментировать
  • Изменяются данные в массиве без ведома?

    @abcd0x00
    В чём может быть дело ?

    Неясен источник возникновения A и B. Такие симптомы говорят о мусоре в начальных данных.
    Ответ написан
    Комментировать
  • Как применить динамическую память для хранения соразмерного количества символов с ввода?

    @abcd0x00
    Я так понял что инициализацию динамического массива надо делать внутри цикла и освобождать память здесь же.

    Нужно сначала выделить буфер, а потом войти в цикл и писать в него посимвольно. Если он переполняется, то, не выходя из цикла, нужно его увеличить (выделить новый, скопировать данные, освободить старый, поставить новый на место старого).
    Ответ написан
    7 комментариев
  • Распознавание кода, конечный автомат, лексический анализатор и прочие умные слова?

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

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