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

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

Привет! Как програмно создавать массивы, например, по событию, чтоб они были необходимого мне, на момент срабатывания события, объема?
Записан
Serg79
Команда клуба

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

WWW
« Ответ #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
Команда клуба

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

WWW
« Ответ #3 : 03-10-2009 18:08 » 

dusty, можно и так.
Записан
dusty
Гость
« Ответ #4 : 03-10-2009 18:14 » 

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

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

WWW
« Ответ #5 : 03-10-2009 18:33 » 

dusty, еще надо не забывать освобождать память. Иначе будут утечки памяти и программа будет пухнуть.
Записан

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

il
Offline 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
Спокойный
Администратор

il
Offline 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
Спокойный
Администратор

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


« Ответ #13 : 01-12-2009 21:26 » 

Да правильно, я что то посчитал. Что он возьмет размерность только указателя на массив указателей. Буду знать, что константные массивы так себя ведут.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Молодой специалист

ru
Offline Offline

« Ответ #15 : 21-12-2009 17:22 » 

хехе, что такое в данном случае? Эта программа, в том виде как она написана (без последнего замечания Алексея) уже НЕ будет работать в 64 разрядных ОС (ну например, в Windows Vists 64 или Window 7 и т.д.)
Записан

С уважением Lapulya
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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
Опытный

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

« Ответ #17 : 22-12-2009 06:56 » 

Для создания массива можно написать char * value;, но, кроме самого массива, выделяется еще и память под указатель. А есть ли способ создания массива любого объёма, размер которого будет количество_элементов*размер_одного_элемента, без выделения лишней памяти?
« Последнее редактирование: 22-12-2009 07:00 от Inkognito » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #18 : 22-12-2009 07:04 » 

Inkognito, есть
Код:
{
  new char[10];
}

но тут серьёзный недостаток - нельзя работать с этим массивом, так как адрес нигде не сохранился. Так что, 4 лишних байтика среди 2 гиг - нормальная плата за удобство и возможность работать Отлично

Если хочется экономить память, а элемент - это не char, с своя структура/класс, то можно задать выравнивание по единице

Код:
#pragma pack(push,1)
struct AAA
{
   ...
};
#pragma pack(pop)

это поможет иногда съэкономить память, но может привести к ухудшению быстродействия.
« Последнее редактирование: 22-12-2009 07:07 от Алексей1153++ » Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #19 : 22-12-2009 07:39 » 

Inkognito, вообще не понял вопроса, но могу сказать следующее - память под указатель выделяется на стеке, а для массива (если динамически) в куче. Если у тебя указатель это чей-то мембер (какого-то класса), и объект этого класса также создан в куче, то тут все в порядке, поскольку массив массивом, а это мемвер! классу с этим мембером работать надо и строго говоря созданный массив к этому мемберу отношения не имеет (еще раз говорю, это просто мембер), поскольку в ходе выполнения этот мембер может ссылать и на другие массивы (области памяти).

LogRus, макрос не будет работать (точнее все просто рухнет), в случае если память под массив еще не выделена (т.е. p[0] еще нет)
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #20 : 22-12-2009 07:43 » 

LogRus, макрос не будет работать (точнее все просто рухнет), в случае если память под массив еще не выделена (т.е. p[0] еще нет)
Макрос нельзя вызывать для динамического массива. )
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #21 : 22-12-2009 07:58 » 

LogRus, макрос не будет работать (точнее все просто рухнет), в случае если память под массив еще не выделена (т.е. p[0] еще нет)

Макрос нельзя вызывать для динамического массива. )

ну вы сами напросились Улыбаюсь
во-первых, в задаче массив на стеке
во-вторых, я редко пользуюсь массивами, я предпочитаю обёртку boost::array
в-третьих, если нужен динамический массив, то это вектор или дек, но ни как не char *
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #22 : 22-12-2009 08:21 » 

LogRus, я ж Лапуле отвечал, а не тебе возражал ))
Записан

lapulya
Молодой специалист

ru
Offline Offline

« Ответ #23 : 22-12-2009 10:26 » 

Алексей1153++, мда... огород мы тут нагородили)))
Записан

С уважением Lapulya
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #24 : 22-12-2009 10:48 » 

огородники ))
Записан

Петр_Иванович
Гость
« Ответ #25 : 19-01-2010 17:45 » 

И все-же, хотелось бы поподробнее об определении размера массива с помощью функции sizeof(). Вроде все понятно, что, если массив типа char, то можно не делить на размер char, если типа int, то делить на sizeof(int) и т.д.. А на деле не всегда получается  Здесь была моя ладья....
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #26 : 19-01-2010 17:55 » 

Петр_Иванович, лучше всегда делить ) Ну а в случае динамического массива - можно только запомнить выделенный размер
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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
Молодой специалист

no
Offline Offline

« Ответ #29 : 20-01-2010 10:43 » new

можно, но всё-же одну мерность надо будет указать.
Код:
#include <stdio.h>

int main(int argc, char* argv[])
{ int a[][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

  return 0;
}
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines