• Что означает эта запись на C?

    dzolotarev
    @dzolotarev
    Этот мир крэшится - я собираю дампы
    Надо открыть K&R на теме про массивы и указатели. *(packet + i) эквивалентно packet[i], ^= - побитовое исключающее или с последующим присваиванием. То есть, там написано:
    paket[i] = packet[i] ^ packet[0]
    Ответ написан
  • Как и с чего начать обучение?

    @krka92
    Ещё такая есть
    Антон Григорьев - О чем не пишут в книгах по Delphi
    Ответ написан
  • Какая приоритетная очередь быстрее?

    @bacon
    Так всё просто, берёте практические реализации, пишите тесты которые отражают ваш "планируемый характер нагрузки" и делаете замеры.
    Ответ написан
  • Зачем определению(definition) объявлять(to declares), если есть определение(definition), которое определяет(to defines)?

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

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

    С функциями все аналогично.
    Ответ написан
  • Стоит ли изучать СИ?

    OnYourLips
    @OnYourLips
    И язык СИ как мне казалось он должен быть легче языка С++.
    Так и есть, C - очень простой язык, а C++ - очень сложный.

    Вопрос используется ли вообще язык СИ где то в проектах?
    Да, но в другом типе проектов.
    Ответ написан
  • Как сделать конкатенацию в функции system()?

    GavriKos
    @GavriKos
    Учитесь гуглить. Прям вот так: C concatenate strings. Узнаете сразу о существовании всяких strcat и вообще библиотеке работы со строками.
    Ответ написан
  • Зачем существует 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
    http://dilbert.com/strip/1998-08-24
    char * suit [4] = { "Hearts", "Diamonds", "Clubs", "Spades" };

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

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

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

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

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

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Как не сложно заметить при большой точности, мой результат отличается от результата библиотечного printf.

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

    long double tt = 0.00000000000000123;

    Число справа от знака = имеет тип double. См.
    Ответ написан
  • Стоит ли мне учить delphi после C# ради смены работы?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Delphi стоит изучать. На нем можно очень много вещей сделать. Лично я делал: срм, игры, видеоконтроль приложение на php backend, веб приложения и мобильные приложения на Android. Delphi похоронили те, кто им никогда не занимался. Но скорость разработки десктопных приложение на нем всегда выше, чем на любом другом языке
    Ответ написан
  • Стоит ли мне учить delphi после C# ради смены работы?

    @Alex_Builder
    Не бойтесь Дельфей. Например, меня большой опыт как на С++/C# так и на Дельфях.
    Современные Дельфи по сути мало чем отличаются от C#. У них даже похожие названия многих библиотечных классов и похожие названия методов в class helper-ах. Дженерики тоже очень похожи.
    Есть и атрибуты как в C#, а так же добавили похожий RTTI и рефлексию.
    Даже такой класс как TStringBuilder есть, хотя на Дельфях он практически и не нужен, поскольку Дельфи позволяют прямое и очень быстрое манипулирование символами строки или частями строки как и C++.
    В последней версии Дельфей даже появилась возможность объявления переменных по месту с самовыведением типа (аналог auto на C++ или var на C#)

    Плюсы Дельфей в сравнении с C#:
    - Найтив для любой поддерживаемой платформы (при использовании библиотеки FMX) с отсутствием подтормаживания на JIT компиляцию. При компоновке по умолчанию вы получаете готовый к запуску исполняемый фаил (exe-шник в случае Win), который не нуждается в установке каких-либо дополнительных фреймворков или runtime-библиотек.
    - Для 64-х битных приложений конечный код в большинстве случаев работает чуть быстрее чем аналогичный на С# (хотя это уже и не существенно). Но при этом в нагруженном приложении отсутствуют какие либо даже минимальные задержки на сборку мусора, что может быть, например, более предпочтительно для индустриального сектора.
    - В разы меньшее потребление памяти на аналогичных задачах.
    - Возможность прямого доступа к памяти. Возможность работы с указателями на любые структуры в любой момент. Не нужно заморачиваться с unsafe блоками на C# для повышения быстродействия, которые все равно имеют ограничения.
    - Более гибкая работа с конструкторами, деструкторами и свойствами классов.
    - Наличие некоторых удобных языковых чисто паскалевских или object-паскалевских конструкций как то, например, возможность более удобного присвоения result в функциях наравне c exit(...) (аналог return в C#);
    конструкции"set of" или "class of", прямых аналогов которых нет в C#. Например, "class of" решает половину вопросов рефлексии без собственно применения медленного механизма рефлексии.
    - Возможность процедурного программирования. Не нужно городить статические классы только ради пары-тройки методов. А так же вложенные процедуры/функции.
    - Прямой доступ к родному API без особых заморочек (хоть для Win, хоть для POSIX) и почти бесшовная работа с COM и ActiveX.
    - Гораздо более легкий доступ к исходному коду стандартной библиотеки и более простой способ пройтись по ней в момент отладки.
    - Возможность писать куски кода прямо на ассемблере в 32х или 64х битном коде (если очень надо, конечно).
    - Очень хорошие компоненты доступа к большому числу баз данных прямо из коробки (FireDAC).
    - Паскалевская структура unit-ов c раздельным объявлением и реализацией (что ближе к разделению на заголовочные и имплементационные части C++), а так же необходимость объявления сверху вниз все же способствует более строгому и грамотному подходу к архитектуре в большом проекте, хотя и безусловно требует больше писанины и планирования (как отчасти и на C++).

    Минусы Дельфей по сравнению с C#:
    - необходимость ручной очистки памяти за исключением строк/записей/и интерфейсов (что, наверное, по началу самое страшное для программистов с менеджет сред). Почти везде необходим try-finally, ну и компоненты типа madExcept тут в помощь. Зато нет порой трудноуловимых утечек, например, из-за ссылок на статические классы как в C#;
    - Как следствие Дельфи требуют более хорошего понимания принципов работы с памятью, а так же хорошего понимания работы ARC механизма для строк и особенно для интерфейсов, где этот механизм можно явно перекрывать. И особенно в свете наличия таких новых атрибутов для ARC механизма как [Weak] и [Unsafe].
    - более многословный и архаичный синтаксис begin...end вместо {...} / := вместо = / необходимость отделения объявления от имплементации и т.п.; оператор case of ( аналог switch в C#) не допускает выбор по строчному значению / оператор for позволят только прямой или обратный проход по счетчику или по экземплярам коллекции (аналог foreach); нет префиксно-постфикстных инкрементов/декрементов типа ++/-- (хотя есть операторы Inc/Dec, которые напрямую транслируются в соответствующие быстрые ассемблерные команды)
    - Много исключений и выкрутасов для обратной совместимости (хотя далеко и не так много как на C++). Например, классически строки индексируются с 1 для совместимости с древними короткими AnsiString,
    но при этом новые компиляторы для мобилок индексируют их с 0. Поэтому, либо нужно писать разный код для десктопа и мобилок, применяя блоки {$IFDEF ... } в коде, либо пользоваться новыми helper-ами для строк.
    - Из-за необходимости классического объявления сверху-вниз и отделения объявления от имплементации существует проблема т.н. circular reference которая требует более продуманного чем для C# дизайна классов или объединения их в одном юните
    - нет развитых Лямда-выражений (есть только анонимные функции)
    - нет удобного LINQ (особенно недостает LINQ for Object)
    - Стандартная библиотека менее всеобъемлющая чем на С#.
    - Нет такого навороченного dataset-а на стороне клиента как на C# (хотя, от его использования многие через некоторое время и так отказываются в пользу самописных или сторонних т.н. объектов бизнес-логики)
    - Более сложный подход к просмотру содержимого объекта в момент отладки. В VS это удобнее и информативнее, а на Дельфи очень часто приходится приводить к нужному классу ручками.

    Дельфи сейчас менее востребованы чем C#. Поскольку во внутри-корпоративном и бизнес-секторе в основном их вытеснил C#.
    Но на десктопе полно еще проектов и на Дельфях. Например утилиты Auslogics или серьезный пакет Altum Designer и т.п. Много осталось проектов как раз в индустриальном секторе, отчасти потому, что на Дельфях очень просто в рамках приложения спуститься на более низкий уровень доступа к памяти и кода вплоть до чистого ассемблера как и на C++, но при этом одновременно проще писать и прикладное ПО (без необходимости постоянной прямой работы с указателями).
    Ответ написан
  • Как выполнять С89/C++ код в Visual Studio Code?

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

    @kalapanga
    Для начала, если Вы этого не делали, найдите какую-нибудь дисковую утилитку и посмотрите эти самые сектора. Всё ли соответствует Вашим ожиданиям, Вашим знаниям о FAT32. Это чтобы не получилось, что Вы что-то считаете неправильным, а на самом деле оно так и должно быть.
    А дальше не торопясь отлаживаться. Чудес не бывает. Если функция раз от разу возвращает разный результат, то либо её вызывают с различными параметрами, либо ошибка в коде функции, либо и то и другое. Всё должен показать отладчик.
    Ответ написан