C--

High-level languages programming questions
  • > массив, где длина всех строк одинакова.
    Их есть у нас. 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, вконтактах, тут, если будут вопросы.
    Из хаоса в космос
  • А как очищать подобную структуру ты случаем не продумывал? А то как-то не хочется в тупую циклом обходить.
    to infinity and beyond
  • > А как очищать подобную структуру ты случаем не продумывал?
    for (i=0; i<count; i++) strcpy(#history_list.Item, 0);

    или как-то так, если ты об этом
    поидее это быстро
    Из хаоса в космос
  • В общем появилась необходимость динамически расширять массив, т.е. выделять доп. память под массив при его увеличении. Насколько я понял это можно сделать при помощи функции dword realloc(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];
    };	
    path_str copy_list[1] - мне и надо увеличивать при необходимости
    to infinity and beyond
  • Нужно смотреть код.
    Вообще да, нужно хранить размер массива и если его не хватает - 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 заменить на динамически изменяющийся?
    to infinity and beyond
  • punk_joker
    Какой размер планируется в килобайтах - от и до ?
  • Serge wrote:punk_joker
    Какой размер планируется в килобайтах - от и до ?
    Если о размере окончательного массива, то неизвестно заранее. Мне необходимо будет его увеличивать при необходимости на один элемент.
    to infinity and beyond
  • 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. Всё это в цикле.
  • punk_joker
    То есть нижняя границ 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. ядро обнуляет выделяемую память.
  • Считаешь кол-во выделенных файлов Insert'ом. Узнаёшь их кол-во.
    Допустим их 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 2 guests