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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как создать двухмерный динамический массив? 
V
    Опции темы
Gunslinger
Дата 3.3.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Привет.
Знаю, как создавать только одномерные. Этот код сделал, просматривая аналогичные темы, поэтому не уверен в его правильности.
Задача: создать 2хмерный массив по размерностям, введенным пользователем. В течении работы программы массив не изменяется. Массив не обязательно квадратный.
Код

       int x;
       int y;    
       cin >> x;//--ооп убрал для легкости кода
       cin >>y;

    int** mass = new int*[x];
    for (int i = 0; i <= x; i++) 
                 for (int j = 1; j <= y; j++)   
                           mass[i][j] = new int [j];
                                                          

з.ы. код для билдера, вектором пользоваться не умею, как подключить stl - не знаю. так что vector не советуйте.
PM MAIL   Вверх
bsa
Дата 3.3.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Учимся пользоваться поиском: [FAQ] Динамические массивы

Добавлено через 51 секунду
Цитата(Gunslinger @ 3.3.2009,  11:42)
з.ы. код для билдера, вектором пользоваться не умею, как подключить stl - не знаю. так что vector не советуйте.

Это минус. Учись!
PM   Вверх
Gunslinger
Дата 3.3.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



#include<vector.h> 
если      
Код

vector<int> mass[5][5];

то ошибок нет.
если
Код

int r=5;
vector<int> mass[r][r];

ошибки:
E2313 Constant expression required
E2313 Constant expression required

PM MAIL   Вверх
azesmcar
Дата 3.3.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата

vector<int> mass[5][5];


это ты матрицу векторов создаешь.

Код

#include <vector>

int main()
{
   //создать вектор (массив)
   std::vector<int> vec;

   //добавить элементы
   vec.push_back( 1 );
   vec.push_back( 2 );
   vec.push_back( 3 );

   //поиск по вектору и изменение значения
   std::vector<int>::iterator it = std::find(vec.begin(), vec.end(), 2);
   *it = 4;

   //поиск и удаление из вектора
   it = std::find(vec.begin(), vec.end(), 1);
   vec.erase(it);
   
   //очистка вектора
   vec.clear();

   //вывод вектора в консоль
   for (std::vector<int>::iterator i = vec.begin(); i != vec.end(); ++i)
      std::cout << *it << std::endl;

   //вывод вектора в консоль - другой способ
   std::copy(vec.begin(), vec.end(), std::ostream_iterator(std::cout, "\n"));
}


Добавлено через 2 минуты и 19 секунд
а матрица тебе не нужна, вектор вполне ее заменяет.

к примеру если нужна матрица 8х8, заполнаешь 64 элемента вектора..а далее мат. операции с индексами.
PM   Вверх
Anikmar
Дата 3.3.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



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

Создание квадратной матрицы:
Код

int **MatrixA;
int SizeMatrix = 5;

void CreateMatrix(void)
{
    MatrixA = new int *[SizeMatrix];
    for(int i=0;i<SizeMatrix;i++) MatrixA[i] = new int[SizeMatrix];
}



Добавлено через 1 минуту и 15 секунд
Чуть не забыл: учимся убирать за собой
Код

void DeleteMatrix(void)
{
    for(int i=0;i<SizeMatrix;i++) delete[] MatrixA[i];
    delete[]MatrixA;
}


PM MAIL ICQ   Вверх
azesmcar
Дата 3.3.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата

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


согласен, да и знать не повредит, в моей практие бывали случаи когда СТЛ низя ) на Си надо было писать..знания никому не помешают..
PM   Вверх
Gunslinger
Дата 3.3.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Цитата(Anikmar @  3.3.2009,  12:50 Найти цитируемый пост)
Создание квадратной матрицы:
Код

int **MatrixA;
int SizeMatrix = 5;
void CreateMatrix(void)
{
    MatrixA = new int *[SizeMatrix];
    for(int i=0;i<SizeMatrix;i++) MatrixA[i] = new int[SizeMatrix];
}



Создали строку (размерность х). Затем к каждому элементу строки создали еще одну строку (размерность у).
PM MAIL   Вверх
GoldFinch
Дата 3.3.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



%)
2мерный (и N мерный) массив делается из 1мерного, 
[x,y]=[y*cx+y]
массивы указателей на массивы - редкостный бред
PM MAIL ICQ   Вверх
Anikmar
Дата 3.3.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(GoldFinch @  3.3.2009,  15:01 Найти цитируемый пост)
массивы указателей на массивы - редкостный бред 

Вам виднее, наверное. Вот только создателям С++ надо вашу точку зрения надо обязательно донести.

Если вы создадите динамический двухмерный массив как одномерный - как вы будете использовать стандартный синтаксис вида [][]?

Добавлено через 5 минут и 6 секунд
Цитата(azesmcar @  3.3.2009,  12:53 Найти цитируемый пост)
согласен, да и знать не повредит, в моей практие бывали случаи когда СТЛ низя ) на Си надо было писать..знания никому не помешают.. 

Дело в том, что многие увлекаются STL считая ее панацеей и не следя за собственным кодом. Надо просто четко знать в каких случаях ее целесообразно применить.
Если создается несколько десятков разных типов, затем запихиваются в вектора никто и не думает, что для каждого типа создается по сути свой экземпляр класса и лучше подумать как минимизировать их количество. С другой стороны многие зачем-то пишут свою сортировку, забыв о наличии STL и ее алгоритмов.
PM MAIL ICQ   Вверх
bsa
Дата 3.3.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Gunslinger, ты не прочитал ту тему, ссылку на которую я тебе дал? Там же я разжевывал все возможные (на мой взгляд) варианты.
PM   Вверх
azesmcar
Дата 3.3.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата

Вам виднее, наверное. Вот только создателям С++ надо вашу точку зрения надо обязательно донести.

 smile

Цитата

Если вы создадите динамический двухмерный массив как одномерный - как вы будете использовать стандартный синтаксис вида [][]?


синтаксис этого типа поддержать не получиться конечно, но как обратиться с помощью x-y он написал. Думаю тут дело вкуса. Смотря для чего как. Мне для шашек легче было одномерный хранить. 

Цитата

Дело в том, что многие увлекаются STL считая ее панацеей и не следя за собственным кодом. Надо просто четко знать в каких случаях ее целесообразно применить.
Если создается несколько десятков разных типов, затем запихиваются в вектора никто и не думает, что для каждого типа создается по сути свой экземпляр класса и лучше подумать как минимизировать их количество. С другой стороны многие зачем-то пишут свою сортировку, забыв о наличии STL и ее алгоритмов.


STL штука хорошая конечно, но в неумелых руках она может привезти к потере эффективности. Потому всем кто собирается его учить - Майерса читать обязательно.

Anikmar, кстати как задачу для новичков можно дать что-то типа стл контейнера для 2х мерного массива. С поддержкой синтаксиса [][]

Это сообщение отредактировал(а) azesmcar - 3.3.2009, 15:52
PM   Вверх
Anikmar
Дата 3.3.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(azesmcar @  3.3.2009,  15:49 Найти цитируемый пост)
синтаксис этого типа поддержать не получиться конечно, но как обратиться с помощью x-y он написал. Думаю тут дело вкуса. Смотря для чего как. Мне для шашек легче было одномерный хранить. 


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


Цитата(azesmcar @  3.3.2009,  15:49 Найти цитируемый пост)
Anikmar, кстати как задачу для новичков можно дать что-то типа стл контейнера для 2х мерного массива. С поддержкой синтаксиса [][]


Не понял вопроса. Вы имеете в виду как будет выглядеть код? Например такой:
Код

    vector<vector<int> > a(10,vector<int>(10));

    for (int i=0;i<10;i++)
        for(int j=0;j<10;j++)
            a[i][j] = i*j;

    for (int i=0;i<10;i++)
    {
        for(int j=0;j<10;j++) printf("%d ",a[i][j]);
        printf("\n");
    }



PM MAIL ICQ   Вверх
azesmcar
Дата 3.3.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата

Не понял вопроса. Вы имеете в виду как будет выглядеть код? Например такой:


ну, это не совсем вопрос, а скорее предложение. Ты сказал

Цитата

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


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

Добавлено через 1 минуту и 28 секунд
хорошая задачка для освоения работы с матрицами и массивами.
PM   Вверх
Anikmar
Дата 3.3.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(azesmcar @  3.3.2009,  16:07 Найти цитируемый пост)
задачка написать шаблонный класс - для матрицы. Типа вектора, но чтобы хранил матрицу, и с стандартными операторами и поддержкой [][].

Я не предлагал писать шаблонные классы. Я предлагал создавать динамические массивы ручками, а затем при помощи STL - чтобы прочуствовать разницу.

А задача написания шаблонного класса для матрицы - это из разряда вообще написать шаблонный класс. Готовые шаблоны для матриц наверняка уже существуют, зачем изобретать велосипед, а матрицу на векторах я уже показал.
PM MAIL ICQ   Вверх
azesmcar
Дата 3.3.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата

Я не предлагал писать шаблонные классы. Я предлагал создавать динамические массивы ручками, а затем при помощи STL - чтобы прочуствовать разницу.


я знаю, это я предложил smile наверное непонйятно выразился. Я имел ввиду новичкам давать такую задачу, для практики.

Цитата

А задача написания шаблонного класса для матрицы - это из разряда вообще написать шаблонный класс. Готовые шаблоны для матриц наверняка уже существуют, зачем изобретать велосипед, а матрицу на векторах я уже показал.


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


PM   Вверх
Anikmar
Дата 3.3.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(azesmcar @  3.3.2009,  16:21 Найти цитируемый пост)
для практики..новичкам вообще полезно изобретать велосипеды по моему, лучше поймут как все устроено и как работает. Я же не говорил давай мы с тобой напишем   


Мне кажется сложновато. Я вообще-то сам не особый знаток шаблонов и хороший шаблонный класс быстро не напишу. А вообще мысль достаточно интересная - вот где синтаксис поизучать можно.
PM MAIL ICQ   Вверх
mes
Дата 3.3.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GoldFinch @  3.3.2009,  14:01 Найти цитируемый пост)
2мерный (и N мерный) массив делается из 1мерного, 
[x,y]=[y*cx+y]
массивы указателей на массивы - редкостный бред 

Дело в том, что сишний 2х мерный динамический массив - это гораздо больше, чем просто 2х-мерный массив.
Такой подход позволяет каждой "строке" массива иметь свою длину. Или просто рассматривать строку, как самостоятельный массив. 
Но ничто не мешает  использовать одномерный массив как псевдо-двухмерный и такой подход также имеет право на жизнь, но теряется рад преимуществ.
Так что все зависит от задачи и использование слова "бред" в том контексте считаю необоснованным.  smile 

Это сообщение отредактировал(а) mes - 3.3.2009, 16:55


--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 3.3.2009, 16:57 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(mes @  3.3.2009,  16:53 Найти цитируемый пост)
и использование слова "бред" в том контексте считаю необоснованным.   

+1   smile 

Именно так.
PM MAIL ICQ   Вверх
GoldFinch
Дата 3.3.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Цитата(mes @  3.3.2009,  16:53 Найти цитируемый пост)
Такой подход позволяет каждой "строке" массива иметь свою длину. 

это уже чтото похожее на дерево (скоре куст), но массивом я бы это не назвал

кроме того в 1м посте ТС написал что ему нужна прямоугольная матрица, а не непоймичто со строками разной длины, неэффективным использованием памяти и большим временем доступа и обхода

алсо при небольших размерах матрицы такие задачи решаются использованием статической матрицы максимального размера

Добавлено через 3 минуты и 1 секунду
...так что в контексте ЭТОЙ задачи, динамический одномерный массив динамических одномерных массивов это бред.

Это сообщение отредактировал(а) GoldFinch - 3.3.2009, 17:18
PM MAIL ICQ   Вверх
Gunslinger
Дата 3.3.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Цитата(bsa @  3.3.2009,  15:17 Найти цитируемый пост)
Gunslinger, ты не прочитал ту тему, ссылку на которую я тебе дал? Там же я разжевывал все возможные (на мой взгляд) варианты. 

прочитал еще до того, как тему запостил. затем перечитал. Разжевано, да. Но... привычка! Сейчас делаю по старинке - на неделе будет время, почитаю про векторы, перепишу с ними.

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


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


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

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



Цитата(GoldFinch @  3.3.2009,  16:18 Найти цитируемый пост)
так что в контексте ЭТОЙ задачи,

Интересно откуда такие подробные сведения о задаче ?  
Мне личного встретившегося в тексте описания не хватило, чтоб сделать такое однозначное заключение.  smile 

Цитата(GoldFinch @  3.3.2009,  16:18 Найти цитируемый пост)
кроме того в 1м посте ТС написал что ему нужна прямоугольная матрица,

Но не сказано для чего она будет использована.

Цитата(GoldFinch @  3.3.2009,  16:18 Найти цитируемый пост)
неэффективным использованием памяти и большим временем доступа и обхода

Будем экономить до каждого такта или может в большинстве случаев достаточно просто не злоупотреблять ?!

Цитата(GoldFinch @  3.3.2009,  16:18 Найти цитируемый пост)
алсо при небольших размерах матрицы такие задачи решаются использованием статической матрицы максимального размера

о! a как же в этом случае поступим с неэффективным использованием памяти ?!

Цитата(GoldFinch @  3.3.2009,  16:18 Найти цитируемый пост)
..так что в контексте ЭТОЙ задачи, динамический одномерный массив динамических одномерных массивов это бред.

Вы дважды употребили это слово по отношению к обсуждаемому предмету. Т.е. Вы утверждаетеи абсолютно, что недостатки  от выбора этого метода значительно превышают преимущества такого подхода?! Или Вам просто нравится голословно (да именно голословно, так как ни одного стоящего факта Вы не привели, подтверждающего именно бредовасть обсуждаеммого подхода) привлекать внимание к своим постам и разводить оффтопик ?!





--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 3.3.2009, 18:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Gunslinger @  3.3.2009,  11:42 Найти цитируемый пост)
Задача: создать 2хмерный массив по размерностям, введенным пользователем. В течении работы программы массив не изменяется. Массив не обязательно квадратный.

Цитата(GoldFinch @  3.3.2009,  17:18 Найти цитируемый пост)
...так что в контексте ЭТОЙ задачи, динамический одномерный массив динамических одномерных массивов это бред.


Автор топика попросил рассказать как создать 2-х мерный массив - так как одномерный у него получился. Таким образом он не просил рассказать как работать с одномерным массивом эмулируя двухмерный, а просил показать именно как создать динамически нормальный двухмерный массив.

Цитата(GoldFinch @  3.3.2009,  17:18 Найти цитируемый пост)
кроме того в 1м посте ТС написал что ему нужна прямоугольная матрица, а не непоймичто со строками разной длины, неэффективным использованием памяти и большим временем доступа и обхода

Пример с квадратной матрицей оставил сознательно, чтобы человек попробовал сам модифицировать пример

Цитата(GoldFinch @  3.3.2009,  17:18 Найти цитируемый пост)
неэффективным использованием памяти и большим временем доступа и обхода

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

Большее время доступа - уже неоднократно сравнивались два подхода, скорость доступа по указателю с использования только сложения без применения умножения выше.

Данный подход к созданию динамических массивов описан в литературе по С++, следовательно авторы типа Страуструпа и Лафоре - лохи, и не знаю, что бредят. Они во время не проконсультировались у GoldFinch, поэтому понаписали всякой бредятины и еще молодежь этому учат.

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

Если GoldFinch очень любит слово "бред" я не смею ему препятствовать - у каждого свои пристрастия и чувства другого следует уважать.
PM MAIL ICQ   Вверх
azesmcar
Дата 3.3.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



GoldFinch
У каждого свои пристрастия, и у каждой задачи свои решения. В некоторых случаях удобнее использовать динамические, в некоторых статические. Я писал программы для устройства с процессором 70 мегагерц и памятью несколько мегабайт причем на ней еще был загружен юникс. И за каждый лишний байт надо было отвечать по всей строгости закона. А бывали задачки когда смена деления на 2 в цикле на битовое смещение снизило время работы программы с трех до одной секунды. Давайте не будем так однозначно судить о возможностях С/С++ и называть это бредом. Если в известных книгах не написано - Матрицы это бред!! значит это не так, поверь что те люди которые их пишут немного глубже тебя и меня изучили предметную область

Это сообщение отредактировал(а) azesmcar - 3.3.2009, 18:37
PM   Вверх
Anikmar
Дата 3.3.2009, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Этот спор мы уже проходили, на самом деле.

Откопал свой тест. Итак имеем 2 массива размерностью 10000х10000.
Один создаем как правильно и работаем стандартно, второй создаем тоже правильно, но вычисляем индексы динамически.

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

Цитата(GoldFinch @  3.3.2009,  17:18 Найти цитируемый пост)
кроме того в 1м посте ТС написал что ему нужна прямоугольная матрица, а не непоймичто со строками разной длины, неэффективным использованием памяти и большим временем доступа и обхода


Итак мой код:
Код

//---------------------------------------------------------------------------
#include <conio.h>
#include <iostream>
#include <vcl.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

int Size1 = 10000;
int Size2 = 10000;
int **MatrixA;
int *MatrixB;

void CreateMatrixA(void)
{
    MatrixA = new int*[Size1];
    for(int i=0;i<Size1;i++) MatrixA[i] = new int[Size2];
}

void CreateMatrixB(void)
{
    MatrixB = new int[Size1*Size2];
}

void FillMatrixA(void)
{
    int Value=0;
    for(int i=0;i<Size1;i++)
        for(int j=0;j<Size2;j++)
            MatrixA[i][j] = Value++;
}

void FillMatrixB(void)
{
    int Value=0;
    for(int i=0;i<Size1;i++)
        for(int j=0;j<Size2;j++)
            MatrixB[i*Size2 + j] = Value++;
}

int main(int argc, char* argv[])
{
    int t1,t2;
    t1 = GetTickCount();
    CreateMatrixA();
    t2 = GetTickCount();
    cout << "Create On Pointers = " << (t2-t1) << endl;

    t1 = GetTickCount();
    CreateMatrixB();
    t2 = GetTickCount();
    cout << "Create solid = " << (t2-t1) << endl;

    t1 = GetTickCount();
    FillMatrixA();
    t2 = GetTickCount();
    cout << "Fill pointers = " << (t2-t1) << endl;

    t1 = GetTickCount();
    FillMatrixB();
    t2 = GetTickCount();
    cout << "Fill solid = " << (t2-t1) << endl;

    getch();
    return 0;
}



По поводу неэффективного использования памяти - тут очевидно, в варианте динамического создания тратится 40000 байт на хранение указателей (считая 4 байта на указатель) либо +- в зависимости от системы.

Что выдала программа при запуске:
Create On Pointers = 406
Create solid = 16
Fill pointers = 1000
Fill solid = 20891

Резюме: На создание такого массива тратится на 40 Кб больше памяти и 400 тиков дольше.
Однако, при доступе к элементам динамическое вычисление оказывается в 20 раз медленнее чем стандартное (в смысле как рекомендуют авторы языка).

Повторю свой подход:


Цитата(Anikmar @  3.3.2009,  18:25 Найти цитируемый пост)
Если необходимо в процессе работы многократно создавать небольшие двухмерные массивы - то применять лучше одномерный - меньше будут потери на выделение памяти. Если требуется достаточно большие вычисления внутри одного массива, а также работа с тремя и выше размерностями - то лучше применять общий случай с указателями.


Эту цитату:

Цитата(GoldFinch @  3.3.2009,  17:18 Найти цитируемый пост)
при небольших размерах матрицы такие задачи решаются использованием статической матрицы максимального размера


я рассматриваю как пустую - мы обсуждали динамические массивы согласно теме.
PM MAIL ICQ   Вверх
mes
Дата 3.3.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Anikmar @  3.3.2009,  17:51 Найти цитируемый пост)
 Gunslinger назвал мой пример редкостным ..

Не того обвиняете,  это был не Gunslinger.  smile 

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


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 3.3.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Цитата(azesmcar @  3.3.2009,  18:33 Найти цитируемый пост)
А бывали задачки когда смена деления на 2 в цикле на битовое смещение снизило время работы программы

это говорит только о том что кодогенератор\оптимизатор плох
Цитата(Anikmar @  3.3.2009,  18:25 Найти цитируемый пост)
Данный подход к созданию динамических массивов описан в литературе по С++

еще в литературе приводят примеры вычисления факториала через рекурсию, хотя факториал никто так не считает, если подход возможен и описан не значит что его можно сразу же бездумно применять
Цитата(Anikmar @  3.3.2009,  18:25 Найти цитируемый пост)
Вопрос о неэффективном использовании памяти весьма спорный, при большом размере массива гораздо больше вероятности отсутствия непрерывного блока в памяти, чем при выделении нескольких блоков - отсюда пойдет дополнительный своп.

Вероятности отсутствия непрерывного блока в памяти - это понятие умерло еще когда от 1Мб адресного пространства перешли к 4Гб.
Сейчас блоки памяти есть всегда, но вот эта память может оказаться в разных местах, и чем больше число кусков памяти и их суммарный размер, тем больше вероятность что память окажется не в кеше\не в ОЗУ, и тем дольше память процесса будет извлекаться из свопа когда она там окажется. Кроме того, чем больше в хипе маленьких блочков памяти тем более фрагментирован хип, и т.п. и т.д.
Цитата(Anikmar @  3.3.2009,  18:25 Найти цитируемый пост)
Большее время доступа - уже неоднократно сравнивались два подхода, скорость доступа по указателю с использования только сложения без применения умножения выше.

если нужен быстрый доступ к строкам - сделайте отдельный массив указателей на каждую строку в одномерном массиве

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

PM MAIL ICQ   Вверх
Anikmar
Дата 3.3.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(mes @  3.3.2009,  19:00 Найти цитируемый пост)
Не того обвиняете,  это был не Gunslinger.   


Ой, тысяча извинений!  smile  Gunslinger, извините, просто похожие ники - перепутал.

Конечно я спорил с GoldFinch!

Прошу прощения  smile 
PM MAIL ICQ   Вверх
GoldFinch
Дата 3.3.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Anikmar, 
Код
void FillMatrixB(void)
{
    int Value=0;
    for(int i=0;i<Size1;i++)
        for(int j=0;j<Size2;j++)
            MatrixB[i*Size2 + j] = Value++;
}

замени на
Код
void FillMatrixB(void)
{
    int Value=0;
    for(int i=0;i<Size1*Size2;i++)
            MatrixB[i] = Value++;
}


Добавлено через 3 минуты и 20 секунд
и время у тебя меряется крайне не точно, может ты переключение потоков поймал, вот у тебя и получилась в 20 раз разница
PM MAIL ICQ   Вверх
mes
Дата 3.3.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GoldFinch @  3.3.2009,  18:02 Найти цитируемый пост)

если нужен быстрый доступ к строкам - сделайте отдельный массив указателей на каждую строку в одномерном массиве

Зачем мудрить и выдумывать когда есть удобное средство.

Цитата(GoldFinch @  3.3.2009,  18:02 Найти цитируемый пост)

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

тем что является стандартным средством и в большинстве случаев не имеет недостатков перед другими подходами.
А вот использование неоднократного открытого расчета (типа a[y*size+x])  имеет ряд скрытых и опасных недостатков.

Добавлено @ 19:23
Цитата(GoldFinch @  3.3.2009,  18:11 Найти цитируемый пост)
замени на

Ну это шарлатанство.. такой трюк(линиализировать матричность)  можно использовать только в ограниченном числе задач.
Хотя я не спорю, что для почередного доступа к элементам  первый пример можно оптимизировать и тогда разницы в скорости не будет.
Но вот при рандомном доступе с оптимизацией будет трудней - хотя все это в принципе решающего значения не имеет. 



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


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 3.3.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



mes, это не шарлатанство, а нормальное решение, ты же std::vector итератором обходишь, а не [] юзаешь
там кстате "итератор" лучше конечно будет,
Код
void FillMatrixB(void)
{
    int Value=0;
    for(int* x=MatrixB,xE=x+Size1*Size2;i<xE;x++)
            *x = Value++;
}

Цитата(mes @  3.3.2009,  19:15 Найти цитируемый пост)
использование неоднократного открытого расчета (типа a[y*size+x])

оберни его во чтонибудь приятное, в дефайн оборачивать те наверное религия не позволит, но мало ли в С++ средств
PM MAIL ICQ   Вверх
Anikmar
Дата 3.3.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(GoldFinch @  3.3.2009,  19:11 Найти цитируемый пост)
замени на

Я этого просто ждал.

GoldFinch, я же сразу написал, что отыгрываю без оптимизации! Мой пример не практичен - так как ничего особого не делает, я его сделал для теста. Возьмите другой пример - на диске файл, сформированный кем-то извне, который содержит перечень координат. Надо взять координату и инкрементировать элемент матрицы. И все сразу станет ясно. Вы уже цепляетесь просто за свою идею вместо того, чтобы просто согласиться, что вы не правы.

Второй вариант - формируем координаты случайным образом, например, чтобы проверить генератор случайных чисел или имитируем дождь. Делаем пару миллиардов капель и раскидываем случайным образом по матрице. Какой вариант покажет более высокую скорость? Это же просто очевидно, в варианте динамического формирования присутствует операция умножения, операция извлечения размерности из переменной и только потом адресация к нужному адресу. И хорошо, если оптимизатору удется размерность в регистре держать. А если нет?

Второй момент: при рабочих кодах, если идет множественное обращение к элементу в разных местах программы - у вас будет тратиться память. На то же умножение и извлечение размерности из переменной. И в некоторых случаях динамический вариант рассчета индекса потратит больше памяти, чем через указатели.

Я ведь не говорю, что ваш вариант бред и неправильный! Я говорю, что все зависит от задачи, но ваш вариант - это не динамический многомерный массив, а его эмуляция при помощи одномерного. И такая эмуляция во многих случаях оказывается удобнее. Нам дан инструмент - С++. Наша задача использовать его максимально удобно и эффективно.

Добавлено через 2 минуты и 5 секунд
Цитата(GoldFinch @  3.3.2009,  19:38 Найти цитируемый пост)
оберни его во чтонибудь приятное, в дефайн оборачивать те наверное религия не позволит, но мало ли в С++ средств 


А это уже попахивает некомпетентностью. Чем же дефайн облегчит жизнь?
PM MAIL ICQ   Вверх
Gunslinger
Дата 3.3.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Цитата(Anikmar @  3.3.2009,  19:03 Найти цитируемый пост)
Прошу прощения  smile

ну так и быть.. smile 
PM MAIL   Вверх
mes
Дата 3.3.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GoldFinch @  3.3.2009,  18:38 Найти цитируемый пост)
mes, это не шарлатанство, а нормальное решение, ты же std::vector итератором обходишь, а не [] юзаешь

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

Цитата(GoldFinch @  3.3.2009,  18:38 Найти цитируемый пост)
оберни его во что нибудь приятное, в дефайн оборачивать те наверное религия не позволит, но мало ли в С++ средств 

о том и речь, что при правильных руках для повседневных задач оба решения равноценны и выбор зависит от других  факторов, о которых (применительно к текущей задаче)  мы практически ничего не знаем. smile


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 3.3.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Цитата(Anikmar @  3.3.2009,  19:38 Найти цитируемый пост)
Чем же дефайн облегчит жизнь? 

#define _M(x,y) M[x+cx*y]

Цитата(GoldFinch @  3.3.2009,  19:02 Найти цитируемый пост)
если нужен быстрый доступ к строкам - сделайте отдельный массив указателей на каждую строку в одномерном массиве


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


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


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

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



Цитата(Anikmar @  3.3.2009,  18:38 Найти цитируемый пост)
А это уже попахивает некомпетентностью. Чем же дефайн облегчит жизнь? 

тут GoldFinch прав в идеи. Оборачивание (правда конечно лучше не в дефайн) сильно уменьшит шансы случайной трудно-обнаружимой ошибки-опечатки.


Это сообщение отредактировал(а) mes - 3.3.2009, 20:01


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 3.3.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Цитата(mes @  3.3.2009,  19:53 Найти цитируемый пост)
матрицу (т. е. в случаях когда нужна двухмерность) невозможно обойти линейным итератором. 

задача 
i=0; M[x,y]= i++; 
эквивалентная M[x,y]=x+cx*y
решается именно линейным итератором

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

конечно тут можно сказать, что двухмерность и не нужна, но все же это задачи связанные с двумерными матрицами


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(mes @  3.3.2009,  19:59 Найти цитируемый пост)
тут GoldFinch прав в идеи. Оборачивание (правда конечно лучше не в дефайн) сильно уменьшит шансы случайной трудно-обнаружимой ошибки-опечатки.


Я думал облегчит в плане скорости. Вообще-то многие гуру уберегают от использования define, особенно с параметрами.

Например приведенный define (#define _M(x,y) M[x+cx*y])  я уверен  не вызвал никаких опасений, а ведь он опасно неправильный.


Цитата(GoldFinch @  3.3.2009,  20:04 Найти цитируемый пост)
задачи обнуления матрицы, формирования единичной матрицы, и т.п. решаются линейными итераторами
суммирование двух матриц так же производится линейным обходом всех элементов матриц
если матрица -  это картинка, то проход по ней окном (например для наложения фильтра) так же решается линейным обходом

конечно тут можно сказать, что двухмерность и не нужна, но все же это задачи связанные с двумерными матрицами


Интересно, что вы отстаиваете? То, что с матрицами производятся только линейные операции? Для линейных итераций матрица как раз не особо нужна. И никто не спорит, что ваш подход имеет право на жизнь. В общем то случае жизнь сложна и многогранна. Метод создания динамических многомерных массивов был разработан давно, поддерживается языком, разработчиками. Если честно, я впервые сталкиваюсь с таким упрямым отстаиванием одного метода... Все-таки как быть со случайным доступом?
PM MAIL ICQ   Вверх
mes
Дата 3.3.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(GoldFinch @  3.3.2009,  19:04 Найти цитируемый пост)
конечно тут можно сказать, что двухмерность и не нужна, но все же это задачи связанные с двумерными матрицами

да для этих задач двухмерность не нужна. (поэтому я и уточнял в скобках, чтоб избежать лишних споров)

Добавлено @ 20:19
Цитата(Anikmar @  3.3.2009,  19:13 Найти цитируемый пост)
апример приведенный define (#define _M(x,y) M[x+cx*y])  я уверен  не вызвал никаких опасений, 

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

Это сообщение отредактировал(а) mes - 3.3.2009, 21:45


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 3.3.2009, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



mes, а где она нужна, двумерность?

Цитата(Anikmar @  3.3.2009,  20:13 Найти цитируемый пост)
Все-таки как быть со случайным доступом? 

Цитата(GoldFinch @  3.3.2009,  19:56 Найти цитируемый пост)
если нужен быстрый доступ к строкам - сделайте отдельный массив указателей на каждую строку в одномерном массиве

или выровнять длину строки до 2^n и использовать умножение сдвигом

Цитата(Anikmar @  3.3.2009,  20:13 Найти цитируемый пост)
Метод создания динамических многомерных массивов был разработан давно, поддерживается языком, разработчиками.

да, но его следует использовать совсем для других целей
PM MAIL ICQ   Вверх
Anikmar
Дата 3.3.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(mes @  3.3.2009,  20:15 Найти цитируемый пост)
не только опасения, но и в таком виде не применим для не тестового/учебного (и другого в этом роде) задания , хотя бы потому что не масштабируем.

Он просто неправильный. Такой define как раз смело можно называть бредом.


Цитата(GoldFinch @  3.3.2009,  20:42 Найти цитируемый пост)
да, но его следует использовать совсем для других целей 

Цели мы вообще пока не обсуждали. У нас цель была только одна: показать как его (динамический многомерный массив) создавать. Если согласно ваших же слов существуют некие цели, для которых следует использовать многомерный массив, то тогда можно узнать, что вы оспариваете?

Краткая история данной темы:

Автор попросил показать пример создания динамического многомерного массива, так как одномерный у него получился, а многомерный нет.

Автор получил несколько ответов, в том числе мой, который просто иллюстрирует книжный пример от разработчиков С++ как это делать, правильность которого больше ни у кого не вызвала сомнений.

Мой ответ вы обозвали полным бредом и стали утверждать, что двумерный массив никому не нужен, а работать с ним следует только как с одномерным методом динамического вычисления индекса. Причем в одном из последних постов вы меня сразили насмерть - вы предложилди для увеличения скорости создать отдельный индексный массив:
Цитата(GoldFinch @  3.3.2009,  19:02 Найти цитируемый пост)
если нужен быстрый доступ к строкам - сделайте отдельный массив указателей на каждую строку в одномерном массиве

что по сути просто представляет собой усложненный стандартный метод, который я представил.

Далее вы просто стали придираться к мелочам:
Цитата(GoldFinch @  3.3.2009,  19:11 Найти цитируемый пост)
и время у тебя меряется крайне не точно, может ты переключение потоков поймал, вот у тебя и получилась в 20 раз разница 

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

Затем предоставили неправильную #define:
Цитата(GoldFinch @  3.3.2009,  19:56 Найти цитируемый пост)
#define _M(x,y) M[x+cx*y]

который лишь показывает, что вы не знаете основные правила написания таких команд

Заодно предлагаете любые методы, усложняющие код, чтобы только отстоять свое:
Цитата(GoldFinch @  3.3.2009,  20:42 Найти цитируемый пост)
или выровнять длину строки до 2^n и использовать умножение сдвигом


Я просто не понимаю уже предмета спора, если вы будете использовать свой метод - используйте, ведь никто в мире не сможет вам это запретить. Но с таким длительным спором, я уже не знаю в чем я вас должен убедить, если на очевидные вещи вы говорите нет и все тут... Станиславский однако...

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


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


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

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



Цитата(Anikmar @  3.3.2009,  19:57 Найти цитируемый пост)
Я просто не понимаю уже предмета спора

Как я понял GoldFinch пытается нам открыть глаза на возможность использования линейного массива, как матрицы и того что с этим связано.
И я ценю это рвение  smile  с которым он отстаивает право на использование такого подхода. 
Вот только жаль, что  Вы, GoldFinch,  не замечаете, что  никто не выступает против.  smile 

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

 smile 


--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 4.3.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Горячие финские парни...
Я уже могу закрыть тему?
PM MAIL   Вверх
Anikmar
Дата 4.3.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Gunslinger @  4.3.2009,  10:03 Найти цитируемый пост)
Горячие финские парни...
Я уже могу закрыть тему? 

Лично я в этом глупом споре больше не участвую. Если вам все понятно - закрывайте  smile 
PM MAIL ICQ   Вверх
ksili
Дата 4.3.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Цитата(Gunslinger @  3.3.2009,  15:42 Найти цитируемый пост)
з.ы. код для билдера, вектором пользоваться не умею, как подключить stl - не знаю. так что vector не советуйте.

Если ты пользуешься Билдером, то там в хелпе есть пример кода на С++ (без STL, только new и delete) как динамически создать двухмерный массив и как правильно его удалить.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Gunslinger
Дата 4.3.2009, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Цитата(ksili @  4.3.2009,  10:18 Найти цитируемый пост)
там в хелпе

искал по dinamic, massiv, pointer - не нашел.

возникла ошибка EInvalidPointer with message 'Invalid pointer operation'. Ошибка возникает, когда нажимаю кнопку с инициализацией массива, а затем закрытия программы. Может с массивом не так что сделал?
Кратко о проге: нажав на кнопку, создается массив; дескриптор записал в обработчик закрытия окна. Но если кнопку не нажимать, а сразу закрыть окно - возникнет ошибка. Поэтому сначала нужно определить, была ли нажата кнопка. Все эти действия я обернул в класс:
Код

class Game {
    private:
        int **FIELD;
        int xField;  //  размер массива игрового поля по х
             int yField;    //  размер массива игрового поля по у
             bool klicked; //флаг: нажата кнопка - true, иначе false
  public:
              Game(){
                xField=0;  
                    yField=0;  
           klicked=false;
        };
    void InitMassiv(String x,String y){  //инициализируем игровое поле
                xField=StrToInt(x);
                yField=StrToInt(y);
                FIELD= new int *[xField];   //инициализируем размерность х
                for(int i=0;i<=xField;i++)                      //инициализируем размерность у
                                                                FIELD[i] = new int[yField];
                                for(int i=0;i<=xField;i++)
                             for(int j=0;j<=yField;j++) FIELD[i][j]=0;
        };
        ~Game(){
                if(klicked==true) {
                          for(int i=0;i<=xField;i++) delete[] FIELD[i];
                                          delete[]FIELD;};
        };


        void Klicked(){
                klicked=true;
        };
};        
 

код проги:
Код

TForm1 *Form1;
Game g;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
     g;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
g.Klicked();
g.InitMassiv(Field_x->Text,Field_y->Text);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
   g.~Game();
}
//---------------------------------------------------------------------------


Это сообщение отредактировал(а) Gunslinger - 4.3.2009, 10:59
PM MAIL   Вверх
ksili
Дата 4.3.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Цитата(Gunslinger @  4.3.2009,  14:51 Найти цитируемый пост)
искал по dinamic, massiv, pointer - не нашел.

ищи по слову new

dynamic через игрек пишется
слова massiv в английском нет. Есть array


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Anikmar
Дата 4.3.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Gunslinger @  4.3.2009,  10:51 Найти цитируемый пост)
 g.~Game();

Это что? Явный вызов деструктора? Зачем? Уберите.

Цитата(Gunslinger @  4.3.2009,  10:51 Найти цитируемый пост)
                for(int i=0;i<=xField;i++)                      //инициализируем размерность у
                                                                FIELD[i] = new int[yField];
                                for(int i=0;i<=xField;i++)
                             for(int j=0;j<=yField;j++) FIELD[i][j]=0;


Условия в циклах дожно быть строго меньше. У вас выход за пределы массива.

Выделяется памяти :
FIELD[i] = new int[yField]; - т.е. yField элементов
 А цикл идет от 0 до yField - т.е. yField+1 элемент


PM MAIL ICQ   Вверх
Gunslinger
Дата 4.3.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Цитата(Anikmar @  4.3.2009,  11:15 Найти цитируемый пост)
Условия в циклах дожно быть строго меньше. У вас выход за пределы массива.

исправил, спасибо!

Цитата(ksili @  4.3.2009,  11:00 Найти цитируемый пост)
new

по нему и не догадался smile 

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

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

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

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

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


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

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


 




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


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

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