.NET - очередная гнусная попытка Билла Г. сожрать луну.
На самом деле, и я это предлагал еще в 95м, оптимальная ось должна выглядеть так: NIX-оидное ядро на C, а в роли GUI - поддерживающий Java многооконный браузер (тоже на C). Тогда пользовательские приложения будут Java-апплетами, а десктопы и графические расширения для приложений юзер сможет генерить по своему желанию в HTML. Единственно, чем нужно дополнить Java-машину, это возможностью доступа на локальный диск (в пределах отведенной админом директории) и логина к "чужим" серверам (только через пароль - нет запроса пароля - нет коннекта).
[C++] Тут я вот за этот язык взялся ;-) После Delphi дискомфорт ужасный, всё как-то через %опу ;-) Есть тупой вопрос про инкремент ;-)30.01.03 11:20 [vh, йцукенг, Ktirf, Step, HandleX] Автор: HandleX <Александр М.> Статус: The Elderman
Вопрос: есть ли в этом великом и могучем языке операция целочисленного инкремента на определённое значение? Насколько я понял MyVar++ увеличивает MyVar на единицу, а если мне надо на 30? Вот в паскале я бы написал Inc(MyVar, 30) а в сях пишу как идиот MyVar = MyVar + 30
Код неоптимизированный получается ;-)
[C++] Тут я вот за этот язык взялся ;-) После Delphi дискомфорт ужасный, всё как-то через %опу ;-) Есть тупой вопрос про инкремент ;-)07.02.03 07:34 Автор: elgato Статус: Незарегистрированный пользователь
> Вопрос: есть ли в этом великом и могучем языке операция > целочисленного инкремента на определённое значение? > Насколько я понял MyVar++ увеличивает MyVar на единицу, а > если мне надо на 30? Вот в паскале я бы написал Inc(MyVar, > 30) а в сях пишу как идиот MyVar = MyVar + 30 > Код неоптимизированный получается ;-) MyVar+=30; // Документацию читать надо.
[C++] Тут я вот за этот язык взялся ;-) После Delphi дискомфорт ужасный, всё как-то через %опу ;-) Есть тупой вопрос про инкремент ;-)05.02.03 19:41 Автор: SawJ Статус: Незарегистрированный пользователь Отредактировано 05.02.03 19:44 Количество правок: 1
> Вопрос: есть ли в этом великом и могучем языке операция > целочисленного инкремента на определённое значение? > Насколько я понял MyVar++ увеличивает MyVar на единицу, а > если мне надо на 30? Вот в паскале я бы написал Inc(MyVar, > 30) а в сях пишу как идиот MyVar = MyVar + 30 > Код неоптимизированный получается ;-)
Да ладно ты, мелочи ... же! Ну вот так мохно MyVar+=30
Я тя кстати очень хорошо понимаю (переход с Делфи на С) сам такой! По началу жуДь, ща на Дельфе сидеть вообще не могу, привык!
просьбы такие темы поднимать на борде Misc. А еще лучше - сразу в scrap.04.02.03 13:30 Автор: йцукенг <jcukeng> Статус: Member
Изначальный вопрос был задан вполне для beginners, хотя почему-то обитатели programming его туда не отправили. Ну а флейм, который дальше пошел - увы...
[C++] Ну вот, дальше — больше. Ещё вопросы из серии тупых, но на этот раз чуточку поумнее. Pls, help...01.02.03 23:23 Автор: HandleX <Александр М.> Статус: The Elderman
Тут столкнулся с тривиальной задачей, нужно «пулять» целочисленные значения по разным ветвям обработки, тривиальный case в Паскале справился бы на-ура. А вот в сях... switch - case какой-то слабоватый. Итак, пример на Паскале ниже и вопрос в том, как это лучше всего реализовать в С:
Case MyIntegerValue of
0..15: DoSomthingCool(MyIntegerValue);
16, 18, 24: DoNextCoolThing(MyIntegerValue);
26..89, 90, 95, 101..170: VeryNiceAndCool(MyIntegerValue);
End;
---
Здесь паскальный Case во всей своей красе — выбор из диапазона, из дискретных значений (что возможно и в сяшной паре switch - case), и в последней строке выбора есть диапазоны и дискретные значения. Неужели прийдётся строить if - else?
Ну а теперь про множества. Это немного соотносится с case.
if MyChar in ['A'..'Z', 'a'..'z'] then DoSomthing — как это сделать попроще?
Я понимаю, что можно так:
if (((MyChar >= "A") && (MyChar <= "Z"))|((MyChar >= "a") && (MyChar <= "z")))
DoSomething();
но это как-то некрасиво.
Ну и потяжелее пример с типом «множество»...
Type
TDigit = (zero, one, two, three, four, five, six, seven, eight, nine);
TDigits = Set Of TDigit;
Var Digits: TDigits;
Begin
Digits := [zero..two, four..six];
Include(Digits, three);
Digits := Digits + [seven..nine];
// Ну и в таком духе — операции со множествами.
End;
---
Я понимаю, для процессора это всего-навсего возня с битами в целочисленных значениях. Меня не испугает никакой язык, если в нём есть операции or, and, xor и прочяя... Но возможно, не надо изобретать колесо и есть уже что-то в самом языке?
Теперь ещё. Была у меня раньше мечта — повозится в ядре драйвером ;-) Delphi для этого не самый лучший инструмент, посколько он для этого не предназначен и включает даже в самую маленькую программу кучу инициализирующего дерьма с вызовом функций из библиотек пользовательского режима. Скажу даже, что за C я взялся, тайно движимый «ядерной» мечтою ;-) Но, наверное, взялся не за тот компилер, а именно за борландовсий С. И что я вижу — программа, которая «ничего не делает» — а именно, входит в Main и выходит из неё, без единого #include занимает 7 с лишним килобайт и выполняет кучу дерьма пользовательского режима при старте. С этим можно как-то побороться, или мне нужен другой компилятор?
Ещё в PE-заголовке драйверов выставляется флаг NATIVE subsystem, это как делается?
Заранее всем большое спасибо, надеюсь что не утомил.
[C++] Всем спасибо, приятно что многие «болеют» за C...03.02.03 05:32 Автор: HandleX <Александр М.> Статус: The Elderman
> Тут столкнулся с тривиальной задачей, нужно «пулять» > целочисленные значения по разным ветвям обработки, > тривиальный case в Паскале справился бы на-ура. А вот в > сях... switch - case какой-то слабоватый. Итак, пример на > Паскале ниже и вопрос в том, как это лучше всего > реализовать в С: >
Case MyIntegerValue of > 0..15: DoSomthingCool(MyIntegerValue);
> 16, 18, 24: DoNextCoolThing(MyIntegerValue);
> 26..89, 90, 95, 101..170:
> VeryNiceAndCool(MyIntegerValue);
> End;
---
> Здесь паскальный Case во всей своей красе — выбор из > диапазона, из дискретных значений (что возможно и в сяшной > паре switch - case), и в последней строке выбора есть > диапазоны и дискретные значения. Неужели прийдётся строить > if - else?
Да, в С/С++ switch простой, без диапазонов, только на сравнение с константой. В любом случае сложный паскалевский case с диапазоном развернется в такую же проверку. Часто, кстати, используется вариант с поиском по предварительно заполненной таблице.
> Ну а теперь про множества. Это немного соотносится с case. > if MyChar in ['A'..'Z', 'a'..'z'] then DoSomthing — как это > сделать попроще? > Я понимаю, что можно так: > if (((MyChar >= "A") && (MyChar <= "Z"))|((MyChar > >= "a") && (MyChar <= "z"))) > DoSomething(); > но это как-то некрасиво.
Конкретно эта задача - проверка символа на попадание в диапазон a-zA-Z обычно решается с помощью функции isalpha, для чисел - isdigit, плюс еще несколько аналогичных функций, которые, насколько я помню, реализованы не как толпа if, а как поиск по таблице. Про множества в чистом виде - ниже.
> Ну и потяжелее пример с типом «множество»... >
Type> TDigit = (zero, one, two, three, four, five, six, seven,
> eight, nine);
> TDigits = Set Of TDigit;
> Var Digits: TDigits;
> Begin
> Digits := [zero..two, four..six];
> Include(Digits, three);
> Digits := Digits + [seven..nine];
> // Ну и в таком духе — операции со множествами.
> End;
---
> Я понимаю, для процессора это всего-навсего возня с битами > в целочисленных значениях. Меня не испугает никакой язык, > если в нём есть операции or, and, xor и прочяя... Но > возможно, не надо изобретать колесо и есть уже что-то в > самом языке?
На уровне, совместимом с классическим С - это честная возня с битами. В С++ для этого есть класс из стандартной библиотеки std::bitset, реализован вполне эффективно.
> Теперь ещё. Была у меня раньше мечта — повозится в ядре > драйвером ;-) Delphi для этого не самый лучший инструмент, > посколько он для этого не предназначен и включает даже в > самую маленькую программу кучу инициализирующего дерьма с > вызовом функций из библиотек пользовательского режима. > Скажу даже, что за C я взялся, тайно движимый «ядерной» > мечтою ;-) Но, наверное, взялся не за тот компилер, а > именно за борландовсий С. И что я вижу — программа, которая > «ничего не делает» — а именно, входит в Main и выходит из > неё, без единого #include занимает 7 с лишним килобайт и > выполняет кучу дерьма пользовательского режима при старте. > С этим можно как-то побороться, или мне нужен другой > компилятор?
Ну, например, в VC всегда можно отрубить стандартную библиотеку, определить свою точку входа вместо стандартной. Скажем, в каких-то простых loader'ах я люблю определить свой WinMainCRTStartup, в итоге вполне функциональные программы получаются размером 2к, из которых большая часть приходится на заголовок, stub и т.п.
> Ещё в PE-заголовке драйверов выставляется флаг NATIVE > subsystem, это как делается?
У VC есть параметр линкера /SUBSYSTEM. И вообще, для таких задач VC, пожалуй, подходит больше, все-таки это родной компилятор, опять же, всякие примеры будут собираться сходу, без предварительного рихтования make-файлов (как это было раньше, по крайней мере).
[C++] Ну и еще02.02.03 02:48 Автор: amirul <Serge> Статус: The Elderman
> Ну, например, в VC всегда можно отрубить стандартную > библиотеку, определить свою точку входа вместо стандартной. > Скажем, в каких-то простых loader'ах я люблю определить > свой WinMainCRTStartup, в итоге вполне функциональные > программы получаются размером 2к, из которых большая часть > приходится на заголовок, stub и т.п. У Matt Pietrek-а есть либа libctiny - реализует _main _WinMain _DllMain всякие printf-ы с malloc-ами, в общем самые полезные функции из crt большей частью средствами WinAPI. При этом ее сырцы весят 17 кило, а сама либа (в COFF-е со всей вспомогательной инфой) - 15 кило. Если подрубить ее вместо стандартной библиотеки, то оставляя возможность использования основных crt-функций она увеличивает файл не на очень много.
> У VC есть параметр линкера /SUBSYSTEM. И вообще, для таких > задач VC, пожалуй, подходит больше, все-таки это родной > компилятор, опять же, всякие примеры будут собираться > сходу, без предварительного рихтования make-файлов (как это > было раньше, по крайней мере). А что действительно можно в BC собирать DDK-шные примеры (пусть даже и с рихтованием makefile-ов) - там же вроде куча чисто VC-шных расширений.
Одна только #pragma по каталогу inc нашлась в 226-ти файлах (в 2k DDK) - сомневаюсь, чтоб BC поддерживал все те же pragm-ы, что и VC, если они даже секции кода и данных не захотели называть так же и ресурсы хранить так же и вообще им не по пути.
[C++] Ну и еще02.02.03 04:27 Автор: dl <Dmitry Leonov>
> У Matt Pietrek-а есть либа libctiny - реализует _main > _WinMain _DllMain всякие printf-ы с malloc-ами, в общем > самые полезные функции из crt большей частью средствами > WinAPI. При этом ее сырцы весят 17 кило, а сама либа (в > COFF-е со всей вспомогательной инфой) - 15 кило. Если > подрубить ее вместо стандартной библиотеки, то оставляя > возможность использования основных crt-функций она > увеличивает файл не на очень много.
Да на самом деле в WinAPI вполне приличное количество функций, которыми при желании можно обойтись и самостоятельно, если стоит цель минимальный размер любой ценой.
> А что действительно можно в BC собирать DDK-шные примеры > (пусть даже и с рихтованием makefile-ов) - там же вроде > куча чисто VC-шных расширений. > Одна только #pragma по каталогу inc нашлась в 226-ти файлах > (в 2k DDK) - сомневаюсь, чтоб BC поддерживал все те же > pragm-ы, что и VC, если они даже секции кода и данных не > захотели называть так же и ресурсы хранить так же и вообще > им не по пути.
Я очень давно не смотрел BC. Не исключено, что они стали обеспечивать совместимость - включили же они в итоге поддержку MFC. Мне муки прикручивания любой библиотеки, автор которой забыл учесть BC, надоели году так в 95-м :)
[C++] Если найдешь DDK для BC - можешь и на нем дриверы писать :-))02.02.03 01:23 Автор: amirul <Serge> Статус: The Elderman
> Тут столкнулся с тривиальной задачей, нужно «пулять» > целочисленные значения по разным ветвям обработки, > тривиальный case в Паскале справился бы на-ура. А вот в > сях... switch - case какой-то слабоватый. Итак, пример на > Паскале ниже и вопрос в том, как это лучше всего > реализовать в С: >
Case MyIntegerValue of > 0..15: DoSomthingCool(MyIntegerValue);
> 16, 18, 24: DoNextCoolThing(MyIntegerValue);
> 26..89, 90, 95, 101..170:
> VeryNiceAndCool(MyIntegerValue);
В сях case действует немного по другому - первый же встреченный case с совпадением приводит к тому, что все другие case как бы пропускаются (почему так - можно понять взглянув на код, который генерится для switch-case инструкции) - именно поэтому каждый case нужно заканчивать break-ом. Так вот, чтоб прикрутить к одной ветке исполнения несколько разных case-ов нужно просто все их указать:
switch(i) {
case 0: case 1: case 2: case 3:
do_my_stuff();
break;
case 10: case 11: case 12:
do_another_stuff();
break;
default:
do_default_stuff();
}
---
Но такой код встречается нечасто, обычно case-ы идут по предопределенным константам (кодам сообщений, ioctl-ов, чего-то еще). Если нужно например сделать что-то только для букв есть библиотечная функция:
if (isalpha(char))
do_something(char);
Другие типы символов можно глянуть в <ctype.h>
И кстати, case-ы с не очень большим разбросом реализуются в коде при помощи таблицы указателей на функции (в общем берем нужный case используем как индекс в некой таблице и получаем искомый результат). Кстати использование всевозможных таблиц с данными - очень часто используемый прием.
Если действительно жизнь не мила без множеств (set-ов) - можешь глянуть на C++ овский STL или нестандартные библиотеки типа MFC.
> End;
---
> Здесь паскальный Case во всей своей красе — выбор из > диапазона, из дискретных значений (что возможно и в сяшной > паре switch - case), и в последней строке выбора есть Сишный switch-case не умеет в одном case-е обрабатывать диапазоны - нет такого типа. Если нужен диапазон - нужно делать несколько case-ов.
> Ну а теперь про множества. Это немного соотносится с case. > if MyChar in ['A'..'Z', 'a'..'z'] then DoSomthing — как это > сделать попроще? Собственно, см выше. Напомню:
if (isalpha(MyChar)) do_something();
> Я понимаю, что можно так: > if (((MyChar >= "A") && (MyChar <= "Z"))|((MyChar > >= "a") && (MyChar <= "z"))) > DoSomething(); Так, кстати, будет работать не везде. Например в кодировке EBCDIC - символы от a до z идут не непрерывно, а C задумывался как высокопортабельный язык, при этом библиотечная функция использует не 4-е сравнения (как в вышеприведенном примере), а одно индексирование и одну логическую операцию (битовое И).
> Ну и потяжелее пример с типом «множество»... >
Type> TDigit = (zero, one, two, three, four, five, six, seven,
> eight, nine);
> TDigits = Set Of TDigit;
> Var Digits: TDigits;
> Begin
> Digits := [zero..two, four..six];
> Include(Digits, three);
> Digits := Digits + [seven..nine];
> // Ну и в таком духе — операции со множествами.
> End;
---
Множеств в стандарте C нет. Есть математические библиотеки с реализациями и так далее. В стандарте C++ множества, как и многое другое есть, но не встроенные в язык, а реализованные в виде стандартной библиотеки. Это кстати соблюдается везде, где можно: все, что не нужно для самого языка выносится в библиотеку, например, в C (и C++) нет поддержки ввода/вывода на уровне языка (в отличие от паскаля, где read/write - операторы) - язык позволяет сделать это в библиотеке. Хотя может я и неточно выражаюсь, потому как эта самая библиотека стандартизирована: все реализации языка должны предоставлять то-то и то-то, а значит вроде как и тоже относятся к языку.
> Я понимаю, для процессора это всего-навсего возня с битами > в целочисленных значениях. Меня не испугает никакой язык, > если в нём есть операции or, and, xor и прочяя... Но > возможно, не надо изобретать колесо и есть уже что-то в > самом языке? См выше. Короче, если кровь из носа нужны множества и именно на C - можешь поискать в инете куча свободных математических библиотек.
> именно за борландовсий С. И что я вижу — программа, которая > «ничего не делает» — а именно, входит в Main и выходит из > неё, без единого #include занимает 7 с лишним килобайт и Маловато что-то :-)))
Вообще-то стандартное выравнивание секций для винды: 0x1000 (4 киловытеса). Именно для виндовозного PE, а не для какого-либо языка или компилятора. При этом выравниваются: заголовок, секция кода, секция данных и секция импортов. Так что минимум, чего можно добиться со стандартными установками - 16 кБ. Границу выравнивания можно уменьшить, но на фиг это никому не нужно. В сях тоже есть инициализация: как минимум проинициализировать некоторые глобальные и статические переменных (иногда не получается на этапе компиляции) и преобразовать строчку параметров строки в массив для вызова main(), вызов самого main-а и т.д.. Там не так много, но все-таки есть.
> выполняет кучу дерьма пользовательского режима при старте. > С этим можно как-то побороться, или мне нужен другой > компилятор? Если собираешься писать дривера, то нужен по-луюбому (см сабж).
> Ещё в PE-заголовке драйверов выставляется флаг NATIVE > subsystem, это как делается? Смотри опции линкера (для VC-шного это делается так: link /subsystem:native) вот только для драйверов нужно не это
> Заранее всем большое спасибо, надеюсь что не утомил. Не очень :-))) Наоборот, нашего полку прибыло :-)))
[C++] Если найдешь DDK для BC - можешь и на нем дриверы писать :-))02.02.03 01:43 Автор: dl <Dmitry Leonov> Отредактировано 02.02.03 01:52 Количество правок: 1
> Вообще-то стандартное выравнивание секций для винды: 0x1000 > (4 киловытеса). Именно для виндовозного PE, а не для > какого-либо языка или компилятора. При этом выравниваются: > заголовок, секция кода, секция данных и секция импортов. > Так что минимум, чего можно добиться со стандартными > установками - 16 кБ. Границу выравнивания можно уменьшить, > но на фиг это никому не нужно.
Отрубив стандартные библиотеки и перебив свою точку входа (и не играясь с выравниванием), легко достичь 2048 байт (которые еще что-то будут делать - крутить таймер, искать окна и т.п.). Меньше у меня не получалось, да и целью такой я не задавался :)
P.S. Задание /ALIGN:16 на пустой программе дало 496 байт :)
[C++] Про малые размеры — посмотрите на regedt32.exe в WinXP — 3584 байта. А у меня 7 кб минимум с учётом того, что выставлена галка «Use dynamic RTL», а без неё вааще за 60 килов отстоя получается. Поэтому вопрос: как отключить станд. библиотеки в BC?03.02.03 06:02 Автор: HandleX <Александр М.> Статус: The Elderman
Так как в XP regedt32 просто ShellExecute-ит regedit.exe и все
[C++] А у меня прога ShellExecute не вызывает, просто входит в Main и выходит, а занимает 7Кб.03.02.03 14:34 Автор: HandleX <Александр М.> Статус: The Elderman
[C++] Где в BC отключаются std lib-ы не знаю. Но это точно где то в настройках линкера. Перейдешь на VC - обращайся :-))))03.02.03 15:04 Автор: amirul <Serge> Статус: The Elderman
> > Вообще-то стандартное выравнивание секций для винды: > 0x1000 > > (4 киловытеса). Именно для виндовозного PE, а не для > > какого-либо языка или компилятора. При этом > выравниваются: > > заголовок, секция кода, секция данных и секция > импортов. > > Так что минимум, чего можно добиться со стандартными > > установками - 16 кБ. Границу выравнивания можно > уменьшить, > > но на фиг это никому не нужно.
> Отрубив стандартные библиотеки и перебив свою точку входа > (и не играясь с выравниванием), легко достичь 2048 байт > (которые еще что-то будут делать - крутить таймер, искать > окна и т.п.). Меньше у меня не получалось, да и целью такой > я не задавался :) Да, я попытался все как можно больше упростить, и поэтому не совсем точно выразился.
На самом деле можно еще и секции слить и еще чего-нить придумать, но это извращение :-))) Щас не то время, когда нужно бороться за каждый такт или байт (эх, а хорошее было время :-))))) )
Вот именно из разряда этих извращений я где-то конкурс видел на самый маленький ELF. Там команда true или false (не помню да и не важно) в полном соответствии со стандартом ELF-а, имеющая все необходимые секции и т.д. занимала что-то около 100 байт (может и еще меньше :-))) )
> P.S. Задание /ALIGN:16 на пустой программе дало 496 байт :)
[C++] Ну вот, дальше — больше. Ещё вопросы из серии тупых, но на этот раз чуточку поумнее. Pls, help...02.02.03 00:53 Автор: Tamas Статус: Member
ты товарищь слишком к поскалу приык
у тебя ошибка даже в этом коде
if (((MyChar >= "A") && (MyChar <= "Z"))|((MyChar >= "a") && (MyChar <= "z")))
{
}
это должно ваглидеть так
if (((MyChar >= 'A') && (MyChar <='Z'))|((MyChar >= 'a') && (MyChar <='z')))
{
}
это конечно мелочь все ошибаются
но носамом деле C# лучьше чем паскаль
хотя switch мне ненравися !
[C++] Ну вот, дальше — больше. Ещё вопросы из серии тупых, но на этот раз чуточку поумнее. Pls, help...02.02.03 10:56 Автор: Ktirf <Æ Rusakov> Статус: Elderman
> но носамом деле C# лучьше чем паскаль Ну про C#, если хочется в ядре копаться, лучше забыть... А что касается "лучше-хуже" - зависит от решаемых задач.
> хотя switch мне ненравися ! Мне тоже. Как и else-if. Предпочитаю ветвление при помощи таблицы переходов.
[C++] Тоже сильно не люблю C#02.02.03 18:19 Автор: amirul <Serge> Статус: The Elderman
Уж сильно начал смахивать на VB. Сборка мусора и многое другое. А уж отказ от указателей, потому как они приводят к ошибкам в программах меня вообще убил. Похоже в мелкософте еще не поняли, что к ошибкам в программах приводят компьютеры. И то не у всех и не всегда. Когда поймут - посмотрю как они от компов отказываться будут