Prokl
Участник
Offline
|
|
« : 09-01-2011 07:49 » |
|
нужен массив большого размера, делал так: #define a 4000 #define b 4000 AnsiString massiv[a][b]; при компиляции выдает ошибку и билдер виснет, до 2000 работает нормально. кто подскажет как сделать правильно
|
|
« Последнее редактирование: 27-02-2011 10:04 от Вад »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #1 : 09-01-2011 10:20 » |
|
нужно выделять динамически (иначе у тебя просто стек переполняется) AnsiString* massiv=AnsiString[a*b]; а потом не забыть удалить массив в кучу delete [] massiv; massiv=0; но ещё лучше пользоваться STL ))
|
|
|
Записан
|
|
|
|
Prokl
Участник
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 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #3 : 10-01-2011 10:00 » |
|
после "=" должно "new" наверное.
вот видишь, заметил, разобрался ) Про STL - можно применить std::vector
|
|
|
Записан
|
|
|
|
Prokl
Участник
Offline
|
|
« Ответ #4 : 10-01-2011 11:31 » |
|
спасибо за подсказки. пока работы хватит
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 10-01-2011 17:37 » |
|
Prokl, STL - Standard Template Library для C++. Реализации у каждого поставщика свои, но поведение описано стандартом. Информации в сети полно. В BCB в хелпах также есть.
Для разового выделения места или для нечастого изменения размера std::vector в самый раз. Для более динамичной работы с массивом больше подходит std:deque, но для него случайный доступ выполняется медленнее.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Prokl
Участник
Offline
|
|
« Ответ #6 : 11-01-2011 14:55 » |
|
мне нужно три строковых двухмерных массива, размер менятся не будет, только заполнение будет очень небольшое. а про библиотеки я в нете еще не искал, потом как-нибудь.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 11-01-2011 17:40 » |
|
"три строковых двухмерных массива" По яснее, пожалуйста.
Какой еще инет? F1!
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Prokl
Участник
Offline
|
|
« Ответ #8 : 12-01-2011 12:54 » |
|
просто в одной программе три строковых двухмерных массива: massiv1[a][с] massiv2[a][с] massiv3[a][с] например: massiv1[2000][1500] = "имя" massiv2[2000][1500]= "фамилия" massiv3[2000][1500]= "отчество"
а с F1 сложно - переводить надо
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #9 : 12-01-2011 16:35 » |
|
#include <vector>
typedef std::vector<AnsiString> MyStrings;
int main() { MyStrings massiv1(2000);
massiv1[0] = "Ифаноф";
return 0; }
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Prokl
Участник
Offline
|
|
« Ответ #10 : 27-02-2011 08:26 » |
|
Ничего не получается. Если объявить массив AnsiString massiv[x ][y] то x это номер элемента массива, а y длина строки. А мне надо чтобы х - количество строк, y - количество столбцев и уже третье число - длина строки. Как это сделать?
|
|
« Последнее редактирование: 27-02-2011 09:04 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #11 : 27-02-2011 09:06 » |
|
Prokl, поменять местами x и y ? (а ещё лучше, воспользоваться STL )
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #12 : 27-02-2011 10:11 » |
|
Prokl, а что в этом массиве должно храниться? Зачем он вообще нужен, какая задача решается?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Prokl
Участник
Offline
|
|
« Ответ #13 : 27-02-2011 13:35 » |
|
это карта, у каждой ячейки несколько данных в виде слов, вот их и надо сохранять Добавлено через 6 минут и 29 секунд:Prokl, поменять местами x и y ? (а ещё лучше, воспользоваться STL ) x и y я для примера привел, могут и другие переменные стоять. главная проблемма, как объявить трехмерный массив. А STL для меня сложно, хотя бы пример какой нибудь был бы
|
|
« Последнее редактирование: 27-02-2011 13:42 от Prokl »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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
Участник
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 - неполучается
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #16 : 01-03-2011 17:00 » |
|
>>пробовал объявить переменную равную 16000000 - неполучается
локальный массив и не получится так объявить
А если не секрет, зачем столько строк сразу выделяется ?
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #17 : 01-03-2011 21:43 » |
|
Алексей1153++, может он запасливый - в хозяйстве пригодится
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #18 : 02-03-2011 04:45 » |
|
Видали мы таких запасливых )
|
|
|
Записан
|
|
|
|
Prokl
Участник
Offline
|
|
« Ответ #19 : 02-03-2011 13:31 » |
|
это карта, у каждой ячейки несколько данных в виде слов, вот их и надо сохранять
просто карта большая
|
|
|
Записан
|
|
|
|
ocbmuhor
Интересующийся
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 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #21 : 09-03-2011 20:35 » |
|
точно есть вот такая ошибка
i<=44
i<44
|
|
|
Записан
|
|
|
|
ocbmuhor
Интересующийся
Offline
|
|
« Ответ #22 : 09-03-2011 21:04 » |
|
Это уже интересно При параметре for (i=0; i<44; i++) все работает. Но чем же подобный параметр (i=1; i<=44; i++) смущает процессор?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #23 : 09-03-2011 21:05 » |
|
попыткой доступа в чужую память, надо полагать
|
|
|
Записан
|
|
|
|
ocbmuhor
Интересующийся
Offline
|
|
« Ответ #24 : 09-03-2011 21:36 » |
|
Ну да. 0..43 как заявлено то не 1..44. теперяче понятно
|
|
|
Записан
|
|
|
|
|