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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сдвиг двумерного массива. 
V
    Опции темы
mes
Дата 4.6.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(fry @  4.6.2009,  17:22 Найти цитируемый пост)
Данная строчка будет не так красиво смотреться при добавнеии обработки исключений. Хотя конечно строчка красивая.

При чем тут исключения по отношению к подобной записи ?
В том примере  использовался динамический массив строк постоянной длины. И ничего особенного от обычного синтаксиса массивов не имеет. 
 smile

Добавлено @ 18:34
Цитата(fry @  4.6.2009,  17:27 Найти цитируемый пост)
см. mes'а <- нелинейный вариант

т.е Вы утверждаете что что  new int[n][20]; вернет массив, элементы которого расположены не линейно ?! 
 smile 

Это сообщение отредактировал(а) mes - 4.6.2009, 18:35


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


Опытный
**


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

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



Ну может именно с исключениями я конечно перебарщил, но проверку на корректное выделение памяти для каждой части массива провести необходимо.
Или я чего не понял, тогда поясни. 

Мне как-то приплюснутый вариант выделения через stl более по душе.

Добавлено @ 18:39
Все допер.. Сорри.

Добавлено @ 18:41
В твоем случае и в моем я ч-то не заметил разницы в смысле, а в синтаксисе огромная.
Поясни почему сделал так. Если не сложно.

Это сообщение отредактировал(а) fry - 8.6.2009, 00:05
PM MAIL   Вверх
Santa12
Дата 4.6.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


вечный чечако



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

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



Еще раз спасибо )
PM MAIL WWW ICQ   Вверх
mes
Дата 4.6.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(fry @  4.6.2009,  17:35 Найти цитируемый пост)
В твоем случае и в моем я ч-то не заметил разницы в смысле, а в синтаксисе огромная.
Поясни почему сделал так. Если не сложно.

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





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


Опытный
**


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

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



В целом, лично для меня, данный синтаксис имеет преимущество в виде возможности писать " [ i ][ j ] "
И недостатки: синтаксис ( ИМХО ИМХО ИМХО ИМХО ИМХО ИМХО ), статика одного измерения.

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

Рад за mes, что повесилил. smile 

Это сообщение отредактировал(а) fry - 4.6.2009, 18:56
PM MAIL   Вверх
mes
Дата 4.6.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(fry @  4.6.2009,  17:53 Найти цитируемый пост)
В целом, лично для меня, данный синтаксис имеет преимущество в виде возможности писать " [ i ][ j ] "

Это следствие, так как наш массив объявлен многомерным smile

Цитата(fry @  4.6.2009,  17:53 Найти цитируемый пост)
В целом, лично для меня, данный синтаксис имеет преимущество в виде возможности писать " [ i ][ j ] "
И недостатки: синтаксис ( ИМХО ИМХО ИМХО ИМХО ИМХО ИМХО ), статика одного измерения. 

Если быть точнее, то преимущество в том, что одно (но только  одно) из измерений является динамическим.

Добавлено через 7 минут и 39 секунд
Цитата(fry @  4.6.2009,  17:53 Найти цитируемый пост)
Кстати подозреваю, что вычисление смещения по индексам будет темже (подозреваю).

Хотя длина строки и константна, но оптимизация умножения может быть возможно, только в случае констаного индекса строки.
Т.е. обращение mas[n][m]  требует одинаковых вычислений,  mas[5][m] может быть лишен умножения, а mas[5][2] - заменен на линейный индекс. smile


Это сообщение отредактировал(а) mes - 4.6.2009, 18:59


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


Опытный
**


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

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



Думаю ответ на вопрос какой вариант пользовать знает тот, кто знает что ему надо (и к чему он привык): "[ ][ ]" или менее напрягающий код объявления (это про два варианта объявления динамических массивов). Ну и конечно от ситуации зависит.
PM MAIL   Вверх
fry
Дата 8.6.2009, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

к 
Цитата

Цитата(fry @  4.6.2009,  16:06 Найти цитируемый пост)
Santa12, имей ввиду, что хранение динамического массива частями (2мерного) далеко не является рациональным решением т.к. заведомо менее производительно и несколько менее, но все же расточительнее. 

это высказывание требует слишком много оговорок,  и в принципе справедливо лишь к "излишнe" занимаемой  памяти.


Забавы ради и удовлетворения любопытства для провел тест на ОС Linux (Fedora 10) на линейные и нелинейные массивы, точнее скорости выделения и работы.

Код теста (взят частично отсюда, переделан за неимением conio и vcl):
Код

#include <iostream>
#include <time.h>

using namespace std;

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[])
{
    clock_t clock_s, clock_e;

    clock_s=clock();
    CreateMatrixA();
    clock_e=clock();
    cout << "Create On Pointers = " << (clock_e-clock_s) << endl;

    clock_s=clock();
    CreateMatrixB();
    clock_e=clock();
    cout << "Create solid = " << (clock_e-clock_s) << endl;

    clock_s=clock();
    FillMatrixA();
    clock_e=clock();
    cout << "Fill pointers = " << (clock_e-clock_s) << endl;

    clock_s=clock();
    FillMatrixB();
    clock_e=clock();
    cout << "Fill solid = " << (clock_e-clock_s) << endl;
    return 0;
}



Выдает:

Без оптимизации:
Create On Pointers = 50000
Create solid = 0
Fill pointers = 900000
Fill solid = 920000

С оптимизацией:
Create On Pointers = 40000
Create solid = 0
Fill pointers = 540000
Fill solid = 540000

ЗЫ ДАННЫЙ ПОСТ НЕ ИМЕЕТ ЦЕЛЬ ЧЕГО-ТО ДОКАЗАТЬ
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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