Я пишу класс шаблона matrix
, который печатает как в файл, так и в std::cout
, то есть:
matrix<float> myMat;
...
myMat.cout(...) // print to std::cout
myMat.write("out.txt") // print to file
Оба будут иметь общую базовую функцию печати, которую я также пытаюсь реализовать в качестве шаблона, поскольку я видел разные примеры, использующие thrust::copy
для записи данных как в std::cout
, так и в файлы.
Ниже приведена схема того, что я сделал, но в настоящее время выводит мусор. Может ли кто-нибудь указать на некоторые ошибки, которые я, возможно, сделал? Например, могу ли я передавать std::cout
вот так?
template <typename data_T> matrix {
...
template <typename out_T> int printTo(out_T &out, ...) {
data_T *start = ..., *end = ...;
...
thrust::copy(start, end, std::ostream_iterator<data_T>(out, " "));
...
}
int cout(...) {
...
printTo(std::cout, ...);
...
}
int write(char* path, ...) {
...
std::ofstream file;
file.open(path);
printTo(file, ...);
...
}
}
Изменить:
- Изменение на
int printTo(std::ostream &out, ...) {...}
не решает проблему. - Дополнительная информация: я читаю данные в матрицу из
thrust::device_vector<T>
, скажем,dvec
, и преобразовываю их в указательdata_T
pvec
с помощьюthrust::raw_pointer_cast(&dvec[0])
(поскольку библиотека CUBLAS использует необработанные указатели). Затем я работаю сpvec
и хочу его распечатать. - Я пробовал печатать из указателя исходного
thrust::device_vector
напрямую (т.е.*dvec
), и это действительно работает:thrust::copy((*dvec).begin(), (*dvec).begin() + n ...)
. Так почему же я могу копировать только с помощью итераторов*dvec
, а не с помощью прямого приведения указателяpvec
?
printTo
шаблонной функцией. Просто пусть первый аргумент будет ссылкойstd::ostream
. - person Some programmer dude   schedule 05.05.2013int printTo(std::ostream &out, ...) {...}
, как и было предложено, но он все еще выводит мусор. Любые другие идеи? - person mchen   schedule 05.05.2013start
иend
? - person Some programmer dude   schedule 05.05.2013matrix
изthrust::device_vector<T>
, скажем,dvec
, и преобразовываю их вdata_T
указательpvec
с помощьюthrust::raw_pointer_cast(&dvec[0])
(поскольку библиотека CUBLAS использует необработанные указатели). Затем я работаю сpvec
и хочу его распечатать. - person mchen   schedule 05.05.2013thrust::device_vector
напрямую (т. е.*dvec
), и это действительно работает:thrust::copy((*dvec).begin(), (*dvec).begin() + n ...)
. Так почему же я могу копировать только из*dvec
, а не из необработанного указателяpvec
? - person mchen   schedule 05.05.2013pvec
печать первого элемента работает правильно, но каждый элемент после первого является мусором? Другими словами, итерация с использованием необработанного указателя может не учитывать некоторые базовые методы реализации структуры данных, которые компенсирует итерация с использованием фактического итератора. - person Jason   schedule 05.05.2013