передача возвращенного указателя динамического двумерного массива в подфункцию и обращение к массиву - PullRequest
0 голосов
/ 26 февраля 2012

Моя проблема заключается в следующем: я делаю указатель на динамический двумерный массив в куче.Это делается в подфункции «Производство», которая заполняет элементы таблицы (массива) и возвращает указатель массива в main ().Там я хочу дать указатель в качестве параметра для другой функции «PrintTable»;какой кут это стол.Моя проблема заключается в том, что возвращаемый указатель на самом деле является одномерным массивом (c ++), и я не знаю, как обратиться к нему, чтобы получить вторую строку массива .. Позвольте мне попытаться объяснить это вам:

Итак, сначала у меня есть функция, которая возвращает указатель на двумерный массив.

int* Production(int num1, string name1[], int num2, string name2[])
{

int** productionTable=new int*[num1];
for (int i = 0; i < num1; i++)
{
      productionTable[i] = new int[num2];
}


for (int i=0;i<num1;i++)
{
cout << "\nGive production " << name1[i]<<endl;
for (int j=0;j<num2;j++)
{
    cout << "On " << name2[j] << " : ";
    cin >> productionTable[i][j];
}
}
return* productionTable;
}

в main () Я позволил возвращенному указателю указать производную таблицу указателей, чтобы она существовала в main.

int* productionTable=Production(num1, name1[], num2, name2[])

Затем я вызываю функцию printTable (), которая должна вывести двумерный массив в виде таблицы.поэтому я хочу использовать этот указатель в качестве аргумента для другой функции;чтобы отслеживать элементы из этого массива.

PrintTable(num1, name1[], num2, name2[], productionTable);

Эта функция выглядит следующим образом:

void printTable(int num1, string name1[], int num2, string name2[],int* productionTable)
{
cout << left <<setw(10)<< "";
for (int i=0;i<num2;i++)
{
    cout << left <<setw(10)<< name2[i];
}
cout<<endl;
for (int i=0;i<num1;i++)
{
cout << setw(10)<<name1[i]<<"";
for (int j=0;j<num2;j++)
{
    cout << left <<setw(10)<< productionTable[i+j];

}cout<<endl;
}
}

Моя проблема в том, что я не могу заставить функцию правильно выводить вторую строку.Как мне указать второй параметр массива?Пока я прочитал, я должен указать в таблице [COLindex * COL_size + ROWindex].Я попробовал, но не заставил его напечатать второй ряд.Каким должен быть параметр COL_size?

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Это ваша проблема:

int** productionTable=new int*[num1];
...
return* productionTable;

По сути, при возврате вы возвращаете только первую строку (или указатель на нее), отбрасывая оставшуюся часть таблицы. Чтобы заставить его работать, вы могли бы объявить Production и productionTable (во всех местах) как int**, return productionTable в Production и использовать productionTable[i][j] для поиска элемента.

0 голосов
/ 26 февраля 2012

Мне не удалось в полной мере разобраться с созданием вашей таблицы, так что там вполне могут быть проблемы.Однако, если взглянуть на конечный бит, кажется, что вы пытаетесь напечатать одномерный массив в двух измерениях, что просто, вам просто нужно отслеживать, как далеко вы находитесь в массиве в каждой строке.

Для каждой строки необходимо сместить индекс столбца на (количество столбцов * количество уже напечатанных строк).

Похоже, num1 - это общее количество строк, а num2общее количество столбцов.i - количество уже завершенных строк.Поэтому i*num2 - это смещение, необходимое для чтения строки, которую вы пытаетесь распечатать.

for (int i=0;i<num1;i++)
{
  cout << setw(10)<<name1[i]<<"";
  for (int j=0;j<num2;j++)
  {
    cout << left <<setw(10)<< productionTable[i*num2+j];
  }
  cout<<endl;
}
...