Здравствуйте! Недавно начал изучать C++. До этого немного был знаком с Паскалем.
Начало C++ далось довольно легко, так как учебник попался хороший. я затруднялся в выборе, как изучать дальше C++, так как опыта в программировании и знакомых программистов нет. Чтобы уметь писать программы "не в консоли", я начал читать про WinAPI. Книга также попалась довольно хорошая. Только, мне кажется, я сделал не совсем правильный выбор, так как это вроде чистый C. Но и прекращать знакомство с WinAPI мне не хочется, жаль будет потраченное время. Подскажите, пожалуйста, как и что изучать, чтобы было полезно: для приобретения опыта, для дальнейшего более подробного изучения самого C++, ну и для того, "чтобы писать программы с дружественным для пользователя интерфейсом".
Здравствуйте, stdcout, Вы писали:
S>Здравствуйте! Недавно начал изучать C++. До этого немного был знаком с Паскалем. S>Начало C++ далось довольно легко, так как учебник попался хороший. я затруднялся в выборе, как изучать дальше C++, так как опыта в программировании и знакомых программистов нет. Чтобы уметь писать программы "не в консоли", я начал читать про WinAPI. Книга также попалась довольно хорошая. Только, мне кажется, я сделал не совсем правильный выбор, так как это вроде чистый C. Но и прекращать знакомство с WinAPI мне не хочется, жаль будет потраченное время. Подскажите, пожалуйста, как и что изучать, чтобы было полезно: для приобретения опыта, для дальнейшего более подробного изучения самого C++, ну и для того, "чтобы писать программы с дружественным для пользователя интерфейсом".
Изучи основы, а потом придумай себе какое-нибудь задание (типа графического редактора), в процессе создания которого будешь искать в литературе пробелы в знаниях.
Здравствуйте, stdcout, Вы писали:
S>Здравствуйте! Недавно начал изучать C++. До этого немного был знаком с Паскалем. S>Начало C++ далось довольно легко, так как учебник попался хороший. я затруднялся в выборе, как изучать дальше C++, так как опыта в программировании и знакомых программистов нет. Чтобы уметь писать программы "не в консоли", я начал читать про WinAPI. Книга также попалась довольно хорошая. Только, мне кажется, я сделал не совсем правильный выбор, так как это вроде чистый C. Но и прекращать знакомство с WinAPI мне не хочется, жаль будет потраченное время. Подскажите, пожалуйста, как и что изучать, чтобы было полезно: для приобретения опыта, для дальнейшего более подробного изучения самого C++, ну и для того, "чтобы писать программы с дружественным для пользователя интерфейсом".
Попробуй MFC — по сути тот же WinAPI, только в виде классов C++.
Здравствуйте, stdcout, Вы писали:
S>Здравствуйте! Недавно начал изучать C++. До этого немного был знаком с Паскалем.
А вам зачем? Вы студент?
Или собираетесь работать программером?
Или просто для себя?
От целей и направление возникает.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, stdcout, Вы писали:
S>>Здравствуйте! Недавно начал изучать C++. До этого немного был знаком с Паскалем. LVV>А вам зачем? Вы студент? LVV>Или собираетесь работать программером? LVV>Или просто для себя? LVV>От целей и направление возникает.
Да, я студент. Специальность связанная с вычислительной техникой, но не напрямую с программированием. Изучаю для себя, потому что для меня это интересно, но также, чтобы в дальнейшем можно было работать. А вот насчёт направления — не имею никакого представления, в каком идти, и даже не знаю, в каком можно развиваться.
Здравствуйте, stdcout, Вы писали:
s> Начало C++ далось довольно легко, так как учебник попался хороший. я затруднялся в выборе, как изучать дальше C++, так как опыта в программировании и знакомых программистов нет. Чтобы уметь писать программы "не в консоли", я начал читать про WinAPI. Книга также попалась довольно хорошая. Только, мне кажется, я сделал не совсем правильный выбор, так как это вроде чистый C. Но и прекращать знакомство с WinAPI мне не хочется, жаль будет потраченное время. Подскажите, пожалуйста, как и что изучать, чтобы было полезно: для приобретения опыта, для дальнейшего более подробного изучения самого C++, ну и для того, "чтобы писать программы с дружественным для пользователя интерфейсом".
Придумай какой-нибудь проект и думай какими целями/библиотеками можешь его написать(стоит приложить свою руку, например, к boost или poco). Если идей нет — можно посмотреть в ветке форума про работу какие задачи предлагают на собеседованиях.
В плане хороших книжек — многим сразу дается Джесс Либерти, "C++ за 21 день", в ней изложены все основы С++ — доступно, понятно и с примерами. Если хочется разобраться глубже, то можно почитать книги Мейерса, Александреску, Саттера.
Здравствуйте, stdcout, Вы писали:
S>Здравствуйте! Недавно начал изучать C++. До этого немного был знаком с Паскалем. S>Начало C++ далось довольно легко, так как учебник попался хороший. я затруднялся в выборе, как изучать дальше C++, так как опыта в программировании и знакомых программистов нет. Чтобы уметь писать программы "не в консоли", я начал читать про WinAPI. Книга также попалась довольно хорошая. Только, мне кажется, я сделал не совсем правильный выбор, так как это вроде чистый C. Но и прекращать знакомство с WinAPI мне не хочется, жаль будет потраченное время. Подскажите, пожалуйста, как и что изучать, чтобы было полезно: для приобретения опыта, для дальнейшего более подробного изучения самого C++, ну и для того, "чтобы писать программы с дружественным для пользователя интерфейсом".
Мне кажется, для студента изучающего С++ должно быть четыре этапа изучения:
1. Базовое знакомство
Почитать что-нибудь простое, типа Подбельский Язык С++, ну или в сети полно всяких простеньких мануалов
2. Практическое применение.
Берем книги с примерами и реализуем
Элджер Библиотека программиста С++
Сэджвик Р. Фундаментальные алгоритмы на С++. Части 1-4
Сэджвик Р. Фундаментальные алгоритмы на С++.Алгоритмы на графах.Diasoft
Мозговой 85 Нетривиальных проектов, решений и задач
Арт Фридман и компания. Архив программ. Код с комментариями
...
3. Углубление знаний, основы проектирования
Герб Саттер. Новые сложные задачи на С++
Мейерс Эффективное использование С++
Ален И. Голуб Веревка достаточной длины чтобы выстрелить себе в ногу
Герб Саттер, Андрей Александреску Стандарты программирования на С++. 101 правило и рекомендация
Андрей Александреску — Современное проектирование на C++
...
4. Изучение средств создания GUI(можно совместить с 3м этапом)
Qt 4. Программирование GUI на С++
ну и там куча всего про MFC, ATL, WTL, wxWidgets и т.д. и т.п.
Ну и главное — пока студент, старайся домашние задания сводить к программированию.
З.Ы. На полноту источников не претендую, тапками не кидать
Здравствуйте, sumkincpp, Вы писали:
S>Придумай какой-нибудь проект и думай какими целями/библиотеками можешь его написать(стоит приложить свою руку, например, к boost или poco). Если идей нет — можно посмотреть в ветке форума про работу какие задачи предлагают на собеседованиях.
S>В плане хороших книжек — многим сразу дается Джесс Либерти, "C++ за 21 день", в ней изложены все основы С++ — доступно, понятно и с примерами. Если хочется разобраться глубже, то можно почитать книги Мейерса, Александреску, Саттера.
Спасибо за совет)) С первой книжкой мне и так повезло — "Язык программирования C++. Лекции и упражнения" Стивена Праты ну и главы по некоторым темам из других учебников тоже просматривал. А вот, чтобы читать Майерса, Саттера, Александреску нужен опыт. А программы в консоли писать, если честно, не очень нравится. Вот и взялся за WinAPI, только там же чистый C — ООП не использовать, шаблоны тоже. Хотя не думаю прекращать изучать WinAPI, вроде полезная штука, пригодится. Но, чтобы не забыть C++ (классы, STL) тоже нужно что-то делать, а в WinAPI их вроде не получится использовать. Помнится, встречал я рекомендации в разных источниках после освоения основ WinAPI переходить к .NET.
Здравствуйте, morm, Вы писали:
M>Почитать что-нибудь простое, типа Подбельский Язык С++, ну или в сети полно всяких простеньких мануалов
M>Берем книги с примерами и реализуем
M>Мозговой 85 Нетривиальных проектов, решений и задач
M>ну и там куча всего про MFC, ATL, WTL, wxWidgets и т.д. и т.п.
Здравствуйте, stdcout, Вы писали:
S>Да, я студент. Специальность связанная с вычислительной техникой, но не напрямую с программированием. Изучаю для себя, потому что для меня это интересно, но также, чтобы в дальнейшем можно было работать. А вот насчёт направления — не имею никакого представления, в каком идти, и даже не знаю, в каком можно развиваться.
Я самому себе задачи придумываю. Вот например. Написать программу для тестирования по какой-нить дисциплине. Тут столько вопросов по мере развития решать нужно:
1. Как хранить базу тестовых вопросов? Для начала можно сделать текстовый файл. Придумать структуру хранения. Типы вопросов. Потом перевести в бинарный. Потом — разработать структуру многофайловую. Потом присоединить СУБД. Если интересно, то рассмотреть вопросы шифрования.
2. Интерфейс. Сначала консоль. Но проги — две: одна для препода — занесение в базу вопросов, другая — для студня, отвечающего на тест.
3. Вопросы настроек. Вопросов в базе — дофига. Надо генерировать конкретные тесты для конкретной контрольной работы... Тут: сколько вопросов, по сколько из какой темы. Время: для каждого вопроса, общее время выполнения теста. Режим: безвозвратный, с возвратами к предыдущим.
4. Опять интерфейс — окна подцеплять. И для препода, и для студента. Много вариантов. Я б начал с более простой библиотеки вроде vxWidget. Ntv более, что есть свободная среда vxDevC++. Потом можно и переписать на Qt — будет опыт большого рефакторинга.
5. Проблемы оценивания результатов теста и сбор статистики.
С++ здесь — только инструмент. Который изучается по ходу реализации интересной проги.
Мне еще интересны вопросы системного ПО. Я для студентов книжку писал и там разрабатывал виртуальные машины, интерпретаторы, ассемблеры, отладчики, загрузчики, xUnit, библиотекарь. Проги вроде небольшие, но практику дают хорошую. А потом все это в интегрированную среду — вот и окошки. А подцепить опять же контроль знаний — вот тебе и СУБД для базы тестов.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
S>Спасибо за совет)) С первой книжкой мне и так повезло — "Язык программирования C++. Лекции и упражнения" Стивена Праты ну и главы по некоторым темам из других учебников тоже просматривал. А вот, чтобы читать Майерса, Саттера, Александреску нужен опыт. А программы в консоли писать, если честно, не очень нравится. Вот и взялся за WinAPI, только там же чистый C — ООП не использовать, шаблоны тоже. Хотя не думаю прекращать изучать WinAPI, вроде полезная штука, пригодится. Но, чтобы не забыть C++ (классы, STL) тоже нужно что-то делать, а в WinAPI их вроде не получится использовать. Помнится, встречал я рекомендации в разных источниках после освоения основ WinAPI переходить к .NET.
Не путайте мягкое с теплым АПИ это АПИ а ЦПП это ЦПП , если взять для примера — то под винапи можно писать и на ассемблере и на басике и на цпп
и на чистом с.
ВИНАПИ — это всего лишь средство для взаимодействия с пользователем ( немного упрощенное описание ).
Во вторых , если вы планируете хоть немного писать под винду , знание как работать с винапи точно лишним не будет , но и в дебри тоже лезть не стоит,
поскольку чистый апи морально устарел уже ... но основы знать надо хотябы для отладки ( если вы пишете натив приложения)
Спокойно себе пользуйте и стл и буст если хотите .
Здравствуйте, stdcout, Вы писали:
S>Здравствуйте! Недавно начал изучать C++. До этого немного был знаком с Паскалем. S>Начало C++ далось довольно легко, так как учебник попался хороший.
а вы уверены, что вам нужны имено плюсы? есть мнение, что на плюсах можно писать высокопроизводительный код, но практика показывает, что рядовой программист пишет на плюсах что-то громоздкое, тормозное, падучее, с учечками памяти и переполнениями буфера и _сильно_ отстающее по производительности не только от жабы, но даже и от интерпретируемых языков типа питона.
меня вот руби очаровал с первого взгляда. вот, смоторите какая программа: 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 с последним вычисленным выражением).
руби не только быстро учитится, но на него и спрос сейчас выше, чем на плюсы (во всяком случае в штатах), а вот руби плюс си -- это вообще супер. пишем критический код на си, компилируем и зовем его из руби, на котором пишем высокоуровневую обвязку.
> Но и прекращать знакомство с WinAPI мне не хочется, жаль будет потраченное время.
winAPI следует использовать _только_ когда без него вообще невозможно. в остальных случаях следует абстрагироваться от платформы. вот я тоже когда-то ковырял WinAPI, а сейчас сижу в конторе, разрабатывая софт для линуха, благо пишу на ANSI C и потому он работает как на винде, так и на линухе. а еще есть маки. и их рынок достаточно обширен. а еще есть мобильные устройства, которых миллионы.
> Подскажите, пожалуйста, как и что изучать, чтобы было полезно: для приобретения опыта, > для дальнейшего более подробного изучения самого C++, ну и для того, "чтобы писать > программы с дружественным для пользователя интерфейсом".
интерфейс редко пишется на WinAPI, да и плюсы не самое лучше средство для этой цели...
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, Вы писали:
М>меня вот руби очаровал с первого взгляда. вот, смоторите какая программа: 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 с последним вычисленным выражением).
Здравствуйте, Murlokotam, Вы писали:
M>Здравствуйте, мыщъх, Вы писали:
М>>Здравствуйте, stdcout, Вы писали:
М>>foo(a,b){return a+b;} ужимается до def foo a,b;a+b;end (т.е. неявный return с последним вычисленным выражением). M>спасибо проблевался
главное, чтобы не просрались! а как вам это? (если писать структурно). на плюсы не затруднит переписать?
def fact(n)
if n == 0
1
else
n * fact(n-1)
end
end
Здравствуйте, мыщъх, Вы писали:
М>меня вот руби очаровал с первого взгляда. вот, смоторите какая программа: 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 с последним вычисленным выражением).
Если честно, для меня данный код очень не привычен.
М>winAPI следует использовать _только_ когда без него вообще невозможно. в остальных случаях следует абстрагироваться от платформы. вот я тоже когда-то ковырял WinAPI, а сейчас сижу в конторе, разрабатывая софт для линуха, благо пишу на ANSI C и потому он работает как на винде, так и на линухе. а еще есть маки. и их рынок достаточно обширен. а еще есть мобильные устройства, которых миллионы.
я WinAPI начал изучать, так как читал, кто-то советовал, изучить основы WinAPI, а после желательно изучать .Net.
М>интерфейс редко пишется на WinAPI, да и плюсы не самое лучше средство для этой цели...
так я программированием увлёкся совсем недавно — полгода где-то И только месяца 2 назад начал читать про C++. Понравилось, особенно C-шный синтаксис, по сравнению с Pascal-евскм. А переходить на изучение другого языка не планирую — с C++, думаю, надо хоть немного освоиться.
Здравствуйте, мыщъх, Вы писали:
М>есть мнение, что на плюсах можно писать высокопроизводительный код, но практика показывает, что рядовой программист пишет на плюсах что-то громоздкое, тормозное, падучее, с учечками памяти и переполнениями буфера и _сильно_ отстающее по производительности не только от жабы, но даже и от интерпретируемых языков типа питона.
Справедливо для любого языка, особенно для С (без плюсов).
>> Но и прекращать знакомство с 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))
Код, написанный с трудом, должен читаться с трудом
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, Ytz, Вы писали:
КД>А за рекурсию — вообще "на кол"
в си -- да. руби же хранит bignum в куче и потому разница между рекурсивным вариантом и не рекурсивным уже не столь существенна.
КД>PS. Отсутствие const у n тоже "не айс"
так оно ж не указатель. зачем ему const?!
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.
Здравствуйте, мыщъх, Вы писали:
М>сначала они утверждали, что это баг компилятора, а после того как выяснили, что это не баг, а фича, они меня за такие фичи бить начали
В 70% случаях когда такое выясняется (а комментария в коде нет) за фичи таки надо бить.
Здравствуйте, 24, Вы писали:
24>Здравствуйте, мыщъх, Вы писали:
М>>конструкция err = (a > b && foo(a, b)) || (a < b && foo(b, a)) || (a == b && bar(a)) 24>Код, написанный с трудом, должен читаться с трудом
хотите сказать, что
if (a > b)
{
err = foo(a, b);
}
else
{
if (a == b)
{
err = bar(a);
}
else
{
err — foo(b, a);
}
}
читается лучше?!
или вот еще вариант.
if (a == b)
err = bar(a);
else
err = foo(MAX(a,b), MIN(a,b));
в принципе, вариант с MIX/MAX лучше тем, что он _читается_, согласен.
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.
Здравствуйте, MescalitoPeyot, Вы писали:
MP>Здравствуйте, мыщъх, Вы писали:
М>>сначала они утверждали, что это баг компилятора, а после того как выяснили, что это не баг, а фича, они меня за такие фичи бить начали
MP>В 70% случаях когда такое выясняется (а комментария в коде нет) за фичи таки надо бить.
извините, а комментировать конструкции типа a = b[c]; тоже нужно пояснять (взять элемент по индексу c от массива b)?! это же в любой книжке для чайников написано, что a = b[c] равносильно a = c[b], равносильно a = *(b + c), равносильно a = *(c + b) равносильно a = (b + c)[0], равносильно a = 0[b + c];
это как бы базовые основы при работе с указателями и массивами. я вообще-то редко использую квадратные скобки, мне как-то ближе *(array + idx). надеюсь, хоть это комментировать не надо?!
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.
Здравствуйте, мыщъх, Вы писали:
М>Здравствуйте, 24, Вы писали:
24>>Здравствуйте, мыщъх, Вы писали:
М>>>конструкция err = (a > b && foo(a, b)) || (a < b && foo(b, a)) || (a == b && bar(a)) 24>>Код, написанный с трудом, должен читаться с трудом М>хотите сказать, что М>if (a > b) М>{ М>err = foo(a, b); М>} М>else М>{ М>if (a == b) М>{ М>err = bar(a); М>} М>else М>{ М>err — foo(b, a); М>} М>}
М>читается лучше?!
М>или вот еще вариант. М>if (a == b) М>err = bar(a); М>else М>err = foo(MAX(a,b), MIN(a,b));
М>в принципе, вариант с MIX/MAX лучше тем, что он _читается_, согласен.
Та я ж просто пошутил
Я обычно пишу открывающую скобку в той же строчке, и пачку else if тоже вместе, как-то так:
err = NO_ERR;
if (a > b) { err = foo(a, b); }
else if (a < b) { err = foo(b, a); }
else { err = bar(a); }
Хотя сразу я и упустил из виду, что в if-else-if нужно отдельно объявлять err, а в одну строчку оно входит. Но если в той строчке заменить a, b, foo и bar на что-то более реалистичное, то она уже будет или очень длинной, или не одной строчкой.
Здравствуйте, 24, Вы писали:
24>Здравствуйте, мыщъх, Вы писали:
24>Я обычно пишу открывающую скобку в той же строчке, и пачку else if тоже вместе, как-то так: 24>
24>err = NO_ERR;
24>if (a > b) { err = foo(a, b); }
24>else if (a < b) { err = foo(b, a); }
24>else { err = bar(a); }
24>
24>Хотя сразу я и упустил из виду, что в if-else-if нужно отдельно объявлять err, а в одну строчку оно входит. Но если в той строчке заменить a, b, foo и bar на что-то более реалистичное, то она уже будет или очень длинной, или не одной строчкой.
эээ... нет... т.к. if/else/if/else покрывают весь спектр вариантов, то err мусора не окажется, но компилятор скорее всего начнет ругаться. кстати, у вас ошибка. правильнее писать err = ERROR. т.к. если ни foo, ни bar не были вызваны -- тут какой-то косяк.
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.
Здравствуйте, мыщъх, Вы писали:
М>правильнее писать err = ERROR. т.к. если ни foo, ни bar не были вызваны -- тут какой-то косяк.
Как в данном случае может не вызваться ни одна из них? А вцелом соглашусь, что если err рассматривать не как показатель ошибки в отдельных функциях, а как общий показатель правильности участка кода, то да, лучше инициализировать как ошибку.
Здравствуйте, 24, Вы писали:
24>Здравствуйте, мыщъх, Вы писали:
М>>правильнее писать err = ERROR. т.к. если ни foo, ни bar не были вызваны -- тут какой-то косяк.
24>Как в данном случае может не вызваться ни одна из них? А вцелом соглашусь, что если err рассматривать не как показатель ошибки в отдельных функциях, а как общий показатель правильности участка кода, то да, лучше инициализировать как ошибку.
Хотя я редко использую коды возврата, и если использую, то по одному, так что вопрос, чем инициализировать, не стоит:
Здравствуйте, 24, Вы писали:
24>Здравствуйте, мыщъх, Вы писали:
М>>правильнее писать err = ERROR. т.к. если ни foo, ни bar не были вызваны -- тут какой-то косяк. 24>Как в данном случае может не вызваться ни одна из них?
я же говорю -- косяк. ошибка в коде. сбой процессора. баг в компиляторе. модификация кода, ведущая к развалу логики...
> А вцелом соглашусь, что если err рассматривать не как показатель ошибки в отдельных функциях, > а как общий показатель правильности участка кода, то да, лучше инициализировать как ошибку.
и тогда лучше завести специальное значение ERROR_IN_DNA, чтобы отличать его от ситуации возврата ошибки из функции.
кстати, мне си нравится тем, что в нем нету исключений. вот руби кидает исключение при ошибке открытия файла и мне непонятно почему. это же совершенно нормальная ситуация. хотели открыть файл, а нас обломали. у программиста есть все возможности обработать эту ситуацию, проверив валидность дескриптора. зачем же сразу кидаться исключениями? а вот если инвалидный дескриптор передан в read/write, то здесь, согласен, исключение выглядит намного логичнее возврата ошибки, т.к. раз инвалидный дескриптор попал в read, то, очевидно, программист уже накосячил и продолжать выполнение программы -- бессмысленно.
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.
Здравствуйте, 24, Вы писали:
24>Здравствуйте, 24, Вы писали:
24>>Здравствуйте, мыщъх, Вы писали:
М>>>правильнее писать err = ERROR. т.к. если ни foo, ни bar не были вызваны -- тут какой-то косяк.
24>>Как в данном случае может не вызваться ни одна из них? А вцелом соглашусь, что если err рассматривать не как показатель ошибки в отдельных функциях, а как общий показатель правильности участка кода, то да, лучше инициализировать как ошибку.
24>Хотя я редко использую коды возврата, и если использую, то по одному, так что вопрос, чем инициализировать, не стоит:
у меня обычно за error отвечает 0 когда возвращается указатель и -1 когда возвращается индекс. или, учитывая, что -1 не является валидным указателем на реальных платформах, -1 это ошибка, 0 — ошибки нет, но искомая строка не найдена или типа того, иначе -- указатель на то, что мы искали.
так же, учитывая, что нижняя и верхняя часть адресного пространства зарезервированы и валидные указали в них не указывают, можно совместить указатель с некоторым магическим числом, что позволяет возвращать некое значение или указатель на значение.
а чтобы отлавливать ситуации когда программист забил болт на проверку ошибок, то возврат указателя на указатель -- это просто магическое средство. т.е. если программист сделает pp = foo(a,b); c = *pp; то при возникновении ошибки foo вернет не указатель на ноль, а просто ноль и программа без проверки ошибок тут же грохнется.
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.
М>>>программисты забивали на мой make болт, копипастили мой сорец себе и говорили, что у меня ошибка и все тут неправильно и оно даже не компилируется. Z_>>Дык они че, тупо через cl компилили?) М>под никсами? cl ?! там вообще-то gcc.
А, простите, от гцц с линухами вообще-то стараюсь подальше держаться) Так что могу тормознуть и ляпнуть)
М>и "затмение" в качестве среды разработки.
Можно просто эклипс) Или вы нарочно делаете ударение на смысл этого слова?)
М>засунули два моих файла (хотя на самом деле там их не два, а больше, но это мелочи) в свой проект -- .c и .h, "затмение" создало .o файл для .c и правильно его подключило, но вот зависимость по zlib так и осталась болтаться.
Кросавхчеги, че.
Z>> Это не программисты, это... другие специалисты. М>а классическая шутка y = 3["0123456"] (подчеркиваю _классическая_) закончилась дракой, поскольку, сначала они утверждали, что это баг компилятора, а после того как выяснили, что это не баг, а фича, они меня за такие фичи бить начали. а конструкция err = (a > b && foo(a, b)) || (a < b && foo(b, a)) || (a == b && bar(a)) вообще переросла в ледовое побоище и они ее переписали на if else if else.
Вы знаете, я и сам стараюсь писать попроще, но тому есть две причины — во-первых сам не эксперт, во-вторых разобраться в простой конструкции на экран проще, чем в мозговороте в одну строчку. Но чтобы морду за это бить... Я бы помалкивал например, и учился бы, благо есть попутный повод поднять свой уровень. С другой стороны, для нормальной поддерживаемости кода его на самом деле нужно писать попроще. Об этом можно договариваться, идти на компромиссы. Но пинать человека за то, что он знает больше тебя... Какие-то непуганые идиоты у вас там работают.
Ни разу в жизни не пользовался эквивалентностью a[с] и с[a], хотя знаком с этим как с очередным сишным курьезом. Допускаю, что разработчик имеет право не знать такой востребованной и частоупотребляемой "фичи" языка, тем более что она не дает ничего нового, а является редко используемой формой записи.
Оператор запятая, думаю, также не знаком многим разработчикам, уже не помню когда я его в последний раз видел в сорцах, вот и нефиг его использовать, если можно обойтись.
23.03.2011 22:33, мыщъх пишет:
> c)[0], равносильно a = 0[b + c]; > > это как бы базовые основы при работе с указателями и массивами. я > вообще-то редко использую квадратные скобки, мне как-то ближе *(array + > idx). надеюсь, хоть это комментировать не надо?!
Не надо. Но надо быть готовым к тому, что скоро на замену термину
"индусский код" придет термин "русский код".
А за такое в коде я бы бил больно и ногами.
Здравствуйте, мыщъх, Вы писали:
М>вот руби кидает исключение при ошибке открытия файла и мне непонятно почему. это же совершенно нормальная ситуация. хотели открыть файл, а нас обломали. у программиста есть все возможности обработать эту ситуацию, проверив валидность дескриптора. зачем же сразу кидаться исключениями?
В случае открытия файла это сделано, как мне кажется, скорее для единообразия (т.к. исключения используются везде, и код возврата только для одной функции делать нет смысла), а не потому, что так лучше. Хотя, чем проще ошибку проигнорировать, тем выше шансы, что она таки будет проигнорирована. Чтоб проигнорировать код возврата — не нужно делать ничего, а чтоб проигнорировать исключение — это нужно явно писать. Необработанное исключение сразу обвалит программу (и будет понятно, где она обломилась), а с необработанным кодом ошибки выполнение молча продолжится, и ошибка, которая произошла в одном месте, вызовет странные эффекты позже в другом месте, и надо ещё разбираться, что оно работает здесь неправильно из-за того, что где-то раньше была ошибка. Но в простых случаях, типа возврата указателя или индекса, я тоже предпочитаю возвращать NULL или -1 соответственно, как признак отсутствия или невозможности получения чего-либо.
М>а вот если инвалидный дескриптор передан в read/write, то здесь, согласен, исключение выглядит намного логичнее возврата ошибки, т.к. раз инвалидный дескриптор попал в read, то, очевидно, программист уже накосячил и продолжать выполнение программы -- бессмысленно.
Можно вернуть код ошибки ERR_INVALID_DESCRIPTOR, тоже можно обработать, как и в случае с обломом открытия файла.
Здравствуйте, 24, Вы писали:
24>Здравствуйте, мыщъх, Вы писали:
24>В случае открытия файла это сделано, как мне кажется, скорее для единообразия 24>(т.к. исключения используются везде, и код возврата только для одной функции 24>делать нет смысла), а не потому, что так лучше.
питон исключение не кидает. и дает мне возможность проверить открытие файла самому. и исключение выпрыгивает только при чтении.
> Хотя, чем проще ошибку проигнорировать, тем выше шансы, что она таки будет проигнорирована.
исключение тоже можно игнорировать. сейчас вот юзаю утилиту коллеги, которая коннектиться к localhost SQL-серверу и работает с ним. заменив localhost на IP я получил возможность работать и с удаленным сервером, но вот засада -- исключения ловятся только на самом верхнем уровне и потому когда к удаленному хосту не приконнектишься или когда какой-то косяк с авторизацией или еще что-то, то все это завершается однообразно и мне совершенно непонятно почему меня обломали? так что исключения тут ничем не помогают, ибо нет обработки ошибок. даешь запрос, а возвращается пустая строка. это значит: ни фига не найдено || соединение установить не удалось || пароль неправильный. с учетом нестабильности тырнета такая неоднозначность становится катострофической.
> Чтоб проигнорировать код возврата — не нужно делать ничего, > а чтоб проигнорировать исключение — это нужно явно писать.
да ладно. устанавливаем один обработчик исключений и на все исключения реагируем однообразно -- вполне типичная практика.
> Необработанное исключение сразу обвалит программу (и будет понятно, где она обломилась), > а с необработанным кодом ошибки выполнение молча продолжится,
исключение выпрыгнет, но чуть позже. скажем, если malloc вернет ноль (памяти нету), то исключение будет при обращении к этому указателю (правда, 100% гарантии в этом у нас нет, но есть 99%). главное, не возвращать мусор. например, если read() на попытку чтения по невалидному дескриптору вернет "", то это не сильно печально и логика программы не пострадает даже без явного контроля ошибок. в случае текстового редактора при ошибке открытия файла редактор покажет пустую страницу. а вот необработанное исключение обрушит всю несохраненную работу. я думаю, что первое намного лучше второго.
вот тут сейчас заюзал одну библиотеку для логгирования, которая при ошибке иницилизации возвращает ошибку и тогда у меня вместо логгирования идет вывод на консоль (ну а что еще делать?!). вот только... иногда библиотека еще и исключение кидает (например, когда файл лога заблокирован другим приложеним) и этот факт в документации _не_ упоминается. и мое приложение неожиданно получает исключение, к которому оно не готово. причем у меня все работает, а у юзера -- нет. кто ж знал, что он собака открывает файл лога вордом, ворд блокирует файл, юзер запускает приложение. приложение рушится. а я никак не могу воспроизвести у себя эту ситуацию, поскольку всегда смотрю логи фаром.
> и ошибка, которая произошла в одном месте, вызовет странные эффекты позже в другом месте, > и надо ещё разбираться, что оно работает здесь неправильно из-за того, что где-то раньше была ошибка
исключения от таких ситуаций не спасают. вот была у меня как-то ошибка, когда при определенных обстоятельствах функция возвращала строку без нуля, но все-таки ноль был чисто потому, что повезло. и падение происходило очччень далеко от места вызова. причем каждый раз в разном месте.
М>>а вот если инвалидный дескриптор передан в read/write, то здесь, согласен, исключение выглядит намного логичнее возврата ошибки, т.к. раз инвалидный дескриптор попал в read, то, очевидно, программист уже накосячил и продолжать выполнение программы -- бессмысленно. 24>Можно вернуть код ошибки ERR_INVALID_DESCRIPTOR, тоже можно обработать, как и в случае с обломом открытия файла.
разница в том, что на момент открытия файла программист еще не успел накосячить, а на момент чтения стало ясно, что он забил на обработку ошибок болт.
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.
Здравствуйте, мыщъх, Вы писали:
М>питон исключение не кидает. и дает мне возможность проверить открытие файла самому. и исключение выпрыгивает только при чтении.
Хмм, в какой версии?
В моей 2.6 прямо на open кидает, в справках к 2.7/3 написано, что тоже кидает.
Здравствуйте, мыщъх, Вы писали:
М>исключение тоже можно игнорировать.
Сознательно отстрелить себе ногу С++ не запрещает, исключения помогают только от случайных ошибок, а не от целенаправленного их игнора.
М>сейчас вот юзаю утилиту коллеги, которая коннектиться к localhost SQL-серверу и работает с ним. заменив localhost на IP я получил возможность работать и с удаленным сервером, но вот засада -- исключения ловятся только на самом верхнем уровне и потому когда к удаленному хосту не приконнектишься или когда какой-то косяк с авторизацией или еще что-то, то все это завершается однообразно и мне совершенно непонятно почему меня обломали? так что исключения тут ничем не помогают, ибо нет обработки ошибок. даешь запрос, а возвращается пустая строка. это значит: ни фига не найдено || соединение установить не удалось || пароль неправильный. с учетом нестабильности тырнета такая неоднозначность становится катострофической.
Если возвращается пустая строка, а не вылетает исключение, то его уже перехватили раньше, и сознательно не обрабатыавают нормально, а просто возвращают пустую строку в случае любой ошибки. Исключения, здесь, по-моему, ни при чём, т.к. при использовании этой утилиты неизвестно (если абстрагироваться, и не знать, как эта утилита написана), почему вернули пустую строку. Вполне могло оказаться, что внутри используются коды возврата, и пустая строка возвращается при любом из них. Другое дело, если бы вместо пустой строки вылетало исключение, соответсвующее тому, какая ошибка произошла. И если специально не писать catch(...), что показывает — мне пофик, какая это ошибка, а обрабатывать каждую как надо, то появление нового вида ошибок проигнорировать не получится.
М>да ладно. устанавливаем один обработчик исключений и на все исключения реагируем однообразно -- вполне типичная практика.
Печально, если это действительно типичная практика. Но даже в этом случае, ошибки хоть как-то обрабатываются (хоть сообщение в лог "тут произошла какая-то ошибка"), а код возврата можно тупо забыть проверить, особенно если добавился ещё один.
М>например, если read() на попытку чтения по невалидному дескриптору вернет "", то это не сильно печально и логика программы не пострадает даже без явного контроля ошибок. в случае текстового редактора при ошибке открытия файла редактор покажет пустую страницу. а вот необработанное исключение обрушит всю несохраненную работу. я думаю, что первое намного лучше второго.
Пострадает психика пользователя этой программы, если он вместо некоторого файла будет постоянно видеть пустой лист. А так хоть будет знать, что явно баг в программе, если она упала. (А какая несохранённая работа при открытии файла?)
М>вот тут сейчас заюзал одну библиотеку для логгирования, которая при ошибке иницилизации возвращает ошибку и тогда у меня вместо логгирования идет вывод на консоль (ну а что еще делать?!). вот только... иногда библиотека еще и исключение кидает (например, когда файл лога заблокирован другим приложеним) и этот факт в документации _не_ упоминается. и мое приложение неожиданно получает исключение, к которому оно не готово. причем у меня все работает, а у юзера -- нет. кто ж знал, что он собака открывает файл лога вордом, ворд блокирует файл, юзер запускает приложение. приложение рушится. а я никак не могу воспроизвести у себя эту ситуацию, поскольку всегда смотрю логи фаром.
Так пользователь увидел, что упала — написал багрепорт. Если бы вместо исключения был какой-то другой код ошибки (который в документации не упоминался бы, как и исключение), стало бы проще? Ведь проверки на тот код ощибки тоже бы не было. И логи могли бы молча не дописаться в заблокированный файл, и пользователь бы об этом не подозревал. Имхо, лучше пусть упадёт, и пользователь будет точно знать, что ошибка, чем он будет думать, что всё нормально, но лог будет неполный.
>> и ошибка, которая произошла в одном месте, вызовет странные эффекты позже в другом месте, >> и надо ещё разбираться, что оно работает здесь неправильно из-за того, что где-то раньше была ошибка М>исключения от таких ситуаций не спасают. вот была у меня как-то ошибка, когда при определенных обстоятельствах функция возвращала строку без нуля, но все-таки ноль был чисто потому, что повезло. и падение происходило очччень далеко от места вызова. причем каждый раз в разном месте.
Для того, чтоб выбросить исключение или вернуть ошибку, нужно сначала определить, что что-то пошло не так. В случае с отсутствием нуля, ошибочная ситуация очевидно не распознавалась (иначе бы дописался ноль, и никаких ошибок). Это просто баг, который ни к исключениям, ни к кодам ощибок отношения не имеет.
М>>>а вот если инвалидный дескриптор передан в read/write, то здесь, согласен, исключение выглядит намного логичнее возврата ошибки, т.к. раз инвалидный дескриптор попал в read, то, очевидно, программист уже накосячил и продолжать выполнение программы -- бессмысленно. 24>>Можно вернуть код ошибки ERR_INVALID_DESCRIPTOR, тоже можно обработать, как и в случае с обломом открытия файла. М>разница в том, что на момент открытия файла программист еще не успел накосячить, а на момент чтения стало ясно, что он забил на обработку ошибок болт.
Какая разница, каким образом здесь функция read/write сообщит о невалидности переданного дескриптора — исключением, или кодом ошибки? Хотя в контексте их сравнения разница есть — если вылетит исключение, и не обработаем — то упадёт. А если вернёт ошибку, и не проверим её, то просто не запишется в файл, и будем думать, что всё ок, а потом прийдется только догадываться, почему файл пустой.
Здравствуйте, xobotik, Вы писали:
X>Здравствуйте, stdcout, Вы писали:
S>>... кто-то советовал, изучить основы WinAPI, а после желательно изучать .Net.
X>Какой дурак это советовал?)