Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерный массив и функция, Двумерный динамический массив указателем 
V
    Опции темы
Дшпыук
Дата 24.6.2010, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Не сплю
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 4.3.2010
Где: Омск

Репутация: нет
Всего: 1



Код

#include <iostream>
#include <stdlib.h>
#include <iomanip>

#define MATRIX_SIZE 6

using namespace std;

inline void fill_matrix(float **a){
    a = new float *[MATRIX_SIZE];
    for(int i = 0; i <= MATRIX_SIZE; ++i)
        a[i] = new float[MATRIX_SIZE];
        
    for(int i = 0; i <= MATRIX_SIZE; ++i)
    for(int j = 0; j <= MATRIX_SIZE; ++j){
        a[i][j] = rand();
    }
}

inline float track(float **a){
    float track_result = 0;
    for(int i = 0; i < MATRIX_SIZE; ++i){
        track_result += a[i][i];
    }
    return track_result;
}

inline void print_matrix(float **a){
    for(int i = 0; i < MATRIX_SIZE; ++i)
    for(int j = 0; j < MATRIX_SIZE; ++j){
        cout << setw(4) <<a[i][j];
    }
}

inline void del_matrix(float **a){
    for(int i = 0; i < MATRIX_SIZE; ++i)
        delete [] a[i];
    delete [] a;
}

int main (void)
{
    float **a, **b;
    cout << "Создание массивов" << endl;
    
    fill_matrix(a);
    fill_matrix(b);
    cout << "Заполнение матриц" << endl;
    
    if(track(a) > track(b)){
        print_matrix(b);
    }else{
        print_matrix(a);
        }

    del_matrix(a);
    del_matrix(b);
    cin.get();
    return 0;    
}


Прога компилится, но ругается на неразрешенное обращение(VS дебагер) тоесть как будто я обращаюсь к элементу за пределами массива, где моя ошибка?
Тренеруюсь работать с указателями, поэтому сильно не пинайте) Заранее благодарю за помощь.

Это сообщение отредактировал(а) Дшпыук - 24.6.2010, 13:23
PM MAIL ICQ   Вверх
triclosan
Дата 24.6.2010, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Создаете массив на MATRIX_SIZE элементов, обращаетесь к MATRIX_SIZE+1 элементу

Код

i < MATRIX_SIZE

PM MAIL   Вверх
mes
Дата 24.6.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Дшпыук @  24.6.2010,  12:02 Найти цитируемый пост)
 i <= MATRIX_SIZE

i < MATRIX_SIZE

Добавлено через 27 секунд
опоздал  smile 


--------------------
PM MAIL WWW   Вверх
Дшпыук
Дата 24.6.2010, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Не сплю
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 4.3.2010
Где: Омск

Репутация: нет
Всего: 1



Спасобо за поправку) Но несмотря на это вылетает та же ошибка. При том внешне вложенные в функции циклы по строению идентичны цыклам из функции создания, но он выполняется юез ошибок, а остальные показывают

"Необработанное исключение в "0x0040e01e" в "a.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000009"."
PM MAIL ICQ   Вверх
triclosan
Дата 24.6.2010, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Цитата(Дшпыук @  24.6.2010,  13:26 Найти цитируемый пост)
Необработанное исключение

Исключение, out_of_range?

Приведите пожалуйста ваш исправленный код
PM MAIL   Вверх
Дшпыук
Дата 24.6.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Не сплю
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 4.3.2010
Где: Омск

Репутация: нет
Всего: 1



Код

#include <iostream>
#include <stdlib.h>
#include <iomanip>

#define MATRIX_SIZE 6

using namespace std;

inline void fill_matrix(float **a){
    a = new float *[MATRIX_SIZE];
    for(int i = 0; i < MATRIX_SIZE; ++i)
        a[i] = new float[MATRIX_SIZE];
        
    for(int i = 0; i < MATRIX_SIZE; ++i)
    for(int j = 0; j < MATRIX_SIZE; ++j){
        a[i][j] = rand();
    }
}

inline float track(float **a){
    float track_result = 0;
    for(int i = 0; i < MATRIX_SIZE; ++i){
        track_result += a[i][i];
    }
    return track_result;
}

inline void print_matrix(float **a){
    for(int i = 0; i < MATRIX_SIZE; ++i)
    for(int j = 0; j < MATRIX_SIZE; ++j){
        cout << setw(4) <<a[i][j];
    }
}

inline void del_matrix(float **a){
    for(int i = 0; i < MATRIX_SIZE; ++i)
        delete [] a[i];
    delete [] a;
}


int main (void)
{
    float **a, **b;
    cout << "Создание массивов" << endl;
    
    fill_matrix(a);
    fill_matrix(b);
    cout << "Заполнение матриц" << endl;
    
    if(track(a) > track(b)){
        print_matrix(b);
    }else{
        print_matrix(a);
        }
    cin.get();
    
    del_matrix(a);
    del_matrix(b);
    return 0;    
}


Программа выводит обе строки, значит fill_matrix отрабатывает без ошибок. 
PM MAIL ICQ   Вверх
mes
Дата 24.6.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Дшпыук @  24.6.2010,  12:35 Найти цитируемый пост)
fill_matrix(float **a){
    a = new float *[MATRIX_SIZE]


У Вас теряется результат new.. Передавайте Ваш указатель на указатель через указатель (или ссылку)
 smile 


--------------------
PM MAIL WWW   Вверх
Дшпыук
Дата 24.6.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Не сплю
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 4.3.2010
Где: Омск

Репутация: нет
Всего: 1



А можно подробнее как это сделать?.. smile А то что то с лёту не доходит...

Добавлено через 5 минут и 16 секунд
В общем то решил, путём запихивания объявления в основной цикл. Но если не лень всё же покажите как должно было быть в старом коде, ибо интересно) smile 
PM MAIL ICQ   Вверх
mes
Дата 24.6.2010, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



проще и без путаницы выделить создание в отдельную функцию :
Код

inline float ** create_matrix(){
    float ** a = new float *[MATRIX_SIZE];
    for(int i = 0; i < MATRIX_SIZE; ++i)
        a[i] = new float[MATRIX_SIZE];
    return a; 
}

inline void fill_matrix(float **a){
    for(int i = 0; i < MATRIX_SIZE; ++i)
    for(int j = 0; j < MATRIX_SIZE; ++j){
        a[i][j] = rand();
    }
}



Это сообщение отредактировал(а) mes - 24.6.2010, 14:19


--------------------
PM MAIL WWW   Вверх
Дшпыук
Дата 24.6.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Не сплю
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 4.3.2010
Где: Омск

Репутация: нет
Всего: 1



Спасибо большое, всё заработало)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.