Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Рассширение/сужение массивов в C++

17K
14 мая 2006 года
EXIS
1 / / 14.05.2006
Использую С++ из VisualStudio 2005

Допустим имеется некая структура D3DMATERIAL9

typedef struct _D3DMATERIAL9 {
D3DCOLORVALUE Diffuse; /* Diffuse color RGBA */
D3DCOLORVALUE Ambient; /* Ambient color RGB */
D3DCOLORVALUE Specular; /* Specular 'shininess' */
D3DCOLORVALUE Emissive; /* Emissive color RGB */
float Power; /* Sharpness if specular highlight */
} D3DMATERIAL9;


Создаю массив для 10 структур.

D3DMATERIAL9[10] MyMaterials;

Как расширить этот масив например до 20 структур
и наоборот сокартить до 10 (отчистить память).

Какие функции Си для этого нужно использовать и каким образом?
memset?

Заранее благодарен.
2
14 мая 2006 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by EXIS
Использую С++ из VisualStudio 2005

Допустим имеется некая структура D3DMATERIAL9

typedef struct _D3DMATERIAL9 {
D3DCOLORVALUE Diffuse; /* Diffuse color RGBA */
D3DCOLORVALUE Ambient; /* Ambient color RGB */
D3DCOLORVALUE Specular; /* Specular 'shininess' */
D3DCOLORVALUE Emissive; /* Emissive color RGB */
float Power; /* Sharpness if specular highlight */
} D3DMATERIAL9;


Создаю массив для 10 структур.

D3DMATERIAL9[10] MyMaterials;

Как расширить этот масив например до 20 структур
и наоборот сокартить до 10 (отчистить память).

Какие функции Си для этого нужно использовать и каким образом?
memset?

Заранее благодарен.


если ты пишешь на С++, НЕ надо использовать функции С. Надо использовать контейнеры STL типа std::vector

http://www.codenet.ru/progr/cpp/stl/Using-STL.php

273
24 мая 2006 года
3A3-968M
1.2K / / 22.12.2005
Массивы, размер которых можно менять на терминологии STL называются векторами, а на терминологии .NET - это списки. Если ты собираешься менять размер массива средствами C, тогда создавай не статический массив, а динамический:
int newsize=10;
D3DMATERIAL9* MyMaterials = malloc(sizeof(D3DMATERIAL9)*newsize);
242
24 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by 3A3-968M
Если ты собираешься менять размер массива средствами C, тогда создавай не статический массив, а динамический:
int newsize=10;
D3DMATERIAL9* MyMaterials = malloc(sizeof(D3DMATERIAL9)*newsize);



значит, если я хочу в С динамически изменить размер массива в процессе выполнения проги, тогда надо зарезирвировать память нужного размера +/- n элементов , и переписываю в него старый массив(+ новые элементы/- ненужные элементы)?

не быстрее ли работать с linked list?

2
24 мая 2006 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by OlgaKr
я резервирую память нужного размера +/- n элементов



не так. сначала - по любому надо каким либо образом выяснить каков будет первоначальный размер. +/- делать нельзя, поскольку моментально получишь buffer overflow. как пример: в свое время WWW консорциум следующим образом рекомендовал выделять память в CGI сценариях на С:

 
Код:
char* read_post()
{
   int size_of_query = atoi (getenv("CONTENT_LENGTH"));
   char str_query = (char *) malloc(size_of_query);
   if (str_query != NULL)
   fread(str_query,size_of_query,1,stdin);
   return str_query;
}


думаю смысл ясен. а при необходимости динамически изменить размер буффера - юзайте realloc.
естественно, не всегда можно получить первоначальный размер массива. поэтому в программу суют:
char str[255], char* str = (char*) malloc(255);
и прочее. и получают в итоге дыры в своем ПО.
поэтому если автор использует С++, как он пишет, пусть пользуется готовыми динамическими структурами.
242
24 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by squirL
не так. сначала - по любому надо каким либо образом выяснить каков будет первоначальный размер. +/- делать нельзя, поскольку моментально получишь buffer overflow. как пример: в свое время WWW консорциум следующим образом рекомендовал выделять память в CGI сценариях на С:

 
Код:
char* read_post()
{
   int size_of_query = atoi (getenv("CONTENT_LENGTH"));
   char str_query = (char *) malloc(size_of_query);
   if (str_query != NULL)
   fread(str_query,size_of_query,1,stdin);
   return str_query;
}


думаю смысл ясен. а при необходимости динамически изменить размер буффера - юзайте realloc.
естественно, не всегда можно получить первоначальный размер массива. поэтому в программу суют:
char str[255], char* str = (char*) malloc(255);
и прочее. и получают в итоге дыры в своем ПО.
поэтому если автор использует С++, как он пишет, пусть пользуется готовыми динамическими структурами.



я говорила о методе динамического изменения размера уже существующего массива.
спасибо за ответ

273
27 мая 2006 года
3A3-968M
1.2K / / 22.12.2005
Готовые динамические структуры в своих внутренностях всё равно используют malloc или realloc, т.к. иначе перераспределить память не получится.
2
27 мая 2006 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by 3A3-968M
Готовые динамические структуры в своих внутренностях всё равно используют malloc или realloc, т.к. иначе перераспределить память не получится.


естественно. смысл только в том, чтобы не заниматься изобретением велосипеда :) кстати - они не обязательно используют malloc и realloc. это - библиотечные функции, которые в свою очередь используют системные вызовы ОС. sbrk\brk для UNIX, например.

273
27 мая 2006 года
3A3-968M
1.2K / / 22.12.2005
Конечно могут быть и системные вызовы соответствующий функций. Функции printf и scanf, malloc и т.д. входят в состав CRT и являются стандартном, так как любой производитель компилятора языка C должен вводить поддержку этих функций, того требует стандарт ANSI C. Для работы с динамическими данными внутри функций я рекомендую использовать функцию alloca, т.к. она выделяет память в программном стеке и автоматически освобождается при возврате из функции.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог