Вернуть динамический массив в C ++ - PullRequest
0 голосов
/ 23 июня 2010

Мне нужно вернуть беззнаковое целое * из функции.Приведенный ниже код скомпилируется, но завершится сбоем во время выполнения на 64-битной машине Windows.Я знаю, что где-то совершаю глупую ошибку и может кто-то указать мне на это.:п.Я также объявил функцию в своем заголовке, так что я знаю, что это не та ошибка.

Обратите внимание, что я подверг цензуре имена и номера переменных, потому что проблема, в которой находится эта функция, еще не опубликована.

Функция:

 unsigned int* convertTime(unsigned int inputInteger, unsigned short inputFrac) {
    unsigned int* output = new unsigned int[2];
    double messageTimeFraction = double(inputFrac) * 20e-6;

    output[1] = unsigned int(inputInteger + 2209032000);
    output[2] = unsigned int(messageTimeFraction * 2e32);

    return output; // Seconds
}

Реализация:

unsigned int* timeStamp;
timeStamp = convertTime(inputInteger,inputFrac);

Ответы [ 7 ]

8 голосов
/ 23 июня 2010

Ну, для начала у вас есть output[1] и output[2].Массивы индексируются нулями в c / c ++, поэтому они должны быть: output[0] и output[1].

Но, поскольку вы спрашиваете о c ++ ... Я призываю вас использовать std::vector илиstd::pair.

(Конечно, для удобства чтения вы можете просто использовать тривиальную структуру с полезными именами полей)

6 голосов
/ 23 июня 2010

Я знаю, что где-то совершаю глупую ошибку и может кто-то указать мне на это

Конечно, и это не имеет никакого отношения к теме вопроса:

output[2] = unsigned int(inputFrac * 2e32);

В output указаны правильные значения [0] и [1] - индексирование выходит за пределы.Результаты «неопределенного поведения» (например, наблюдаемый сбой).

0 голосов
/ 24 июня 2010

Я создал временную структуру для различных форматов и написал функции конвертера для обработки преобразований.Используя структуры, мне не нужно беспокоиться об утечках памяти и улучшенной читаемости.Более того, код теперь более масштабируем, чем использование динамических массивов, поскольку я могу добавлять больше полей и создавать новые форматы времени.

struct time{
    unsigned int timeInteger;
    unsigned int timeFraction;
}time_X, time_Y;

Моя глупая ошибка заключалась в опечатке, основанной на индексации с нуля, но большей ошибкой было использованиединамический массив.

0 голосов
/ 23 июня 2010

Более обычный способ написания таких функций в стиле C - передать ссылку на переменную, которая будет установлена.

Для удобства вы возвращаете выходной буфер, чтобы функция могла легкобыть использованы в выражении.

unsigned int* convertTime(unsigned int* output, unsigned int inputInteger, unsigned short inputFrac) {
  double messageTimeFraction = double(inputFrac) * 20e-6;

  output[0] = unsigned int(inputInteger + 2209032000);
  output[1] = unsigned int(inputFrac * 2e32);

  return output; // Seconds
}

// later
unsigned int seconds[2];
unsigned int* pseconds;
pseconds = convertTime(seconds,a,b);
0 голосов
/ 23 июня 2010

использовать output[0] и output[1], массивы C / C ++ равны 0 -

0 голосов
/ 23 июня 2010

Массивы в C ++ основаны на нуле, поэтому элементы вашего массива размером два output[0] и output[1]

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

Также странно то, что вы делаете - 2209032000 - это количество секунд в 70 лет и результат умножения короткого замыкания на 2e32переполнит размер беззнакового целого.

0 голосов
/ 23 июня 2010

Индексами в массиве из 2 элементов являются array [0] и array [1], поэтому измените его на:

output[0] = unsigned int(inputInteger + 2209032000);
output[1] = unsigned int(inputFrac * 2e32);
...