2012-02-26 1 views
0

Моя проблема в следующем: я делаю указатель на динамический двухмерный массив в куче. Это делается в подфункции «Производство», которая заполняет элементы таблицы (массива) и возвращает указатель массива на main(). Там я хочу указать указатель как параметр для другой функции «PrintTable»; который cout's стол. Моя проблема в том, что возвращаемый указатель на самом деле является одномерным массивом (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; 
} 

в основном() я позволяю возвращаемую точку указателя на указатель productiontable так оно существует в основном.

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

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

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?

+0

Если вы используете '**' в C++, есть хороший шанс, что вы делаете что-то неправильно. Вы должны решительно рассмотреть использование контейнеров. –

+0

, тогда скажите мне, как я должен сделать указатель на динамический 2-мерный массив. Существует не так много альтернатив. – Rps

+0

'std :: vector >' есть одна возможность. 'boost :: multi_array ' другой. –

ответ

1

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

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

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

+0

спасибо большое! Это сработало отлично. – Rps

0

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

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

Похоже, что 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; 
} 
Смежные вопросы