Копирование динамически размещенного 2D-массива

0

У меня вопрос:

Я объявлял две переменные типа double-to-pointer **matrix1 и **matrix2 и выделял их new оператором, чтобы стать двумерными массивами. Сначала я использовал для цикла, чтобы matrix1 указывала на двойной тип данных, называемый element, затем matrix1 в matrix2, что означает, что matrix2 указывает на element. Тогда возникает проблема: я использовал оператор delete для завершения matrix1 после копирования, но тогда значение matrix2 указывает на то, что стало чрезвычайно странным. Я думаю, это было потому, что после удаления matrix1 element завершается, поэтому я думаю, что одно из решений позволяет matrix2 указывать на другой адрес со значениями, одинаковыми с элементом. Но я не знаю, как это сделать (скопировать элемент в новые динамические памяти и не исчезнет после удаления matrix1) эффективным способом, может кто-нибудь мне помочь? Спасибо.

void MatCpy(double **InMat, double **OutMat, int NumOfRow, int NumOfCol)
{
    for (int j = 0; j < NumOfRow; j++)
    {
        for (int i = 0; i < NumOfCol; i++)
        {
            OutMat[j][i] = InMat[j][i];
        }
    }
}

double **Malloc2D_Dbl(int row, int col)
{
    double **data = new double*[row];

    for (int i = 0; i < row; i++)
        data[i] = new double[col];

    return data;    
}

void load(char *load_path, double **data, int height, int width) // function for loading
{
    int i = 0, j = 0;
    char buffer[30];
    file_handle = fopen (load_path, "r");   
    for (int k = 0; k < width*height; k++)  
    {
        fscanf (file_handle, "%s", &buffer);  
        j = k / width;
        i = k % width;                
        data[j][i] = atof(buffer);   
    }   
    fclose (file_handle);
}

Извините, я ноб....

  • 1
    Можете ли вы добавить код для этого?
  • 0
    Добавление кода будет полезным. Однако теперь я могу представить, что дело в мелком копировании. Т.е. копирует только указатели на данные, а не сами данные.
Показать ещё 5 комментариев
Теги:
arrays

1 ответ

0

Более эффективным, чем копирование отдельных элементов, является использование memcpy следующим образом:

void MatCpy(double **InMat, double **OutMat, int NumOfRow, int NumOfCol) {
   for(int j=0; j<NumOfRow; j++) {
        memcpy(OutMat[j], InMat[j], NumOfCol*sizeof(double));
   }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню