LINUX.ORG.RU
ФорумTalks

[чудеса?][C++]Интерполяция Лагранжа

 


0

1

В универе сдавали лабу на плюсах по интерполяции Лагранжа, так вот, при попытке ввести значение х вне диапазона, борландси вылетел с кучей ошибок. Скомпилировала тот же код дома в g++ - всё работает. Как так?


Ответ на: комментарий от Lorchanko

Неявные допущения о сиюминутных свойствах конктерного компилятора.

Их или документировать отдельно, либо написать написать на один раз и забыть, откинув возможность легкой поддержки.

mclaudt
()
Ответ на: комментарий от mclaudt

>Объясни, зачем такую очевидно самостоятельную сущность, как количество элементов массива, нужно привязывать к типу элемента массива? Неужели нет готовых низкоуровневых функций для этого?

дык sizeof() и есть такая «низкоуровневая функция» :) и проблем тут никаких не было и не будет. Тут только одна проблема - всё сломается, если ВНЕЗАПНО изменится тип массива, тогда конечно sizeof(не_тот_тип) даст не тот результат. Потому на практике пишут /sizof(x[0]). (как уже выше подмечено).

drBatty ★★
()
Ответ на: комментарий от mclaudt

>Неявные допущения о сиюминутных свойствах конктерного компилятора.

нет тут ничего подобного. эта конструкция ещё во времена K&R работала. ИЧСХ - также как сейчас (только, ЕМНИП, sizeof() давала тогда int тип)

drBatty ★★
()
Ответ на: комментарий от mclaudt

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

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

drBatty ★★
()
Ответ на: комментарий от by_zero

вообще, в вашем примере я не отыскал быдлокода, за исключением:

1) sizeof(double) сломается, если сменится тип x

2) double x[6]={... следует сменить на double x[]={... для того, что-бы проще вводить новые числа (ну или написать #define N))

3) конструкция sizeof(x) убьётся, ежели вы отдадите x внутрь функции(внезапно x станет указателем, а не массивом, а у указателя очевидно размер не тот).

4) напоминает индуский код continue. ИМХО удобнее if(i != j) P1 *= xx - x[j]; но это уже если придираться.

5) ну и древний глюкландси требует mathлибы даже для умножения, а не только для всяких косекансов, как этот ваш г++.

6) непонятно, зачем применять перегруженный << в программе на C. Уж применили-бы printf (я не помню, как там в глюкланде using работает, ЕМНИП никак)

7) стиль...

drBatty ★★
()
Ответ на: комментарий от mclaudt

>Это всего лишь временно сложившаяся практика, здесь и сейчас.

не. это язык C. (и, ЕМНИП C++, но про последний я не уверен)

drBatty ★★
()
Ответ на: комментарий от Lorchanko

спасибо. действительно - там чёрным по белому написано, что размер массива равен числу его эл-тов умноженному на их размер.

drBatty ★★
()

Глядя на это понимаешь, что фортран совсем не так уж и плох.

aedeph
()
Ответ на: комментарий от drBatty

спасибо за замечания по теме

И, блин, это не я писала!

Но учту чужие ошибки, и свою программу сделаю поизящнее

by_zero
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.