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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] массивы-указатели, динамическая память 
V
    Опции темы
scai
Дата 8.9.2007, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Неофит
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.1.2007
Где: г. Загорск

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



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

p.s. vector не предлагать)))
--------------------
 
PM MAIL   Вверх
apook
Дата 8.9.2007, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(scai @  8.9.2007,  03:03 Найти цитируемый пост)
как прописать для них typedef

С динамическими массивами не поможет typedef


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
zkv
Дата 8.9.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Код

typedef        float        ELEM_T;
typedef        ELEM_T*        VECTOR_T;
typedef        VECTOR_T*    MATRIX_T;

int main( int argc, char *argv[] )
{
    int nRows = 5,  
        nCols = 10;
    
    MATRIX_T matrix = new VECTOR_T[ nRows ];
    for( int i = 0; i < nRows; ++i )
    {
        matrix[i] = new ELEM_T[ nCols ];
    }
//TO DO...
    
    for( int i = 0; i < nRows; ++i )
    {
        delete []matrix[i];
    }
    delete matrix;

    return 0;
}

это?
PM MAIL   Вверх
scai
Дата 8.9.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Неофит
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.1.2007
Где: г. Загорск

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



ага. похоже.

таак.

угу.

а что значит 
Код

delete []matrix[i];

?
первые квадратные скобки?

значит перемещение строк - 
Код

matrix[i]=matrix[j];

[]matrix[i] = []matrix[j];?????????????????????????????




... и как звездочки расставить чтоб, обратиться непосредственно к значению элемента? к указателю на него?

а первый typedef -, просто, для концептуальной полноты?

а не много ли вопросов? smile 


--------------------
 
PM MAIL   Вверх
zkv
Дата 8.9.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(scai @  8.9.2007,  14:38 Найти цитируемый пост)

а что значит 

delete []matrix[i];

есть оператор delete, а есть delete[].
Первый удаляет единичный элемент, а второй массив. (грубо говоря)

логически было бы вернее расставить пробелы так:
Код

delete[] matrix[i];




Цитата(scai @  8.9.2007,  14:38 Найти цитируемый пост)
значит перемещение строк - 

верно:
Цитата(scai @  8.9.2007,  14:38 Найти цитируемый пост)
matrix[i]=matrix[j];

только нужно понимать, что фактически нет никакого перемещения, производится только перенацеливание указателей. 
matrix[j] - как раз указатель на вектор (одномерный массив) элементов.

Цитата(scai @  8.9.2007,  14:38 Найти цитируемый пост)
.. и как звездочки расставить чтоб, обратиться непосредственно к значению элемента?

следущие строки эквивалентны:
Код

matrix[i][j]
*(matrix[i]+j)
*(*(matrix+i)+j)

Цитата(scai @  8.9.2007,  14:38 Найти цитируемый пост)
к указателю на него?

следущие строки эквивалентны:
Код

&matrix[i][j]
matrix[i]+j
*(matrix+i)+j


Цитата(scai @  8.9.2007,  14:38 Найти цитируемый пост)
а первый typedef -, просто, для концептуальной полноты?

да, matrix можно было объявить вообще просто так:
Код

float **matrix;

ну и дальше:
Код

matrix = new float *[nRows];

и т.д.
Цитата(scai @  8.9.2007,  14:38 Найти цитируемый пост)
а не много ли вопросов?

у меня спрашиваешь?  smile 

Это сообщение отредактировал(а) zkv - 8.9.2007, 15:02
PM MAIL   Вверх
scai
Дата 8.9.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Неофит
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.1.2007
Где: г. Загорск

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



zkv, здорово!

Да. Имя массива как указатель на первый элемент.

обьясни, пожалуйста, что тут происходит, на пальцах.
Код

float **matrix;
matrix = new float *[nRows];


matrix как указатель на указатель в первой строке, а затем выделение памяти под массив указателей. так?
а потом 
Код

matrix[i] = new float *[ nCols ]

?

[upd]
и еще. (извини, если надоедает, плохо в указателях понимаю), matrix[i][j] - у нас массив указателей... без разыменования обращаемся? то есть, если обьявлен указатель и направлен на массив в динамической памяти, то можно использовать такойже синтаксис как для работы со статическим массивом? так?

Это сообщение отредактировал(а) scai - 8.9.2007, 18:41
--------------------
 
PM MAIL   Вверх
zkv
Дата 8.9.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(scai @  8.9.2007,  18:08 Найти цитируемый пост)
Да. Имя массива как указатель на первый элемент.

у нас здесь как раз таки не массив, а указатель, разница между ними есть, если интересно, поищи в Общих вопросах, войны даже были помню, по этому вопросу.


Цитата(scai @  8.9.2007,  18:08 Найти цитируемый пост)
обьясни, пожалуйста, что тут происходит, на пальцах.

Цитата(scai @  8.9.2007,  18:08 Найти цитируемый пост)
float **matrix;

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

Цитата(scai @  8.9.2007,  18:08 Найти цитируемый пост)
matrix = new float *[nRows];

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

Цитата(scai @  8.9.2007,  18:08 Найти цитируемый пост)
    
matrix[i] = new float *[ nCols ]

а тут неправильно, нужно:
Код

matrix[i] = new float [ nCols ];

здесь мы требуем выделить нам памяти под массив из nCols элементов типа float (то есть элементы матрицы i-й строки ), 
и записать адрес первого элемента массива в i-ю ячейку массива, на который указывает matrix.

Цитата(scai @  8.9.2007,  18:08 Найти цитируемый пост)
matrix[i][j] - у нас массив указателей... без разыменования обращаемся?

так это и есть разыменование, для:
int *pInt = new int[10];
записи:
Код

cout<<pInt[1];

и
Код

cout<<*(pInt1+1);
эквивалентны

Цитата(scai @  8.9.2007,  18:08 Найти цитируемый пост)
то можно использовать такойже синтаксис как для работы со статическим массивом? так?

да только нужно не забывать, что размеры динамического массива определяются в рантайме, 
поэтому, к примеру, оператор sizeof() будет работать не корректно, так как он выполняется на этапе компиляции.
PM MAIL   Вверх
scai
Дата 8.9.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Неофит
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.1.2007
Где: г. Загорск

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



zkv, спасибо за исчерпывающий ответ! Оч. помог! А то после паскаля с сишным синтаксисом не так просто разобраться... Спасибо!
--------------------
 
PM MAIL   Вверх
zkv
Дата 8.9.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(scai @  8.9.2007,  18:44 Найти цитируемый пост)
спасибо за исчерпывающий ответ!

насчет исчерпывающего сомневаюсь, только самые штрихи. Сам то с трудом понял, что написал smile Советую читать книги, понимание придет со временем  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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