• Не работает структура объявленная в заголовочном файле?

    @TheCalligrapher
    Так а что это такое вообще: htval.num = 10;?

    Это выглядит как инструкция (statement). В языках С и С++ инструкции могут находиться только внутри функций. Больше нигде. Это требование грамматики, т.е. элементарного синтаксиса этих языков. Зачем вы написали инструкцию в "чистом поле" за пределами функции? Это некорректно с точки зрения синтаксиса языка.

    Упрощенно выражаясь, в С и С++ код пишется внутри функций, а не снаружи.

    P.S. Ваш вопрос не имеет никакого отношения к "структуре, объявленной в заголовочном файле". Ни структуры, ни заголовочные файлы тут ни при чем.
    Ответ написан
    Комментировать
  • Стоит ли учить С/С++ если не планируешь писать на нём?

    bingo347
    @bingo347
    Crazy on performance...
    Языки не нужно учить. Это крайне вредно. Ну заучите Вы синтаксис и базовые принципы, а что дальше? Программировать с этим Вы не сможете. Подход выучить ЯП Х не работает, как и не работает подход выучить естественный. Просто подумайте, кто быстрее заговорит на английском - тот кто выучит много слов и правил или тот кто поедет в США и будет вынужден там общаться? С языками программирования все то же самое.

    Теперь о C и C++
    C наверно самый простой ЯП, проще только ассемблер. Из высокоуровневых абстракций в нем только типы данных да структурное программирование (if, for, while, ...). Вы скорее всего уже с этим всем знакомы. Из нового разве что будет работа с указателями, опять же максимально простым способом - в лоб.
    C++ - обвешали простой C максимальным количеством высокоуровневых абстракций (все виды полиморфизма, ООП, замыкания, динамическая диспетчеризация и т.д.), что сделало его очень сложным. Вам понадобятся годы практики (практики, а не зубрежки!), чтобы просто понять, что здесь происходит. А скорее всего Вы просто бросите это дело, породив пару десятков UB в простейшей программе и на ровном месте.
    Ответ написан
    Комментировать
  • Как узнать статичная ли функция по ELF файлу?

    hakain
    @hakain Автор вопроса
    Немного знаю С/С++, Qt, и микроконтроллеры
    Похоже я сам нашел ответ на вопрос. Если вызвать команду objdump с опцией -t, то можно увидеть следующий вывод.
    $ objdump -t test | grep foo
    0000000000000000 l    df *ABS*	0000000000000000              foo.c
    000000000000064e l     F .text	0000000000000014              s_foo
    000000000000063a g     F .text	0000000000000014              foo

    В моем случае видно, что строки имеют флаги l и g.
    The symbol is a local (l), global (g), unique global (u), neither global nor local (a space) or both global and local (!). 
    A symbol can be neither local or global for a variety of reasons, e.g., because it is used for debugging, 
    but it is probably an indication of a bug if it is ever both local and global.

    По всей видимости static функции помечаются флагом l.
    Ответ написан
    Комментировать
  • Имеет ли cмысл после Си учить C#?/Сколько времени уйдёт изучение на язык Си?

    solotony
    @solotony
    покоряю пик Балмера
    у "с" и "с#" - общего только буква "с" в названии. и схожесть синтаксиса. назначение и приемы программирования у этих языков совершено различны.

    си - примитивный язык, замена ассемблера. с# - высокоуровневый язык, аналог Java от MS

    перед тем как решать ЧТО учить следует ответить на вопрос ЗАЧЕМ учить
    Ответ написан
    Комментировать
  • На что указывает указатель, на бит или байт?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    В данном случае на объект класса string. Которого, кстати, в C нет.
    Ответ написан
    Комментировать
  • На что указывает указатель, на бит или байт?

    GavriKos
    @GavriKos
    Стоит на дороге знак. Он указывает на метр? На десять? а может на сто?
    Нет. Он указывает на НАЧАЛО ОБЪЕКТА.
    Ответ написан
    Комментировать
  • Как проверять на нестрогое неравенство вещественные числа?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    https://stackoverflow.com/questions/17333/what-is-...
    Мне вот этот код понравился
    bool approximatelyEqual(float a, float b, float epsilon)
    {
        return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
    }
    
    bool essentiallyEqual(float a, float b, float epsilon)
    {
        return fabs(a - b) <= ( (fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon);
    }
    
    bool definitelyGreaterThan(float a, float b, float epsilon)
    {
        return (a - b) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
    }
    
    bool definitelyLessThan(float a, float b, float epsilon)
    {
        return (b - a) > ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
    }
    Ответ написан
    Комментировать
  • В чём разница между json.Unmarshal и json.NewDecoder?

    @ghostiam
    На Go писатель, серверов пинатель.
    json.Unmarshal использует массив байт, а json.NewDecoder это потоковый парсер, которому не нужно сразу хранить в памяти все данные для парсинга.

    Для парсинга json из файла или из запроса, я бы советовал json.NewDecoder, так как он будет меньше потреблять памяти (не нужно заранее считывать в память массив байт).
    Ответ написан
    Комментировать
  • Какую использовать среду разработки C под Windows?

    bibak
    @bibak
    Front-end dev
    Можете CodeBlocks использовать
    Ответ написан
    Комментировать
  • Как и с чего начать обучение?

    @krka92
    Ещё такая есть
    Антон Григорьев - О чем не пишут в книгах по Delphi
    Ответ написан
    Комментировать
  • Зачем определению(definition) объявлять(to declares), если есть определение(definition), которое определяет(to defines)?

    @res2001
    Developer, ex-admin
    int val;
    Является одновременно и определением и объявлением.
    В данном случае происходит реальное выделение памяти под переменную.

    Объявление это
    extern int val;
    Оно говорит компилятору, что где-то есть переменная val типа int. В этом случае компилятор уже знает какие операции допустимо использовать с этой переменной, но память под переменную не выделяет. Реальный адрес переменной подставит линковщик, когда будет собирать исполняемый файл из нескольких единиц трансляции.
    Если в одной единице трансляции вы используете объявление переменной, то где-то (в другой единице трансляции или в этой же) вы должны обязательно сделать определение. Иначе линковщик не найдя определения выдаст undefined reference.
    Если же определять переменную в каждой единице трансляции, то линковщик выругается на redefinition symbol, т.е. несколько символов с одним именем (переопределение существующего символа).
    Если вам все таки нужны символы с одним именем в разных единицах трансляции, то вы должны объявлять их static. В этом случае будет использоваться локальная для данной единицы трансляции переменная с данным именем.

    С функциями все аналогично.
    Ответ написан
  • Как сделать конкатенацию в функции system()?

    GavriKos
    @GavriKos
    Учитесь гуглить. Прям вот так: C concatenate strings. Узнаете сразу о существовании всяких strcat и вообще библиотеке работы со строками.
    Ответ написан
    1 комментарий
  • Зачем существует registry в lua?

    @q27off
    Некоторые абстракции данных невозможно хранить в C-коде в чистом виде. - Их реализации "скрыты" за луашным API. К таким данным относятся, наприер, lua-таблицы.

    В типичном случае таблица по индексу LUA_REGISTRYINDEX используется для хранения метатаблиц пользовательских библиотек. Например, во время инициализации библиотеки создается метатаблица:

    luaL_newmetatable(L, LIBNAME); // создаем метатаблицу на стэке
    // ... - какой-то код, наполняющий созданную таблицу
    lua_rawsetp(L, LUA_REGISTRYINDEX, (void*)METAKEY); // устанавливаем метатаблицу по уникальному ключу


    Затем, при генерации нового библиотечного объекта, ему устанавливается ранее созданная метатаблица:

    int object_new(lua_State *L)
    {
        char *ud = lua_newuserdata(L, UDSIZE); // создаем новый объект
        lua_rawgetp(L, LUA_REGISTRYINDEX, (void *)METAKEY); // извлекаем ранее созданную метатаблицу
        lua_setmetatable(L, -2); // устанавливаем метатаблицу для созданного объекта
        return 1;
    }
    Ответ написан
    Комментировать
  • Как изменить строку, инициализированную при объявлении массива символьных указателей, с помощью scanf?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    char * suit [4] = { "Hearts", "Diamonds", "Clubs", "Spades" };

    Как изменить строку, инициализированную при объявлении массива символьных указателей, с помощью scanf?

    В данном случае -- только выделив память для новой строки, сделав scanf туда и присвоив указатель на выделенную память элементу массива suit. Напрямую в первоначальный массив -- никак, потому что указатели указывают на константные строки (а возможность писать char * вместо const char * -- это устаревшее средство обеспечения совместимости с древними версиями стандарта).
    Ответ написан
    3 комментария
  • Нужно ли изучать delphi 10.3 с нуля если шарю в delphi 7?

    HemulGM
    @HemulGM Куратор тега Delphi
    Delphi Developer, сис. админ
    Я переносил крупные проекты прямиком из Delphi 7 в Seattle и проблемы были только с WideChar и AnsiChar.
    В остальном появилось огромное кол-во фишек и нововведений. Одни ускоряют процесс разработки, другие увеличивают кол-во возможностей языка и ООП и многое-многое другое. Новые версии среды - это тот же Delphi, что и Delphi 7, тебе не стоит переживать по этому поводу.
    Ответ написан
    Комментировать
  • Есть ли в Си функция, читающая TCP без коллбеков?

    gbg
    @gbg
    Любые ответы на любые вопросы
    В си вообще нету функции, которая что-то там читает из сокета - это делается либо функцией из состава Berkeley sockets для UNIX или Winsock для Windows.

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

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как не сложно заметить при большой точности, мой результат отличается от результата библиотечного printf.

    Как не сложно заметить, long double имеет 19 значащих цифр, т.е. 0,0000000000000012300000000000000679 -- это всё что имеет смысл печатать, и эта часть одинакова в выводе printf и ft_printf. Всё что идёт дальше -- это мусор, который не содержится в исходном числе.

    long double tt = 0.00000000000000123;

    Число справа от знака = имеет тип double. См.
    Ответ написан
    4 комментария
  • Кроссплатформенная отправка на почту в Си?

    GavriKos
    @GavriKos
    Ответ написан
    Комментировать
  • Как выполнять С89/C++ код в Visual Studio Code?

    @LASHKOAG
    Си, Робототехника, Linux, Телеметрия, Разработчик
    компилятор это такая же программа как и все другие программы, поэтому его нет встроенного, как нет либреоффиса или ворда или антивируса. Компиляторов тоже есть несколько. Сейчас все ставят MinGW64. Есть в интернете курс МФТИ белый пояс С++ там показывают где скачать. как поставить, как в переменную среду прописать, если не знаете. Ну или просто ютуб
    Ответ написан
    Комментировать