Использлование ссылки или указателя

Тема в разделе "LANGS.C", создана пользователем reddrak, 8 фев 2009.

  1. reddrak

    reddrak New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2008
    Сообщения:
    13
    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;
    }

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


    Вот это же на языке оригинала

    Consider the following function that sets a particular element of a two-dimensional array:

    1. inline void set_2d( float *a, int m, int i, int j ) {
    2. a[i*m+j] = a[i*m+j] * a[i*m+j] + a[i*m+j]; // oops!
    3. }
    4.

    We can replace the line commented 'oops!' with a simpler version that employs a reference.

    1. inline void set_2d( float *a, int m, int i, int j ) {
    2. float &r = a[i*m+j];
    3. r = r*r+r;
    4. }
    5.
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    reddrak
    Дело было так. Автор оригинального первого издания написал первый код так:
    inline void set_2d( float *a, int m, int i, int j ) {
    a[i*m+j] = a[i*m+j] * a[i*m+i] + a[i*m+j]; // oops
    }
    т.е. во втором слагаемом он специально перепутал j на i. Второй код он привел как более красивый, понятный и очевидный вариант, в котором, в отличии от первого, трудно ошибится. (Если заменить второй член на a[i*m+j], то он будет тоже правильный.)
    А русский перевод - это отдельная тема, там опечатка на опечатке - и это одна из них. Переводчик не понял оригинального автора и все.
    Кстати, это уже где-то обсуждалось, и не только русский перевод ошибочный, поэтому - читайте оригинал.