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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: большой массив  (Прочитано 13183 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Prokl
Участник

ru
Offline Offline

« : 09-01-2011 07:49 » 

нужен массив большого размера, делал так:
Код:
#define a 4000
#define b 4000
AnsiString massiv[a][b];
при компиляции выдает ошибку и билдер виснет,
до 2000 работает нормально.
кто подскажет как сделать правильно
« Последнее редактирование: 27-02-2011 10:04 от Вад » Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

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


« Ответ #1 : 09-01-2011 10:20 » 

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

Код:
AnsiString* massiv=AnsiString[a*b];

а потом не забыть удалить массив в кучу
Код:
delete [] massiv;
massiv=0;

но ещё лучше пользоваться STL ))
Записан

Prokl
Участник

ru
Offline Offline

« Ответ #2 : 10-01-2011 08:47 » 

а про STL можно подробнее

Добавлено через 1 час, 2 минуты и 21 секунду:
Код:
AnsiString* massiv=AnsiString[a*b];

после "=" должно "new" наверное.

Код:
AnsiString* massiv=new AnsiString[a*b];

а STL это StringList ? в моем случае он мне не подходит, или я не знаю как применить
« Последнее редактирование: 10-01-2011 09:50 от Prokl » Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

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


« Ответ #3 : 10-01-2011 10:00 » 

после "=" должно "new" наверное.
вот видишь, заметил, разобрался )

Про STL - можно применить std::vector
Записан

Prokl
Участник

ru
Offline Offline

« Ответ #4 : 10-01-2011 11:31 » 

спасибо за подсказки. пока работы хватит
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #5 : 10-01-2011 17:37 » 

Prokl, STL - Standard Template Library для C++. Реализации у каждого поставщика свои, но поведение описано стандартом. Информации в сети полно. В BCB в хелпах также есть.

Для разового выделения места или для нечастого изменения размера std::vector в самый раз. Для более динамичной работы с массивом больше подходит std:deque, но для него случайный доступ выполняется медленнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Prokl
Участник

ru
Offline Offline

« Ответ #6 : 11-01-2011 14:55 » 

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

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

WWW
« Ответ #7 : 11-01-2011 17:40 » 

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

Какой еще инет? F1!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Prokl
Участник

ru
Offline Offline

« Ответ #8 : 12-01-2011 12:54 » 

просто в одной программе три строковых двухмерных массива:
massiv1[a][с]
massiv2[a][с]
massiv3[a][с]
например:
massiv1[2000][1500] = "имя"
massiv2[2000][1500]= "фамилия"
massiv3[2000][1500]= "отчество"

а с F1 сложно - переводить надо
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #9 : 12-01-2011 16:35 » 

Код: (C++)
#include <vector>

typedef std::vector<AnsiString> MyStrings;

int main()
{
  MyStrings massiv1(2000);

  massiv1[0] = "Ифаноф";

  return 0;
}

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Prokl
Участник

ru
Offline Offline

« Ответ #10 : 27-02-2011 08:26 » 

Ничего не получается. Если объявить массив   AnsiString massiv[x ][y] то x это номер элемента массива, а y длина строки. А мне надо чтобы х - количество строк, y - количество столбцев и уже третье число - длина строки. Как это сделать?
« Последнее редактирование: 27-02-2011 09:04 от Алексей1153++ » Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

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


« Ответ #11 : 27-02-2011 09:06 » 

Prokl, поменять местами x и y ? Улыбаюсь

(а ещё лучше, воспользоваться STL Отлично )
Записан

Dimka
Деятель
Команда клуба

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

« Ответ #12 : 27-02-2011 10:11 » 

Prokl, а что в этом массиве должно храниться? Зачем он вообще нужен, какая задача решается?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Prokl
Участник

ru
Offline Offline

« Ответ #13 : 27-02-2011 13:35 » 

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

Добавлено через 6 минут и 29 секунд:
Prokl, поменять местами x и y ? Улыбаюсь

(а ещё лучше, воспользоваться STL Отлично )
x и y я для примера привел, могут и другие переменные стоять. главная проблемма, как объявить трехмерный массив. А STL для меня сложно, хотя бы пример какой нибудь был бы
« Последнее редактирование: 27-02-2011 13:42 от Prokl » Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

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


« Ответ #14 : 27-02-2011 15:02 » 

если без замороченной оптимизации, то вот
Код:
//myElemType - структура ячейки

typedef std::vector<myElemType> td_row; //одномерный массив
typedef std::vector<td_row> td_plane; //двумерный
typedef std::vector<td_plane> td_volume; //трёхмерный

td_volume m_my3Darray;
Записан

Prokl
Участник

ru
Offline Offline

« Ответ #15 : 01-03-2011 11:27 » 

решил проблему так:
Код:
#define a 4000
AnsiString* massiv=new AnsiString[a*a];//здесь объявляется массив
//размером 16000000 именно столько ячеек в поле 4000/4000
 
massiv[a+3999*b] = Edit1->Text;//a - кордината по горизонтали,
//b - координата по вертикали

пробовал объявить переменную равную 16000000 - неполучается
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

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


« Ответ #16 : 01-03-2011 17:00 » 

>>пробовал объявить переменную равную 16000000 - неполучается

локальный массив и не получится так объявить

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

Dimka
Деятель
Команда клуба

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

« Ответ #17 : 01-03-2011 21:43 » 

Алексей1153++, может он запасливый - в хозяйстве пригодится Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
кот глобальный и пушистый
Глобальный модератор

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


« Ответ #18 : 02-03-2011 04:45 » 

Видали мы таких запасливых )
Записан

Prokl
Участник

ru
Offline Offline

« Ответ #19 : 02-03-2011 13:31 » 

это карта, у каждой ячейки несколько данных в виде слов, вот их и надо сохранять
просто карта большая
Записан
ocbmuhor
Интересующийся

ua
Offline Offline

« Ответ #20 : 09-03-2011 20:26 » 

Народ, у меня своя проблема по схожей теме. Код компилируется, программа выполняется, но после выполнения по закрытии терминала выдается ошибка. Тут пару постов выше говорилось о переполнении стека это не оно самое случайно? Сообщение об ошибке:
*.exe raised exeption class EAccessViplation with message 'Access violation at adress 326099DC. Write of adress 00000008'. Process stopped.

Код:
Код:
#include <iostream> //подключение заголовочного файла с заглавными функциями ввода - вывода
#include <conio>    //необязательное включение файла для ожидания консоли действий после выполнения программы
#include <math>     //подключение математических функций
#include <string>
#include <windows>
using namespace std;

//вывод кириллицы в консоли
ostream& operator << (ostream& stream, char* rout)
{
    char* tmp;
    tmp = new char[strlen(rout) + 1];
    CharToOem(rout, tmp);
    stream.write(tmp, strlen(tmp));
    delete [] tmp;
    return stream;
}
//собственно алгоритм задачи 
void main()
{
  double *a, n;
  int i, z;
  cout<<"Введите число исходное значение для функции ";
  cin>>n;
  z=0;
  a= new double [44];
  for (i=1; i<=44; i++) {
    a[i]=sqrt(n*n*n);
    n=n++;
    cout<<"\n  n"<<i<<"= "<<n;
    cout<<"   исходное число "<<a[i];
    a[i]=z;
    cout<<"   число после преобразования "<<a[i];
    }
getch();
}

Добавлено через 3 минуты и 43 секунды:
*.exe raised exeption class EAccessViolation with message 'Access violation at adress 326099DC. Write of adress 00000008'. Process stopped.
D ghjikjv gjcnt jxtgznrf
« Последнее редактирование: 09-03-2011 20:30 от ocbmuhor » Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

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


« Ответ #21 : 09-03-2011 20:35 » 

точно есть вот такая ошибка

i<=44

i<44
Записан

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

ua
Offline Offline

« Ответ #22 : 09-03-2011 21:04 » 

Это уже интересно При параметре for (i=0; i<44; i++) все работает. Но чем же подобный параметр (i=1; i<=44; i++) смущает процессор?
Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

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


« Ответ #23 : 09-03-2011 21:05 » 

попыткой доступа в чужую память, надо полагать
Записан

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

ua
Offline Offline

« Ответ #24 : 09-03-2011 21:36 » 

Ну да. 0..43  как заявлено то не 1..44. теперяче понятно
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines