Задать вопрос
Ответы пользователя по тегу C
  • Как понять какой стандарт Си используется в проекте?

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Данная задача решается мета-программированием. Это предполагает 2 фазы компилляции. Поскольку
    речь идет о языке С. У нас нет рефлексии и нет шаблонов. То я вижу только такой выход.

    Вобщем 2 фазы. В первой фазе - объявить структуру TS1 в каком-то обобщенном формате.
    Например в JSON.
    {
      "struct" : {
        "name" : "TS1",
        "fields" : [
          { "name" : "a", "type" : "int" },
          { "name" : "b", "type" : "int" }
        ]
      }
    }


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

    mayton2019
    @mayton2019
    Bigdata Engineer
    FILE *handle = fopen("filename", "r")
    возвращает файловый указатель. Если открываешь на чтение - то он обычно null если файла
    не было или была какая-то другая ошибка. Детали по ошибке выдает другой системный вызов errno, streeror или
    что там еще есть другое не помню точно.
    Ответ написан
    Комментировать
  • Как создать массив из типов данных в си?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для того чтобы это работало в духе ООП, все типы должны иметь базовый тип.

    Для функциональщины - нужно иметь абстрактный тип Any и коллекции типов которые - суть
    подтипы Any. И функцию с pattern matching которая просто кастомизирует size() и прочие
    функции. Короче почти ручная работа.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Такое связывание специфично для Java-фреймворков а не для языка С.

    Я-бы предложил обсудить вопросы безопасности. Что будет если пользователь вызовет функцию которую ему нельзя вызывать? Как мы вообще ограничиваем пользователя? Стоит-ли такая гибкость получаемого удобства? Может лучше пойти классическим путем? Перечислить все возможные варианты действий явно и в switch-case обработать?
    Ответ написан
    Комментировать
  • На чем можно создать оффлайн базу знаний со встроенным редактором?

    mayton2019
    @mayton2019
    Bigdata Engineer
    По топику не сильно понятно что-же на самом деле хочет делать автор. Движок или саму базу?

    У баз знаний есть одна особенность. Они обычно понятны только их создателю. Тоесть если вы хотите обобщенного решения - то берите mediawiki. Всем подходит. Но опции поиска будут - наподобие текстовых. Если какое-то очень узкое кастомное решение - то это какой-нибудь семантическйи веб (XML/RDF) но пользоваться этим и искать информацию сможет только их создатель. Зато можете искать информацию очень узко. Например "все друзья у которых есть вконтакте друг который входит в группу и т.д".

    Я вот тоже пытался делать умные базы но в конечном счете все закончилось банальным языком разметки наподобие github markup language и текстовыми файлами.
    Ответ написан
    Комментировать
  • Как сделать обработчик коллизий в OpenGL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Это сложная тема. Это вам - не арканоид написать. Чтоб правильно сталкивать объекты - надо представить как-бы они сталкивались в реальном мире. И я думаю что тут даже десятка параметров недостаточно чтобы описать какое это столкновение. Столкнуть два бильярдных шарика - это одно. А два мешка с песком - это другое. Или шарик с мешком.
    Ответ написан
    1 комментарий
  • Как создать кастомное кроссплатформенное окно на си?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Буквально недавно было обсуждение здесь https://qna.habr.com/q/1241266

    Если кратко - то под каждую платформу - надо писать какой-то #ifdef ....#endif. Тоесть ваш код
    будет в объеме умножаться на число платформ которые надо поддержкать. Сколько их щас?

    В чистом виде язык "C" не имеет какого-то стандарта на отображение графики.
    Ответ написан
    Комментировать
  • Кроссплатформенное программирование на C?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Давайте поговорим о шрифтах. В 2012 я перешел с windows7 на Linux. И первая проблема практической работы с десктопом заключалась в том что я начал менять шрифты. Вот не нравились мне не шрифты не алгоритмы их рендеринга. Надо отдать должное МС. Шрифты у них хорошие. Дизайнеры очень долго думали над ними. Вот. Когда вы заняты кросс-платформенным UI возникает проблема. - Где взять шрифты максимально похожие на оригинал. Высота. Кернинг. Все должно быть максимально похожим на оригинальный десктоп где идет разработка иначе дизайн разваливается. В годы развития Linux Suse я пытался устанавливать их десктопы и использовать. И самая большая визуальная проблема что я видел - это полный развал шрифтового оформления. Доходило до смешного. Я просто не мог прочитать кириллический месседж в окне. Текст - сползал куда-то за границу окна. Или текст успешно переносился а баттон сползал за границы окна. Вобщем проблем было масса. Я думаю что одна из главных проблем кросс-платформенного UI - это унификация шрифтов. И дело тут вовсе не в Qt или Gnome/Gtk или KDE. А дело в том что другая платформа понятия не имеет как должен выглядет текстовый месседж.
    Ответ написан
    Комментировать
  • Bsd-socket. Почему бесконечное чтение при http запросе?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Скорее всего отправитель перестал что-то отправлять. Это не ошибка. Это нормальное состояние сокета. Обрабатывайте на прикладном уровне содержимое потока. Если это http-response то там есть хедеры и длина и прочее и содержимое (XML/Json).
    Ответ написан
  • Как не повторять весь код, если после условного оператора меняется сравнение?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Множитель (-1) или (+1) слева и справа от знака равно может перевернуть смысл сравнения.

    int m = choose == 1 ? 1 : -1;
    return m * ptr_array[13][j] > m * ptr_array[13][j + 1]
    Ответ написан
    Комментировать
  • Как транспонировать прямоугольную матрицу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    На входе - матрица размром (l,c) на выходе после транспонирования размеры перевернутся и будет (c,l).

    UPD1: Ты аллоцировал матрицу А. Потом матрицу Б. И в конце удалил память только одной матрицы. Это небрежность?

    UPD2: Как-то так должно быть. Лишние параметры поудалял. Добавил матрицу Б. Где-то перевернул индексы.

    #include "stdio.h"
    #include "stdlib.h"
    
    double **input_matrix(int l, int c) {
        double **A = (double **) malloc(l * sizeof(double *));
        for (int i = 0; i < l; ++i) {
            A[i] = (double *) malloc(c * sizeof(double));
            for (int j = 0; j < c; ++j) {
                double x;
                scanf("%lf", &x);
                A[i][j] = x;
            }
        }
        return A;
    }
    
    double **trans_matrix(double **A, int l, int c) {
        double **B = (double **) malloc(c * sizeof(double *));
        for (int i = 0; i < c; ++i) {
            B[i] = (double *) malloc(l * sizeof(double));
        }
        for (int i = 0; i < c; ++i) {
            for (int j = 0; j < l; ++j) {
                B[i][j] = A[j][i];
            }
        }
        return B;
    }
    
    void print_matrix(double **A, int l, int c) {
        for (int i = 0; i < l; ++i) {
            for (int j = 0; j < c; ++j) {
                printf("%lf ", A[i][j]);
            }
            printf("\n");
        }
    }
    
    void free_matrix(double **A, int l) {
        for (int i = 0; i < l; ++i) {
            free(A[i]);
        }
        free(A);
    }
    
    int main() {
        int l, c;
        printf("Enter the number of lines: ");
        scanf("%d", &l);
        printf("Enter the number of column: ");
        scanf("%d", &c);
        
        double **A = input_matrix(l, c);
        printf("Matrix A\n");
        print_matrix(A, l, c);
    
        double **B = trans_matrix(A, l, c);
        printf("Matrix B\n");
        print_matrix(B, c, l);
    
        free_matrix(A, l);
        free_matrix(B, c);
        return 0;
    }
    Ответ написан
    Комментировать
  • Как считать из файла определенное слово, и посчитать сколько раз оно появляется в файле СИ?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Почему вопрос градуирован как "сложный"? Тебе нужен символьный буфер на 6 символов. Вот и пиши в него
    по кругу. Как только в круге появится ананас - вот и считай плюс один.

    Кстати где твоя попытка хоть написать привет-мир с файлами?
    Ответ написан
    Комментировать
  • Собственная функция возведения в степень Си?

    mayton2019
    @mayton2019
    Bigdata Engineer
    У тебя - рекурсия. Попробуй расчитать какой она глубины.
    Ответ написан
  • Как учить C++ если будешь знать С?

    mayton2019
    @mayton2019
    Bigdata Engineer
    то с какого аспекта или момента учить C++

    Нет такого момента или аспекта. Просто учишь и все. Языки похожи по синтаксису. Но начиная с каких-то 80х
    годов С++ стал отдельным форком и сегодня это два разных языка которые не должны быть под-множествами
    друг друга. Кроме С++ еще придется изучать и библиотеки STL/Boost и это отдельная тема.
    Ответ написан
    Комментировать
  • Как реализовать Алгоритм Брезенхэма?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Брезенхем не использует вещественные числа. В этом его суть. Вещественные появляются просто в ходе доказательства его правильности. Но сама реализация - только на целых числах.
    Ответ написан
    4 комментария
  • Быстро ли мое решение?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Измерение перформанса - это великое искусство. В данном конкретном приложении скорее всего узким местом будет не игры с массивами а конкретно печать на экране
    printf("%d\n", c[i][0]);
    поэтому из быстрых алгоритмов печать надо вышвырнуть. Или заменить ее на агрегацию результата или
    думать об асинхронных и параллельных операциях записи результата в файл если уж он так сильно нужен.

    Очень многие начинающие прокалываются на этом. Еще попробуй отказаться от индекса в массиве и заменить
    его на "подвижный" указатель по массиву. Часто бывает что умные компилляторы умеют распознавать такой шаблон но я-бы предложил написать две реализации и сравнить.

    Ну и размер твоих массивов должен меряться мегабайтами чтобы ты хоть что-то почувствовал при замерах. Иначе будешь мерять только квантовый шум.
    Ответ написан
  • Как в Си вывести в консоль без записи в буфер?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Есть ли какая другая команда вывода, которая будет текст выводить только в терминал, без записи в файл?

    Да есть. Ты можешь выводить в STDERR и тогда это будет печататься на экране но в лог файл не попадет по причине такого скрипта
    ./a.out > file.log'
    Чтобы оба потока писались в лог - нужно делать так
    ./a.out 2>&1 > file.log'
    Но кажется что ты борешся не с той проблемой и не так. Для логгирования в файлы - есть специальные библиотеки.
    А работа с STDOUT/STDERR - это просто базовые абстракции любого Unix-процесса.
    Ответ написан
    4 комментария
  • Как найти область двумерного массива?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Серая область? Тут наверное 2 цикла надо.

    Либо обходить левый прямоугольник элементов и уже 2 линиями ограничить. Одна линия
    y = x и вторая - перевернутая y = -x и сдвинутая на вниз на SIZE. Тоесть y = -x + SIZE
    Ответ написан
    Комментировать