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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2010, 16:53   #1
mannheimer
Новичок
Джуниор
 
Аватар для mannheimer
 
Регистрация: 02.03.2010
Сообщений: 4
По умолчанию Работа с массивами и функциями (С++)

Здравствуйте!
Сделал задачу, откомпилировал, запустил, но после ввода массивов приложение вылетает. DevC++ при отладке выдает следующее сообщение "Ваша программа вызвала нарушение доступа (ошибку сегментации)"

Вот сама задача:
"Даны две матрицы A(N,M), B(K,L). Найти максимальный элемент в каждой матрице и большим из них заменить меньший. Результат вывести. Задачу реализовать путем создания функций"


Вот листинг программы:
Код:
# include <iostream.h>
void input (int **a, int &str, int &sto, char name);
int search (int **a, int str, int sto, int &imax, int &jmax);
void change (int **a, int imax, int jmax, int max);
int output (int **a, int str, int sto, char name);
void deletearr (int **a, int str);
void input (int **a, int &str, int &sto, char name)
{
    int i,j;
    cout << "Vvod matricy " << name << "\n";
    cout << "Vvedite kol-vo strok ";
    cin >> str;
    cout << "Vvedite kol-vo stolbcov ";
    cin >> sto;
    cout << "\n";
    a = new int *[str];
    for (i=0; i < str; i++)
	a[i] = new int [sto];
    for (j=0; j < sto; j++)
        for (i=0; i < str; i++)
        {
            cout << name << "[" << i << "][" << j << "]= ";
            cin >> *(*(a+i) + j); 
        }
}
int search (int **a, int str, int sto, int &imax, int &jmax)
{
	int i, j, max;
	max = a[0][0];
	imax = 0;
	jmax = 0;
	for (j=0; j < sto; j++)
        for (i=0; i < str; i++)
        {
            if (*(*(a+i) + j) > max)
            {
		    max = *(*(a+i) + j); 
		    imax = i;
		    jmax = j;
	     }
        }
	return max;
}
void change (int **a, int imax, int jmax, int max)
{
	*(*(a+imax) + jmax) = max;
}
int output (int **a, int str, int sto, char name)
{
	int i, j;
	for (j=0; j < sto; j++)
        for (i=0; i < str; i++)
        cout << name << "[" << i << "][" << j << "]= " << *(*(a+i) + j);
}
void deletearr (int **a, int str)
{
	int i;
	for (int i=0; i < str; i++)
    {
        delete [] a[i];
    }
    delete [] a;
}
int main ()
{
    int **A;
    int **B;
    int maxA, maxB, imaxA, jmaxA, imaxB, jmaxB, N, M, K, L;
    input (A, N, M, 'A');
    input (B, K, L, 'B');
    maxA = search (A, N, M, imaxA, jmaxA);
    maxB = search (B, K, L, imaxB, jmaxB);
    if (maxA > maxB)
	change (B, imaxB, jmaxB, maxB);
    else
    { 
	change (A, imaxA, jmaxA, maxA);
    }
    output (A, N, M, 'A');
    output (B, K, L, 'B');
    deletearr (A, N);
    deletearr (B, K);
}
Подскажите, пожалуйста, у меня уже руки опускаются -- не могу выявить в чем же косяк.

Последний раз редактировалось mannheimer; 02.03.2010 в 16:58.
mannheimer вне форума Ответить с цитированием
Старый 02.03.2010, 17:02   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Протрассируйте, и посмотрите где прога вылетит. Скорее всего, где то за границы массива вылезли.
Кстати, не проще вместо *(*(a+i) + j) писать a[i][j]?
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 02.03.2010, 17:09   #3
mannheimer
Новичок
Джуниор
 
Аватар для mannheimer
 
Регистрация: 02.03.2010
Сообщений: 4
По умолчанию

При отладке вылетает на этой строчке, чем ставит в тупик:
Код:
max = a[0][0];
Компилятор DEV C++
P.S.
Цитата:
Сообщение от Greblin Посмотреть сообщение
Кстати, не проще вместо *(*(a+i) + j) писать a[i][j]?
Конечно проще, просто я себя к работе с указателями приучал =)
mannheimer вне форума Ответить с цитированием
Старый 02.03.2010, 17:49   #4
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

А, ну так всё правильно
Код:
void input (int **a, int &str, int &sto, char name)
передаёте A по значению, после работы функции у Вас мэйновская переменная A никак не изменяется, как в ней был мусор, так и остался
Измените описание функции на
Код:
void input (int **&a, int &str, int &sto, char name)
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 02.03.2010, 18:04   #5
Codemaster_N1
Новичок
Джуниор
 
Регистрация: 01.03.2010
Сообщений: 18
По умолчанию

в функции main() нужно инициализацию переменных A, B записать так:
Код:
int **A = new int*;
int **B = new int*;

Последний раз редактировалось Codemaster_N1; 02.03.2010 в 18:25.
Codemaster_N1 вне форума Ответить с цитированием
Старый 03.03.2010, 12:06   #6
mannheimer
Новичок
Джуниор
 
Аватар для mannheimer
 
Регистрация: 02.03.2010
Сообщений: 4
По умолчанию

Greblin, спасибо большое за подсказку. Проблема ушла.
mannheimer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
РАБОТА С ФУНКЦИЯМИ В С++ серг Помощь студентам 4 03.03.2010 22:26
работа с процедурами и функциями. Tanushka5606 Паскаль, Turbo Pascal, PascalABC.NET 2 06.05.2009 23:01
работа со строковыми процедурами и функциями pooharilo Паскаль, Turbo Pascal, PascalABC.NET 3 26.12.2008 23:51
Работа с функциями Worms Общие вопросы Delphi 1 02.12.2007 15:51