dusty
Гость
|
|
« : 03-10-2009 17:40 » |
|
Привет! Как програмно создавать массивы, например, по событию, чтоб они были необходимого мне, на момент срабатывания события, объема?
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #1 : 03-10-2009 17:44 » |
|
dusty, выделяй динамически память и размешай в нем данные.
|
|
|
Записан
|
|
|
|
dusty
Гость
|
|
« Ответ #2 : 03-10-2009 18:04 » |
|
Вот так? include<iostream.h>
int number = 0; while(1) { cout<<"Введите размер массива:\n"; cin>>number;
int *massiv = new int*[number];
for (int i = 0; i<number; i++) { cout<<"введите значение ячейки массива:\n"; cin>>massiv[i]; } } return 0;
|
|
« Последнее редактирование: 03-10-2009 18:38 от Finch »
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #3 : 03-10-2009 18:08 » |
|
dusty, можно и так.
|
|
|
Записан
|
|
|
|
dusty
Гость
|
|
« Ответ #4 : 03-10-2009 18:14 » |
|
Спасибо.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 03-10-2009 18:33 » |
|
dusty, еще надо не забывать освобождать память. Иначе будут утечки памяти и программа будет пухнуть.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #6 : 03-10-2009 18:37 » |
|
Поправка int *massiv = new int*[number];
Так ты создаеш двухмерный массив, с не иницилизированным вторым измерением. И на дальшейшем коде ты от компилятора должен получать большие матюки про не соответсвие L уровня. Нужно писать int *massiv = new int[number];
|
|
« Последнее редактирование: 03-10-2009 18:40 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
dusty
Гость
|
|
« Ответ #7 : 03-10-2009 18:42 » |
|
Все понял, спасибо большое.
|
|
|
Записан
|
|
|
|
urugvai
Гость
|
|
« Ответ #8 : 01-12-2009 21:01 » |
|
Более удобный вариант.
char *ps [] = {"Импортная", "Зарубежная", "Брендовая", "Купить", "Купить"}; short lim = sizeof ps / sizeof (int); // подсчитать количесво массивов. cout << lim;
|
|
|
Записан
|
|
|
|
urugvai
Гость
|
|
« Ответ #9 : 01-12-2009 21:07 » |
|
Можно использовать класс string он автоматический подсчитывает размер массива.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #10 : 01-12-2009 21:09 » |
|
urugvai, Предложенный тобой способ удобен, только когда заранее известна размерность. И ты ее вводиш уже в коде программы. Что не совсем удовлетворяет условию задачи. И еше одно sizeof(ps)/sizeof(int) будет всегда равно 1. Проверяй код, прежде чем постить его.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
urugvai
Гость
|
|
« Ответ #11 : 01-12-2009 21:15 » |
|
Я проверял. Код работает. char *ps [] = {"Импортная", "Зарубежная", "Брендовая", "Купить"}; short lim = sizeof ps / sizeof (int); // подсчитать количесво массивов. cout << sizeof(int);
Показывает 4 байта! Все верно.
|
|
|
Записан
|
|
|
|
urugvai
Гость
|
|
« Ответ #12 : 01-12-2009 21:16 » |
|
Вот программа
//---------------------------------------------------------------------------
#include <vcl.h> #pragma hdrstop #include <iostream> using namespace std;
#include <tchar.h> //---------------------------------------------------------------------------
#pragma argsused int _tmain(int argc, _TCHAR* argv[]) { //char *ps[80] = {"animal"}; char *ps [] = {"Импортная", "Зарубежная", "Брендовая", "Купить", "ssss"}; short lim = sizeof ps / sizeof (int); // подсчитать количесво массивов. cout << lim; cin.get(); return 0; } //---------------------------------------------------------------------------
Показывает 5!! как и должно быть 5ть масивов.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #13 : 01-12-2009 21:26 » |
|
Да правильно, я что то посчитал. Что он возьмет размерность только указателя на массив указателей. Буду знать, что константные массивы так себя ведут.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 02-12-2009 05:37 » |
|
всё нормально, только считать надо не sizeof ps / sizeof(int) а sizeof(ps) / sizeof(*ps) - это выражение для любого статического массива даст количество элементов. В данном случае urugvai-ю повезло, что sizeof(int)==sizeof(viod*) Иначе его программы бы не работали
|
|
« Последнее редактирование: 02-12-2009 05:39 от Алексей1153++ »
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #15 : 21-12-2009 17:22 » |
|
хехе, что такое в данном случае? Эта программа, в том виде как она написана (без последнего замечания Алексея) уже НЕ будет работать в 64 разрядных ОС (ну например, в Windows Vists 64 или Window 7 и т.д.)
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Антон (LogRus)
|
|
« Ответ #16 : 22-12-2009 04:42 » |
|
......... short lim = sizeof ps / sizeof (int); // подсчитать количесво массивов. ........
меняем на #define SIZE_OF_ARRAY(x) sizeof(x)/( sizeof(x[0])) ......... size_t lim = SIZE_OF_ARRAY(ps); ........
|
|
|
Записан
|
Странно всё это....
|
|
|
Dr.Yevhenius
|
|
« Ответ #17 : 22-12-2009 06:56 » |
|
Для создания массива можно написать char * value;, но, кроме самого массива, выделяется еще и память под указатель. А есть ли способ создания массива любого объёма, размер которого будет количество_элементов*размер_одного_элемента, без выделения лишней памяти?
|
|
« Последнее редактирование: 22-12-2009 07:00 от Inkognito »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 22-12-2009 07:04 » |
|
Inkognito, есть но тут серьёзный недостаток - нельзя работать с этим массивом, так как адрес нигде не сохранился. Так что, 4 лишних байтика среди 2 гиг - нормальная плата за удобство и возможность работать Если хочется экономить память, а элемент - это не char, с своя структура/класс, то можно задать выравнивание по единице #pragma pack(push,1) struct AAA { ... }; #pragma pack(pop)
это поможет иногда съэкономить память, но может привести к ухудшению быстродействия.
|
|
« Последнее редактирование: 22-12-2009 07:07 от Алексей1153++ »
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #19 : 22-12-2009 07:39 » |
|
Inkognito, вообще не понял вопроса, но могу сказать следующее - память под указатель выделяется на стеке, а для массива (если динамически) в куче. Если у тебя указатель это чей-то мембер (какого-то класса), и объект этого класса также создан в куче, то тут все в порядке, поскольку массив массивом, а это мемвер! классу с этим мембером работать надо и строго говоря созданный массив к этому мемберу отношения не имеет (еще раз говорю, это просто мембер), поскольку в ходе выполнения этот мембер может ссылать и на другие массивы (области памяти).
LogRus, макрос не будет работать (точнее все просто рухнет), в случае если память под массив еще не выделена (т.е. p[0] еще нет)
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 22-12-2009 07:43 » |
|
LogRus, макрос не будет работать (точнее все просто рухнет), в случае если память под массив еще не выделена (т.е. p[0] еще нет)
Макрос нельзя вызывать для динамического массива. )
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #21 : 22-12-2009 07:58 » |
|
LogRus, макрос не будет работать (точнее все просто рухнет), в случае если память под массив еще не выделена (т.е. p[0] еще нет)
Макрос нельзя вызывать для динамического массива. )
ну вы сами напросились во-первых, в задаче массив на стеке во-вторых, я редко пользуюсь массивами, я предпочитаю обёртку boost::array в-третьих, если нужен динамический массив, то это вектор или дек, но ни как не char *
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 22-12-2009 08:21 » |
|
LogRus, я ж Лапуле отвечал, а не тебе возражал ))
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #23 : 22-12-2009 10:26 » |
|
Алексей1153++, мда... огород мы тут нагородили)))
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 22-12-2009 10:48 » |
|
огородники ))
|
|
|
Записан
|
|
|
|
Петр_Иванович
Гость
|
|
« Ответ #25 : 19-01-2010 17:45 » |
|
И все-же, хотелось бы поподробнее об определении размера массива с помощью функции sizeof(). Вроде все понятно, что, если массив типа char, то можно не делить на размер char, если типа int, то делить на sizeof(int) и т.д.. А на деле не всегда получается .
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #26 : 19-01-2010 17:55 » |
|
Петр_Иванович, лучше всегда делить ) Ну а в случае динамического массива - можно только запомнить выделенный размер
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #27 : 20-01-2010 04:56 » |
|
а еще лучше пользоваться обёртками оверхед (производительность/память) минимальный, а плюсов море. еще размер массива можно получить с помощью шаблона template<typename T, size_t N> size_t serialize_impl(const T (&val)[N]) // val можно опустить { return N; }
|
|
|
Записан
|
Странно всё это....
|
|
|
Петр_Иванович
Гость
|
|
« Ответ #28 : 20-01-2010 10:15 » |
|
Есть еще один вопрос по массивам, теперь по двумерным В одном источнике мне встречалось, что можно создавать статический массив без указания размера в квадратных скобках, если его сразу инициализировать. С одномерным массивом получается, а с двумерным никак. Даже, если явно задать количество строк. Вопрос: возможно ли такое в принципе (т.е. мною были допущены ошибки при создании такого массива) или ошиблись авторы источника (какого не помню)?
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #29 : 20-01-2010 10:43 » |
|
можно, но всё-же одну мерность надо будет указать. #include <stdio.h>
int main(int argc, char* argv[]) { int a[][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
return 0; }
|
|
|
Записан
|
|
|
|
|