Ответы пользователя по тегу C
  • Почему в VS программа на СИ работает неправильно, хотя в онлайн компиляторе все в порядке?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Вангую, что ответа на этот вопрос Вы не получите :)

    Почему?

    Потому что никому неинтересно продираться через очередную нубскую лабу по потоковому вводу-выводу или чему-нибудь еще такому же.
    Ответ написан
    7 комментариев
  • Как происходит создание переменных в Си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Переменные, не обьявленные статическими, создаются в динамической области памяти ("куче") и будут иметь случайное значение. То, что там сейчас нуль - это вовсе не значит, что всегда и везде там будет нуль. Полагаться на то, что переменная после обьявления содержит (не содержит) какое-то значение - верный путь огрести SIGSEGV и самая распространенная ошибка.
    Ответ написан
    Комментировать
  • Какая лучшая книга по C (Си) для начинающего?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Мне в свое время очень помогла книга "Уэйт М., Прата С., Мартин Д. Язык Си. Руководство для начинающих". Но она довольно старая, не знаю, можно ли ей сейчас пользоваться. Сам язык конечно не поменялся...

    Почитать можно здесь
    Ответ написан
    Комментировать
  • Структура в си == объект?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    В С нет обьектов. Либо переходите на C++, либо читайте про выделение памяти :)

    Если alphabetSize известно заранее - нужно выделить память под массив структур сразу:
    struct character *c_ptr, *c_ptr2;
    
    c_ptr = calloc(sizeof(struct character), alphabetSize);

    И теперь можно перемещаться по полученному массиву меняя адрес указателя на структуру:
    int i;
    
    for(i = 0, c_ptr2 = c_ptr; i < alphabetSize; i++, c_ptr2++)
     {
    тут что-то делаем...
    }
    Ответ написан
    Комментировать
  • Как запустить код на C из perl?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Как сделать, чтобы все запускалось, а не просто открывалась VS

    Собрать программу, написанную на С.
    Или переписать ее на Perl.
    JFYI: "Скрипта на С" не существует. С - язык компилируемого типа.
    Ответ написан
    Комментировать
  • В чем разница между указателями в си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Все просто.
    Попробуйте-как динамически память выделить, используя только mt1 :) (Хинт: не получится нифига. Выделить память через malloc еще можно, используя sizeof struct, а вот присвоить адрес начала области переменной mt1 фиг получится)
    Структуры - офигенное средство для расписывания памяти, особенно при чтении бинарных файлов фиксированной структуры внутри - считал N байт в область, наложил на эту область структуру - и все, можно к полям обращаться. Что, собственно в примере у Вас и делается.
    Ответ написан
    Комментировать
  • Как получить результат функции в main при работе с матрицами?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Программа полностью работает

    Сумнительно.

    Вот так:
    printf("n \n");
        scanf("%d",&n);
        int matrix[n][n];

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

    Выделение памяти нужно делать таким образом:
    int *matrix;
    
    matrix = calloc( n * n, 1);

    после чего matrix - указатель на int и всю программу соответственно нужно переделать под адресную арифметику (подозреваю, что задание было на изучение адресной арифметики :) )

    По-хорошему, результат calloc нужно проверить - выделилась ли память и перед завершением программы сделать
    free(matrix);
    Ответ написан
  • Как создать тип данных строка в си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    C - низкоуровневый язык, в нем нет таких вещей. Для работы со строками есть string.h
    Ответ написан
  • Как можно сравнить строки в C?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Потому что stricmp - это какой-то неведомый зверь.
    Есть стандартная strcmp - она не игнорит регистр и ищет конец строки по '\0', что очень часто приводит к SIGSEGV :)
    Есть strncmp - она тоже не игнорит регистр, но сравнивает не более N символов, что считается более безопасным, если ты забыл '\0' поставить.
    Есть strcasecmp и strncasecmp - полные аналоги, только регистр игнорят.
    Ответ написан
    Комментировать
  • Что делать если не работает библиотека?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Это вопрос из серии "Как пройти в библиотеку?" :)

    Тут до библиотеки дело еще даже и не дошло. Компилятор не нашел на стандартном пути (где он в винде - понятия не имею) заголовочного файла regex.h
    Ответ написан
    Комментировать
  • Почему условие if ( a == a) может не выполняться для Embedded-разработки?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Ну, я бы сказал, что не выполнится (b == b) потому что формат хранения float таков, что точного сравнения провести невозможно. Число с плавающей точкой есть математическая абстракция, для реализации которой в вычислительной технике (которая оперирует конкретными нулями и единицами) применяется ряд допущений ;)
    Ответ написан
    9 комментариев
  • В какой директории хранить файл для считывания из программы?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Без указания пути программа считает, что файл находится в том каталоге, который сейчас текущий для нее. Причем это далеко не всегда тот каталог, который подразумеваете Вы :)
    Ответ написан
    Комментировать
  • Как работать текстовыми файлами?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Потому что нормальный алгоритм работы с мелкими текстовиками следующий:

    открыть файл на чтение (man open - внимание, не потоковый fopen, а простой open!)
    получить размер файла из элемента оглавления каталога (man stat)
    выделить память размером с файл (man calloc)
    прочитать весь файл целиком (man read)
    закрыть файл (man close)
    и после этого парсить полученный буфер как угодно вдоль и поперек, не забывая конечно, что портить его не надо :)

    Ну или вот так наверно понятнее будет:
    #define NUL 0
      #define ERR -1
      int i;
      short int handle;
      struct stat sb;
      char *name="/tmp/testfile.txt";
      char *data;
    
      if ((handle = open(name, O_RDONLY)) < NUL)
        return ERR;
    
      stat(name, &sb);
      data = (char *) сalloc(sb.st_size + 1);
      i = read(handle, data, sb.st_size);
      close(handle);

    На выходе - массив data с данными файла.
    Ищещь перевод строки ('\n') и переставляешь указатель ЗА него (если нужно конвертить число в цифру то после перестановки на место перевода строки пишешь '\0' и используешь atoi() - на выходе длина строки, которая идет в качестве контроля, чтобы на SIGSEGV случайно не выскочить.
    Потом от нового положения указателя цикл по длине строки с поиском по таблице замен.

    Вот блин...ведь мамой клялся, что подсказывать не буду...
    Ответ написан
    1 комментарий
  • Как линковщик ищет функции?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    У меня другое определение :) - а это я не знаю, откуда Вы такое добыли.
    Ведро 4.14.52, glibc 2.26-r7, Calculate Linux 17
    extern int printf (const char *__restrict __format, ...);


    То же самое - ведро 2.6.32-696, glibc 2.12, CentOS 6.10
    extern int printf (__const char *__restrict __format, ...);


    Локально stdio.h находится там же, где и все - в /usr/include. Исходный код данной функции никогда в программе присутствовать не будет. Вообще. Код stdio() находится в glibc, которая находится соответственно в /lib64 (для 32-битных систем - в /lib). Если очень хочется посмотреть на ее исходник - качайте исходник glibc.
    Ответ написан
  • Стоит ли переходить на С?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Ну, тут положение таково...

    Если планируете когда-либо заниматься UNIX на уровне больше чем "настроить LAMP на локалхосте на убунте, собезьянив действия из манов" - то знать C надо. Знание С - оно все целиком постоянно проходит через админство и в общем-то понятно почему.

    А вот насчет крутости... Язык - это инструмент ;) Язык программирования в том числе :) Он нужен для решения задач. А не наоборот! Если у Вас есть задача и ее надо решать Вам - сами должны выбрать, на каком языке ее реализовать. На С пишется одно, на С++ - другое...
    Ответ написан
    Комментировать
  • Изучение Си подобным образом?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Ну, gdb несомненно знать надо - пригодится и не раз :) Если не нравятся чьи-то чужие примеры - ну придумайте себе свои :)
    Ответ написан
    Комментировать
  • Можно ли написать AAA-игру на языке программирование Си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Можно.

    Но сложно. Инди-игру наверное еще одолеете, но вот новый FarCry или Overwatch - точно вряд ли. Слишком много великов придется самому сколхозить...

    C - язык системных программ, библиотек, драйверов, консольных утилит. Что-либо юзерское на нем лабать сложно из-за необходимости колхозить множество вещей, уже давно сделанных в плюсовых тулкитах.
    Ответ написан
    1 комментарий
  • По какой книге можно хорошо СИ изучить?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    M. УЭИТ С. ПРАТА Д. МАРТИН Язык Си. Книга отнюдь не новая, а весьма даже старая, но когда-то она здорово мне помогла - собственно все мое умение писать на С началось с нее...
    Ответ написан
    1 комментарий
  • Что за ошибка при компиляции?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Английским по белому - файл cal.h не найден
    Ответ написан
  • Как запустить программу на Си с помощью bcc32.exe если возникает ошибка "Unresolved external..."?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    мама дорогая, кто-то еще пользуется Борманом?

    Правильно понимаете. Линкер не может собрать исполняемый модуль, потому что не знает где найти точки входа в процедуры beginthread и endthread. Спросите гугла, как их добавить (если конечно он это знает. Бормана я использовал последний раз ээээ.... 15 лет назад....)
    Ответ написан
    Комментировать