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

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Если разово - то man opendir(), man closedir() - просто чтение каталога в том месте, где должен быть файл. Можно по-топорному - через system выплюнуть команду "ls | grep blabla.txt". Можно попробовать открыть файл - man open(), если файла нет - будет ошибка, если успешно - он есть.
    Ответ написан
    Комментировать
  • Значение переменной в двойных кавычках?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    gcc test.c -o test
    test.c: In function ‘main’:
    test.c:3:13: warning: initialization of ‘int’ from ‘char *’ makes integer from pointer without a cast [-Wint-conversion]
        3 |     int x = "15";
          |             ^~~~


    то есть сначала компилер обьявляет строковую константу "15" (два символа - 0x31 и 0x35), потом присваивает адрес этой константы в переменную и обнаруживает, что переменная типа int и соответственно нормальное присваивание невозможно.
    Ответ написан
    Комментировать
  • Как создать кастомное кроссплатформенное окно на си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Можно ли обойтись без использования WinAPI?

    Нужно. Если не хотите лабать под кажду платформу свой код.

    Здесь нужно различать два случая:
    - хочу написать кроссплатформенное приложение, пофиг на чем
    В этом случае берут Qt, Gtk иже с ними и пишут. Там уже обеспечили кроссплатформенность

    - хочу написать кроссплатформенное приложение без сторонних библиотек
    В этом случае придется изучать механизмы отрисовки окон (и скорее всего опять-таки лабать под каждую платформу свой код)
    Ответ написан
    Комментировать
  • Кроссплатформенное программирование на C?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    большинство людей в своих программах активно используют WinApi

    Смелое и голословное утверждение.

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

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Заводим переменную типа char *
    Берем в нее память килобайт 10, зануляем
    Считали текст, сдвинули указатель, запомнили
    (повторять, пока есть текст)
    По завершению - массив текста и массив указателей, указывающих на начало каждой строки
    Ответ написан
    Комментировать
  • Почему происходит сегфолт?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Сразу видно, что код - копипаста :) Берете в зубы gdb и - по операторам шагать, выясняя, что и как делается, заодно и в коде разберетесь, чтобы на защите не краснеть :)
    Ответ написан
    Комментировать
  • Почему программа вообще заходит в цикл и почему тут же завершается при присваивании?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Потому что в num мусор. Она обьявлена на куче и в ней может быть любое произвольное значение, нуль может быть, а может быть и нет. Если ломает сделать отдельную инициализацию, смените цикл на for
    Ответ написан
    Комментировать
  • Как учить C++ если будешь знать С?

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

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    А, простите, чего хотели-то? Передали в функцию два указателя, поменяли первый со вторым, ничего с данными по указанным адресам не сделали - ничего и не поменялось :)

    Указатель содержит адрес. Чтобы поменять данные - нужно считать данные по адресу.
    Ответ написан
    Комментировать
  • Как сделать ввод/вывод текста в ядре на С?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Найти исходники доса, напрмер, если ось будет однозадачная. Или minix какого-нибудь - если с закосом под линуха.
    Ответ написан
  • Выдает то signal: illegal instruction core dumped то stack smashing detected terminated. Как исправить?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Хорошо, что компиляторы не имеют души :) и не могут сказать "О великий компьютерый бог, что тут меня заставляют делать!" :)

    Этот код - по-моему одна большая сплошная нелепость. Давайте начнем с постановки задачи, да? Как было сформировано условие?

    Ну и сразу что бросается в глаза:
    char firstFraction[2];
      char secondFraction[2];

    Во-первых.
    Чего так мало места? В такой прости-Господи массив поместится ровно один символ (потому что второй займет '\0')
    Во-вторых.
    Почему вообще char? Понятие указателя не одолели, что ли? Вы там какую то арифметику делать будете - какого фига не вводить сразу int? Если стоит условие ввода в char - я не вижу atoi()
    scanf("%s", firstFraction);
    Продолжение предыдущего вопроса - почему ввод строковый, хотя предполагается арифметика? Зачем лишний раз конвертить из строки в число? Или Вы полагаете, что С, как многие модно-стильно-молодежные языки - сам определит тип переменной в зависимости от операции? Так вот, черта с два. С - язык старой школы, он требователен и к программе и к программисту. Никакой автотипизации, никакой сборки мусора - все на совести программиста.

    Пишите условие задачи, а там посмотрим.
    Ответ написан
  • Библиотека Cron scheduler на windows для си?

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

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Потому что это называется "утечка памяти", когда программа выделяет ее, но не освобождает. Если это мелкая программа, то похрен - программа кончилась, вся ее память освободилась. Но тут нарабатывается плохая привычка и в итоге мы получаем что-то типа Firefox, который жрет память тоннами и не освобождает. А когда в системе кончается реальная память - начинает работать менеджер страничного обмена (свопа), который вытесняет неиспользуемые страницы на диск - это во-первых жрет ресурсы, во-вторых диск бестолково гоняет. А когда кончается и страничная память (обьем свопа) - система тупо встанет.
    Ответ написан
    Комментировать
  • Как инициализировать массив?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Ну, начать на до с того, что вот так:
    int len;
        printf("Print array's length: ");
        scanf("%d", &len);
        char str[len];

    массивы не обявляют. Потому что у Вас написана чушь. В строке
    char str[len];
    записана инструкция компилятору - выделить массив именем str и длиной из переменной len. Но в момент компиляции значение переменной len - неизвестно. Оно может быть нулем, мусором, каким угодно числом. Вам - либо задавать массив фиксированной длины, либо брать память динамически через malloc()/calloc() (лучше последний - он сразу память нулями забьет)
    Ответ написан
  • Указатели в языке Си?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Вмешалась ОС? Но если так, то почему?

    Потому что классическая ошибка - использование неинициализированного указателя. Ты обьявил a указателем на целое, но не присвоил ему никакого значения (через malloc(), calloc() или функции, возвращающие указатель). Обьявленная переменная была выделена в куче и получила какое-то мусорное значение, доступное твоей программе (вполне может быть указатель на часть кода, например, на ядро, на общие функции). Ты его прочитал.
    При попытке записать по данному адресу поймал SIGSEGV, потому что данный адрес твоей программе по записи недоступен. Все, как должно быть.
    могу ли я указателю дать ссылку на конкретную ячейку в памяти?

    Теоретически можешь, но практически ось тебе сразу выдаст SIGSEGV, потому что писать ты можешь только в те области памяти, которые тебе доступны по записи.
    warning: initialization of 'int *' from 'int' makes pointer from integer without a cast

    Ну правильно говорит - инициализация делается без приведения типа. Такой финт ушами часто делают со строками - по умолчанию выставляя там указатель на NULL (что обычно означает, что строке еще не выделялась память), напрмер
    char *str = (char *) NULL;
    Ответ написан
    Комментировать
  • Что означает -'0' на C?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Это символьная константа - текстовый символ цифры "ноль". Компилятор сам переведет в число, а записывать так проще и быстрее - я вот не помню код цифры "ноль".
    Ответ написан
    Комментировать
  • Как записать значение в файл и зашифровать его на языке C?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Существует масса различных библиотек с API шифрования, да и простяцкие подстановочные шифры никто не отменял. Ну или вообще топорный вариант - число в текст, записать base64 текста
    Ответ написан
    Комментировать
  • Почему размер int такой?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Так много, друг Горацио, на свете, что и не снилось нашим мудрецам...

    С работает на разных платформах и даже на разных архитектурах. И размер int в этих платформах и архитектурах - он - внезапно - разный!

    А работает ли там модно-стильно-молодежный Rust - я не знаю :) Я уже столько этих "убийц С" перевидал :)
    Ответ написан
  • Как в языке си вернуть пустой массив?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    А что непонятно-то?

    ЕСЛИ
    по данному адресу лежит '\0'
    ИЛИ
    данный адрес равен NULL
    ТО
    вернуть пустой массив (обьект памяти, указывающий на '\0' либо указатель на данный обьект)

    Все :) В языке С нет отдельного понятия "массив", в нем все - обьекты памяти, а уж как интерпретировать результат, который тебе приехал - это твое дело. Посчитаешь массивом - будет массив, посчитаешь структурой - будет структура :) Посчитаешь массивом структур - будет массив структур :D
    Ответ написан
  • Где можно узнать как расшифровываются эти "руны"?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Это не "команды", а функции. А узнать про любую функцию очень просто - man atoi например. Правда, не все функции есть везде. Например itoa стандартной функцией не считается, и частенько приходится колхозить ее замены :)
    Ответ написан
    Комментировать