Использование функций для открытия, чтения, сохранения и записи в CSV-файл (C ++) [дубликат]

Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:

object o = null;
DateTime d = (DateTime)o;

Он выкинет NullReferenceException в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.

Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:

" />

Здесь SelectedDate на самом деле является свойством - типа DateTime - типа Calendar Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...

15
задан 7 revs, 6 users 57% 9 November 2009 в 08:31
поделиться

4 ответа

Поскольку вы используете C ++, если вы хотите изменить xc и yc, вы можете использовать ссылки:

void trans(double x, double y, double theta, double& m, double& n)
{
    m=cos(theta)*x+sin(theta)*y;
    n=-sin(theta)*x+cos(theta)*y;
}

int main()
{
    // ... 
    // no special decoration required for xc and yc when using references
    trans(center_x, center_y, angle, xc, yc);
    // ...
}

Если вы используете C, вам нужно будет пройти явные указатели или адреса, такие как:

void trans(double x, double y, double theta, double* m, double* n)
{
    *m=cos(theta)*x+sin(theta)*y;
    *n=-sin(theta)*x+cos(theta)*y;
}

int main()
{
    /* ... */
    /* have to use an ampersand to explicitly pass address */
    trans(center_x, center_y, angle, &xc, &yc);
    /* ... */
}

Я бы рекомендовал проверить запись C ++ FAQ Lite в ссылках для получения дополнительной информации о том, как правильно использовать ссылки.

33
ответ дан seaotternerd 1 September 2018 в 07:36
поделиться

Передача по ссылке действительно является правильным ответом, однако C ++ sort-to позволяет возвращать многозначные значения с использованием std::tuple и (для двух значений) std::pair:

#include <cmath>
#include <tuple>

using std::cos; using std::sin;
using std::make_tuple; using std::tuple;

tuple<double, double> trans(double x, double y, double theta)
{
    double m = cos(theta)*x + sin(theta)*y;
    double n = -sin(theta)*x + cos(theta)*y;
    return make_tuple(m, n);
}

Таким образом, вам вообще не нужно использовать out-parameters.

На стороне вызывающего абонента вы можете использовать std::tie для распаковки кортежа в другие переменные:

using std::tie;

double xc, yc;
tie(xc, yc) = trans(1, 1, M_PI);
// Use xc and yc from here on

Hope это помогает!

7
ответ дан Michael Price 1 September 2018 в 07:36
поделиться

Вам нужно передать свои переменные по ссылке, что означает

void trans(double x,double y,double theta,double &m,double &n) { ... }
1
ответ дан Soufiane Hassou 1 September 2018 в 07:36
поделиться

, как сказано выше, вам нужно передать по ссылке, чтобы вернуть измененные значения «m» и «n», но ... рассмотреть возможность передачи всего по ссылке и использовать const для параметров, которые вы не хотите изменять внутри ваша функция, т.е.

void trans(const double& x, const double& y,const double& theta, double& m,double& n)
0
ответ дан timB33 1 September 2018 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: