Re[4]: Достаточно ли знать С без знания С++ для устройства на работу?
От: smeeld  
Дата: 06.09.14 22:42
Оценка: -1
Здравствуйте, sergey2b, Вы писали:

S>нужен динамический список (лучше array но можно list)

S>который динамически меняет размер от 0 до 0.5G +- каждые несколько секунд
S>софтина серверная 24x7, просто зарезервировать полгига (может не хватить) на все время работы программы незлья пользователь не поймет этого
Можно массив с эффектом непрерывного array только запись/чтение, управление через функции.

#define MASS_NODE (2<<20)
#define NODE_NUMBER (2<<9)
#define MAX_SIZE ((2<<29)-(2<<20))

size_t grow_buffer(void* glob_ptr, size_t sz){
unsigned long* tmp=(unsigned long*)glob_ptr, *nxt;
size_t current_size=*tmp;
size_t mas=MASS_NODE;
void* p;
if((sz > MAX_SIZE) || (current_size >= sz)) return current_size;
while(current_size < sz){
current_size+=mas;printf("RS %d Sz==%d\n", mas, sz);
nxt=tmp+current_size/mas;
p=malloc(mas);
if(!p){current_size-=mas; break; };
*nxt=(unsigned long)p;
};
*tmp=current_size;
return current_size;
};

size_t reduce_buffer(void* glob_ptr, size_t sz){
unsigned long* tmp=(unsigned long*)glob_ptr, *nxt;
size_t current_size=*tmp;
size_t mas=MASS_NODE;
void* p;

while(current_size>sz){
nxt=tmp+current_size/mas;
p=(void*) *nxt;
free(p);
current_size-=mas;
};
*tmp=current_size;
return current_size;
};

void* alloc_buffer(size_t sz){
unsigned long* glob_ptr;
void* p=malloc(NODE_NUMBER*sizeof(unsigned long));
if(!p) return NULL;
glob_ptr=(unsigned long*)p;
*glob_ptr=0;
if(grow_buffer(p, sz) < sz) return NULL;
return p;
};

free_buffer(void* p){
(void) reduce_buffer(p, 0);
free(p);
};
size_t read_from(void* dst, void* glob_ptr, size_t offset, size_t sz){
unsigned long* tmp=(unsigned long*)glob_ptr;
void* src;
tmp++;
size_t current_size=*tmp, mas=MASS_NODE, tail=offset, count=0, step;
if((offset>current_size) || (sz > (current_size-offset))) return 0;
src=(void*) *(tmp+tail/mas);
step=tail%mas;
src+=step;
step=sz-count;
do{
step=(step < mas) ? step : mas;
memcpy(dst+count, src, step);
tail+=step;
count+=step;
src=(void*) *(tmp+tail/mas);
step=sz-count;
}while(step);
return count;
};

size_t write_to(void* src, void* glob_ptr, size_t offset, size_t sz){
unsigned long* tmp=(unsigned long*)glob_ptr;
void* dst;
size_t current_size=*tmp, mas=MASS_NODE, tail=offset, count=0, step;
if((offset>current_size) || (sz > (current_size-offset))) return 0;
tmp++;
dst=(void*) *(tmp+tail/mas);
step=tail%mas;
src+=step;
step=sz-count;
do{
step=(step < mas) ? step : mas;
memcpy(dst, src+count, step);
tail+=step;
count+=step;
dst=(void*) *(tmp+tail/mas);
step=sz-count;
}while(step);
return count;
};

size_t current_size(void* glob_ptr){
unsigned long* tmp=(unsigned long*)glob_ptr;
return *tmp;
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.