Может кому то понадобиться. Программирования в делфи консольных приложений в стиле C. Стартовый код располагается в файле имя_проекта.dpr Код (Pascal): program nameproject; { Консольное приложения в стиле Си для Win32 } {$APPTYPE CONSOLE} uses Windows, name_project in 'name_project.pas'; procedure __getmainargs(_argc: PInteger; _argv, _environ:PChar; _param:integer; _si:PStartupInfo); cdecl; external 'msvcrt.dll'; //СТАРТОВЫЙ КОД var argc:integer; argv, environ : arrayPChar; _si:STARTUPINFO; begin _si.cb := sizeof(STARTUPINFO); GetStartupInfoA( _si ); __getmainargs( @argc, @argv, @environ, 0, @_si ); ExitProcess(main(argc, argv, environ)); end. А теперь код проекта. Код (Pascal): unit name_project; interface uses Windows{, SysUtils}; type arrayPChar = array of PChar; ParrayPChar = ^arrayPChar; function printf(Format: PChar): Integer; cdecl; varargs; external 'msvcrt.dll'; function sprintf(CharBuf: PChar; const Format: PAnsiChar): Integer; cdecl; varargs; external 'msvcrt.dll'; function main(argc : integer; argv, envp : arrayPChar): Integer; cdecl; implementation function main(argc : integer; argv, envp : arrayPChar): Integer; var i : integer; begin printf('ParamCount: %d'#10, argc); for i:=0 to argc-1 do printf('argv[%d]=[%s]'#10, i, argv[i]); end; end. Как то так, стартовый код в принципе надо переделать, но пока что есть. PS Код переделал, на более компактный и главное рабочий.
Да, надо привести более реальный пример. Я тут намедни выложил код для расчёта даты пасхи. Попробуем сделать тоже на паскале в стиле Си, т.е. используем стандартную библиотеку С. Стартовый код. Спойлер: easter.dpr Код (Pascal): program easter_project; { Консольное приложения в стиле Си для Win32 } {$APPTYPE CONSOLE} uses Windows, easter in 'easter.pas'; procedure __getmainargs(_argc: PInteger; _argv, _environ:PChar; _param:integer; _si:PStartupInfo); cdecl; external 'msvcrt.dll'; //СТАРТОВЫЙ КОД var argc:integer; argv, environ : arrayPChar; _si:STARTUPINFO; begin _si.cb := sizeof(STARTUPINFO); GetStartupInfoA( _si ); __getmainargs( @argc, @argv, @environ, 0, @_si ); ExitProcess(main(argc, argv, environ)) end. Основной код Спойлер: easter.pas Код (Pascal): {===================================================== Дата православной и католической пасхи. По формуле Карла Фридриха Гаусса (1777-1855). Календарь и хронология. Климишин И.А. 1990, стр. 133 (c) Intro v1.03 5.04.2019 25.05.2019 ======================================================} unit easter; interface uses Windows; type arrayPChar = array of PChar; ParrayPChar = ^arrayPChar; Sdate = record day:byte; // 1-31 mon:byte; // 0-11 end; function printf(Format: PChar): Integer; cdecl; varargs; external 'msvcrt.dll'; function sprintf(CharBuf: PChar; const Format: PAnsiChar): Integer; cdecl; varargs; external 'msvcrt.dll'; function atoi(_Str: PChar): Integer; cdecl; external 'msvcrt.dll'; function main(argc : integer; argv, envp : arrayPChar): Integer; cdecl; implementation //****************************************** function NewStyleDay(year:integer):integer; // Расхождение между новым и старым стилем, дней. var century:integer; begin century := year div 100; Result := (century div 4)*3 + century mod 4 - 2; end; function NumDay2Data(day:integer):Sdate; // номер дня от 1 марта в дату var mon:integer; begin mon := 2; // March if day>31 then begin dec(day, 31); inc(mon); // April if day>30 then begin dec(day, 30); inc(mon) // May end; end; Result.day := day; Result.mon := mon; end; function GetEasterGauss(year, m, n:integer; is_catholic:boolean):integer; var a,b,c,d,e,day:integer; begin a := year mod 19; b := year mod 4; c := year mod 7; d := (19*a + m) mod 30; e := (2*b + 4*c + 6*d + n) mod 7; day := 22 + d + e; if is_catholic and (day>=56) and (e=6) then dec(day, 7); Result:= day; end; function GetOrthodoxEaster(year:integer):integer; // православная пасха begin Result:= GetEasterGauss(year, 15, 6, false); end; function GetCatholicEaster(year:integer):integer; // католическая пасха var m,n,p,q,century:integer; begin century := year div 100; p := (century*8 + 13) div 25; q := century div 4; m := (century - p - q + 15) mod 30; n := (century - q + 4) mod 7; Result:= GetEasterGauss(year, m, n, true); end; function main(argc : integer; argv, envp : arrayPChar): Integer; var year, day : integer; old_s, new_s:Sdate; begin Result:=0; if argc<>2 then begin printf('Usage: easter year'#10); exit; end; year := atoi(argv[1]); day := GetOrthodoxEaster(year); // old style old_s := NumDay2Data(day); inc(day, NewStyleDay(year)); new_s := NumDay2Data(day); printf('Orthodox easter in %d:'#10, year); printf('Old style: %2d.%02d New style: %2d.%02d'#10, old_s.day, old_s.mon+1, new_s.day, new_s.mon+1); day := GetCatholicEaster(year); // new style new_s := NumDay2Data(day); dec(day, NewStyleDay(year)); old_s := NumDay2Data(day); printf('Catholic easter in %d:'#10, year); printf('Old style: %2d.%02d New style: %2d.%02d'#10, old_s.day, old_s.mon+1, new_s.day, new_s.mon+1); end; end. Имеет ли смысл портировать стандартную библиотеку Си в паскаль? Да имеет, хотя компилятор делфи давно устарел. Но всё же код на паскале однозначно более понятен. Да, паскаль плох по сравнения с Си тем, что он просто не доделан как надо. Я так думаю. ЗЫ Я исправил ошибку в коде, где, например для 1991 дата пасхи рассчитывалась не правильно. ЗЫЫ У меня на делфи 6 получился файл 15К не плохо, GCC создал более объёмный код, даже с ключами оптимизации на минимальный размер.
"более" -- это сколько? http://alignment.hep.brandeis.edu/Software/Pascal/Pascal.html а этот пробовал? --- Сообщение объединено, 27 май 2019 --- https://rextester.com/l/pascal_online_compiler
лол! паскаль плох по сравнению с си? наверно строгой типизацией? или наличием строкового типа данных? или отсутствием неопределенного поведения? а может быть быстрой скоростью компиляции и нормальной системой модулей? или наличием обработки исключений и ооп?
Можно. У Ms-Rem'а были статьи по пересборке System.pas и SysInit.pas. Подкладываешь их в свой проект и на выходе получаешь чрезвычайно минималистичный бинарник безо всего. --- Сообщение объединено, 28 май 2019 --- Так какой смысл? В дэльфи прекрасная RTL из коробки, имхо, намного более удобная, чем CRT.
Может непонял смысл темы ? Какой смысл делать Делфи в стиле Си, не лучше тогда и писать на Си ? Вообще настольгия, с Делфи начинал, но нравилась 6-ая версия, Borland, потом когда она стала Embarcadero, быстренько перешел на другие среды.)))
Для фронтенда дэльфи и в 2019м остаётся очень вкусным решением! Ничего удобнее FireMonkey ещё не видел, Qt и рядом не стоит по скорости дизайнинга и удобству. И компилятор создаёт неплохой код. Не уровень gcc/msvc/icc, конечно, но уверенный середнячок - для фронтенда хватает с головой. Так что, дэльфи жил, жив и будет жить
Есть C++ Builder , который почему-то мало кто юзает. А ведь это все тот же визуальный дельфи, но пишешь на Си. Для гуев лучше нету.
А с этим не соглашусь. В билдере "плохой" си, не соответствующий никаким стандартам. Помню, когда пробовал на нём писать, были какие-то проблемы с лямбдами и с чем-то ещё, а в LLVM-версии отваливаются подсказки. В общем, билдер оставил смешанные чувства. Проверял год назад, сейчас, возможно, уже исправили - особенно, учитывая, что в одном из недавних обновлений сделали, наконец, поддержку C++17 и сменили владельца (Embarcadero -> Idera). В любом случае, для гуи я бы выбрал именно дэльфи - много сахара, удобный, легко читается, а при необходимости уже писать дллки на плюсах в msvc.
а зачем такие изыски для окошек? да, и многим ли нужны лямбды? куча публики ваще окошки на джавах клепают иль совсем веб интерфейс хотя с другой стороны, конечно, билдер имеет массу замен, тч сугубо окошек ради публика к нему тянуться не будет.
Ну как сказать... Я очень часто использую, а кто-то предпочитает классические каллбэки. Да даже не важно: назвался плюсами - полезай в комитет по стандартизации. Иначе это и не плюсы, и не новый язык, а что-то непонятное. Ведь лямбды - лишь частный пример. Отличий от стандарта в борландовском си хватает. Да, тоже заметил моду на Electron и подобные js-движки. Но мне они не нравятся - неторопливые, тяжеловесные. Из прямой альтернативы билдеру, скорее, Qt, но IDE там тоже удовольствие так себе, на троечку, хотя сам Qt, как фреймворк, хорош. Но в плане визуального дизайнинга дэльфи конкурентов нет. Очень удобно рисовать формы мышкой, мышкой же делать анимации, кидать шейдеры, создавать свои векторные контролы. Влюбился в FireMonkey сразу, как увидел, на что он способен! Пробовал потом и QtWidgets, и даже QML - ну не то, неудобно дизайнить, и всё тут! (И я уже не говорю о необходимости статически билдить Qt, чтобы собрать приложение без зависимостей). Вообще, каждый фреймворк хорош по-своему. Даже джавовский FXML. Но лично для себя я выбрал дэльфи и иногда Qt для фронта, а плюсы (в VS на msvc) для бэка.
Хм? А что сложного в их отладке? Я и не знал, что с ними могут быть какие-то сложности... Сложно сказать... В студии нет дизайнера для плюсового кода, но если ты про VS Blend и дизайнер для шарпа - судить не берусь, потому что смотрел его лишь поверхностно (на шарпе не пишу) и не знаю, например, как там делать кастомные контролы со своими анимациями и эффектами, чтобы сравнить с дэльфи, но уверен, что всё это там есть. Всё-таки, студия - эталон (для меня) для разработки именно на плюсах, а что происходит в её шарповой части - не знаю.
вроде не так давно они перевели и дельфи и ихний плюсовый компилятор на один и тот же общий бекенд, который эмитит ллвм, не? QML очень удобная штука, хотя проседает по скорости (JS-код) в сравнении с чистыми плюсами, но как язык для гуя он очень хороший... зависит от компилера, часто на месте лямбды генерируется класс, который инкапсулирует все переменные, которые использованы лямбдой извне, не всегда бывает, что эта конструкция распознается отладчиком (насчет студии не знаю, но гдб бывает путается в показаниях подобных вещей), хоть и должна быть в теории... физически ты видишь функцию с this-указателем и все, остальное адресуется через указатель... если включены оптимизации, то некоторые части этой конструкции могут быть заинлайнены, там бывает знатный бардак по коду...
с колбэком разные сложности могут возникать (как и с любой другой функой) и логировать/ладить его работу удобней при классическом подходе.
Не знаю, я года полтора назад последний раз игрался с билдером - там LLVM только ввели и он был на выбор. И, насколько помню, поддерживался только для x64. И отваливались подсказки! Не знаю, как сейчас. А про то, что и дэльфи теперь на LLVM, впервые слышу. Интересно было бы сравнить производительность и качество кода. QML тоже только по верхам посмотрел. Посмотрел, и вернулся в более привычные QtWidgets, хотя нет-нет, а подмывает разобраться в QML и что-нибудь на нём написать. Ни разу не сталкивался с какими-то сложностями при дебаге лямбд в визуалке. Всегда дебажил их, как обычный код, и не задумывался, что где-то с ними могут быть трудности. Но всё это без оптимизаций в Debug-режиме, конечно. А если включать релиз, то проблемы с дебагом начинаются со ВСЕМ, а не только с лямбдами, но это и нормально.
Да какой бы не был, суть то не в этом. Мне лично просто привычней написать if (edit1->text == '') { indyhttp->get... } чем все эти begin end := Привык к Сишному синтаксису, в паскале путаюсь. А так то, чем билдер плох? Я вот юзал шестую версию (98 год!) и норм, ну изредка юникод глючит. А более новые вообще сказка - если надо по быстрому гуи набросать. Лямбды в жизни не юзал, так что не скажу.
Да не сказать, что плох. Тормознее, чем дэльфи, криво работает с подсказками для LLVM (в 10.2.х, в 10.3.х, возможно, пофиксили), но IDE, в целом, неплохая. У меня нет каких-то выраженных языковых предпочтений, одинаково легко писать и на дэльфи, и на си, и на джаве с пхп, поэтому для меня нет проблем с перестройкой на другой язык. Если кому-то удобнее именно си, билдер тоже будет неплохим выбором. Звёзд с неба не хватает, но писать можно. Хотя, если уж писать на плюсах, то сразу в Qt. Больше интересует другое: у дэльфи и билдера, по опыту, много проблем с антивирусами - почему-то они не любят дэльфовый софт. Кто-то ещё сталкивался? И как решали?
Я последнее время сталкиваюсь с другим - гуй пишут на С#(frontend) . со всякими маршалингами и прочим . А либы С++ ые (backend) . Тоже имеет место быть между прочим.