C ++: доступ к значениям переменных, указанным массивом двойных указателей, переданным в качестве аргумента функции - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь получить доступ к значениям, указанным указателями в двумерном массиве двойных указателей, переданных в качестве аргументов функции

float cfun (float **indatav, int rows, int cols)
{
    float* *outdatav = new float*[rows];
    for (int i=0; i < rows; i++){
        outdatav[i] = new float[cols];
    }

    for (int i=0; i < rows; i++){
        for (int j=0; j < cols; j++){
            outdatav[i][j] = *(*(indatav[i])[j]);
            }
    }

    return outdatav;
}

Я пробовал несколько вариантов, но ни один из них не работает.Этот вариант кажется мне наиболее правильным, но он не работает, и я не понимаю, почему.Любая подсказка или объяснение будет высоко ценится.

Я знаю, что outdatav[i][j] = indatav[i][j]; с типом возврата float** может работать, но это не то, что я ищу, потому что в этом случае функция будет возвращать адрес памяти двойных указателей, в то время какЯ ищу значения переменных, указанных этими указателями.

Воспроизводимый пример:

#include <iostream> 
#include <vector>
using namespace std;

//float cfun (float **indatav, int rows, int cols)
float** cfun (float **indatav, int rows, int cols)
{
    float** outdatav = new float*[rows];
    for (int i=0; i < rows; i++){
        outdatav[i] = new float[cols];
    }

    for (int i=0; i < rows; i++){
        for (int j=0; j < cols; j++){
            outdatav[i][j] = *(*(indatav[i])[j]);
        }
    }
    return outdatav;
}

int main(){

//  float indatav[2][2] = {{1.,2.};{3;4}} // WRONG!
    float indatav[2][2] = {{1.,2.},{3,4}};// RIGHT!
    int rows = 2, cols = 2;

//  float y[2][2] = cfun(**indatav, rows, cols); // Try compiling this!
    float **y = cfun(indatav, rows, cols); // THIS DOES WHAT YOU ARE AKSING!
    return 0;
}

Где y будет иметь значения {{1.,2.},{3,4}}.// Обратите внимание на изменения

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

После долгого обсуждения я понял, что неправильно передаю аргументы в функциях и путаюсь с указателями и типами данных.Вот окончательный ответ:

#include <iostream>
#include <vector>
using namespace std;

float** cfun (float **indatav, int rows, int cols) 
{
    float* *outdatav = new float*[rows];
    for (int i=0; i < rows; i++){
        outdatav[i] = new float[cols];
    }

    for (int i=0; i < rows; i++){
        for (int j=0; j < cols; j++){
            outdatav[i][j] = indatav[i][j]; 
            }
    }
    return outdatav; 
}

int main(){

    int rows = 2, cols = 2;
    float list[rows][cols]= {{1.,2.},{3.,4.}};

    float* *indatav = new float*[rows];
    for (int i=0; i < rows; i++){
        indatav[i] = new float[cols];
    }

    for (int i=0; i < rows; i++){
        for (int j=0; j < cols; j++){
          indatav[i][j]=list[i][j];
        }
    }

    float **y = cfun(indatav, rows, cols);

    for(int i=0; i<rows; i++){
      for(int j=0; j<rows; j++){
        cout << y[i][j] <<endl;
      }
    }

    return 0;
}

Очевидно, я открыт для любого более изящного решения основной функции.

0 голосов
/ 29 сентября 2019

Вам кажется очень удобным, когда вы правильно разыменовываете свой outdatav 2D-массив, так почему же вы думаете, что к indatav 2D-массиву следует относиться иначе?Попробуйте следующее исправление в две строки:

float** cfun (float **indatav, int rows, int cols) // Now return 2D pointer!
{
    float* *outdatav = new float*[rows];
    for (int i=0; i < rows; i++){
        outdatav[i] = new float[cols];
    }

    for (int i=0; i < rows; i++){
        for (int j=0; j < cols; j++){
        //  outdatav[i][j] = *(*(indatav[i])[j]);
            outdatav[i][j] = indatav[i][j]; // Why don't you think this will work?
            }
    }

    return outdatav; // Note change in function declaration!
}

В конце концов, и outdatav, и indatav имеют точно одинаковые объявления - оба float**.

В вашем отредактированном вопросе у вас теперь есть вызов: y = cfun(**indatav, rows, cols);, и вы добавляете

Где y будет иметь значения {{1., 2.}, {3; 4}}

Это точно как я интерпретировал то, что вы хотите.Вам необходимо объявить вашу переменную "y" следующим образом: float** y, а фактическое значение для данных в строке 0 и столбце 1 будет задано выражением y[0][1].Тем не менее, ваш звонок на cfun неправильный и должен быть: y = cfun(indatav, rows, cols); для приведенного вами примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...