Arhn - архитектура программирования

std::array для ошибки нарушения доступа к указателю

Я пытаюсь заставить свою функцию 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** не работает?

09.06.2013

  • В чем он не равен (помимо двойного указателя)? Вы получаете разные результаты, ошибки? 09.06.2013

Ответы:


1

Двумерный массив не распадается на двойной указатель. Он распадается на T*[]. Объяснение см. в этой теме.

Вам придется изменить неисправную строку на:

void Transpose(T* Data[], std::size_t Size)

или (чтобы можно было вывести длину)

template <typename T, std::size_t Size1, std::size_t Size2>
void Transpose(T (&Data)[Size1][Size2])
09.06.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..