URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7885
[ Назад ]

Исходное сообщение
"Передача по ссылке "

Отправлено niknik , 07-Фев-09 22:46 
HI all

Возник вопрос. Читаю очень интересную книгу "Священные знания  с++ " на стр.34
столкнулся со следующей проблемой.
Дана функция, задающая конкретный элемент двумерного массива
inline void foo(float *a, int m, int i, int j) {
  a[i*m+j] = a[i*m+j] * a[i*m+j] + a[i*m+j];    /// ошибка
}

так же имеется реализация этой функции со ссылкой
inline void foo(float *a, int m, int i, int j) {
   float &r = a[i*m + j ];
   r= r *r +r;
}

Так вот в книге сказано что в первом случае есть ошибка.
Не могу понять какая ?

Ps: Сильно не пинать


Содержание

Сообщения в этом обсуждении
"Передача по ссылке "
Отправлено vic , 09-Фев-09 15:43 
>inline void foo(float *a, int m, int i, int j) {
>  a[i*m+j] = a[i*m+j] * a[i*m+j] + a[i*m+j]; /// ошибка
>}
>inline void foo(float *a, int m, int i, int j) {
>   float &r = a[i*m + j ];
>   r= r *r +r;
>}
>Так вот в книге сказано что в первом случае есть ошибка.
>Не могу понять какая ?

ыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыы)))
все просто до безобразия, вы читаете книгу на русском с кучей ошибок перевода и еще самовольными изменениями переводчика =))
вот как выглядит строка в оригинале:
a[i*m+j] = a[i*m+j] * a[i*m+i] + a[i*m+j];
внимание на индексы, второй множитель в оригинале с индесом i*m+i вместо i*m+j, поэтому читатель русской версии книги и не вдупляет т.к. переводчик самовольно поправил код :))

а в оригинале автор переходя к использованию ссылки показывает что таким образом можно:
1. предохраниться от подобных ошибок
2. "соптимизировать" чутка. во втором случае вместо четырехкратного вычисления индекса и обращения к элементу массива это делается один раз при инициализации ссылки. Надеюсь понятно почему в кавычках? ;)
3. элегантно отделил алгоритм функции от синтаксического мусора доступа к элементу массива. т.е. выделил важное.
0. автор мог бы пойти дальше и написать r += r * r; для полного счастья :))


"Передача по ссылке "
Отправлено NikNik , 10-Фев-09 15:32 
Спасибо