Не иметь доступа к массиву после вызова функции - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь изменить значение ydot [] в func (), чтобы я мог использовать его в своей функции ode ().Однако, похоже, у меня больше нет доступа к ydot [] после вызова func ().Я передаю func () в ode () как указатель на функцию dydt.Вот мои две функции:

    void func(double t, double y[], double ydot[])
    {
        for(int i = 0; i < 18; i++){
            ydot[i] = y[i]+1;
        }
    }

    typedef void (*dydt_func)(double t, double y[ ], double ydot[ ]);

    void ode(double y0[ ], double yend[ ], int len, double t0,
             double t1, dydt_func dydt)
    {
        double ydot[len];

        dydt = &func;

        //This prints out all the value of ydot[] just fine
        for (int i = 0; i < 18; i++){
            cout << ydot[i] << ",";
        }

        dydt(t1, y0, ydot);

        //This SHOULD print all the revised value of ydot[]
        //But I get an error instead:
        //Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

        for (int i = 0; i < 18; i++){
            cout << ydot[i] << ",";
        }
    };

У меня есть доступ к ydot [] как раз перед вызовом dydt ().Что-то не так с тем, как я использую указатель функции?Или я должен передать указатель ydot [] или что-то в func () вместо этого?Спасибо ребята за помощь!

1 Ответ

0 голосов
/ 22 сентября 2018

C ++ не имеет массивов переменной длины, как в C, поэтому вам нужно использовать new для выделения массива с переменным размером или использовать std::vector вместо массива.

Вам нужно передать размер массива func, чтобы он мог ограничить количество элементов, которые он обновляет, до этого размера.Ваш код будет иметь неопределенное поведение, если длина массива меньше 18.

void func(double t, double y[], double ydot[], int len)
{
    for(int i = 0; i < len; i++){
        ydot[i] = y[i]+1;
    }
}

typedef void (*dydt_func)(double t, double y[ ], double ydot[ ], int len);

void ode(double y0[ ], double yend[ ], int len, double t0,
         double t1, dydt_func dydt)
{
    double *ydot = new double[len];

    dydt = &func;

    //This prints out all the value of ydot[] just fine
    for (int i = 0; i < 18; i++){
        cout << ydot[i] << ",";
    }

    dydt(t1, y0, ydot, len);

    for (int i = 0; i < len; i++){
        cout << ydot[i] << ",";
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...