Я пытаюсь заставить свою функцию Transpose принимать указатели вместо std::arrays
. И причина, по которой я хочу это сделать, заключается в том, что тогда я могу передать указатель или std::array
через функцию .data()
.
В настоящее время у меня есть следующее, и он работает с использованием массивов 2D и 1D для переноса на место или в новый массив. Однако преобразование приведенного ниже кода для получения указателей вместо этого дает ошибку нарушения доступа к памяти.
Может кто-нибудь объяснить разницу и почему приведенное ниже не равно моим версиям указателя (ниже этого):
#include <iostream>
#include <array>
template<typename T, std::size_t Size>
void Transpose(std::array<T, Size> &Data)
{
int Width = sqrt(Size);
for (int I = 1; I < Width; ++I)
{
for (int J = 0; J < I; ++J)
{
std::swap(Data[I * Width + J], Data[J * Width + I]);
}
}
}
template<typename T, std::size_t Size>
void Transpose(std::array<std::array<T, Size>, Size> &Data)
{
for (int I = 0; I < Size; ++I)
{
for (int J = 0; J < I; ++J)
{
std::swap(Data[I][J], Data[J][I]);
}
}
}
Однако преобразование в приведенное ниже не работает, когда я использую указатель: S
template<typename T>
void Transpose(T* Data, std::size_t Size)
{
int Width = sqrt(Size);
for (int I = 1; I < Width; ++I)
{
for (int J = 0; J < I; ++J)
{
std::swap(Data[I * Width + J], Data[J * Width + I]);
}
}
}
template<typename T>
void Transpose(T** Data, std::size_t Size)
{
for (int I = 0; I < Size; ++I)
{
for (int J = 0; J < I; ++J)
{
std::swap(Data[I][J], Data[J][I]);
}
}
}
Кто-нибудь может объяснить разницу и почему T**
не работает?