Ответы пользователя по тегу C
  • Что изучать в первую очередь? С(СИ) или С++?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Смотря чем хотите заниматься.

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

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

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

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

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

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

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Еще один "хакир"?

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

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

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Чем вездеход хуже самолета?
    Гуя нет ни у какого языка, есть среда разработки.
    Ответ написан
    2 комментария
  • Установка программы через документ?

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

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

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

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

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

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

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Максимально подробно - это man.

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

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

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    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
    //COPY01 EXEC PGM=IEBGENER
    Понятие "лучше" абстрактное и вне фразы "лучше чем" не существует. По каким признакам оценивать код - по быстродействию, по читабельности, по еще сто-тыщ-разных критериев?

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

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

    Кстати о присваиваниях. Операции типа tmp++ вполне могут делаться в регистрах, одной командой.
    Ответ написан
    4 комментария
  • Где исходный код system call open()?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Это самое что ни на есть pure code. Начните с man open и посмотрите, сколько всего имеется open-ов разного рода. Мне сейчас в исходники ведра лезть лениво, но сто процентов - все эти open-ы сводятся макросами к одному какому-нибудь __open(), который передает вызов в ядро, какому-нибудь __kernel_open()
    Ответ написан
  • С или С++ для микроконтроллеров. Почему С?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    1. скомпилите под любой контроллер hello world на С и на плюсах. Потом посмотрите на размер получившегося бинаря. Для контроллера размер бинаря имеет не просто значение, а решающее значение.
    2. Итоговый (ассемблерный) код проще, выполняется быстрее, оверхед на абстракции меньше - программы для контроллеров очень часто пишут полупрограммисты-полужелезячники, которые мыслят в терминах железа и не нуждаются в уровне абстракции плюсов
    Ответ написан
    Комментировать
  • Как с помощью нативного php расширения защитить свои наработки на php?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    Общий ответ - никак. Потому что неотламываемой защиты нет, есть скорость взлома. Если Ваш проект коммерчески успешен и приносит большой профит (то есть такой, который будет заведомо больше стоимости взлома) - отломают все, что бы Вы ни пристроили, тем более в PHP, где способов защиты не так уж и много. Да и ставить себе на сервер непонятно что за модуль я не стал бы.
    Здесь надо немного взглянуть глубже, убить в себе ИТ-шника и поглядеть на задачу глазами бизнеса. Ведь защита Вам нужна не сама по себе, а чтобы не тырили, а покупали, то есть ради обеспечения профита с разработки. Вот и задумайтесь - а можно ли обеспечить профит другими способами? OnYourLips дал Вам замечательный совет. Почему становится таким популярным SaaS? А потому что так значительно проще защищать свои наработки - ведь они никуда не уходят :) Более того, ты можешь и свои условия клиенту диктовать, как только популярность наберешь, и его данными втихушку разжиться - не для того чтобы использовать, конечно - за это и огрести можно, а просто поржать.
    Ответ написан
    Комментировать
  • Самый лучший ресурс для изучения UNIX, для начинающего?

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