Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическая инициализация массивов...как?  (Прочитано 21897 раз)
0 Пользователей и 1 Гость смотрят эту тему.
GrunT
Гость
« : 06-05-2005 18:22 » 

 Программер я еще совсем плохой...возможно даже тему не так сформулировал...но вот в чем моя проблема...у меня есть функция, у которой есть лишь 1 параметр - двухмерный массив(размерность любая), внутри этого массива создается еще один массив размерностью на 1 меньше чем тот массив, который передается в параметрах...
Вот пример кода
Код:
int Det(int mat[]){
size=ARRAYSIZE(mat);
for (int f=0;f<size-1;f++){
  int m[f][size-1][size-1];
   }
}
Но у меня size не явл. константой так же как и f...
Тут кстати возникает еще 1 проблема   Вот такой я вот я не знаю как передавать в ф-ю массив, и ...
пожалуста помогите!...очень срочно нужно...
« Последнее редактирование: 08-01-2010 14:53 от Алексей1153++ » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 06-05-2005 19:29 » 

Мда, Ты хочеш создать трехмерный массив, динамически. Насколько я понял. Примерно это будет выглядеть так.
Код:
int ***m=new int **[size-1];
for(int z=0; z<(size-1); z++)
{
    m[z]=new int *[size-1];
    for(int k=0; k<(size-1); k++)
    {
        m[z][k]=new int[size-1];
    }
}

Обрашение к элементу массива m[k][z];

Удаление
Код:
for(int z=0; z<(size-1); z++)
{
    for(int k=0; k<(size-1); k++)
    {
        delete [] m[z][k];
    }
   delete [] m[z];
}
delete [] m;

Код не проверял, возможны баги Улыбаюсь
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
michaelprog
Гость
« Ответ #2 : 11-05-2005 08:45 » 

Вот интересная строчка кода
size=ARRAYSIZE(mat);
кто мне объяснит что такое ARRAYSIZE???
насколько я знаю, в языке нет средств для определения размера динамического массива, поэтому такое врядли будет работать. все известные мне релазации хранят размер массива
Но у меня size не явл. константой так же как и f...
Тут кстати возникает еще 1 проблема   Вот такой я вот я не знаю как передавать в ф-ю массив, и ...
пожалуста помогите!...очень срочно нужно...
В чем собственно проблема, size-1 вычисляется во время выполнения.

обычно неискушенные програмисты массивы в функцию передают так
Код:
void SomeFunction1(int* mass, int size);//одномерный
void SomeFunction2(int** mass, int x_size, int y_size);//двумерный
// и т.д.
Записан
OxCom
Гость
« Ответ #3 : 16-05-2008 17:03 » new

Доброго времени суток. У меня возник такой вопрос:
Надо создать массив, который в процессе работы программы будет изменять свой размер и доступ к нему должен осуществляться как к обычному массиву.
Вариант создать такойже массив +1 элемент, скопировать предыдуший в новый и поменять указатели - не катит.
В дельфе я такое реализовал в два счета:
Код:
//это мои заморочки
type a = Record
...
end;
//это объявление динамического массива с моими заморочками
type b = array of a;
MS : TD_Thrd;
и потом к с ним легко работал:
Код:
SetLength(MS,i); //делаем i элемент(ов) в массиве MS
Length(MS); //узнаем сколько элементов в массие
Обращение к массиву стандартное: MS

Как сделать это в C++? Покажите на примере. Спс.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 16-05-2008 17:19 » 

OxCom, используй STL.

Почитай эту тему: https://forum.shelek.ru/index.php/topic,14142.0.html
« Последнее редактирование: 16-05-2008 17:22 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
OxCom
Гость
« Ответ #5 : 16-05-2008 17:51 » 

Пасибо Улыбаюсь теперь дует первый проект с <vector.h> Улыбаюсь
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 16-05-2008 19:07 » 

OxCom, без ".h" !!!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 17-05-2008 08:14 » 

OxCom, а ещё можно выделить память под линейный массив размером x*y*z , а обращаться через макрос Улыбаюсь Ну это я бы так сделал, а тебе самому выбирать
Записан

OxCom
Интересующийся

ua
Offline Offline
Пол: Мужской
Неуч


« Ответ #8 : 08-01-2010 11:02 » 

И снова здравствуйте.  Дабы не плодить кучу тем, продолжу в этой.
Надеюсь вы поможете мне понять почему так происходит и как в дальнейшем этого избежать. Суть заключается в следующем
Делаю от такую всем довольно знакомую штуку:
Код:
int iSize = 3; // вообще оно случайное значение, я для примера выбрал 3.
int *iarMatA = new int(iSize*iSize);
int *iarMatB = new int(iSize*iSize);
Потом заполняю полученные массивы... заполнение проходит на ура, что записал то и получил потом при проверке, но тут мне надо передать эти массивы в функцию. Передаю вот так:
Код:
float fRes = GetResult(iSize, iarMatA, iarMatB);
Сама функция:
Код:
float GetResult(int iSize, int *iarMatA, int *iarMatB) {}
Как по мне, то все должно быть замечательно при обращении iarMatA и iarMatB, но вот начинаются чудеса: при чтении какого-либо значения массива получаю совершенно не те значения, что были записаны. Отсюда вытекает вопрос: почему так, как этого избежать и что сделать, чтобы такого не происходило?
« Последнее редактирование: 08-01-2010 11:34 от OxCom » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 08-01-2010 11:31 » 

Ты не массив выделяешь, а одну переменную int в куче. И инициализируешь её значением iSize*iSize
Код:
int *iarMatA = new int(iSize*iSize);
В результате, когда ты работаешь с iarMatA как с массивом, ты пишешь в левую память, в которой расположено что угодно кроме массива, и происходит чёрти что.

Массив выделяется с помощью
Код:
int *arr = new int[iSize*iSize];
- оператор new[], с квадратными скобками.
Записан
OxCom
Интересующийся

ua
Offline Offline
Пол: Мужской
Неуч


« Ответ #10 : 08-01-2010 11:55 » 

Ой) спасибо, разобрался) забыл про это)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines