Для того, чтобы завершить предыдущие действительные ответы, я буду стараться расширить ответ:
Have I done it correctly?
Ну, для того, чтобы передать данные между функциями: да, делать это с указателями является опцией. Но это обычно обескураживает сообщество, потому что это затрудняет управление памятью.
Когда вы работаете с указателями, указывающими динамическую память, вы должны иметь четкое изображение WHERE, которое создается в памяти, и WHERE память будет удалена, другими словами: цикл жизни памяти должен быть ясным и простым и по этой причине пропущенные указатели между функциями обычно обескуражены.
Например, в вашем случае: функция unsigned int* step1(...)
возвращает указатель, но, глядя на него, новый программист или кто-то работает с вами, не сказал бы, если указатель Возвращается динамической памяти и, если вы звоните шаг1 должны delete
или delete []
память после вызова, то же самое касается unsigned char* step2(unsigned int* savedData, ...)
и будет более запутанной и хлопотной, потому что кто-то спросил бы: step2
изменит savedData
?
Для того, чтобы исправить step2
проблему, вы можете изменить функцию:
unsigned char* step2(const unsigned int* const savedData, ...)
путем добавления const
вы говорите: «Эй step2
не собирается изменять содержимое savedData
ни! изменяя адрес, на который он указывает ".
Но все предыдущие тексты бесполезны, так как не устраняют самую важную проблему: где освобождается память?
В step1
вы создаете память динамически, в памяти step2
эта память считывается, но ... delete
скрыт где-то в коде, который вы не вставляете? или есть step3
, ожидающий заботы о памяти?
Чтобы избежать все эти головные боли памяти, обычно рекомендуется использование STL контейнеров, как std::vector
, контейнер будет заботиться управления памятью для вас, в вашем случае:
typedef std::vector<int> intvector;
typedef std::vector<intvector> intintvector;
void step1(intintvector &Data, ...) {
...
// create data arrays
intvector data0, data1, data2, data3;
// fill data0, data1, data2, data3
// ...
// save data arrays.
Data.push_back(data0);
Data.push_back(data1);
Data.push_back(data2);
Data.push_back(data3);
}
void step2(const intintvector &savedData, ...) {
// read data arrays
intvector data0 = savedData[0];
intvector data1 = savedData[1];
intvector data2 = savedData[2];
intvector data3 = savedData[3];
// ...
}
В кратком изложении: Вы не используете правильную часть указателя, если не занимаетесь динамической памятью, поэтому вы должны исправить эту проблему или делегировать ее в контейнеры STL.
Надеюсь, это поможет! : D
'4 массива между функциями' У вас нет 4 массивов. У вас есть 1 массив, содержащий 4 элемента. –
Нет, data0-4 - это фактические массивы, динамически распределенные в функции. –
Я рекомендую прочитать некоторые [книги на C++] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –