Page 11 of 15

Re: C--

Posted: Mon Mar 24, 2014 12:46 pm
by punk_joker
Leency wrote:Что ты конкретно хочешь сделать?

> Каким образом в С-- можно получить данные определенного размера с определенной позиции?
strncpy(in_buf, from_buf + смещение_на_определённую позицию, размер_копируемых_данных);

оно?
Теоретически оно. В общем то, мне нужен скорее всего двумерный массив, где длина всех строк одинакова.

Re: C--

Posted: Mon Mar 24, 2014 1:19 pm
by Leency
> массив, где длина всех строк одинакова.
Их есть у нас. http://websvn.kolibrios.org/filedetails ... Fhistory.h

Code: Select all

struct path_string {
char Item[4096];
};
 
#define MAX_HISTORY_NUM 40
path_string history_list[MAX_HISTORY_NUM];

Code: Select all

strlcpy(#history_list[current].Item, #URL, sizeof(history_list[0].Item));
А вот для чего-то покруче (например, массив переменного размера) придётся писать свои функции. Пингуй мя в скайпе jewont, вконтактах, тут, если будут вопросы.

Re: C--

Posted: Mon Mar 24, 2014 2:19 pm
by punk_joker
А как очищать подобную структуру ты случаем не продумывал? А то как-то не хочется в тупую циклом обходить.

Re: C--

Posted: Mon Mar 24, 2014 2:36 pm
by Leency
> А как очищать подобную структуру ты случаем не продумывал?
for (i=0; i<count; i++) strcpy(#history_list.Item, 0);

или как-то так, если ты об этом
поидее это быстро

Re: C--

Posted: Wed Mar 26, 2014 12:28 am
by punk_joker
В общем появилась необходимость динамически расширять массив, т.е. выделять доп. память под массив при его увеличении. Насколько я понял это можно сделать при помощи функции dword realloc(dword mptr, size)
где dword mptr - указатель на текущий массив, size - соответственно новый размер массива, а на выходе указатель на наш массив с дополнительной выделенной памятью, правильно?

Re: C--

Posted: Wed Mar 26, 2014 12:29 am
by punk_joker

Code: Select all

struct Copy_Path {
	dword	size;
	dword	type;
	path_str copy_list[1];
};	
path_str copy_list[1] - мне и надо увеличивать при необходимости

Re: C--

Posted: Wed Mar 26, 2014 11:15 am
by Leency
Нужно смотреть код.
Вообще да, нужно хранить размер массива и если его не хватает - realloc.

Re: C--

Posted: Fri Apr 25, 2014 6:42 pm
by punk_joker
struct path_str {
char Item[4096];
};

#define MAX_HISTORY_NUM 10

Clipboard clipboard;

struct Copy_Path {
dword size;
dword type;
int count;
path_str copy_list[MAX_HISTORY_NUM];
};

Как массив copy_list заменить на динамически изменяющийся?

Re: C--

Posted: Fri Apr 25, 2014 6:56 pm
by Serge
punk_joker
Какой размер планируется в килобайтах - от и до ?

Re: C--

Posted: Fri Apr 25, 2014 7:04 pm
by punk_joker
Serge wrote:punk_joker
Какой размер планируется в килобайтах - от и до ?
Если о размере окончательного массива, то неизвестно заранее. Мне необходимо будет его увеличивать при необходимости на один элемент.

Re: C--

Posted: Fri Apr 25, 2014 8:05 pm
by e-andrew
punk_joker wrote:
Serge wrote:punk_joker
Какой размер планируется в килобайтах - от и до ?
Если о размере окончательного массива, то неизвестно заранее. Мне необходимо будет его увеличивать при необходимости на один элемент.
Как вариант, можешь написать такой класс, который имеет значение, id, ссылку на следующий элемент (если == 0, то это конечный элемент вектора), сслыку на предыдущий элемент (если == 0, то это первый элемент). Можно просто портировать заголовок vector с C.
Метод push создаёт новый объект класса vector (нашего класса), устанавливает newvc.id = this.id + 1; newvc.prev = this; this.next = newvc;
Метод get_el или [] просто сравнивает id, если меньше, то сравнить с id+1, если больше, то id-1, иначе вернуть value. Всё это в цикле.

Re: C--

Posted: Fri Apr 25, 2014 8:30 pm
by Serge
punk_joker
То есть нижняя границ 4Кб и верхняя несколько десятков Мб или полтора Гб ?

Re: C--

Posted: Fri Apr 25, 2014 10:40 pm
by punk_joker
Serge wrote:punk_joker
То есть нижняя границ 4Кб и верхняя несколько десятков Мб или полтора Гб ?
Врятли таких объемов достигнет, но да.

Re: C--

Posted: Sat Apr 26, 2014 1:15 am
by Serge
punk_joker
Если массив непрерывный особых проблем нет. Резервируешь большой диапазон адресов ф68.12. Пока массив растёт, считаешь кол-во страниц которое он занимает, физ память автоматически предоставит ядро. Когда массив начнёт уменьшаться возвращаешь ядру ненужные страницы ф68.26. Например у тебя был массив 719Кб это 180стр, стало 113 Кб это 29 стр. Значит edx = 29 * 4096 esi = (180-29)*4096. Когда массив начнёт расти, ядро снова выделит память в пределах первоначально зарезервированных ф.68.12. При желании ты можешь освободить страницы в любом месте в пределах диапазона. Используя этот механизм можно зарезервировать все доступное пространство адресов и дальше использовать свой аллокатор.
P.S. ядро обнуляет выделяемую память.

Re: C--

Posted: Sat Apr 26, 2014 1:06 pm
by Leency
Считаешь кол-во выделенных файлов Insert'ом. Узнаёшь их кол-во.
Допустим их 34. Тогда делаешь copy_files_mas=malloc(34*4096).
Потом сохраняешь пути для каждого strcpy(i*nomer_faila+copy_files_mas, file_path_to_copy);
где i - это список файлов от 0 до 33.