Теоретически оно. В общем то, мне нужен скорее всего двумерный массив, где длина всех строк одинакова.Leency wrote:Что ты конкретно хочешь сделать?
> Каким образом в С-- можно получить данные определенного размера с определенной позиции?
strncpy(in_buf, from_buf + смещение_на_определённую позицию, размер_копируемых_данных);
оно?
C--
-
to infinity and beyond
> массив, где длина всех строк одинакова.
Их есть у нас. http://websvn.kolibrios.org/filedetails ... Fhistory.h
А вот для чего-то покруче (например, массив переменного размера) придётся писать свои функции. Пингуй мя в скайпе jewont, вконтактах, тут, если будут вопросы.
Их есть у нас. 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));
Из хаоса в космос
А как очищать подобную структуру ты случаем не продумывал? А то как-то не хочется в тупую циклом обходить.
to infinity and beyond
> А как очищать подобную структуру ты случаем не продумывал?
for (i=0; i<count; i++) strcpy(#history_list.Item, 0);
или как-то так, если ты об этом
поидее это быстро
for (i=0; i<count; i++) strcpy(#history_list.Item, 0);
или как-то так, если ты об этом
поидее это быстро
Из хаоса в космос
В общем появилась необходимость динамически расширять массив, т.е. выделять доп. память под массив при его увеличении. Насколько я понял это можно сделать при помощи функции dword realloc(dword mptr, size)
где dword mptr - указатель на текущий массив, size - соответственно новый размер массива, а на выходе указатель на наш массив с дополнительной выделенной памятью, правильно?
где dword mptr - указатель на текущий массив, size - соответственно новый размер массива, а на выходе указатель на наш массив с дополнительной выделенной памятью, правильно?
to infinity and beyond
Code: Select all
struct Copy_Path {
dword size;
dword type;
path_str copy_list[1];
};
to infinity and beyond
Нужно смотреть код.
Вообще да, нужно хранить размер массива и если его не хватает - realloc.
Вообще да, нужно хранить размер массива и если его не хватает - realloc.
Из хаоса в космос
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 заменить на динамически изменяющийся?
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 заменить на динамически изменяющийся?
to infinity and beyond
punk_joker
Какой размер планируется в килобайтах - от и до ?
Какой размер планируется в килобайтах - от и до ?
Если о размере окончательного массива, то неизвестно заранее. Мне необходимо будет его увеличивать при необходимости на один элемент.Serge wrote:punk_joker
Какой размер планируется в килобайтах - от и до ?
to infinity and beyond
Как вариант, можешь написать такой класс, который имеет значение, id, ссылку на следующий элемент (если == 0, то это конечный элемент вектора), сслыку на предыдущий элемент (если == 0, то это первый элемент). Можно просто портировать заголовок vector с C.punk_joker wrote:Если о размере окончательного массива, то неизвестно заранее. Мне необходимо будет его увеличивать при необходимости на один элемент.Serge wrote:punk_joker
Какой размер планируется в килобайтах - от и до ?
Метод push создаёт новый объект класса vector (нашего класса), устанавливает newvc.id = this.id + 1; newvc.prev = this; this.next = newvc;
Метод get_el или [] просто сравнивает id, если меньше, то сравнить с id+1, если больше, то id-1, иначе вернуть value. Всё это в цикле.
punk_joker
То есть нижняя границ 4Кб и верхняя несколько десятков Мб или полтора Гб ?
То есть нижняя границ 4Кб и верхняя несколько десятков Мб или полтора Гб ?
Врятли таких объемов достигнет, но да.Serge wrote:punk_joker
То есть нижняя границ 4Кб и верхняя несколько десятков Мб или полтора Гб ?
to infinity and beyond
punk_joker
Если массив непрерывный особых проблем нет. Резервируешь большой диапазон адресов ф68.12. Пока массив растёт, считаешь кол-во страниц которое он занимает, физ память автоматически предоставит ядро. Когда массив начнёт уменьшаться возвращаешь ядру ненужные страницы ф68.26. Например у тебя был массив 719Кб это 180стр, стало 113 Кб это 29 стр. Значит edx = 29 * 4096 esi = (180-29)*4096. Когда массив начнёт расти, ядро снова выделит память в пределах первоначально зарезервированных ф.68.12. При желании ты можешь освободить страницы в любом месте в пределах диапазона. Используя этот механизм можно зарезервировать все доступное пространство адресов и дальше использовать свой аллокатор.
P.S. ядро обнуляет выделяемую память.
Если массив непрерывный особых проблем нет. Резервируешь большой диапазон адресов ф68.12. Пока массив растёт, считаешь кол-во страниц которое он занимает, физ память автоматически предоставит ядро. Когда массив начнёт уменьшаться возвращаешь ядру ненужные страницы ф68.26. Например у тебя был массив 719Кб это 180стр, стало 113 Кб это 29 стр. Значит edx = 29 * 4096 esi = (180-29)*4096. Когда массив начнёт расти, ядро снова выделит память в пределах первоначально зарезервированных ф.68.12. При желании ты можешь освободить страницы в любом месте в пределах диапазона. Используя этот механизм можно зарезервировать все доступное пространство адресов и дальше использовать свой аллокатор.
P.S. ядро обнуляет выделяемую память.
Считаешь кол-во выделенных файлов Insert'ом. Узнаёшь их кол-во.
Допустим их 34. Тогда делаешь copy_files_mas=malloc(34*4096).
Потом сохраняешь пути для каждого strcpy(i*nomer_faila+copy_files_mas, file_path_to_copy);
где i - это список файлов от 0 до 33.
Допустим их 34. Тогда делаешь copy_files_mas=malloc(34*4096).
Потом сохраняешь пути для каждого strcpy(i*nomer_faila+copy_files_mas, file_path_to_copy);
где i - это список файлов от 0 до 33.
Из хаоса в космос
Who is online
Users browsing this forum: No registered users and 32 guests