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

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Сначала нужно определиться, что есть для Вас "системное программирование".
    Написание собственных демонов, использование очередей, нитей, общих областей памяти, сокетов, каналов? Сможете, хотя не факт, что примеры приведенные в книге, заработают в некоей конкретной версии линуха - маны читать все равно придется, они явно будут новее книги.
    Написание драйверов, системных вызовов, модулей ядра? Нет, нужно будет читать маны именно по kernel-hacking
    Ответ написан
    Комментировать
  • Как задать размер массива через аргументы функции?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    В памяти массив все равно одномерный будет, хоть тресни ;) N-мерность нужна для удобства доступа.
    Ответ написан
    Комментировать
  • В чем различие void func(char * var) от void func(char **var)?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Это плохо. Указатели - основа С, без понимания того, как работают указатели, будет ооочень трудно.

    char *var - указатель на переменную типа char. Сама var содержит адрес, шестнадцатеричное число, размер его зависит от реализации, от ОС, от платформы etc. Этот адрес указывает на область памяти длиной 1 байт (потому что char *), соответственно в эту область можно поместить 1 байт. Если поместить туда скажем переменную типа short int (два байта), то можно получить опять же в зависимости от того, как получали под нее память либо затирание соседней переменной (что не всегда плохо и очень часто используется для обнуления областей), либо SIGSEGV, то есть нарушение защиты памяти, запись в область памяти не выделенную программе.
    char ** var - указатель на указатель на переменную типа char. Сама var, как и раньше содержит адрес, но теперь этот адрес указывает на область памяти размером с указатель (он фиксированный в пределах реализации) и по этому адресу записан адрес области, в которую можно поместить 1 байт (со всеми вытекающими последствиями).
    Зачем такие извращения? Ну, например для упрощения вызова функции - передавать один параметр или же 4-5. Обработка списков, деревьев и всего, что строится на их основе. Данная конструкция очень распространена, рекомендую проработать пару демок в отладчике - с дотошным разбором, где что находится, как откуда и куда извлекается...
    Ответ написан
    3 комментария
  • Почему ошибка "recipe for target 'XXX.o' failed" при компиляции?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Именно данное сообщение не означает ничего. Кроме того, что при выполнении компиляции файла(ов) исходного текста для мишени libbitcoin_server_a-checkpoints.о возникла ошибка. Какая - а фиг его знает, ищите в логах :)
    Ответ написан
    Комментировать
  • Что изучать в первую очередь? С(СИ) или С++?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Смотря чем хотите заниматься.

    Системщик, программист МК, встраиваемых систем, драйверописатель - пишет на С
    Прикладник, разработчик юзерских программ с UI, пищалками и свистелками - на C++
    Ответ написан
  • Язык Си (Керниган. Ритчи). Помощь с упражнением. Компилятор ругается?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Вас в гугле забанили? Исправляйте ошибки - перестанет ругаться. Я ошибки вижу - они элементарные. Но подсказывать не буду. Читайте доки - они рулез :D
    Ответ написан
    6 комментариев
  • Почему в Си допускается переполнение массива?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Потому что С - низкоуровневый язык. Как уже говорили, a[b] - всего лишь иная форма записи *(a+b), что позволяет делать мнооооожество финтов ушами :) man memmove например почитайте :) - это вообще адЪ :) Существует множество либ, содержащих например те же strcpy, strcat, strstr, но обвешанные различными проверками - кому надо, тот их использует.
    Ответ написан
    1 комментарий
  • Какова адресация элементов структуры в си?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    отключать оптимизацию при компиляции через -O0 (первый символ - буква O, второй - цифра "ноль"!). Это отключит механизмы оптимизации размещения обьектов в памяти и еще много чего, что не дает нормально отлаживаться.
    Можно явно задать выравнивание элемента на границу байта, слова, двойного слова - через #pragma pack. В данном случае нужно позаботиться, чтобы структура была выравнена на границу int - в зависимости от того, какой у данного контроллера int - в два байта, в четыре...
    Ответ написан
    Комментировать
  • Где объявлять функции, перед или после функции main?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Я обычно обьявляю до main, потому что в этом случае при вызове функции она уже определена, компилер может проверить соответствие формальных параметров фактическим и у линкера вопросов не возникнет. Делать я так привык с лоооооохматых годов (аж сказать страшно - года так с 1990-го :D), может нынешние компиляторы и линкеры поумнели настолько что им пофиг, конечно.
    Ответ написан
    2 комментария
  • Правильно ли я выбрал ЯП?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Не совсем правильно. Для этого больше нужен ассемблер. Не, ось на С написать можно, но ПК работает на значительно более низком уровне :)
    Ответ написан
    Комментировать
  • Как запустить исполняемый файла на linux на с/c++?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Еще один "хакир"?

    Если пишете демона, самим придется за временем следить. А по запуску исполняемых файлов - man exec
    Ответ написан
    Комментировать
  • Как организовать структуру файла проекта собственной программы?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Пожалуй, единственный критерий - будет ли этот файл читаться только программой, или же его будут читать также и люди? Если только программой - бинарник удобнее. Расписал структуру, наложил на запись - вуаля, разобрано по полям! Но человеку прочитать это будет довольно сложно, если файл будут читать также и люди, лучше потраться на более-менее полноценный парсер типа name=value, если редактировать вручную, будет куда проще.
    Ответ написан
    Комментировать
  • Язык Си. Вопрос: почему так мало видеоуроков? есть ли GUI у языка Cи? и чем он хуже C++?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Чем вездеход хуже самолета?
    Гуя нет ни у какого языка, есть среда разработки.
    Ответ написан
    1 комментарий
  • Установка программы через документ?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Можно. Но с парой оговорок.

    - только для формата документов с макросами (то есть rtf например - мимо)
    - только если выполнение макросов не запрещено

    Там где макросы как бы есть, но есть и защита - легально обычно нельзя, можно только через дыры
    Ответ написан
  • Почему вылазит "Ошибка сегментирования"?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Ну правильно, так и должен выдавать. SIGSEGV возникает тогда, когда программа пытается изменить данные в области, которые ей не принадлежат, то есть не в статическом буфере и не в динамической области, полученной через malloc().
    char* result;
    создаст переменную, содержащую указатель на знак. Переменная не инициализирована, поэтому содержит мусор. Если этот мусор интерпретировать как адрес для записи, что делается вот здесь:
    result[counter] = randChar;
    SIGSEGV гарантирован :D
    Ответ написан
    Комментировать
  • Можно ли в СИ выводить строку по координатам?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Это Вы простите откуда такой чудно знакомый код взяли - не из досовых ли учебников? Да, в досе была такая возможность, как прямой вывод в видеопамять :) Окошки, менюшки можно было рисовать... указатель b000:0000 как раз оттуда :)

    В общем случае - нельзя. В частных случаях - (программа работает на консоли линуха или на консоли винды) - можно. Но не системными вызовами, а дополнительным API.
    Ответ написан
    2 комментария
  • Есть ли книжка, или какой другой ресурс, в которой описывается СИ максимально подробно?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Максимально подробно - это man.

    ПисАть. ПисАть и еще раз писАть. Изучать чужой код и писать свой. Если не хочется "задачу ради задачи" - присоединиться к какому-нибудь сообществу и попытаться им помочь.
    Ответ написан
    Комментировать
  • Для чего в Си ввели синтаксис указателя на массив?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Потому что это удобно :) Есть сложные типы данных - структуры, обьединения, в которых полно указателей на другие указатели и пр. Очень часто обьекты данных такого типа агрегируются в массивы и адресуются указателями - получил один указатель и можешь перебирать огромный массив.
    Си - системный язык и получить в качестве значения указатель, который адресует массив, содержащий указатели на элементы, каждый из которых указатель на что-нибудь с чем наконец-то можно и поработать - запросто :D
    Ответ написан
    Комментировать
  • Как изменить присвоенное значение переменной char?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    char string_1[7] = "0"; - так нельзя. Это не Perl, не /bin/sh, где переменные без типа до тех пор, пока не прошло первое присваивание. Массиву символов вообще присвоить в C довольно сложно. Можно например вот так:
    char string_1[] = "0";
    char string_2[] ={ '0'};

    Имя массива - константа. Ее нельзя изменить. Можно взять указатель на нее и с ним работать.
    if (string_1 == "00");
    Здесь сразу две ошибки :) Во-первых, компилятор дойдет до ; и посчитает, что if кончился :) , а во-вторых работать со строками так нельзя. Для сравнения строк есть str(n)cmp, memcmp. Код
    if (*string_1 == '0');
    был бы правильным с точки зрения структур языка, но бессмысленным
    Ответ написан
    Комментировать
  • Какой код лучше?

    CityCat4
    @CityCat4 Куратор тега C
    Жил да был черный кот за углом...
    Понятие "лучше" абстрактное и вне фразы "лучше чем" не существует. По каким признакам оценивать код - по быстродействию, по читабельности, по еще сто-тыщ-разных критериев?

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

    Если хотите оценить понятность кода - второй гораздо сложнее воспринимается. В первом, кстати второй if совершенно лишний :) - a[i] может быть либо равно key, либо не равно, третьего варианта нет, поэтому его совершенно спокойно можно заменить на else - это и по быстродействию даст выйгрыш.

    Кстати о присваиваниях. Операции типа tmp++ вполне могут делаться в регистрах, одной командой.
    Ответ написан
    4 комментария