Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Apr 23, 2019 9:24 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 217 posts ]  Go to page Previous 19 10 11 12 1315 Next
Author Message
 Post subject: Re: C--
PostPosted: Mon Mar 24, 2014 12:46 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1143
Leency wrote:
Что ты конкретно хочешь сделать?

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

оно?


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

_________________
я лишь учусь


Top
   
 Post subject: Re: C--
PostPosted: Mon Mar 24, 2014 1:19 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4983
> массив, где длина всех строк одинакова.
Их есть у нас. http://websvn.kolibrios.org/filedetails ... Fhistory.h

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

Code:
strlcpy(#history_list[current].Item, #URL, sizeof(history_list[0].Item));

А вот для чего-то покруче (например, массив переменного размера) придётся писать свои функции. Пингуй мя в скайпе jewont, вконтактах, тут, если будут вопросы.

_________________
Через тернии к звездам


Top
   
 Post subject: Re: C--
PostPosted: Mon Mar 24, 2014 2:19 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1143
А как очищать подобную структуру ты случаем не продумывал? А то как-то не хочется в тупую циклом обходить.

_________________
я лишь учусь


Top
   
 Post subject: Re: C--
PostPosted: Mon Mar 24, 2014 2:36 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4983
> А как очищать подобную структуру ты случаем не продумывал?
for (i=0; i<count; i++) strcpy(#history_list[i].Item, 0);

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

_________________
Через тернии к звездам


Top
   
 Post subject: Re: C--
PostPosted: Wed Mar 26, 2014 12:28 am 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1143
В общем появилась необходимость динамически расширять массив, т.е. выделять доп. память под массив при его увеличении. Насколько я понял это можно сделать при помощи функции dword realloc(dword mptr, size)
где dword mptr - указатель на текущий массив, size - соответственно новый размер массива, а на выходе указатель на наш массив с дополнительной выделенной памятью, правильно?

_________________
я лишь учусь


Top
   
 Post subject: Re: C--
PostPosted: Wed Mar 26, 2014 12:29 am 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1143
Code:
struct Copy_Path {
   dword   size;
   dword   type;
   path_str copy_list[1];
};   


path_str copy_list[1] - мне и надо увеличивать при необходимости

_________________
я лишь учусь


Top
   
 Post subject: Re: C--
PostPosted: Wed Mar 26, 2014 11:15 am 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4983
Нужно смотреть код.
Вообще да, нужно хранить размер массива и если его не хватает - realloc.

_________________
Через тернии к звездам


Top
   
 Post subject: Re: C--
PostPosted: Fri Apr 25, 2014 6:42 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1143
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 заменить на динамически изменяющийся?

_________________
я лишь учусь


Top
   
 Post subject: Re: C--
PostPosted: Fri Apr 25, 2014 6:56 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
punk_joker
Какой размер планируется в килобайтах - от и до ?


Top
   
 Post subject: Re: C--
PostPosted: Fri Apr 25, 2014 7:04 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1143
Serge wrote:
punk_joker
Какой размер планируется в килобайтах - от и до ?

Если о размере окончательного массива, то неизвестно заранее. Мне необходимо будет его увеличивать при необходимости на один элемент.

_________________
я лишь учусь


Top
   
 Post subject: Re: C--
PostPosted: Fri Apr 25, 2014 8:05 pm 
Offline
User avatar

Joined: Sat Oct 05, 2013 9:32 pm
Posts: 386
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. Всё это в цикле.


Top
   
 Post subject: Re: C--
PostPosted: Fri Apr 25, 2014 8:30 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
punk_joker
То есть нижняя границ 4Кб и верхняя несколько десятков Мб или полтора Гб ?


Top
   
 Post subject: Re: C--
PostPosted: Fri Apr 25, 2014 10:40 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1143
Serge wrote:
punk_joker
То есть нижняя границ 4Кб и верхняя несколько десятков Мб или полтора Гб ?

Врятли таких объемов достигнет, но да.

_________________
я лишь учусь


Top
   
 Post subject: Re: C--
PostPosted: Sat Apr 26, 2014 1:15 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
punk_joker
Если массив непрерывный особых проблем нет. Резервируешь большой диапазон адресов ф68.12. Пока массив растёт, считаешь кол-во страниц которое он занимает, физ память автоматически предоставит ядро. Когда массив начнёт уменьшаться возвращаешь ядру ненужные страницы ф68.26. Например у тебя был массив 719Кб это 180стр, стало 113 Кб это 29 стр. Значит edx = 29 * 4096 esi = (180-29)*4096. Когда массив начнёт расти, ядро снова выделит память в пределах первоначально зарезервированных ф.68.12. При желании ты можешь освободить страницы в любом месте в пределах диапазона. Используя этот механизм можно зарезервировать все доступное пространство адресов и дальше использовать свой аллокатор.
P.S. ядро обнуляет выделяемую память.


Top
   
 Post subject: Re: C--
PostPosted: Sat Apr 26, 2014 1:06 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4983
Считаешь кол-во выделенных файлов Insert'ом. Узнаёшь их кол-во.
Допустим их 34. Тогда делаешь copy_files_mas=malloc(34*4096).
Потом сохраняешь пути для каждого strcpy(i*nomer_faila+copy_files_mas, file_path_to_copy);
где i - это список файлов от 0 до 33.

_________________
Через тернии к звездам


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 217 posts ]  Go to page Previous 19 10 11 12 1315 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited