Рассширение/сужение массивов в C++
Допустим имеется некая структура 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?
Заранее благодарен.
Использую С++ из 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
int newsize=10;
D3DMATERIAL9* MyMaterials = malloc(sizeof(D3DMATERIAL9)*newsize);
Если ты собираешься менять размер массива средствами C, тогда создавай не статический массив, а динамический:
int newsize=10;
D3DMATERIAL9* MyMaterials = malloc(sizeof(D3DMATERIAL9)*newsize);
значит, если я хочу в С динамически изменить размер массива в процессе выполнения проги, тогда надо зарезирвировать память нужного размера +/- n элементов , и переписываю в него старый массив(+ новые элементы/- ненужные элементы)?
не быстрее ли работать с linked list?
я резервирую память нужного размера +/- n элементов
не так. сначала - по любому надо каким либо образом выяснить каков будет первоначальный размер. +/- делать нельзя, поскольку моментально получишь buffer overflow. как пример: в свое время WWW консорциум следующим образом рекомендовал выделять память в CGI сценариях на С:
{
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);
и прочее. и получают в итоге дыры в своем ПО.
поэтому если автор использует С++, как он пишет, пусть пользуется готовыми динамическими структурами.
не так. сначала - по любому надо каким либо образом выяснить каков будет первоначальный размер. +/- делать нельзя, поскольку моментально получишь buffer overflow. как пример: в свое время WWW консорциум следующим образом рекомендовал выделять память в CGI сценариях на С:
{
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);
и прочее. и получают в итоге дыры в своем ПО.
поэтому если автор использует С++, как он пишет, пусть пользуется готовыми динамическими структурами.
я говорила о методе динамического изменения размера уже существующего массива.
спасибо за ответ
Готовые динамические структуры в своих внутренностях всё равно используют malloc или realloc, т.к. иначе перераспределить память не получится.
естественно. смысл только в том, чтобы не заниматься изобретением велосипеда :) кстати - они не обязательно используют malloc и realloc. это - библиотечные функции, которые в свою очередь используют системные вызовы ОС. sbrk\brk для UNIX, например.