Re[3]: Изучение Си после C++?
От: AeroSun  
Дата: 24.07.19 09:21
Оценка: 55 (6) +5 :))) :))) :)
Здравствуйте, SomeOne_TT, Вы писали:

SO_>Не соглашусь. На сях пишут совершенно иначе, нежели на плюсах. Я бы сам с удовольствием почитал бы про типовые практики и организацию программ на си. В данный момент единственный мне известный солидный источник знаний — это исходники на гитхабе.


А что там собственно изучать? Там же всё просто как палка. Организация там одна — описываешь данные структурой (ctx) и начинаешь вокруг наворачивать методы с очень_длинными_названиями_описывающие_и_проблему_и_контекст.
Кому букв не подвезли — у того тарабарщина в названиях — dtadrrprf, amg_opt, и т.п. Естественно на комментарий букв им тоже не хватает.
У любителей "мета"-программирования всё работает на макросах из макросов из макросов из макросов...
И кругом ctx, ctx, ctx, ctx...
Re[3]: Изучение Си после C++?
От: rg45 СССР  
Дата: 24.07.19 20:57
Оценка: +4
Здравствуйте, Stanislav V. Zudin, Вы писали:


SVZ>Полиморфизм реализуется вручную при помощи указателей на функции.

SVZ>Вот стандартных контейнеров не хватает.
SVZ>Макросы вместо шаблонов это жесть.

+1

SVZ>А в остальном жить можно.


На мой взгляд, самая ощутимая проблема C по сравнению с C++ — это невозможность использования RAII.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: Изучение Си после C++?
От: Nikе Россия  
Дата: 24.07.19 22:08
Оценка: +1 :)))
Здравствуйте, sergey2b, Вы писали:

N>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.


S>и почему же он тода еще жив

S>pascal вот умер и Си живее всех живых

Удачная смесь мумификации и столкгольмского синдрома
Нужно разобрать угил.
Re[3]: Изучение Си после C++?
От: pagid Россия  
Дата: 23.07.19 17:56
Оценка: +3
Здравствуйте, VladFein, Вы писали:

VF>Вопрос, вероятно, о том, чего будет не хватать...

Там проще описать что там есть, чем, то чего не будет хватать.
Re: Изучение Си после C++?
От: Nikе Россия  
Дата: 24.07.19 22:00
Оценка: +2 -1
Здравствуйте, BadCats, Вы писали:

BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.


Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.
Нужно разобрать угил.
Re[4]: Изучение Си после C++?
От: Vaynamond Россия  
Дата: 25.07.19 14:06
Оценка: 2 (1) +1
Здравствуйте, Nikе, Вы писали:

N>Здравствуйте, SomeOne_TT, Вы писали:


SO_>>Не соглашусь. На сях пишут совершенно иначе, нежели на плюсах.


N>Пишут так же, только на порядок более многословно, опаснее и нерасширяемей ):

Как человек, четверть века использующий С (правда, последние лет десять больше С++) соглашусь с тем, что

На сях пишут совершенно иначе, нежели на плюсах


и не соглашусь с этим:

только на порядок более многословно, опаснее и нерасширяемей


ООП (с точки зрения практического программирования) — всего лишь технология и, как любая технология,
она имеет свои плюсы и минусы. Я видел элегантный код на С и ужасный на С++, ровно как и наоборот.
Re: Изучение Си после C++?
От: lpd Черногория  
Дата: 23.07.19 17:08
Оценка: +2
Здравствуйте, BadCats, Вы писали:

BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.


Не в языке программирования дело, а в технологиях: Linux/сети/многопоточность/базы данных/драйвера. Их и стоит изучать. Со знанием C++ в C будет мало нового.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)
Отредактировано 23.07.2019 17:09 lpd . Предыдущая версия .
Re[3]: Изучение Си после C++?
От: kov_serg Россия  
Дата: 24.07.19 22:15
Оценка: +2
Здравствуйте, sergey2b, Вы писали:

S>а можно пример когда такая оазница в коде

Сечас точно не вспомню. Давно это было. Но идея была такой решалось диф.уравнение с автоматическим подбором шага методом Рунге-Кута.
Решение на C++ было примерно в десятки раз длиннее. Хотя на C++ можно было написать так же, но зачем-то были использованы шаблоны, контейнеры и разные прибабахи.
На C просто банально разнотипные состояния сериализовались в один массив и обратно, а массив обрабатывалься тривиальным кодом из десятка строк.
Просто имея очень гибкие возможности C++ можно было шаблонами засунуть состояния и с ними работать, что и было нагорожено.
Но простое преобразование в линейный массив, убирало всю эту чепуху. Код был короче, проще и более того работал быстрее.
Тут дело даже не в C, а в возможности взглянуть на проблему со сторон с разными ограничениями.
И после супер общего решения которое вы считаете винцом человеческой мысли, вам показывают короткий, простой аскетичный код который решает эту же задачу даже лучше это вызывает кучу эмоций.
В целом проблема упирается в комбинаторные взрывы, получающиеся из-за широких языковых возможностей, которые используются не для решения задачи, а потому "так лучше".
В случае ограниченных возможностей вы будете искать оптимальный путь, а в противном случае будете выбирать самый комфортный.
Вообще без насиля на собой хороший код не получается. Это просто физиологическая особенность человеков.
Re[3]: Изучение Си после C++?
От: Stanislav V. Zudin Россия  
Дата: 24.07.19 22:17
Оценка: +2
Здравствуйте, sergey2b, Вы писали:

N>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.


S>и почему же он тода еще жив

S>pascal вот умер и Си живее всех живых

Потому что платформ поддерживает огроменное количество, компилится быстро, по сравнению с с++.
И альтернативы этому "высокоуровневому ассемблеру" пока не видно.
Ну и легаси, куда же без него
_____________________
С уважением,
Stanislav V. Zudin
Re: Изучение Си после C++?
От: andyp  
Дата: 25.07.19 09:24
Оценка: +2
Здравствуйте, BadCats, Вы писали:

BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.


По С есть хорошие, а главное нетолстые книжки. Пролистать знакомое будет энергетически выгоднее, чем искать именно то, что ты хочешь имхо.
Re[3]: Изучение Си после C++?
От: Nikе Россия  
Дата: 25.07.19 21:12
Оценка: -2
Здравствуйте, Михaил, Вы писали:

N>>Основное отличие С от С++, это убогость и крайняя устарелость.


М>минималистичность и полный контроль над железом.


C++ — это минималистичность и полный контроль над железом. А С — отстой.

М>то что на нём почти все mcu программируются?q А так же драйвера, системные утилиты и огромное количество кроссплатформенных opensource либ?


Современные драйвера вполне себе на С++ пишут. На С пишут дрова, если нужно в килобайты вместиться.

М>ты сиплюсплюсер?


Я использую тот язык, который оптимален для конкретной задачи.
Нужно разобрать угил.
Re[3]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 24.07.19 14:51
Оценка: 4 (1)
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, kov_serg, Вы писали:


_>>Сразу после C++ писание на С даётся тяжко, чувствуешь себя как со связанными руками. Но со временем приходит понимание что писать можно на чем угодно. Особенно воодушевляют примеры которые при "правильном" написании на C++ занимают десяток страниц, а тоже самое на C десяток строк. Просто топорно не в общем виде, но работает как надо.


S>а можно пример когда такая оазница в коде


Из бородатого юмора:

#include
void main(void)
{
char *message[] = {"Hello ", "World"};
int i;

for(i = 0; i < 2; ++i)
printf("%s", message[i]);
printf("\n");
}


#include 
#include 

class string
{
private:
  int size;
  char *ptr;

public:
  string() : size(0), ptr(new char('\0')) {}

  string(const string &s) : size(s.size)
  {
    ptr = new char[size + 1];
    strcpy(ptr, s.ptr);
  }

  ~string()
  {
    delete [] ptr;
  }

  friend ostream &operator < <(ostream &, const string &);
  string &operator=(const char *);
};

ostream &operator<<(ostream &stream, const string &s)
{
  return(stream << s.ptr);
}

string &string::operator=(const char *chrs)
{
  if (this != &chrs)
  {
    delete [] ptr;
    size = strlen(chrs);
    ptr = new char[size + 1];
    strcpy(ptr, chrs);
  }
  return(*this);
}

int main()
{
  string str;

  str = "Hello World";
  cout << str << endl;

  return(0);
}


Там ещё дальше есть с применением COM
Re[6]: Изучение Си после C++?
От: Vaynamond Россия  
Дата: 26.07.19 05:48
Оценка: 2 (1)
Здравствуйте, Nikе, Вы писали:

N>Здравствуйте, Vaynamond, Вы писали:


V>>ООП (с точки зрения практического программирования) — всего лишь технология и, как любая технология,

V>>она имеет свои плюсы и минусы. Я видел элегантный код на С и ужасный на С++, ровно как и наоборот.

N>Как человек программировавший вообще всё что угодно за те же четверть века сообщу, что хорошего кода на С не видел. Хорошего в том плане, что его нельзя было бы в разы улучшить переписав на С++.

Программирование, как и любая деятельность, представляет собой компромисс между желаемым результатом и затратами.
Зачастую приходится жертвовать расширяемостью в пользу сокращения времени разработки. И, кстати,
в контексте моей работы такой подход срабатывает примерно в 3/4 задач.
Насчет

Хорошего в том плане, что его нельзя было бы в разы улучшить переписав на С++


Вот прямо-таки в разы ?
И по каким параметрам улучшить ? Производительность ? Читаемость ? Расширяемость ?
Не пробовали оценить затраты на переписывание ? Я, например, пробовал по некоторым своим задачам —
результаты получались не слишком оптимистичные, потому что почти во всех случаях пришлось бы переписывать "с нуля".
Сразу скажу, что речь шла не о "Hello, world!", а о коде порядка миллиона строк.
Re[4]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.07.19 19:21
Оценка: 1 (1)
Здравствуйте, B0FEE664, Вы писали:

N>>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.

S>>и почему же он тода еще жив
S>>pascal вот умер и Си живее всех живых

BFE>Потому, что его используют электронщики. У электронщиков одна программа соответствует одной схеме. Изменение схемы == изменение программы. С++ им не нужен.


Электронщики у нас схемы рисуют и разводят. А прогают прогеры-эмбеддеры, и я в том числе. Схема-то в комплексе конечно одна уникальная, но компоненты — датчики всякие — вполне типовые, и набор схемных решений тоже типовые. Всё уже давно упаковано в плюсовые либы, и вся разработка сводится к набивке main'а нужными объектами. Обычно новый девайс за неделю-другую целиком поднимается, и тормозят проблемы в основном с железом — то электронщики накосячат, то монтажники
Маньяк Робокряк колесит по городу
Re[2]: Изучение Си после C++?
От: SomeOne_TT  
Дата: 23.07.19 18:25
Оценка: +1
Здравствуйте, lpd, Вы писали:

lpd>Не в языке программирования дело, а в технологиях: Linux/сети/многопоточность/базы данных/драйвера. Их и стоит изучать. Со знанием C++ в C будет мало нового.


Не соглашусь. На сях пишут совершенно иначе, нежели на плюсах. Я бы сам с удовольствием почитал бы про типовые практики и организацию программ на си. В данный момент единственный мне известный солидный источник знаний — это исходники на гитхабе.
Re: Изучение Си после C++?
От: kov_serg Россия  
Дата: 24.07.19 09:48
Оценка: +1
Здравствуйте, BadCats, Вы писали:

BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.

Тоже ищу такую книгу. Везде описание только самого инструмента, но практики его применения и не особенностей его использования, ни карты расположения граблей.
Сразу после C++ писание на С даётся тяжко, чувствуешь себя как со связанными руками. Но со временем приходит понимание что писать можно на чем угодно. Особенно воодушевляют примеры которые при "правильном" написании на C++ занимают десяток страниц, а тоже самое на C десяток строк. Просто топорно не в общем виде, но работает как надо.

И да: настоящий физик может писать фортраном на любом языке.
Re[5]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.07.19 21:52
Оценка: +1
Здравствуйте, kov_serg, Вы писали:

M>>Нет, куча .obj-файлов, которые потом линкуются в одну программу

_>Для это есть либы

Зачем труд делать либы, когда нужно собрать конкретное приложение?
Маньяк Робокряк колесит по городу
Re[3]: Изучение Си после C++?
От: Nikе Россия  
Дата: 24.07.19 22:01
Оценка: +1
Здравствуйте, SomeOne_TT, Вы писали:

SO_>Не соглашусь. На сях пишут совершенно иначе, нежели на плюсах.


Пишут так же, только на порядок более многословно, опаснее и нерасширяемей ):
Нужно разобрать угил.
Re[4]: Изучение Си после C++?
От: sergey2b ЮАР  
Дата: 24.07.19 22:27
Оценка: +1
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Потому что платформ поддерживает огроменное количество, компилится быстро, по сравнению с с++.

SVZ>И альтернативы этому "высокоуровневому ассемблеру" пока не видно.
SVZ>Ну и легаси, куда же без него

моя версия, потому что
хорошо подходит для написания кода для маломощных платформ
изучаеться за неделю ученным или студентом
хорошая замена ассемблеру
легаси
Re[6]: Изучение Си после C++?
От: sergey2b ЮАР  
Дата: 26.07.19 03:35
Оценка: +1
Здравствуйте, LaptevVV, Вы писали:

S>>и по факту язык умер

LVV>Не согласен.
LVV>1. Лично мне всегда казалось, что разработка промышленных систем на Паскале — это как из детского конструктора попытаться сделать что-то реальное.
LVV>2. По факту разработки велись не на Паскале, а на СИЛЬНО переработанном-доработанном языке.
LVV>Который имел офигенную библиотеку поддержки и первую в мире IDE — гениальное изобретение.
LVV>Кстати, в Астрахани в начале 90-х видел зарплату, разработанную на Турбо-паскале
LVV>3. Повторю: паскаль используется там, для чего и создавался — в обучении.


turbo pascal 3 был прорывов засчет IDE
4 стал поддерживать оверлеи позволяюшие писать например CAD под MSDOS
на 8 мн XT паскаль компилировал примерно 1000 строк в 5 секунд те средяя утилита компилировался за 20 сек в то время как Turbo C или MS C можно было идти на перекур после запуска компляции
в 5.5 язык стал ОО

если в 90 году надо было написать проект под MSDOS скажем в 50 000 строк — Turbo Pascal выглядел бы предпочтительней
более менее строгая типизация появилась в Си примерно в 90 году в Паскале быыла с самого начала
Re[7]: Изучение Си после C++?
От: rg45 СССР  
Дата: 26.07.19 08:03
Оценка: +1
Здравствуйте, kov_serg, Вы писали:

_>Вот например: как улучшить в разы этот код, переписав его на C++


Выгнать говнокодера и нанять программиста. Улучшение станет заметно еще до перехода на C++.

Это не код, а донесение итальянского шпиона, зашифрованное с использованием лапши. Здесь только инструкций goto не хватает, для полноты пейзажа.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 26.07.2019 8:11 rg45 . Предыдущая версия . Еще …
Отредактировано 26.07.2019 8:09 rg45 . Предыдущая версия .
Re[4]: Изучение Си после C++?
От: Stanislav V. Zudin Россия  
Дата: 26.07.19 09:29
Оценка: +1
Здравствуйте, Maniacal, Вы писали:

AG>>IMHO: вместо C++-исключений, в чистом Си: setjmp и longjmp — но эти вещи превратят ваш код в страшное "спагетти"


M>Хм. Тогда можно сигналы использовать. Вполне сойдёт как очень кривая реализация исключений.


Не, сигналы точно не сойдут. Стек же не раскрутится. Добавится только геморроя, особенно в многопоточном приложении.
_____________________
С уважением,
Stanislav V. Zudin
Re[14]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.07.19 17:41
Оценка: :)
Здравствуйте, Mystic Artifact, Вы писали:

M>>Т.е. это архив таки?

M>>Почему же там нет сжатия?
MA> Потому, что файл, содержащий в себе другие файлы — называют архивом вне зависимости от сжатия.
MA> Кстати, zip какой-нибудь тоже можно сделать без сжатия.

Эту мысль я и хотел донести до Maniacal
Автор: Maniacal
Дата: 29.07.19
Маньяк Робокряк колесит по городу
Изучение Си после C++?
От: BadCats  
Дата: 23.07.19 17:05
Оценка:
Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
c
Re[2]: Изучение Си после C++?
От: VladFein США  
Дата: 23.07.19 17:17
Оценка:
Здравствуйте, lpd, Вы писали:

lpd>Со знанием C++ в C будет мало нового.


Вопрос, вероятно, о том, чего будет не хватать...
Re: Изучение Си после C++?
От: Maniacal Россия  
Дата: 24.07.19 13:04
Оценка:
Здравствуйте, BadCats, Вы писали:

BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.


Тут достаточно просто: C = C++ — ООП — stdlib — C++ Exceptions — new/delete
От ООП только структуры, вместо стандартных контейнеров — самописные, вместо стандартных функций — платформозависимые в основном, вместо C++-исключений структурные исключения, вместо new/delete — malloc/free
Функции рекомендуется группировать в файлы по объединяющему логическому признаку, т.е. как и в классах, один класс = один заголовочный и один файл исходников. В заголовочном описываются "экспортируемые" прототипы функций и глобальные переменные из исходника в виде "extern".
Re[2]: Изучение Си после C++?
От: Stanislav V. Zudin Россия  
Дата: 24.07.19 13:16
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>От ООП только структуры, вместо стандартных контейнеров — самописные, вместо стандартных функций — платформозависимые в основном, вместо C++-исключений структурные исключения, вместо new/delete — malloc/free


Полиморфизм реализуется вручную при помощи указателей на функции.
Вот стандартных контейнеров не хватает.
Макросы вместо шаблонов это жесть.
А в остальном жить можно.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Изучение Си после C++?
От: kov_serg Россия  
Дата: 24.07.19 14:05
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Функции рекомендуется группировать в файлы по объединяющему логическому признаку, т.е. как и в классах, один класс = один заголовочный и один файл исходников. В заголовочном описываются "экспортируемые" прототипы функций и глобальные переменные из исходника в виде "extern".

И вместо одной монолитной программы которая умеет всё куча независимы модулей из которых строются большие уже на языках типа bash, python, perl и т.п.
Re[2]: Изучение Си после C++?
От: sergey2b ЮАР  
Дата: 24.07.19 14:13
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Сразу после C++ писание на С даётся тяжко, чувствуешь себя как со связанными руками. Но со временем приходит понимание что писать можно на чем угодно. Особенно воодушевляют примеры которые при "правильном" написании на C++ занимают десяток страниц, а тоже самое на C десяток строк. Просто топорно не в общем виде, но работает как надо.


а можно пример когда такая оазница в коде
Re[3]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 24.07.19 14:47
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, Maniacal, Вы писали:


M>>Функции рекомендуется группировать в файлы по объединяющему логическому признаку, т.е. как и в классах, один класс = один заголовочный и один файл исходников. В заголовочном описываются "экспортируемые" прототипы функций и глобальные переменные из исходника в виде "extern".

_>И вместо одной монолитной программы которая умеет всё куча независимы модулей из которых строются большие уже на языках типа bash, python, perl и т.п.

Нет, куча .obj-файлов, которые потом линкуются в одну программу
Re[4]: Изучение Си после C++?
От: kov_serg Россия  
Дата: 24.07.19 16:07
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Нет, куча .obj-файлов, которые потом линкуются в одну программу

Для это есть либы
Re[4]: Изучение Си после C++?
От: AeroSun  
Дата: 24.07.19 19:38
Оценка:
ну, только в юморе разве что
Re[3]: Изучение Си после C++?
От: AleksandrN Россия  
Дата: 24.07.19 21:18
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, Maniacal, Вы писали:


M>>Функции рекомендуется группировать в файлы по объединяющему логическому признаку, т.е. как и в классах, один класс = один заголовочный и один файл исходников. В заголовочном описываются "экспортируемые" прототипы функций и глобальные переменные из исходника в виде "extern".

_>И вместо одной монолитной программы которая умеет всё куча независимы модулей из которых строются большие уже на языках типа bash, python, perl и т.п.

Как слинкуешь, так и будет. Можешь отдельные компоненты сделать, можешь статические или динамические библиотеки, можешь один исполняемый файл сделать. На Си можно всё.
Re[3]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.07.19 21:25
Оценка:
Здравствуйте, SomeOne_TT, Вы писали:

SO_>Здравствуйте, lpd, Вы писали:


lpd>>Не в языке программирования дело, а в технологиях: Linux/сети/многопоточность/базы данных/драйвера. Их и стоит изучать. Со знанием C++ в C будет мало нового.


SO_>Не соглашусь. На сях пишут совершенно иначе, нежели на плюсах.


Конечно также, но иначе. Там есть пара приемов, чтобы занятые ресурсы корректно освобождать, но это выглядит как говно. Поэтому в основном пишут так же красиво, как на плюсах, забивая на всё остальное.
Маньяк Робокряк колесит по городу
Re[4]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.07.19 21:33
Оценка:
Здравствуйте, Maniacal, Вы писали:


_>>>Сразу после C++ писание на С даётся тяжко, чувствуешь себя как со связанными руками. Но со временем приходит понимание что писать можно на чем угодно. Особенно воодушевляют примеры которые при "правильном" написании на C++ занимают десяток страниц, а тоже самое на C десяток строк. Просто топорно не в общем виде, но работает как надо.


S>>а можно пример когда такая оазница в коде


M>Из бородатого юмора:


Какой-то наверно очень бородатый юмор, года из 90го .. 95го:
#include <iostream>
#include <string>
using namespace std;

string message[] = {"Hello ", "World"};
int i;

int main() {
    // your code goes here
    for(i = 0; i < 2; ++i)
        cout<<message[i];
    return 0;
}


Hello World

Маньяк Робокряк колесит по городу
Re[3]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.07.19 21:45
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

M>>От ООП только структуры, вместо стандартных контейнеров — самописные, вместо стандартных функций — платформозависимые в основном, вместо C++-исключений структурные исключения, вместо new/delete — malloc/free


SVZ>Полиморфизм реализуется вручную при помощи указателей на функции.


Я так пробовал в начале нулевых, когда сишечку хотел в одном проекте нативно поддержать. Хорошо, хватило ума отказаться от это бесплодной затеи, и не тратить на это жизнь
Маньяк Робокряк колесит по городу
Re[4]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.07.19 21:48
Оценка:
Здравствуйте, rg45, Вы писали:

R>На мой взгляд, самая ощутимая проблема C по сравнению с C++ — это невозможность использования RAII.


Там есть, но через одно место. Не могу пример привести, но видел такой код. Это полное гавно, сама логика работы просто незаметна на фоне обеспечения RAII
Маньяк Робокряк колесит по городу
Re[3]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 24.07.19 21:50
Оценка:
Здравствуйте, kov_serg, Вы писали:

M>>Функции рекомендуется группировать в файлы по объединяющему логическому признаку, т.е. как и в классах, один класс = один заголовочный и один файл исходников. В заголовочном описываются "экспортируемые" прототипы функций и глобальные переменные из исходника в виде "extern".

_>И вместо одной монолитной программы которая умеет всё куча независимы модулей из которых строются большие уже на языках типа bash, python, perl и т.п.

Это ты о чем сейчас?

И почему пайтон ты упомянул в одном ряду с говном типа баша и перла?

Хотя и пайтон не айс, но остальное....
Маньяк Робокряк колесит по городу
Re[2]: Изучение Си после C++?
От: sergey2b ЮАР  
Дата: 24.07.19 22:05
Оценка:
Здравствуйте, Nikе, Вы писали:


N>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.


и почему же он тода еще жив
pascal вот умер и Си живее всех живых
Re[5]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 25.07.19 05:26
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, Maniacal, Вы писали:


M>>Нет, куча .obj-файлов, которые потом линкуются в одну программу

_>Для это есть либы

Особенность сишных компиляторов: один файл исходников — один объектный файл. А так да, либа = собранный в один файл набор объекнрых файлов. Либа от исполняемого файла логически только наличием функции main отличается, а физически дополнительно наличием заголовка исполняемого файла.
Re[5]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 25.07.19 05:35
Оценка:
Здравствуйте, AeroSun, Вы писали:

AS>ну, только в юморе разве что


Как я понял, посыл был в том, что на C++ всегда руки тянутся написать код в "общем" виде, универсальный, который потом можно будет повторно использовать, а на C хочется писать "в лоб", "топорно", код решающий ровно одну задачу.
Re[4]: Изучение Си после C++?
От: Hobbes Россия  
Дата: 25.07.19 06:08
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>
M>#include 
M>#include 

M>class string
M>{
M>private:
M>  int size;
M>  char *ptr;

M>public:
M>  string() : size(0), ptr(new char('\0')) {}

M>  string(const string &s) : size(s.size)
M>  {
M>    ptr = new char[size + 1];
M>    strcpy(ptr, s.ptr);
M>  }

M>  ~string()
M>  {
M>    delete [] ptr;
M>  }

M>  friend ostream &operator < <(ostream &, const string &);
M>  string &operator=(const char *);
M>};

M>ostream &operator<<(ostream &stream, const string &s)
M>{
M>  return(stream << s.ptr);
M>}

M>string &string::operator=(const char *chrs)
M>{
M>  if (this != &chrs)
M>  {
M>    delete [] ptr;
M>    size = strlen(chrs);
M>    ptr = new char[size + 1];
M>    strcpy(ptr, chrs);
M>  }
M>  return(*this);
M>}

M>int main()
M>{
M>  string str;

M>  str = "Hello World";
M>  cout << str << endl;

M>  return(0);
M>}
M>


Кстати, в программе ошибка.

Выделяем:
ptr(new char('\0'))

Удаляем:
delete [] ptr;
Re[2]: Изучение Си после C++?
От: Hobbes Россия  
Дата: 25.07.19 06:15
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Тут достаточно просто: C = C++ — ООП — stdlib — C++ Exceptions — new/delete


Ты ещё шаблоны и overload-полиморфизм забыл.
Re[3]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 25.07.19 06:22
Оценка:
Здравствуйте, Hobbes, Вы писали:

H>Здравствуйте, Maniacal, Вы писали:


M>>Тут достаточно просто: C = C++ — ООП — stdlib — C++ Exceptions — new/delete


H>Ты ещё шаблоны и overload-полиморфизм забыл.


Шаблоны — да, забыл. А инкапсуляция, наследование и полиморфизм это ООП.
Re[3]: Изучение Си после C++?
От: LaptevVV Россия  
Дата: 25.07.19 09:06
Оценка:
N>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.
S>и почему же он тода еще жив
S>pascal вот умер и Си живее всех живых
Нифига паскаль не умер.
Как использовался для обучения — так ип используется.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Изучение Си после C++?
От: LaptevVV Россия  
Дата: 25.07.19 09:10
Оценка:
BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.
Книжек таких не встречал.
Можно взять просто книжку по С — Дейтела, например.
Вот: https://my-shop.ru/shop/books/1830518.html?b45=1_1
Или просто Библию Кернигана-Ритчи.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Отредактировано 25.07.2019 9:14 LaptevVV . Предыдущая версия .
Re[2]: Изучение Си после C++?
От: Михaил  
Дата: 25.07.19 09:49
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Здравствуйте, BadCats, Вы писали:


BC>>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.


N>Основное отличие С от С++, это убогость и крайняя устарелость.


минималистичность и полный контроль над железом.

N>Собственно не очень понятно, что про него ещё нужно знать.


то что на нём почти все mcu программируются?q А так же драйвера, системные утилиты и огромное количество кроссплатформенных opensource либ?

ты сиплюсплюсер?
Re[2]: Изучение Си после C++?
От: sergey2b ЮАР  
Дата: 25.07.19 10:40
Оценка:
Здравствуйте, LaptevVV, Вы писали:

мне по Си больше всего вот эта нравиться
читаеться за полдня и все что надо с примерами изложенно

Язык программирования Си для персонального компьютера
Бочков
Субботин


https://www.ozon.ru/context/detail/id/138319640/
Re[3]: Изучение Си после C++?
От: B0FEE664  
Дата: 25.07.19 13:59
Оценка:
Здравствуйте, sergey2b, Вы писали:

N>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.

S>и почему же он тода еще жив
S>pascal вот умер и Си живее всех живых

Потому, что его используют электронщики. У электронщиков одна программа соответствует одной схеме. Изменение схемы == изменение программы. С++ им не нужен.
И каждый день — без права на ошибку...
Re[4]: Изучение Си после C++?
От: Hobbes Россия  
Дата: 25.07.19 17:11
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Шаблоны — да, забыл. А инкапсуляция, наследование и полиморфизм это ООП.


Overload-полиморфизм к ООП не имеет отношения. Это функции с одинаковыми именами и разными сигнатурами.
Re[6]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.07.19 18:53
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>>>Нет, куча .obj-файлов, которые потом линкуются в одну программу

_>>Для это есть либы

M>Особенность сишных компиляторов: один файл исходников — один объектный файл. А так да, либа = собранный в один файл набор объекнрых файлов. Либа от исполняемого файла логически только наличием функции main отличается, а физически дополнительно наличием заголовка исполняемого файла.


Не совсем так. Либа — это типа архива объектников
Маньяк Робокряк колесит по городу
Re[3]: Изучение Си после C++?
От: LaptevVV Россия  
Дата: 25.07.19 18:57
Оценка:
S>мне по Си больше всего вот эта нравиться
S>читается за полдня и все что надо с примерами изложено
S>Язык программирования Си для персонального компьютера
S>Бочков
S>Субботин
S>https://www.ozon.ru/context/detail/id/138319640/
Хорошая книга — читал в 90-е.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.07.19 19:11
Оценка:
Здравствуйте, sergey2b, Вы писали:

N>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.


S>и почему же он тода еще жив

S>pascal вот умер и Си живее всех живых

Торвальдс его любит. И еще некоторое количество упоротых. У и всякие ниосиляторы в эмбеде.
Ну и уже столько кала наворочено, типа всяких гобжектов, что никто в здравом уме переписывать не будет, да и развивать, кроме владельцев-основателей и некоторых упоротых последователей, никто не берется

У нас тут дядечка до недавнего прошлого под PIC'и на асме всё писал, только полгода назад пересадили его на STM21 и потихонечку крестам обучаем. Пока в основном сишное подмножество. Думаю, такие мамонты и еще есть.
Маньяк Робокряк колесит по городу
Re[4]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.07.19 19:14
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Нифига паскаль не умер.

LVV>Как использовался для обучения — так ип используется.

Это и называется — умер, когда только для обучения используется. Непонятно только, зачем над студентами издеваетесь
Маньяк Робокряк колесит по городу
Re[3]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 25.07.19 19:25
Оценка:
Здравствуйте, Михaил, Вы писали:


М>то что на нём почти все mcu программируются?q А так же драйвера, системные утилиты и огромное количество кроссплатформенных opensource либ?


Эмбеддеры давно на плюсы перешли. Пятый Keil (armcc) даже 11 стандарт поддерживает (в нем — в Keil'е есть и clang), а на днях JetBrains выкатили CLion для армовских MCU.

Драйвера под винду давно на плюсах пишут, под линупс — да, на сишечке в основном, из-за упоротости отца-основателя
Маньяк Робокряк колесит по городу
Re[4]: Изучение Си после C++?
От: sergey2b ЮАР  
Дата: 25.07.19 19:26
Оценка:
Здравствуйте, LaptevVV, Вы писали:

N>>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.

S>>и почему же он тода еще жив
S>>pascal вот умер и Си живее всех живых
LVV>Нифига паскаль не умер.
LVV>Как использовался для обучения — так ип используется.


я активно писал на Turbo Pascal c 89 по 93 год (если не ошибась самый большой проект у меня был больше 20 000 строк)
при этом у меня были друзья в компании которых примеррно до 95 года основной язык был pascal и они хорошо зарабатывали и везли много книг и библиотек по Pascal из заграницы

turbo pascal 3 был пожалуй лучшим языком на момент своего выходы (MSDOS, CP/M, Apple II)
и позволял писать большие программы коммерческого качества
не теряя над ними контроль
с 640k RAM и одним дисководом

не случайно первая версия винды писалась на pascal
Аштантейт активно использовало его

TPW for Win был гораздо лучше и удобней С++ и позволял писать на 386 компе под win 3 (что я и мои знакомые делали)

потом что то пошло не так и Си и С++ стали лучше паскаля
потом Borland умер
потом перестали писаться книги уровня Фараонова

и по факту язык умер
Re[5]: Изучение Си после C++?
От: Nikе Россия  
Дата: 25.07.19 21:14
Оценка:
Здравствуйте, Vaynamond, Вы писали:

V>ООП (с точки зрения практического программирования) — всего лишь технология и, как любая технология,

V>она имеет свои плюсы и минусы. Я видел элегантный код на С и ужасный на С++, ровно как и наоборот.

Как человек программировавший вообще всё что угодно за те же четверть века сообщу, что хорошего кода на С не видел. Хорошего в том плане, что его нельзя было бы в разы улучшить переписав на С++.
Нужно разобрать угил.
Re[5]: Изучение Си после C++?
От: LaptevVV Россия  
Дата: 26.07.19 02:58
Оценка:
LVV>>Нифига паскаль не умер.
LVV>>Как использовался для обучения — так ип используется.
M>Это и называется — умер, когда только для обучения используется. Непонятно только, зачем над студентами издеваетесь
1. Во-первых, Паскаль для обучения и создавался.
2. Он всегда для обучения использовался. Это фирмы решили, что это промышленный язык и стали выпускать средства разработки
3. Мы-то как раз не издеваемся...
И наша МНОГОЛЕТНЯЯ практика показывает, что С++ для обычных средних программистов — трудноват для освоения.
Поэтому мы сначала учим программированию, а потом уже С++...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: Изучение Си после C++?
От: LaptevVV Россия  
Дата: 26.07.19 03:03
Оценка:
S>и по факту язык умер
Не согласен.
1. Лично мне всегда казалось, что разработка промышленных систем на Паскале — это как из детского конструктора попытаться сделать что-то реальное.
2. По факту разработки велись не на Паскале, а на СИЛЬНО переработанном-доработанном языке.
Который имел офигенную библиотеку поддержки и первую в мире IDE — гениальное изобретение.
Кстати, в Астрахани в начале 90-х видел зарплату, разработанную на Турбо-паскале
3. Повторю: паскаль используется там, для чего и создавался — в обучении.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Изучение Си после C++?
От: AlexGin Беларусь  
Дата: 26.07.19 05:23
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>...вместо C++-исключений структурные исключения...


Это MS Specific
Вот подробнее: https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=vs-2019

IMHO: вместо C++-исключений, в чистом Си: setjmp и longjmp — но эти вещи превратят ваш код в страшное "спагетти"
Отредактировано 26.07.2019 5:26 AlexGin . Предыдущая версия .
Re[5]: Изучение Си после C++?
От: AlexGin Беларусь  
Дата: 26.07.19 06:00
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>моя версия, потому что

S>хорошо подходит для написания кода для маломощных платформ
+100500
...для любых платформ: от маломощных, до больших серверных...

S>изучаеться за неделю ученным или студентом

+100500
Для этой категории людей — просто неприлично не знать Си
Отредактировано 26.07.2019 9:36 AlexGin . Предыдущая версия .
Re[7]: Изучение Си после C++?
От: so5team https://stiffstream.com
Дата: 26.07.19 06:04
Оценка:
Здравствуйте, Vaynamond, Вы писали:

V>Программирование, как и любая деятельность, представляет собой компромисс между желаемым результатом и затратами.


И при использовании чистого С этот "компромисс" имеет заметный перекос именно в сторону затрат.

V>Вот прямо-таки в разы ?


Обычно в разы.

V>И по каким параметрам улучшить ? Производительность ? Читаемость ? Расширяемость ?


Плотность ошибок на единицу кода, надежность/хрупкость, стоимость сопровождения. Читаемость, кстати, тоже. Ибо в C читать приходится сильно больше.

V>Не пробовали оценить затраты на переписывание ?


Скорее речь идет о том, что если бы изначаль писали не на чистом C, а на чем-то уровнем повыше.

Да, по поводу:

Я видел элегантный код на С

Можно пару-тройку ссылок на примеры элегантного кода на C? Где-то же он должен же быть, раз так уж много про этот мифический "элегантный С" говорят.
Re[5]: Изучение Си после C++?
От: Vaynamond Россия  
Дата: 26.07.19 06:04
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, LaptevVV, Вы писали:


N>>>>Основное отличие С от С++, это убогость и крайняя устарелость. Собственно не очень понятно, что про него ещё нужно знать.

S>>>и почему же он тода еще жив
S>>>pascal вот умер и Си живее всех живых
LVV>>Нифига паскаль не умер.
LVV>>Как использовался для обучения — так ип используется.


S>я активно писал на Turbo Pascal c 89 по 93 год (если не ошибась самый большой проект у меня был больше 20 000 строк)

S>при этом у меня были друзья в компании которых примеррно до 95 года основной язык был pascal и они хорошо зарабатывали и везли много книг и библиотек по Pascal из заграницы
Кстати, была такая продвинутая оболочка для MS-DOS под названием DOS-Navigator — исходники на Паскале (причем размер под 3 мегабайта).
Мой преподаватель по термеху писал на Паскале (по-моему, 5.5 или, максимум, 6) пакет для моделирования динамических систем с графической
визуализацией (потом к нему еще сопромат прикрутили). Причем пакет не был простой поделкой — на нем рассчитывали динамику раскрытия
солнечных батарей на космических аппаратах и прочие сурьёзные задачи.
Re[5]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 26.07.19 06:11
Оценка:
Здравствуйте, Hobbes, Вы писали:

H>Overload-полиморфизм к ООП не имеет отношения. Это функции с одинаковыми именами и разными сигнатурами.


Да, пожалуй. Но к C тоже отношения не имеет.
Re[6]: Изучение Си после C++?
От: Hobbes Россия  
Дата: 26.07.19 06:18
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Да, пожалуй. Но к C тоже отношения не имеет.


Так ведь обсуждаем, чего есть в C++ и нет в C
Re[7]: Изучение Си после C++?
От: Hobbes Россия  
Дата: 26.07.19 06:24
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>более менее строгая типизация появилась в Си примерно в 90 году в Паскале быыла с самого начала


Я что-то задумался... Какие средства есть для строгой типизации в C? Кроме структур ничего не приходит на ум.
Re[6]: Изучение Си после C++?
От: kov_serg Россия  
Дата: 26.07.19 06:41
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Как человек программировавший вообще всё что угодно за те же четверть века сообщу, что хорошего кода на С не видел. Хорошего в том плане, что его нельзя было бы в разы улучшить переписав на С++.


Скажу больше всегда есть ощущение что перепесав чужой код он станет лучше. Особенно если к этому коду прикладывали руки много народу в течении длительного времени.
Вообще хороший код зависит не от языка програмирования, а от способа мышления и дисциплины. И само понятие "хороший" вообще-то контексто-зависимое.

// st.h
#pragma once

double invstudenttdistribution(int k, double p);

double st(double alpha,int n);// =invstudenttdistribution(n-1,(alpha+1)*0.5)
// 0.99   10 3.250
// 0.99  100 2.626
// 0.99 1000 2.581
// 0.95   10 2.296
// 0.95  100 1.984
// 0.95 1000 1.962

  Вот например: как улучшить в разы этот код, переписав его на C++
// st.c: inverse student distribution
#include <math.h>
#define ASSERT(c,msg)
#define DOUBLE_MAX 1E300
#define DOUBLE_MIN 1E-300
#define DOUBLE_EPS 5E-16

double invstudenttdistribution(int k, double p);

#define PI 3.14159265358979323846
int ifloor(double x) { return int(floor(x)); }
int iround(double x)  { return int(floor(x+0.5)); }

double gammastirf(double x) {
    double result;
    double y;
    double w;
    double v;
    double stir;

    w = 1/x;
    stir = 7.87311395793093628397E-4;
    stir = -2.29549961613378126380E-4+w*stir;
    stir = -2.68132617805781232825E-3+w*stir;
    stir = 3.47222221605458667310E-3+w*stir;
    stir = 8.33333333333482257126E-2+w*stir;
    w = 1+w*stir;
    y = exp(x);
    if( x>143.01608 )
    {
        v = pow(x, 0.5*x-0.25);
        y = v*(v/y);
    }
    else
    {
        y = pow(x, x-0.5)/y;
    }
    result = 2.50662827463100050242*y*w;
    return result;
}

/*************************************************************************
Gamma function

Input parameters:
    X   -   argument

Domain:
    0 < X < 171.6
    -170 < X < 0, X is not an integer.

Relative error:
 arithmetic   domain     # trials      peak         rms
    IEEE    -170,-33      20000       2.3e-15     3.3e-16
    IEEE     -33,  33     20000       9.4e-16     2.2e-16
    IEEE      33, 171.6   20000       2.3e-15     3.2e-16

Cephes Math Library Release 2.8:  June, 2000
Original copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier
Translated to AlgoPascal by Bochkanov Sergey (2005, 2006, 2007).
*************************************************************************/
double gamma(double x) {
    double result;
    double p;
    double pp;
    double q;
    double qq;
    double z;
    int i;
    double sgngam;

    sgngam = 1;
    q = fabs(x);

    if (q > 33.0) {
        if (x < 0.0) {
            p = ifloor(q);
            i = iround(p);

            if (i % 2 == 0) {
                sgngam = -1;
            }

            z = q - p;

            if (z > 0.5) {
                p = p + 1;
                z = q - p;
            }

            z = q * sin(PI * z);

            z = fabs(z);
            z = PI / (z * gammastirf(q));
        }

        else {
            z = gammastirf(x);
        }

        result = sgngam * z;

        return result;
    }

    z = 1;

    while (x >= 3) {
        x = x - 1;
        z = z * x;
    }

    while (x < 0) {
        if (x > -0.000000001) {
            result = z / ((1 + 0.5772156649015329 * x) * x);
            return result;
        }

        z = z / x;

        x = x + 1;
    }

    while (x < 2) {
        if (x < 0.000000001) {
            result = z / ((1 + 0.5772156649015329 * x) * x);
            return result;
        }

        z = z / x;

        x = x + 1.0;
    }

    if (x == 2) {
        result = z;
        return result;
    }

    x = x - 2.0;

    pp = 1.60119522476751861407E-4;
    pp = 1.19135147006586384913E-3 + x * pp;
    pp = 1.04213797561761569935E-2 + x * pp;
    pp = 4.76367800457137231464E-2 + x * pp;
    pp = 2.07448227648435975150E-1 + x * pp;
    pp = 4.94214826801497100753E-1 + x * pp;
    pp = 9.99999999999999996796E-1 + x * pp;
    qq = -2.31581873324120129819E-5;
    qq = 5.39605580493303397842E-4 + x * qq;
    qq = -4.45641913851797240494E-3 + x * qq;
    qq = 1.18139785222060435552E-2 + x * qq;
    qq = 3.58236398605498653373E-2 + x * qq;
    qq = -2.34591795718243348568E-1 + x * qq;
    qq = 7.14304917030273074085E-2 + x * qq;
    qq = 1.00000000000000000320 + x * qq;
    result = z * pp / qq;
    return result;
    return result;
}

double lngamma(double x, double& sgngam) {
    double result;
    double a;
    double b;
    double c;
    double p;
    double q;
    double u;
    double w;
    double z;
    int i;
    double logpi;
    double ls2pi;
    double tmp;

    sgngam = 1;
    logpi = 1.14472988584940017414;
    ls2pi = 0.91893853320467274178;
    if( x<-34.0 )
    {
        q = -x;
        w = lngamma(q, tmp);
        p = ifloor(q);
        i = iround(p);
        if( i%2==0 )
        {
            sgngam = -1;
        }
        else
        {
            sgngam = 1;
        }
        z = q-p;
        if( z>0.5 )
        {
            p = p+1;
            z = p-q;
        }
        z = q*sin(PI*z);
        result = logpi-log(z)-w;
        return result;
    }
    if( x<13 )
    {
        z = 1;
        p = 0;
        u = x;
        while(u>=3)
        {
            p = p-1;
            u = x+p;
            z = z*u;
        }
        while(u<2)
        {
            z = z/u;
            p = p+1;
            u = x+p;
        }
        if( z<0 )
        {
            sgngam = -1;
            z = -z;
        }
        else
        {
            sgngam = 1;
        }
        if( u==2 )
        {
            result = log(z);
            return result;
        }
        p = p-2;
        x = x+p;
        b = -1378.25152569120859100;
        b = -38801.6315134637840924+x*b;
        b = -331612.992738871184744+x*b;
        b = -1162370.97492762307383+x*b;
        b = -1721737.00820839662146+x*b;
        b = -853555.664245765465627+x*b;
        c = 1;
        c = -351.815701436523470549+x*c;
        c = -17064.2106651881159223+x*c;
        c = -220528.590553854454839+x*c;
        c = -1139334.44367982507207+x*c;
        c = -2532523.07177582951285+x*c;
        c = -2018891.41433532773231+x*c;
        p = x*b/c;
        result = log(z)+p;
        return result;
    }
    q = (x-0.5)*log(x)-x+ls2pi;
    if( x>100000000 )
    {
        result = q;
        return result;
    }
    p = 1/(x*x);
    if( x>=1000.0 )
    {
        q = q+((7.9365079365079365079365*0.0001*p-2.7777777777777777777778*0.001)*p+0.0833333333333333333333)/x;
    }
    else
    {
        a = 8.11614167470508450300*0.0001;
        a = -5.95061904284301438324*0.0001+p*a;
        a = 7.93650340457716943945*0.0001+p*a;
        a = -2.77777777730099687205*0.001+p*a;
        a = 8.33333333333331927722*0.01+p*a;
        q = q+a/x;
    }
    result = q;
    return result;
}

/*************************************************************************
Power series for incomplete beta integral.
Use when b*x is small and x not too close to 1.

Cephes Math Library, Release 2.8:  June, 2000
Copyright 1984, 1995, 2000 by Stephen L. Moshier
*************************************************************************/
double incompletebetaps(double a, double b, double x, double maxgam) {
    double result;
    double s;
    double t;
    double u;
    double v;
    double n;
    double t1;
    double z;
    double ai;
    double sg;

    ai = 1.0 / a;
    u = (1.0 - b) * x;
    v = u / (a + 1.0);
    t1 = v;
    t = u;
    n = 2.0;
    s = 0.0;
    z = DOUBLE_EPS * ai;

    while (fabs(v) > z) {
        u = (n - b) * x / n;
        t = t * u;
        v = t / (a + n);
        s = s + v;
        n = n + 1.0;
    }

    s = s + t1;

    s = s + ai;
    u = a * log(x);

    if (a + b < maxgam && fabs(u) < log(DOUBLE_MAX)) {
        t = gamma(a + b) / (gamma(a) * gamma(b));
        s = s * t * pow(x, a);
    }

    else {
        t = lngamma(a + b, sg) - lngamma(a, sg) - lngamma(b, sg) + u + log(s);

        if (t < log(DOUBLE_MIN)) {
            s = 0.0;
        }

        else {
            s = exp(t);
        }
    }

    result = s;

    return result;
}

/*************************************************************************
Continued fraction expansion #1 for incomplete beta integral

Cephes Math Library, Release 2.8:  June, 2000
Copyright 1984, 1995, 2000 by Stephen L. Moshier
*************************************************************************/
double incompletebetafe(double a,
     double b,
     double x,
     double big,
     double biginv)
{
    double result;
    double xk;
    double pk;
    double pkm1;
    double pkm2;
    double qk;
    double qkm1;
    double qkm2;
    double k1;
    double k2;
    double k3;
    double k4;
    double k5;
    double k6;
    double k7;
    double k8;
    double r;
    double t;
    double ans;
    double thresh;
    int n;

    k1 = a;
    k2 = a+b;
    k3 = a;
    k4 = a+1.0;
    k5 = 1.0;
    k6 = b-1.0;
    k7 = k4;
    k8 = a+2.0;
    pkm2 = 0.0;
    qkm2 = 1.0;
    pkm1 = 1.0;
    qkm1 = 1.0;
    ans = 1.0;
    r = 1.0;
    n = 0;
    thresh = 3.0*DOUBLE_EPS;
    do
    {
        xk = -x*k1*k2/(k3*k4);
        pk = pkm1+pkm2*xk;
        qk = qkm1+qkm2*xk;
        pkm2 = pkm1;
        pkm1 = pk;
        qkm2 = qkm1;
        qkm1 = qk;
        xk = x*k5*k6/(k7*k8);
        pk = pkm1+pkm2*xk;
        qk = qkm1+qkm2*xk;
        pkm2 = pkm1;
        pkm1 = pk;
        qkm2 = qkm1;
        qkm1 = qk;
        if( qk!=0 )
        {
            r = pk/qk;
        }
        if( r!=0 )
        {
            t = fabs((ans-r)/r);
            ans = r;
        }
        else
        {
            t = 1.0;
        }
        if( t<thresh )
        {
            break;
        }
        k1 = k1+1.0;
        k2 = k2+1.0;
        k3 = k3+2.0;
        k4 = k4+2.0;
        k5 = k5+1.0;
        k6 = k6-1.0;
        k7 = k7+2.0;
        k8 = k8+2.0;
        if( fabs(qk)+fabs(pk)>big )
        {
            pkm2 = pkm2*biginv;
            pkm1 = pkm1*biginv;
            qkm2 = qkm2*biginv;
            qkm1 = qkm1*biginv;
        }
        if( fabs(qk)<biginv||fabs(pk)<biginv )
        {
            pkm2 = pkm2*big;
            pkm1 = pkm1*big;
            qkm2 = qkm2*big;
            qkm1 = qkm1*big;
        }
        n = n+1;
    }
    while(n!=300);
    result = ans;
    return result;
}


/*************************************************************************
Continued fraction expansion #2
for incomplete beta integral

Cephes Math Library, Release 2.8:  June, 2000
Copyright 1984, 1995, 2000 by Stephen L. Moshier
*************************************************************************/
double incompletebetafe2(double a,
     double b,
     double x,
     double big,
     double biginv)
{
    double result;
    double xk;
    double pk;
    double pkm1;
    double pkm2;
    double qk;
    double qkm1;
    double qkm2;
    double k1;
    double k2;
    double k3;
    double k4;
    double k5;
    double k6;
    double k7;
    double k8;
    double r;
    double t;
    double ans;
    double z;
    double thresh;
    int n;

    k1 = a;
    k2 = b-1.0;
    k3 = a;
    k4 = a+1.0;
    k5 = 1.0;
    k6 = a+b;
    k7 = a+1.0;
    k8 = a+2.0;
    pkm2 = 0.0;
    qkm2 = 1.0;
    pkm1 = 1.0;
    qkm1 = 1.0;
    z = x/(1.0-x);
    ans = 1.0;
    r = 1.0;
    n = 0;
    thresh = 3.0*DOUBLE_EPS;
    do
    {
        xk = -z*k1*k2/(k3*k4);
        pk = pkm1+pkm2*xk;
        qk = qkm1+qkm2*xk;
        pkm2 = pkm1;
        pkm1 = pk;
        qkm2 = qkm1;
        qkm1 = qk;
        xk = z*k5*k6/(k7*k8);
        pk = pkm1+pkm2*xk;
        qk = qkm1+qkm2*xk;
        pkm2 = pkm1;
        pkm1 = pk;
        qkm2 = qkm1;
        qkm1 = qk;
        if( qk!=0 )
        {
            r = pk/qk;
        }
        if( r!=0 )
        {
            t = fabs((ans-r)/r);
            ans = r;
        }
        else
        {
            t = 1.0;
        }
        if( t<thresh )
        {
            break;
        }
        k1 = k1+1.0;
        k2 = k2-1.0;
        k3 = k3+2.0;
        k4 = k4+2.0;
        k5 = k5+1.0;
        k6 = k6+1.0;
        k7 = k7+2.0;
        k8 = k8+2.0;
        if( fabs(qk)+fabs(pk)>big )
        {
            pkm2 = pkm2*biginv;
            pkm1 = pkm1*biginv;
            qkm2 = qkm2*biginv;
            qkm1 = qkm1*biginv;
        }
        if( fabs(qk)<biginv||fabs(pk)<biginv )
        {
            pkm2 = pkm2*big;
            pkm1 = pkm1*big;
            qkm2 = qkm2*big;
            qkm1 = qkm1*big;
        }
        n = n+1;
    }
    while(n!=300);
    result = ans;
    return result;
}

/*************************************************************************
Incomplete beta integral

Returns incomplete beta integral of the arguments, evaluated
from zero to x.  The function is defined as

                 x
    -            -
   | (a+b)      | |  a-1     b-1
 -----------    |   t   (1-t)   dt.
  -     -     | |
 | (a) | (b)   -
                0

The domain of definition is 0 <= x <= 1.  In this
implementation a and b are restricted to positive values.
The integral from x to 1 may be obtained by the symmetry
relation

   1 - incbet( a, b, x )  =  incbet( b, a, 1-x ).

The integral is evaluated by a continued fraction expansion
or, when b*x is small, by a power series.

ACCURACY:

Tested at uniformly distributed random points (a,b,x) with a and b
in "domain" and x between 0 and 1.
                                       Relative error
arithmetic   domain     # trials      peak         rms
   IEEE      0,5         10000       6.9e-15     4.5e-16
   IEEE      0,85       250000       2.2e-13     1.7e-14
   IEEE      0,1000      30000       5.3e-12     6.3e-13
   IEEE      0,10000    250000       9.3e-11     7.1e-12
   IEEE      0,100000    10000       8.7e-10     4.8e-11
Outputs smaller than the IEEE gradual underflow threshold
were excluded from these statistics.

Cephes Math Library, Release 2.8:  June, 2000
Copyright 1984, 1995, 2000 by Stephen L. Moshier
*************************************************************************/
double incompletebeta(double a, double b, double x) {
    double result;
    double t;
    double xc;
    double w;
    double y;
    int flag;
    double sg;
    double big;
    double biginv;
    double maxgam;
    double minlog;
    double maxlog;

    big = 4.503599627370496e15;
    biginv = 2.22044604925031308085e-16;
    maxgam = 171.624376956302725;
    minlog = log(DOUBLE_MIN);
    maxlog = log(DOUBLE_MAX);
    ASSERT(a > 0 && b > 0, "Domain error in IncompleteBeta");
    ASSERT(x >= 0 && x <= 1, "Domain error in IncompleteBeta");

    if (x == 0) {
        result = 0;
        return result;
    }

    if (x == 1) {
        result = 1;
        return result;
    }

    flag = 0;

    if (b*x <= 1.0 && x <= 0.95) {
        result = incompletebetaps(a, b, x, maxgam);
        return result;
    }

    w = 1.0 - x;

    if (x > a / (a + b)) {
        flag = 1;
        t = a;
        a = b;
        b = t;
        xc = x;
        x = w;
    }

    else {
        xc = w;
    }

    if (flag == 1 && b*x <= 1.0 && x <= 0.95) {
        t = incompletebetaps(a, b, x, maxgam);

        if (t <= DOUBLE_EPS) {
            result = 1.0 - DOUBLE_EPS;
        }

        else {
            result = 1.0 - t;
        }

        return result;
    }

    y = x * (a + b - 2.0) - (a - 1.0);

    if (y < 0.0) {
        w = incompletebetafe(a, b, x, big, biginv);
    }

    else {
        w = incompletebetafe2(a, b, x, big, biginv) / xc;
    }

    y = a * log(x);

    t = b * log(xc);

    if (a + b < maxgam && fabs(y) < maxlog && fabs(t) < maxlog) {
        t = pow(xc, b);
        t = t * pow(x, a);
        t = t / a;
        t = t * w;
        t = t * (gamma(a + b) / (gamma(a) * gamma(b)));

        if (flag == 1) {
            if (t <= DOUBLE_EPS) {
                result = 1.0 - DOUBLE_EPS;
            }

            else {
                result = 1.0 - t;
            }
        }

        else {
            result = t;
        }

        return result;
    }

    y = y + t + lngamma(a + b, sg) - lngamma(a, sg) - lngamma(b, sg);

    y = y + log(w / a);

    if (y < minlog) {
        t = 0.0;
    }

    else {
        t = exp(y);
    }

    if (flag == 1) {
        if (t <= DOUBLE_EPS) {
            t = 1.0 - DOUBLE_EPS;
        }

        else {
            t = 1.0 - t;
        }
    }

    result = t;

    return result;
}

/*************************************************************************
Inverse of Normal distribution function

Returns the argument, x, for which the area under the
Gaussian probability density function (integrated from
minus infinity to x) is equal to y.


For small arguments 0 < y < exp(-2), the program computes
z = sqrt( -2.0 * log(y) );  then the approximation is
x = z - log(z)/z  - (1/z) P(1/z) / Q(1/z).
There are two rational functions P/Q, one for 0 < y < exp(-32)
and the other for y up to exp(-2).  For larger arguments,
w = y - 0.5, and  x/sqrt(2pi) = w + w**3 R(w**2)/S(w**2)).

ACCURACY:

                     Relative error:
arithmetic   domain        # trials      peak         rms
   IEEE     0.125, 1        20000       7.2e-16     1.3e-16
   IEEE     3e-308, 0.135   50000       4.6e-16     9.8e-17

Cephes Math Library Release 2.8:  June, 2000
Copyright 1984, 1987, 1988, 1992, 2000 by Stephen L. Moshier
*************************************************************************/
double invnormaldistribution(double y0) {
    double result;
    double expm2;
    double s2pi;
    double x;
    double y;
    double z;
    double y2;
    double x0;
    double x1;
    int code;
    double p0;
    double q0;
    double p1;
    double q1;
    double p2;
    double q2;

    expm2 = 0.13533528323661269189;
    s2pi = 2.50662827463100050242;

    if (y0 <= 0) {
        result = -DOUBLE_MAX;
        return result;
    }

    if (y0 >= 1) {
        result = DOUBLE_MAX;
        return result;
    }

    code = 1;

    y = y0;

    if (y > 1.0 - expm2) {
        y = 1.0 - y;
        code = 0;
    }

    if (y > expm2) {
        y = y - 0.5;
        y2 = y * y;
        p0 = -59.9633501014107895267;
        p0 = 98.0010754185999661536 + y2 * p0;
        p0 = -56.6762857469070293439 + y2 * p0;
        p0 = 13.9312609387279679503 + y2 * p0;
        p0 = -1.23916583867381258016 + y2 * p0;
        q0 = 1;
        q0 = 1.95448858338141759834 + y2 * q0;
        q0 = 4.67627912898881538453 + y2 * q0;
        q0 = 86.3602421390890590575 + y2 * q0;
        q0 = -225.462687854119370527 + y2 * q0;
        q0 = 200.260212380060660359 + y2 * q0;
        q0 = -82.0372256168333339912 + y2 * q0;
        q0 = 15.9056225126211695515 + y2 * q0;
        q0 = -1.18331621121330003142 + y2 * q0;
        x = y + y * y2 * p0 / q0;
        x = x * s2pi;
        result = x;
        return result;
    }

    x = sqrt(-2.0 * log(y));

    x0 = x - log(x) / x;
    z = 1.0 / x;

    if (x < 8.0) {
        p1 = 4.05544892305962419923;
        p1 = 31.5251094599893866154 + z * p1;
        p1 = 57.1628192246421288162 + z * p1;
        p1 = 44.0805073893200834700 + z * p1;
        p1 = 14.6849561928858024014 + z * p1;
        p1 = 2.18663306850790267539 + z * p1;
        p1 = -1.40256079171354495875 * 0.1 + z * p1;
        p1 = -3.50424626827848203418 * 0.01 + z * p1;
        p1 = -8.57456785154685413611 * 0.0001 + z * p1;
        q1 = 1;
        q1 = 15.7799883256466749731 + z * q1;
        q1 = 45.3907635128879210584 + z * q1;
        q1 = 41.3172038254672030440 + z * q1;
        q1 = 15.0425385692907503408 + z * q1;
        q1 = 2.50464946208309415979 + z * q1;
        q1 = -1.42182922854787788574 * 0.1 + z * q1;
        q1 = -3.80806407691578277194 * 0.01 + z * q1;
        q1 = -9.33259480895457427372 * 0.0001 + z * q1;
        x1 = z * p1 / q1;
    }

    else {
        p2 = 3.23774891776946035970;
        p2 = 6.91522889068984211695 + z * p2;
        p2 = 3.93881025292474443415 + z * p2;
        p2 = 1.33303460815807542389 + z * p2;
        p2 = 2.01485389549179081538 * 0.1 + z * p2;
        p2 = 1.23716634817820021358 * 0.01 + z * p2;
        p2 = 3.01581553508235416007 * 0.0001 + z * p2;
        p2 = 2.65806974686737550832 * 0.000001 + z * p2;
        p2 = 6.23974539184983293730 * 0.000000001 + z * p2;
        q2 = 1;
        q2 = 6.02427039364742014255 + z * q2;
        q2 = 3.67983563856160859403 + z * q2;
        q2 = 1.37702099489081330271 + z * q2;
        q2 = 2.16236993594496635890 * 0.1 + z * q2;
        q2 = 1.34204006088543189037 * 0.01 + z * q2;
        q2 = 3.28014464682127739104 * 0.0001 + z * q2;
        q2 = 2.89247864745380683936 * 0.000001 + z * q2;
        q2 = 6.79019408009981274425 * 0.000000001 + z * q2;
        x1 = z * p2 / q2;
    }

    x = x0 - x1;

    if (code != 0) {
        x = -x;
    }

    result = x;

    return result;
}

/*************************************************************************
Inverse of imcomplete beta integral

Given y, the function finds x such that

 incbet( a, b, x ) = y .

The routine performs interval halving or Newton iterations to find the
root of incbet(a,b,x) - y = 0.


ACCURACY:

                     Relative error:
               x     a,b
arithmetic   domain  domain  # trials    peak       rms
   IEEE      0,1    .5,10000   50000    5.8e-12   1.3e-13
   IEEE      0,1   .25,100    100000    1.8e-13   3.9e-15
   IEEE      0,1     0,5       50000    1.1e-12   5.5e-15
With a and b constrained to half-integer or integer values:
   IEEE      0,1    .5,10000   50000    5.8e-12   1.1e-13
   IEEE      0,1    .5,100    100000    1.7e-14   7.9e-16
With a = .5, b constrained to half-integer or integer values:
   IEEE      0,1    .5,10000   10000    8.3e-11   1.0e-11

Cephes Math Library Release 2.8:  June, 2000
Copyright 1984, 1996, 2000 by Stephen L. Moshier
*************************************************************************/
double invincompletebeta(double a, double b, double y) {
    double result;
    double aaa;
    double bbb;
    double y0;
    double d;
    double yyy;
    double x;
    double x0;
    double x1;
    double lgm;
    double yp;
    double di;
    double dithresh;
    double yl;
    double yh;
    double xt;
    int i;
    int rflg;
    int dir;
    int nflg;
    double s;
    int mainlooppos;
    int ihalve;
    int ihalvecycle;
    int newt;
    int newtcycle;
    int breaknewtcycle;
    int breakihalvecycle;

    i = 0;
    ASSERT(y >= 0 && y <= 1, "Domain error in InvIncompleteBeta");

    if (y == 0) {
        result = 0;
        return result;
    }

    if (y == 1.0) {
        result = 1;
        return result;
    }

    x0 = 0.0;

    yl = 0.0;
    x1 = 1.0;
    yh = 1.0;
    nflg = 0;
    mainlooppos = 0;
    ihalve = 1;
    ihalvecycle = 2;
    newt = 3;
    newtcycle = 4;
    breaknewtcycle = 5;
    breakihalvecycle = 6;

    while (true) {

        //
        // start
        //
        if (mainlooppos == 0) {
            if (a <= 1.0 || b <= 1.0) {
                dithresh = 1.0e-6;
                rflg = 0;
                aaa = a;
                bbb = b;
                y0 = y;
                x = aaa / (aaa + bbb);
                yyy = incompletebeta(aaa, bbb, x);
                mainlooppos = ihalve;
                continue;
            }

            else {
                dithresh = 1.0e-4;
            }

            yp = -invnormaldistribution(y);

            if (y > 0.5) {
                rflg = 1;
                aaa = b;
                bbb = a;
                y0 = 1.0 - y;
                yp = -yp;
            }

            else {
                rflg = 0;
                aaa = a;
                bbb = b;
                y0 = y;
            }

            lgm = (yp * yp - 3.0) / 6.0;

            x = 2.0 / (1.0 / (2.0 * aaa - 1.0) + 1.0 / (2.0 * bbb - 1.0));
            d = yp * sqrt(x + lgm) / x - (1.0 / (2.0 * bbb - 1.0) - 1.0 / (2.0 * aaa - 1.0)) * (lgm + 5.0 / 6.0 - 2.0 / (3.0 * x));
            d = 2.0 * d;

            if (d < log(DOUBLE_MIN)) {
                x = 0;
                break;
            }

            x = aaa / (aaa + bbb * exp(d));

            yyy = incompletebeta(aaa, bbb, x);
            yp = (yyy - y0) / y0;

            if (fabs(yp) < 0.2) {
                mainlooppos = newt;
                continue;
            }

            mainlooppos = ihalve;

            continue;
        }

        //
        // ihalve
        //

        if (mainlooppos == ihalve) {
            dir = 0;
            di = 0.5;
            i = 0;
            mainlooppos = ihalvecycle;
            continue;
        }

        //
        // ihalvecycle
        //

        if (mainlooppos == ihalvecycle) {
            if (i <= 99) {
                if (i != 0) {
                    x = x0 + di * (x1 - x0);

                    if (x == 1.0) {
                        x = 1.0 - DOUBLE_EPS;
                    }

                    if (x == 0.0) {
                        di = 0.5;
                        x = x0 + di * (x1 - x0);

                        if (x == 0.0) {
                            break;
                        }
                    }

                    yyy = incompletebeta(aaa, bbb, x);

                    yp = (x1 - x0) / (x1 + x0);

                    if (fabs(yp) < dithresh) {
                        mainlooppos = newt;
                        continue;
                    }

                    yp = (yyy - y0) / y0;

                    if (fabs(yp) < dithresh) {
                        mainlooppos = newt;
                        continue;
                    }
                }

                if (yyy < y0) {
                    x0 = x;
                    yl = yyy;

                    if (dir < 0) {
                        dir = 0;
                        di = 0.5;
                    }

                    else {
                        if (dir > 3) {
                            di = 1.0 - (1.0 - di) * (1.0 - di);
                        }

                        else {
                            if (dir > 1) {
                                di = 0.5 * di + 0.5;
                            }

                            else {
                                di = (y0 - yyy) / (yh - yl);
                            }
                        }
                    }

                    dir = dir + 1;

                    if (x0 > 0.75) {
                        if (rflg == 1) {
                            rflg = 0;
                            aaa = a;
                            bbb = b;
                            y0 = y;
                        }

                        else {
                            rflg = 1;
                            aaa = b;
                            bbb = a;
                            y0 = 1.0 - y;
                        }

                        x = 1.0 - x;

                        yyy = incompletebeta(aaa, bbb, x);
                        x0 = 0.0;
                        yl = 0.0;
                        x1 = 1.0;
                        yh = 1.0;
                        mainlooppos = ihalve;
                        continue;
                    }
                }

                else {
                    x1 = x;

                    if (rflg == 1 && x1 < DOUBLE_EPS) {
                        x = 0.0;
                        break;
                    }

                    yh = yyy;

                    if (dir > 0) {
                        dir = 0;
                        di = 0.5;
                    }

                    else {
                        if (dir < -3) {
                            di = di * di;
                        }

                        else {
                            if (dir < -1) {
                                di = 0.5 * di;
                            }

                            else {
                                di = (yyy - y0) / (yh - yl);
                            }
                        }
                    }

                    dir = dir - 1;
                }

                i = i + 1;

                mainlooppos = ihalvecycle;
                continue;
            }

            else {
                mainlooppos = breakihalvecycle;
                continue;
            }
        }

        //
        // breakihalvecycle
        //

        if (mainlooppos == breakihalvecycle) {
            if (x0 >= 1.0) {
                x = 1.0 - DOUBLE_EPS;
                break;
            }

            if (x <= 0.0) {
                x = 0.0;
                break;
            }

            mainlooppos = newt;

            continue;
        }

        //
        // newt
        //

        if (mainlooppos == newt) {
            if (nflg != 0) {
                break;
            }

            nflg = 1;

            lgm = lngamma(aaa + bbb, s) - lngamma(aaa, s) - lngamma(bbb, s);
            i = 0;
            mainlooppos = newtcycle;
            continue;
        }

        //
        // newtcycle
        //

        if (mainlooppos == newtcycle) {
            if (i <= 7) {
                if (i != 0) {
                    yyy = incompletebeta(aaa, bbb, x);
                }

                if (yyy < yl) {
                    x = x0;
                    yyy = yl;
                }

                else {
                    if (yyy > yh) {
                        x = x1;
                        yyy = yh;
                    }

                    else {
                        if (yyy < y0) {
                            x0 = x;
                            yl = yyy;
                        }

                        else {
                            x1 = x;
                            yh = yyy;
                        }
                    }
                }

                if (x == 1.0 || x == 0.0) {
                    mainlooppos = breaknewtcycle;
                    continue;
                }

                d = (aaa - 1.0) * log(x) + (bbb - 1.0) * log(1.0 - x) + lgm;

                if (d < log(DOUBLE_MIN)) {
                    break;
                }

                if (d > log(DOUBLE_MAX)) {
                    mainlooppos = breaknewtcycle;
                    continue;
                }

                d = exp(d);

                d = (yyy - y0) / d;
                xt = x - d;

                if (xt <= x0) {
                    yyy = (x - x0) / (x1 - x0);
                    xt = x0 + 0.5 * yyy * (x - x0);

                    if (xt <= 0.0) {
                        mainlooppos = breaknewtcycle;
                        continue;
                    }
                }

                if (xt >= x1) {
                    yyy = (x1 - x) / (x1 - x0);
                    xt = x1 - 0.5 * yyy * (x1 - x);

                    if (xt >= 1.0) {
                        mainlooppos = breaknewtcycle;
                        continue;
                    }
                }

                x = xt;

                if (fabs(d / x) < 128.0*DOUBLE_EPS) {
                    break;
                }

                i = i + 1;

                mainlooppos = newtcycle;
                continue;
            }

            else {
                mainlooppos = breaknewtcycle;
                continue;
            }
        }

        //
        // breaknewtcycle
        //

        if (mainlooppos == breaknewtcycle) {
            dithresh = 256.0 * DOUBLE_EPS;
            mainlooppos = ihalve;
            continue;
        }
    }

    //
    // done
    //

    if (rflg != 0) {
        if (x <= DOUBLE_EPS) {
            x = 1.0 - DOUBLE_EPS;
        }

        else {
            x = 1.0 - x;
        }
    }

    result = x;

    return result;
}

/*************************************************************************
Functional inverse of Student's t distribution

Given probability p, finds the argument t such that stdtr(k,t)
is equal to p.

ACCURACY:

Tested at random 1 <= k <= 100.  The "domain" refers to p:
                     Relative error:
arithmetic   domain     # trials      peak         rms
   IEEE    .001,.999     25000       5.7e-15     8.0e-16
   IEEE    10^-6,.001    25000       2.0e-12     2.9e-14

Cephes Math Library Release 2.8:  June, 2000
Copyright 1984, 1987, 1995, 2000 by Stephen L. Moshier
*************************************************************************/
double invstudenttdistribution(int k, double p) {
    double result, t, rk, z;
    int rflg;
    ASSERT(k > 0 && p > 0 && p < 1, "Domain error in InvStudentTDistribution");
    rk = k;

    if (p > 0.25 && p < 0.75) {
        if (p == 0.5) {
            result = 0;
            return result;
        }

        z = 1.0 - 2.0 * p;

        z = invincompletebeta(0.5, 0.5 * rk, fabs(z));
        t = sqrt(rk * z / (1.0 - z));

        if (p < 0.5) {
            t = -t;
        }

        result = t;

        return result;
    }

    rflg = -1;

    if (p >= 0.5) {
        p = 1.0 - p;
        rflg = 1;
    }

    z = invincompletebeta(0.5 * rk, 0.5, 2.0 * p);

    if (DOUBLE_MAX*z < rk) {
        result = rflg * DOUBLE_MAX;
        return result;
    }

    t = sqrt(rk / z - rk);

    result = rflg * t;
    return result;
}

double st(double alpha,int n) { 
    return invstudenttdistribution(n-1,(alpha+1)*0.5);
}
Re[7]: Изучение Си после C++?
От: so5team https://stiffstream.com
Дата: 26.07.19 07:03
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Вот например: как улучшить в разы этот код, переписав его на C++


В этом коде, как минимум, следовало бы избавиться от define и длинных списков деклараций переменных без присваивания им начального значения. Ну а где-то и от вот таких бессмысленных конструкций:
result = z / ((1 + 0.5772156649015329 * x) * x);
return result;


Да и последовательности вида:
    stir = 7.87311395793093628397E-4;
    stir = -2.29549961613378126380E-4+w*stir;
    stir = -2.68132617805781232825E-3+w*stir;
    stir = 3.47222221605458667310E-3+w*stir;
    stir = 8.33333333333482257126E-2+w*stir;

Можно было бы подсократить до чего-то такого:
stir = tricky_accumulate(w,
    7.87311395793093628397E-4,
    -2.29549961613378126380E-4,
    -2.68132617805781232825E-3,
    3.47222221605458667310E-3,
    8.33333333333482257126E-2);
Re[7]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 26.07.19 07:37
Оценка:
Здравствуйте, Marty, Вы писали:

M>Не совсем так. Либа — это типа архива объектников


Это от компилятора зависит. В gcc (.a) это архив. В VC++, например, нет.
Re[8]: Изучение Си после C++?
От: so5team https://stiffstream.com
Дата: 26.07.19 08:12
Оценка:
Здравствуйте, rg45, Вы писали:

R>Это не код, а донесение итальянского шпиона, составленное при помощи лапши. Здесь только инструкций goto не хватает, для полноты пейзажа.


Ну вообще-то для области вычислительной математики это еще просто чудо насколько хороший код.
Re[9]: Изучение Си после C++?
От: rg45 СССР  
Дата: 26.07.19 08:14
Оценка:
Здравствуйте, so5team, Вы писали:

R>>Это не код, а донесение итальянского шпиона, составленное при помощи лапши. Здесь только инструкций goto не хватает, для полноты пейзажа.


S>Ну вообще-то для области вычислительной математики это еще просто чудо насколько хороший код.


Я в разных областях работал, и в области вычислительной математики в том числе. И что такое распределение Стьюдента, я знаю. По моим меркам это говнокод. И язык C здесь не виноват.

double st(double alpha,int n);// =invstudenttdistribution(n-1,(alpha+1)*0.5)


За такие имена с комментариями — отбивать руки.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 26.07.2019 8:20 rg45 . Предыдущая версия . Еще …
Отредактировано 26.07.2019 8:16 rg45 . Предыдущая версия .
Re[10]: Изучение Си после C++?
От: so5team https://stiffstream.com
Дата: 26.07.19 08:20
Оценка:
Здравствуйте, rg45, Вы писали:

R>По моим меркам это говнокод.


Намек был на то, что в подавляющем большинстве там еще хуже

R>И язык C здесь не виноват.


А это вообще-то С++
int iround(double x)  { return int(floor(x+0.5)); } // Приведение типов в стиле C++.
double lngamma(double x, double& sgngam) { // Передача аргумента по ссылке. Видимо out-параметр.
Re[11]: Изучение Си после C++?
От: rg45 СССР  
Дата: 26.07.19 08:24
Оценка:
Здравствуйте, so5team, Вы писали:

S>А это вообще-то С++

S>
S>int iround(double x)  { return int(floor(x+0.5)); } // Приведение типов в стиле C++.
S>double lngamma(double x, double& sgngam) { // Передача аргумента по ссылке. Видимо out-параметр.
S>


Вообще замечательно. Иллюстрация к тому, почему в названии языка C++ исползуется постинкремент.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[10]: Изучение Си после C++?
От: Stanislav V. Zudin Россия  
Дата: 26.07.19 08:25
Оценка:
Здравствуйте, rg45, Вы писали:

S>>Ну вообще-то для области вычислительной математики это еще просто чудо насколько хороший код.


R>Я в разных областях работал, и в области вычислительной математики в том числе. И что такое распределение Стьюдента, я знаю. По моим меркам это говнокод. И язык C здесь не виноват.


А я бы с удовольствием посмотрел на неговнокод. Так сказать, с целью расширения кругозора.
В идеале — на приведенный выше код, написанный в правильном стиле.
_____________________
С уважением,
Stanislav V. Zudin
Re[11]: Изучение Си после C++?
От: rg45 СССР  
Дата: 26.07.19 08:37
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>А я бы с удовольствием посмотрел на неговнокод. Так сказать, с целью расширения кругозора.

SVZ>В идеале — на приведенный выше код, написанный в правильном стиле.

Этим я заниматься не стану, конечно, но общие принципы выражу:

1) Выполнить декомпозицию и структрурирование кода в соответствии с принципом "одна функция — одна задача";
2) Убрать из кода "магические" константы;
3) Исключить использование неинициализированных переменных;
4) Дать всем фунциям и, по возможности, переменным понятные имена.

Да, в области математики, дать вменяемые имена локальным переменным не всегда удается — просто потому, что они чисто исторически обозначаются буквами. Но, как минимум, буквенные обозначения должны соответствовать общепринятым. И важную роль здесь играет декомпозиция кода и сокращение размеров тел функций — когда перед глазами одновременно и переменная, и ее использование, смысл понимается легче, как правило. В моем коде вы не встретите функции, которая бы не умещалась на одном экране.

  Вот такое — ни в одни ворота
    double result;
    double a;
    double b;
    double c;
    double p;
    double q;
    double u;
    double w;
    double z;
    int i;
    double logpi;
    double ls2pi;
    double tmp;



При переходе к C++:

1) Систематическое использование модификаторов const;
2) Объявление переменных как можно ближе к месту их использования (это, опять же, к вопросу о легкости восприятия имен переменных);
3) Замены (там где это оправдано) монолитных больших функций, классами вычислителями, использующими общий общий набор закрытых переменных, но декомпозированных на более простые функции.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 26.07.2019 9:05 rg45 . Предыдущая версия . Еще …
Отредактировано 26.07.2019 8:58 rg45 . Предыдущая версия .
Отредактировано 26.07.2019 8:54 rg45 . Предыдущая версия .
Отредактировано 26.07.2019 8:41 rg45 . Предыдущая версия .
Re[12]: Изучение Си после C++?
От: Stanislav V. Zudin Россия  
Дата: 26.07.19 09:07
Оценка:
Здравствуйте, rg45, Вы писали:

SVZ>>А я бы с удовольствием посмотрел на неговнокод. Так сказать, с целью расширения кругозора.

SVZ>>В идеале — на приведенный выше код, написанный в правильном стиле.

R>Этим я заниматься не стану, конечно, но общие принципы выражу:


Черт, не сработало

R>1) Выполнить декомпозицию и структрурирование кода в соответствии с принципом "одна функция — одна задача";

R>2) Убрать из кода "магические" константы;
R>3) Дать всем фунциям и, по возможности, переменным понятные имена.

Да, это важно, но не всегда можно подобрать краткое говорящее имя.

Декомпозиция с одной стороны важна, а с другой — зело дорогое удовольствие.
Частенько приходится ей жертвовать.
Обычная ситуация: во время вычислений данных для одной задачи можно получить забесплатно данные для второй задачи. Если канонично провести декомпозицию, разделить задачи, то придется запускать вычисления еще раз — это удвоить общее время вычислений, которое и так ощутимо.

R>Да, в области математики, дать вменяемые имена локальным переменным не всегда удается — просто потому, что они чисто исторически обозначаются буквами. Но здесь главную роль должна сыграть декомпозиция кода и сокращение размеров тел функций. В моем коде вы не встретите функции, которая бы не умещалась на одном экране.


Еще одна проблема с декомпозицией — необходимость протаскивания кучи данных, либо повторное их вычисление.
В итоге либо у тебя появляются лямбды, либо вычисленные промежуточные данные складываются в т.н. "контекст", который тащится через все функции.

Постоянно приходится чем-то жертвовать — либо декомпозицией, либо временем исполнения, либо расходом памяти на хранение промежуточных данных.
Короче, эти рекомендации из раздела "мыши, станьте ёжиками".

R>При переходе к C++


R>1) Систематическое использование модификаторов const;


const был в Сях со времен K&R. Почему его избегают —

R>2) Объявление переменных как можно ближе к месту их использования (это, опять же, к вопросу о легкости восприятия имен переменных).


В новых Сях это есть. Но есть нюанс.
Если ограничить применение кода парой-тройкой популярных платформ, то нет нужды переходить на С++, используем свежий С и всё замечательно.
А если надо запускать код на каком-нить zOS, то тут проблема — компилятор С++ там времен 98г. Си — каноничный, времен K&R.
Так что либо пишем на Сях по-древнему, либо переходим на Яву.
Вот такая вот загогулина.

Я в этом коде не нашел чего-то непотребного, видывал код и похуже. Видимо, у меня иммунитет
_____________________
С уважением,
Stanislav V. Zudin
Re[7]: Изучение Си после C++?
От: andyp  
Дата: 26.07.19 09:20
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Вот например: как улучшить в разы этот код, переписав его на C++


Там в куче мест вычисление полиномиальной аппроксимации по схеме Горнера с разными коэффициентами. На последних плюсах это имхо вполне себе можно как-то в отдельный класс вынести с нулевыми потерями в риалтайм.
Re[3]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 26.07.19 09:22
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Здравствуйте, Maniacal, Вы писали:


M>>...вместо C++-исключений структурные исключения...


AG>Это MS Specific

AG>Вот подробнее: https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=vs-2019

AG>IMHO: вместо C++-исключений, в чистом Си: setjmp и longjmp — но эти вещи превратят ваш код в страшное "спагетти"


Хм. Тогда можно сигналы использовать. Вполне сойдёт как очень кривая реализация исключений.
Re[7]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 26.07.19 09:24
Оценка:
Здравствуйте, Hobbes, Вы писали:

H>Здравствуйте, Maniacal, Вы писали:


M>>Да, пожалуй. Но к C тоже отношения не имеет.


H>Так ведь обсуждаем, чего есть в C++ и нет в C


Перегрузки функций нет в C и есть в C++
Re[8]: Изучение Си после C++?
От: sergey2b ЮАР  
Дата: 26.07.19 10:40
Оценка:
Здравствуйте, Hobbes, Вы писали:

H>Здравствуйте, sergey2b, Вы писали:


S>>более менее строгая типизация появилась в Си примерно в 90 году в Паскале быыла с самого начала


H>Я что-то задумался... Какие средства есть для строгой типизации в C? Кроме структур ничего не приходит на ум.



после принятия ANSII C

запрет на смещивания указателей и int
прототипы функций
модификатор const
изменились правила приведения типов
возрат функцийе enum
Re[6]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.07.19 02:05
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>>>Нифига паскаль не умер.

LVV>>>Как использовался для обучения — так ип используется.
M>>Это и называется — умер, когда только для обучения используется. Непонятно только, зачем над студентами издеваетесь
LVV>1. Во-первых, Паскаль для обучения и создавался.

А кто решил, что ЭТО лучше остального способствует обучению?
Во времена, когда асм был единственной реальной альтернативой, паскаль был неплох. Но это было овер 30 лет назад

LVV>2. Он всегда для обучения использовался. Это фирмы решили, что это промышленный язык и стали выпускать средства разработки


Это решил борманд, и он обосрался с этим

LVV>И наша МНОГОЛЕТНЯЯ практика показывает, что С++ для обычных средних программистов — трудноват для освоения.


А может, вы учить не умеете?

LVV>Поэтому мы сначала учим программированию, а потом уже С++...


Т.е. метод говна и шоколадки?


В техникуме сортировал гномиков на паскале, после асма Z80 это не было прорывом, но было чуть-чуть немного удобнее, хотя и не всегда; для спектрума уже не помню кто, но кто-то сделал классный асм со средой в стиле турбо вижн, и это было круто.

В институте на первом курсе давали сишечку, и она для меня неплохо зашла

К началу второго курса распробовал сипипишечку, и она тоже зашла хорошо. Для меня не проблема просто взять и налабать што-то на жаве или на шарпе не слишком сложное — такая обычная рутинная задача для плюсовика, что и говорить тащем-то не о чем.

Итого: мне пару-тройку лет скармливали говно, называя это обучением программированию
Маньяк Робокряк колесит по городу
Re[8]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.07.19 02:07
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>>Не совсем так. Либа — это типа архива объектников


M>Это от компилятора зависит. В gcc (.a) это архив. В VC++, например, нет.


Расскажи за MSVC
Маньяк Робокряк колесит по городу
Re[7]: Изучение Си после C++?
От: LaptevVV Россия  
Дата: 27.07.19 03:18
Оценка:
LVV>>1. Во-первых, Паскаль для обучения и создавался.
M>А кто решил, что ЭТО лучше остального способствует обучению?
Никлаус Вирт — неужели ты не в курсе?
M>Во времена, когда асм был единственной реальной альтернативой, паскаль был неплох. Но это было овер 30 лет назад
Очень ограниченный взгляд на обучение программированию.
M>А может, вы учить не умеете?
Поступай, посмотришь...
LVV>>Поэтому мы сначала учим программированию, а потом уже С++...
M>Т.е. метод говна и шоколадки?
Программирование для тебя говно?
Что ты делаешь в программировании ???

M>В техникуме сортировал гномиков на паскале, после асма Z80 это не было прорывом, но было чуть-чуть немного удобнее, хотя и не всегда; для спектрума уже не помню кто, но кто-то сделал классный асм со средой в стиле турбо вижн, и это было круто.

Ко мне в 1999 году пришел пацан с химического факультета нашего универа.
И скромненько так говорит: я тут написал среду для программирования на ассемблере, вы посмотрите?
Дело было в MSDOS на IBM PC-286...
Конечно, я посмотрел — и он перевелся к нам на кафедру.
M>В институте на первом курсе давали сишечку, и она для меня неплохо зашла
M>К началу второго курса распробовал сипипишечку, и она тоже зашла хорошо. Для меня не проблема просто взять и налабать што-то на жаве или на шарпе не слишком сложное — такая обычная рутинная задача для плюсовика, что и говорить тащем-то не о чем.
Сишечка и Спипишечка — это только инструменты, а не программирование.
M>Итого: мне пару-тройку лет скармливали говно, называя это обучением программированию
Сочувствую — столько говна пришлось жрать...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[9]: Изучение Си после C++?
От: Hobbes Россия  
Дата: 27.07.19 06:55
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>после принятия ANSII C


S>запрет на смещивания указателей и int


Ну это прям типизация я вообще не могу.

S>прототипы функций

S>модификатор const
S>изменились правила приведения типов

Тут я не в курсе, что-то поменялось с 80х годов?

S>возрат функцийе enum


Вот практическая задача — я хочу 2 типа, температура и давление. Оба имеют значение с плавающей точкой. Как сделать, чтобы значения этих типов были несовместимы? Чтобы их было нельзя присваивать, сравнивать, передавать в функцию, если типы не совпадают. Чтобы при попытке написать ошибочное использование получалась ошибка компиляции.

В C++ написать такое как 2 пальца об асфальт. Если это нельзя написать в C, то о какой строгой типизации идёт речь?
Re[6]: Изучение Си после C++?
От: LaptevVV Россия  
Дата: 27.07.19 08:02
Оценка:
V>Кстати, была такая продвинутая оболочка для MS-DOS под названием DOS-Navigator — исходники на Паскале (причем размер под 3 мегабайта).
Кстати Windows начинался на Паскале.
V>Мой преподаватель по термеху писал на Паскале (по-моему, 5.5 или, максимум, 6) пакет для моделирования динамических систем с графической
V>визуализацией (потом к нему еще сопромат прикрутили). Причем пакет не был простой поделкой — на нем рассчитывали динамику раскрытия
V>солнечных батарей на космических аппаратах и прочие сурьёзные задачи.
Это и сейчас пишут — на компонентном паскале.
Поинтересуйся на oberoncore.ru
Там научники, которым не требуется создавать промышленный продукт, свои научные программы пишут в BlackBox на компоентном паскале.
И очень довольны.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Изучение Си после C++?
От: Михaил  
Дата: 27.07.19 10:04
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Здравствуйте, Михaил, Вы писали:


N>>>Основное отличие С от С++, это убогость и крайняя устарелость.


М>>минималистичность и полный контроль над железом.


N>C++ — это минималистичность и полный контроль над железом. А С — отстой.


Нет, сипипи — это раздутый монстр, куда впихнули все, что только возможно было впихнуть (и продолжают это делать).

М>>то что на нём почти все mcu программируются?q А так же драйвера, системные утилиты и огромное количество кроссплатформенных opensource либ?


N>Современные драйвера вполне себе на С++ пишут. На С пишут дрова, если нужно в килобайты вместиться.


Пишут на максимально обрубленном с++, который по сути больше чем «с с классами» трудно назвать.

М>>ты сиплюсплюсер?


N>Я использую тот язык, который оптимален для конкретной задачи.


Ну так какие задачи решаешь? У каждого есть специализация.
Re[4]: Изучение Си после C++?
От: Михaил  
Дата: 27.07.19 10:07
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, Михaил, Вы писали:



М>>то что на нём почти все mcu программируются?q А так же драйвера, системные утилиты и огромное количество кроссплатформенных opensource либ?


M>Эмбеддеры давно на плюсы перешли. Пятый Keil (armcc) даже 11 стандарт поддерживает (в нем — в Keil'е есть и clang), а на днях JetBrains выкатили CLion для армовских MCU.


Поддерживает не значит что пишут. Ардуино тоже якобы с++, а на практике там этих плюсов и не видно.

M>Драйвера под винду давно на плюсах пишут, под линупс — да, на сишечке в основном, из-за упоротости отца-основателя


Пишут да. Где от плюсов — наследование, и то урезанное.
Re[5]: Изучение Си после C++?
От: sergey2b ЮАР  
Дата: 27.07.19 10:11
Оценка:
Здравствуйте, Михaил, Вы писали:



М>Пишут да. Где от плюсов — наследование, и то урезанное.



здесь на форуме есть человек который написал статью ка использовать stl в драйверах
Re[5]: Изучение Си после C++?
От: Nikе Россия  
Дата: 27.07.19 18:05
Оценка:
Здравствуйте, Михaил, Вы писали:

N>>C++ — это минималистичность и полный контроль над железом. А С — отстой.


М>Нет, сипипи — это раздутый монстр, куда впихнули все, что только возможно было впихнуть (и продолжают это делать).


Не, там нет многого-полезного.

М>Пишут на максимально обрубленном с++, который по сути больше чем «с с классами» трудно назвать.


Всё, кроме исключений.

N>>Я использую тот язык, который оптимален для конкретной задачи.


М>Ну так какие задачи решаешь? У каждого есть специализация.


Я неспециализированный, то тут то там. Делаю сложные проекты, часто приходится решать довольно внезапные задачи. Но С++ это основной бекграунд, конечно.
Нужно разобрать угил.
Re: Изучение Си после C++?
От: Fikayande  
Дата: 28.07.19 08:27
Оценка:
Здравствуйте, BadCats, Вы писали:

BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.


А есть ли смысла изучать С после С++?
Re[9]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 29.07.19 11:01
Оценка:
Здравствуйте, Marty, Вы писали:

M>>Это от компилятора зависит. В gcc (.a) это архив. В VC++, например, нет.


M>Расскажи за MSVC


Что-то я посмотрел .a-файл, там тоже не архив, как и .lib у MSVC. Архив, естественно, в понимании сжатости данных.
Re[10]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.07.19 16:20
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>>>Это от компилятора зависит. В gcc (.a) это архив. В VC++, например, нет.


M>>Расскажи за MSVC


M>Что-то я посмотрел .a-файл, там тоже не архив, как и .lib у MSVC. Архив, естественно, в понимании сжатости данных.


tar — это архив или нет?
Маньяк Робокряк колесит по городу
Re[13]: Изучение Си после C++?
От: sergey2b ЮАР  
Дата: 29.07.19 16:27
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

R>>2) Объявление переменных как можно ближе к месту их использования (это, опять же, к вопросу о легкости восприятия имен переменных).


SVZ>В новых Сях это есть. Но есть нюанс.

SVZ>Если ограничить применение кода парой-тройкой популярных платформ, то нет нужды переходить на С++, используем свежий С и всё замечательно.
SVZ>А если надо запускать код на каком-нить zOS, то тут проблема — компилятор С++ там времен 98г. Си — каноничный, времен K&R.


в чем плюс такого объявления ?
ведь искать по все функции какого типа переменная или окинуть взглядом список всех переменных в одном месте
уддобней чем искать эту информациию по всему тексту функции
Re[11]: Изучение Си после C++?
От: kov_serg Россия  
Дата: 29.07.19 16:28
Оценка:
Здравствуйте, Marty, Вы писали:

M>tar — это архив или нет?

Название Tape ARchive как бы намекает что это архив для сохранения на магнитную ленту
Re[14]: Изучение Си после C++?
От: Stanislav V. Zudin Россия  
Дата: 29.07.19 16:32
Оценка:
Здравствуйте, sergey2b, Вы писали:

R>>>2) Объявление переменных как можно ближе к месту их использования (это, опять же, к вопросу о легкости восприятия имен переменных).


S>в чем плюс такого объявления ?

S>ведь искать по все функции какого типа переменная или окинуть взглядом список всех переменных в одном месте
S>уддобней чем искать эту информациию по всему тексту функции

Уменьшается вероятность ошибки, избавляемся от неинициализированных переменных.
Переменная появляется только там, где она реально нужна — код становится читабельнее.
Не все же функции состоят из пяти строк.
А работая в IDE нам пофигу, в каком месте объявлена переменная — её тип выводится в тултипе.
_____________________
С уважением,
Stanislav V. Zudin
Re[12]: Изучение Си после C++?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.07.19 16:42
Оценка:
Здравствуйте, kov_serg, Вы писали:

M>>tar — это архив или нет?

_>Название Tape ARchive как бы намекает что это архив для сохранения на магнитную ленту

Т.е. это архив таки?
Почему же там нет сжатия?
Маньяк Робокряк колесит по городу
Re[13]: Изучение Си после C++?
От: Mystic Artifact  
Дата: 29.07.19 17:01
Оценка:
Здравствуйте, Marty, Вы писали:

M>Т.е. это архив таки?

M>Почему же там нет сжатия?
Потому, что файл, содержащий в себе другие файлы — называют архивом вне зависимости от сжатия.
Кстати, zip какой-нибудь тоже можно сделать без сжатия.
Re[15]: Изучение Си после C++?
От: Mystic Artifact  
Дата: 29.07.19 18:20
Оценка:
Здравствуйте, Marty, Вы писали:

Извиняюсь, недоглядел.
Re[12]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 30.07.19 06:29
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, Marty, Вы писали:


M>>tar — это архив или нет?

_>Название Tape ARchive как бы намекает что это архив для сохранения на магнитную ленту

Ну, у них и МакДоналдс — ресторан. В русском языке это не так.
Re[12]: Изучение Си после C++?
От: Maniacal Россия  
Дата: 30.07.19 06:31
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, Marty, Вы писали:


M>>tar — это архив или нет?

_>Название Tape ARchive как бы намекает что это архив для сохранения на магнитную ленту

Угу. Специальная подготовка файла для архивирования на ленте. А .a и .lib не предархивная подготовка. Это библиотеки. Библиотека и архив почти синонимы, но архив — он для хранения, а библиотека для использования.
Re: Изучение Си после C++?
От: B0FEE664  
Дата: 01.08.19 10:33
Оценка:
Здравствуйте, BadCats, Вы писали:

BC>Посоветуйте пожалуйста курсы или книги про Си, которые демонстрируют его отличие от C++ — т.е материал по Си — не для начинающих, позволяющий освоить язык как "дополнительный", в том смысле, что его изучение будет не первым.


Книжек таких не знаю, могу лишь сказать, что главное существенное различие — это разная семантика inline функций, которая в С опасна и может привести к UB. Впрочем, в С++, возможно, тоже может быть UB, как результат нарушения ODR, точно не помню.
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.