Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2011, 11:52   #1
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию Передача в функцию указателя на динамический массив

Задача с динамическим массивом в котором некоторые операции с массивом необходимо провести в отдельной функции. Ругается на строчку с matrix1[n1][m1] ... я как-то некорректно передаю в функцию указатель на массив?

Код:
//---------------------------------------------------------------------------
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
#include <vcl.h>
#pragma hdrstop

void CntAndSum(int **matrix1,int n1,int m1);
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
    int **matrix; //двойной указатель для создания дин. матрицы
    int i,j,n,m,k,flag=0;

    cout<< "Vvedite razmernost' matrix: ";     //задаем размерность матрицы
    cin>>n>>m;                  //n кол-во строк, m кол-во элементов в строке
    matrix = new int*[n];
    for (i=0;i<n;i++) matrix[i] = new int[m];

do{
    cout<<endl<<endl;
    cout<< "Sposob zapolneni9"<< endl;
    cout<< "1 - By hands"<< endl;    // ввести элементы матрицы вручную
    cout<< "2 - Random" << endl<<endl; //заполнить случайными цифрами
    cin>> k;

	switch(k)
	{ 
		case 1: cout<<endl<< "Zapolnite matrix"<<endl;
			for (i=0; i<n; i++)
			{
				for(j = 0;j<m;j++)
					cin>>matrix[i][j];
			}
                        flag = 1;
			break;
		case 2: cout<<endl<< "Matrix zapolnena (Random)"<<endl;
			randomize();
			for (i=0; i<n; i++)
			{
				for(j = 0;j<m;j++)
					matrix[i][j] = random(30)-15;
			}
                        flag = 1;
			break;
		default: cout<<endl<< "Error";
	}
	} while (flag !=1);
    cout<<endl<<endl;

    for (i=0; i<n; i++)
         {
	      for(j = 0;j<m;j++)
	      cout<<setw(4)<<setiosflags(ios::right)<<matrix[i][j]<<" ";
	      cout<<endl;
	 }

    CntAndSum(matrix,n,m);

	for (i=0; i<m; i++)
		{
			delete [] matrix[i];
		}
	delete [] matrix;

    getch();
    return 0;
}
//---------------------------------------------------------------------------

void CntAndSum(int **matrix1,int n1,int m1)
{
    int T,cnt=0,sum=0;
    cout<<"Enter T = ";
    cin>>T;
    cout<<endl<<endl;

      for (int i=0; i<n1; i++)
      {
	      for(int j = 0;j<m1;j++)
	      {
                   if (matrix1[n1][m1] == T)
                   {
                       cnt++;
                       sum=sum+T;
                   }
              }
      }

    cout<<"Kol-vo T("<<T<<") = "<<cnt<<endl;
    cout<<"Summa elementov ravnyh T = "<<sum<<endl;

}
Airou вне форума Ответить с цитированием
Старый 05.05.2011, 10:20   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Ругается на строчку с matrix1[n1][m1]
Правильно ругается.
Этой строчки тут вообще не должно быть. По логике должно быть
Код:
matrix1[i][j]
А так ты обращаешься, во-первых, к одному и тому же элементу каждое прохождение цикла, и, во-вторых (и "в-главных"), оба индекса при этом обращении лежат вне границ объявленного массива.
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 05.05.2011, 11:14   #3
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
А так ты обращаешься, во-первых, к одному и тому же элементу каждое прохождение цикла, и, во-вторых (и "в-главных"), оба индекса при этом обращении лежат вне границ объявленного массива.
Компилятор не может ругаться на подобную ошибку.
Это ошибка времени выполнения
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 05.05.2011, 11:52   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Компилятор не может ругаться на подобную ошибку.
Это ошибка времени выполнения
А кто тебе сказал, что ругается компилятор?
Попробуй сам -- компилируется без сучка и задоринки.
А вот во время выполнения вылетает Segmentation fault
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 05.05.2011, 17:07   #5
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Спасибо, такая глупая ошибка
Airou вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать Динамический массив в функцию? RainCat Помощь студентам 4 13.04.2011 11:25
Передача указателя на объект CodeNOT Общие вопросы C/C++ 7 06.01.2011 20:01
Передача указателя по цепочке (Си) mutabor Общие вопросы C/C++ 3 29.05.2010 16:29
Передача указателя на массив в функцию loser Общие вопросы C/C++ 2 19.02.2010 19:41
передача указателя в функцию arturka Помощь студентам 3 06.07.2008 00:25