>> Но и прекращать знакомство с WinAPI мне не хочется, жаль будет потраченное время. М>winAPI следует использовать _только_ когда без него вообще невозможно. в остальных случаях следует абстрагироваться от платформы. вот я тоже когда-то ковырял WinAPI, а сейчас сижу в конторе, разрабатывая софт для линуха, благо пишу на ANSI C и потому он работает как на винде, так и на линухе. а еще есть маки. и их рынок достаточно обширен. а еще есть мобильные устройства, которых миллионы.
Ага, кросс-платформенные приложения, работающие одинаково убого на всех платформах... Знаем, знаем. Вы когда-нибудь слышали притчу о хм... попе, которая пыталась усидеть больше чем на одном стуле?
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, stdcout, Вы писали:
LVV>Я самому себе задачи придумываю. Вот например. Написать программу для тестирования по какой-нить дисциплине. LVV>1. Как хранить базу тестовых вопросов? Для начала можно сделать текстовый файл.
неинтересно. это даже школьник напишет. а вот анкетирование написать сложнее, так как возникает вариационность. вы мужчина или женщина? (дальше тест для мужчины и женщины в зависимости от ответа). вы имели в своей жизни секс? если да, то следующий вопрос: с кем, если нет, то спрашиваем вы пробовали наркотики? причем за наркотики мы спрашиваем независимо от сексуального опыта.
вот тут правильный формат хранения очень важен, т.к. вопросы идет не сплошным тексом, они взаимосвязаны и нужно как-то обозначить эту связь. а так же нужно уметь быстро прыгать на нужный вопрос...
LVV>С++ здесь — только инструмент. Который изучается по ходу реализации интересной проги.
изучать плюсы по ходу дела... ну... это же ООП блин. я тут по ходу изучения питона (который несравненно проще плюсов) написал простенький харвестр сайтов, который парсит страны, находит нужные линки, скачивает их, парсит HTML дальще и... только потом открыл для себя как это действительно делается на питоне со штатными библиотеками. и делается это совсем не так...
и мне страшно представить как будет меняться концепция проекта по ходу изучения плюсов...
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, stdcout, Вы писали:
S>Здравствуйте, мыщъх, Вы писали:
М>>меня вот руби очаровал с первого взгляда. вот, смоторите какая программа: 12.times {|a| puts ' '*(12-a)+'*'*2*a}; после этого так мучительно возвращаться к циклам типа for(int a=0;a<12;a++), когда гораздо быстрее написать 12.times {}, не говоря уже за мелочи типа когда foo(a,b){return a+b;} ужимается до def foo a,b;a+b;end (т.е. неявный return с последним вычисленным выражением).
S>Если честно, для меня данный код очень не привычен.
если его написать с форматированием, то получится:
def foo (a,b)
return a+b;
end
а вот еще один пример:
File.readlines('file.txt').each do |line|
puts line
end
тут непривычность для сишника может быть только в том, что | line | это объявления параметра цикла, а еще в том, что end автоматически закроет файл, открытый readlines. т.е. тут мы открываем файл, читаем его по строкам и закрываем всего с одним библиотечным вызовом readlines.
S>я WinAPI начал изучать, так как читал, кто-то советовал, изучить основы WinAPI, а после желательно изучать .Net.
в чем-то такой совет очень правилен, поскольку, желательно представлять себе как оно вообще работает изнутри. с другой стороны -- даже на си вызов fopen работает и на линухе (через open через INT 80h) и на винде (через CreateFileA/W). а в дос оно вообще работает через INT 21h. но зачем все это знать? если не писать системный софт, то... только для общего развития. ну и еще для отладки программ...
.net -- удовольствие сомнительное. а точно ли она нужна? кому-то нужна это точно, но на ней свет клином не сошелся.
М>>интерфейс редко пишется на WinAPI, да и плюсы не самое лучше средство для этой цели... S>так я программированием увлёкся совсем недавно — полгода где-то И только месяца 2 назад начал читать про C++. S>Понравилось, особенно C-шный синтаксис, по сравнению с Pascal-евскм.
меня тоже си очаровал после паскаля. особенно тот факт, что в любое место можно воткнуть выражение и что можно легко взять указатель от функции: ((*cmd==*"cos")?cos:sin)(arg)). паскалю как бы и не снилось. там будет унылое дублирование cos(arg) и sin(arg).
> А переходить на изучение другого языка не планирую — с C++, думаю, надо хоть немного освоиться.
ага, и вас тут же спросят про виртуальный деструктор. на питоне и рубине такие вопросы неуместны, но по своей мощи они превосходят плюсы. мы (наш тим) сейчас остановились на руби, поскольку он позволяет писать большие проекты малыми силами и легко их сопровождать.
плюсы хороши только там, где действительно нужна эффективность. в остальных случаях лучше воспользоваться более дружелюбными к программисту языками.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, Ytz, Вы писали:
Ytz>Здравствуйте, мыщъх, Вы писали:
M>>а как вам это? (если писать структурно). на плюсы не затруднит переписать?
Ytz>Пожалуйста:
Ytz>
а где в плюсах big_int ?! извините, но ваш ответ из серии do_it(). это и я так умею. в руби есть встроенный bihnum, в плюсах -- нет. значит, нужна библиотека или спец. компилер. а где их брать? так что не темните. давайте полный пример плюс make-файл, чтобы мы видели как оно на плюсах будет и сколько телодвижений займет.
далее -- будет ли этот bignum совместим с остальными встроенными типами? можно ли к нему применять, в частности printf?! или это окажется (а она ведь окажется) "вещь в себе" ? я охотно верю, что можно найти библиотеку для bignum, реализующую сложение, вычитание, умножение и деление, но вот на руби я напишу fact(666).abs и оно будет работать. а у вас? покажите библиотеку, которая реализует bignum, который можно засунуть в любую из си/си++ функций и которая его поймет.
в этот и заключается разница между нативной и ненативной поддержками
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
М>а где в плюсах big_int ?!
Да много где. Мне больше всего в GMP нравится.
М>далее -- будет ли этот bignum совместим с остальными встроенными типами?
Да.
М>можно ли к нему применять, в частности printf?!
Нативный ввод-вывод в С++ — это потоки. С ними всё ОК.
М>или это окажется (а она ведь окажется) "вещь в себе" ? я охотно верю, что можно найти библиотеку для bignum, реализующую сложение, вычитание, умножение и деление, но вот на руби я напишу fact(666).abs и оно будет работать. а у вас?
Без проблем. Только abs() надо реализовать будет не забыть.
М>покажите библиотеку, которая реализует bignum, который можно засунуть в любую из си/си++ функций и которая его поймет.
А нафиг?
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, мыщъх, Вы писали:
М>>а где в плюсах big_int ?! C>Да много где. Мне больше всего в GMP нравится.
это понятно, что библиотеки есть, но если программа использует библиотеку -- это нужно указывать явно в самой программе. причем, использование сторонних библиотек это сложная задача как с инженерной, так и с юридической точки зрения. на каких платформах доступна эта библиотека? для каких компиляторов? какая лицензия?
кстати, если на то пошло, то в приличной библиотеке должен быть готовый факториал. так что мой вариант на плюсах выглядит даже короче: fact(666).
М>>далее -- будет ли этот bignum совместим с остальными встроенными типами? C>Да.
можно даже так сделать: "0123456"[(fact(666) >> fact(9)) & 3]
меня терзают смутные сомнения, что нельзя.
М>>или это окажется (а она ведь окажется) "вещь в себе" ? я охотно верю, что можно найти библиотеку для bignum, реализующую сложение, вычитание, умножение и деление, но вот на руби я напишу fact(666).abs и оно будет работать. а у вас? C>Без проблем. Только abs() надо реализовать будет не забыть.
то есть де-факто нельзя.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
М>>>а где в плюсах big_int ?! C>>Да много где. Мне больше всего в GMP нравится. М>это понятно, что библиотеки есть, но если программа использует библиотеку -- это нужно указывать явно в самой программе. причем, использование сторонних библиотек это сложная задача как с инженерной,
Ой, ну не смешите меня. Использование библиотек решается нормальной системой сборки. Мне для подключения libgmp3 нужно лишь прописать пару строк в CMake-файл.
М>так и с юридической точки зрения.
Основы лицензий современный программист один фиг обязан знать.
М>на каких платформах доступна эта библиотека? для каких компиляторов? какая лицензия?
Смотрим в readme. А ты знаешь как у Ruby работает GC на Солярисе?
М>кстати, если на то пошло, то в приличной библиотеке должен быть готовый факториал. так что мой вариант на плюсах выглядит даже короче: fact(666).
Да, в libgmp он есть. Причём оптимизированый.
М>>>далее -- будет ли этот bignum совместим с остальными встроенными типами? C>>Да. М>можно даже так сделать: "0123456"[(fact(666) >> fact(9)) & 3] М>меня терзают смутные сомнения, что нельзя.
В libgmp3 можно, с небольшой поправкой на синтаксис.
C>>Без проблем. Только abs() надо реализовать будет не забыть. М>то есть де-факто нельзя.
Почему?
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, мыщъх, Вы писали:
C>Ой, ну не смешите меня. Использование библиотек решается нормальной системой сборки.
ой, ну не смешите меня. далеко не всякая библиотека заведется с произвольным компилятором и никакая система сборки этого не решит. далее, если мой сорец пользует кто-то еще, использование нестандартных библиотек добавляет головной боли. скажу честно, я затрахался объяснять что такое zlib штатовским никсовым программистам. настолько сильно затрахался, что плюнул и скопипастил его в свой код. причем я поставлял свои сорцы + make-файл. и zlib уже есть в никсах. но... программисты забивали на мой make болт, копипастили мой сорец себе и говорили, что у меня ошибка и все тут неправильно и оно даже не компилируется.
М>>так и с юридической точки зрения. C>Основы лицензий современный программист один фиг обязан знать.
это понятно. но я о том, что лицензия на библиотеку может сильно ограничить свободу вашего кода, особенно на международном энтерпрайз рынке. не говоря уже за сертификацию. в частности, я не могу использовать ничего из того, что выходит за штатный комплект поставки цент-оси без кучи согласований. и если мне будет нужен bignum, то, верятно, я напишу его на си быстрее, чем согласую это.
М>>на каких платформах доступна эта библиотека? для каких компиляторов? какая лицензия? C>Смотрим в readme. А ты знаешь как у Ruby работает GC на Солярисе?
что мне солярис... я с рельсами на виндах так протахался, что плюнул и подрубился к sql напрямую -- это оказалось гораздо проще. я ж не спорю. руби это не панацея. я вообще убежденный сишник. вот тут на прошлой неделе написал прототип детектора полиморфа одного. на си. оказалось быстрее, чем на питоне. на питоне я увяз в кастинге. на си легко итерпретировать ячейку памяти как байт или дв. слово или как слово. на питоне получается сильно громоздко.
М>>>>далее -- будет ли этот bignum совместим с остальными встроенными типами? C>>>Да. М>>можно даже так сделать: "0123456"[(fact(666) >> fact(9)) & 3] М>>меня терзают смутные сомнения, что нельзя. C>В libgmp3 можно, с небольшой поправкой на синтаксис.
я в смысле о перекрытии операторов >> и &. ну и [].
C>>>Без проблем. Только abs() надо реализовать будет не забыть. М>>то есть де-факто нельзя. C>Почему?
"прозрачный" bignum удобнее тем, что можно даже не знать, что это bignum и что он вышел за пределы 2^32 или даже 2^64, прозрачный bignum не нужно специально объявлять, гадая хватит или не хватит у нас int.
тут на rsdn пробегало описание протокола сигнализации от автомобилей, в котором была ошибка, которую и требовалось найти (взлом через запоминание/имитацию посылок), и там так же была бага целочисленного переполнения, актуальная для 16-битного int. просто никто об этом и не подумал. вот. а сколько таких багов возникает, когда думали, что хватит и int, а его -- ррраз и не хватило.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
C>>Ой, ну не смешите меня. Использование библиотек решается нормальной системой сборки. М>ой, ну не смешите меня. далеко не всякая библиотека заведется с произвольным компилятором и никакая система сборки этого не решит.
И чем только я libgmp не компилировал...
Тем более, что сейчас реально существуют три компилятора: gcc, MSVC и Intel'овский. Все остальные ушли в глухие ниши и никого не интересуют, так как указаная тройка покрывает все интересные target'ы.
М>далее, если мой сорец пользует кто-то еще, использование нестандартных библиотек добавляет головной боли. скажу честно, я затрахался объяснять что такое zlib штатовским никсовым программистам.
Ась? "apt-get install zlib1g-dev" и усё.
М>настолько сильно затрахался, что плюнул и скопипастил его в свой код. причем я поставлял свои сорцы + make-файл. и zlib уже есть в никсах. но... программисты забивали на мой make болт, копипастили мой сорец себе и говорили, что у меня ошибка и все тут неправильно и оно даже не компилируется.
Выбросьте ваших никсовых программистов. Или хотя бы обучите.
М>>>так и с юридической точки зрения. C>>Основы лицензий современный программист один фиг обязан знать. М>это понятно. но я о том, что лицензия на библиотеку может сильно ограничить свободу вашего кода, особенно на международном энтерпрайз рынке.
Может, поэтому ищется библиотека с подходящей лицензией.
М>не говоря уже за сертификацию. в частности, я не могу использовать ничего из того, что выходит за штатный комплект поставки цент-оси без кучи согласований. и если мне будет нужен bignum, то, верятно, я напишу его на си быстрее, чем согласую это.
Не напишешь. Тем более, что libgmp в CentOS есть.
М>>>можно даже так сделать: "0123456"[(fact(666) >> fact(9)) & 3] М>>>меня терзают смутные сомнения, что нельзя. C>>В libgmp3 можно, с небольшой поправкой на синтаксис. М>я в смысле о перекрытии операторов >> и &. ну и [].
Оно там есть. Оператор [] не пергружается, вместо него делается неявный каст к size_t (с runtime-исключением при выходе за диапазоны).
C>>Почему? М>"прозрачный" bignum удобнее тем, что можно даже не знать, что это bignum и что он вышел за пределы 2^32 или даже 2^64, прозрачный bignum не нужно специально объявлять, гадая хватит или не хватит у нас int.
А как будет работать "0123456"[123412398423984918234123984123413412341123413241234]?
М>тут на rsdn пробегало описание протокола сигнализации от автомобилей, в котором была ошибка, которую и требовалось найти (взлом через запоминание/имитацию посылок), и там так же была бага целочисленного переполнения, актуальная для 16-битного int. просто никто об этом и не подумал. вот. а сколько таких багов возникает, когда думали, что хватит и int, а его -- ррраз и не хватило.
В протоколах bignum'ы как раз очень неудобны.
Здравствуйте, Cyberax, Вы писали:
C>Тем более, что сейчас реально существуют три компилятора: gcc, MSVC и Intel'овский.
Ещё Clang забыл, но он совместим с gcc.
Здравствуйте, stdcout, Вы писали:
S>Начало C++ далось довольно легко, так как учебник попался хороший. я затруднялся в выборе, как изучать дальше C++, так как опыта в программировании и знакомых программистов нет. Чтобы уметь писать программы "не в консоли", я начал читать про WinAPI. Книга также попалась довольно хорошая. Только, мне кажется, я сделал не совсем правильный выбор, так как это вроде чистый C. Но и прекращать знакомство с WinAPI мне не хочется, жаль будет потраченное время. Подскажите, пожалуйста, как и что изучать, чтобы было полезно: для приобретения опыта, для дальнейшего более подробного изучения самого C++, ну и для того, "чтобы писать программы с дружественным для пользователя интерфейсом".
Если разрабатывать только под Windows, лучше продолжить изучать WinAPI через изучение библиотек MFC и WTL. Копание в их исходниках здорово помогает в освоении WinAPI. Параллельно изучать STL. Дальше Boost, по желанию.
Самое важное здесь — практика. Ставьте себе задачи и решайте их, копайтесь в чужих опенсорсных проектах. Это всё только в плюс пойдёт.
М>программисты забивали на мой make болт, копипастили мой сорец себе и говорили, что у меня ошибка и все тут неправильно и оно даже не компилируется.
Дык они че, тупо через cl компилили?) Это не программисты, это... другие специалисты.
Здравствуйте, dZentle_man, Вы писали:
Z_>Здравствуйте, мыщъх, Вы писали:
М>>программисты забивали на мой make болт, копипастили мой сорец себе и говорили, что у меня ошибка и все тут неправильно и оно даже не компилируется. Z_>Дык они че, тупо через cl компилили?)
под никсами? cl ?! там вообще-то gcc. и "затмение" в качестве среды разработки. засунули два моих файла (хотя на самом деле там их не два, а больше, но это мелочи) в свой проект -- .c и .h, "затмение" создало .o файл для .c и правильно его подключило, но вот зависимость по zlib так и осталась болтаться.
Z> Это не программисты, это... другие специалисты.
я уже писал, что оператор запятая для них стал откровением и что они не въезжали какой результат вернет return *a = *b, *c = *d, не говоря уже за то, что foo(a,b){return a+b;} повергло их в культурный шок. а классическая шутка y = 3["0123456"] (подчеркиваю _классическая_) закончилась дракой, поскольку, сначала они утверждали, что это баг компилятора, а после того как выяснили, что это не баг, а фича, они меня за такие фичи бить начали. а конструкция err = (a > b && foo(a, b)) || (a < b && foo(b, a)) || (a == b && bar(a)) вообще переросла в ледовое побоище и они ее переписали на if else if else. и побоище было вызвано тем фактом, что если foo вернет ошибку, то ленивые вычисления отменяются и в худшем случае мы получаем на два сравнения больше, чем у них, но поскольку foo исполняется долго, а ошибку возвращает нечасто, то накладные расходы ничтожны, зато мой вариант записывается в одну строчку, а их портянка if — else — if растягивается на весь экран.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Кол. За использование else
КД>А за рекурсию — вообще "на кол"
КД>PS. Отсутствие const у n тоже "не айс"
КД>PSS. Стебаюсь.
Ещё отсутствие обработки отрицательных чисел допиши (но это правда было сразу в "задании").
Здравствуйте, мыщъх, Вы писали:
М>конструкция err = (a > b && foo(a, b)) || (a < b && foo(b, a)) || (a == b && bar(a))
Код, написанный с трудом, должен читаться с трудом