URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5750
[ Назад ]

Исходное сообщение
"calloc"

Отправлено Fagot , 27-Сен-06 14:37 
Здравствуйте.

есть структра
struct _cfg {
  char var[256];
  char val[256];
  struct _cfg *next;
} *cfg;

циклом перебираю файл. из каждой строчки заносятся (должны заносится) данные в массив.
я думаю надо делать через calloc, для инициализации массива, или я что-то неправильно думаю?
Книгу по этой теме заштудировал, но не черта не понял, хочется так сказать из первых рук :-)
Заранее спасибо!


Содержание

Сообщения в этом обсуждении
"calloc"
Отправлено Fagot , 27-Сен-06 15:29 
Немного разобрался.
Делаю вот так:

struct _cfg {
  char *var;
  char *val;
  struct _cfg *next;
} *cfg;

struct _cfg *ptr;
while(...)
{
        for(ptr = cfg; ptr != NULL; ptr = ptr->next);

        ptr = calloc(1, sizeof(struct _cfg));
        ptr->var = malloc(strlen(var));
        ptr->val = malloc(strlen(val));
        strcpy(ptr->var, var);
        strcpy(ptr->val, val);
}

но это не конченая штука. Не работает так как надо.
Надо что-то добавить, чтобы всё заносилось в cfg.
А то ента штука всё на первом уровне только изменяет (next не трогает).


"calloc"
Отправлено DeepEye , 27-Сен-06 17:57 
>Немного разобрался.
>Делаю вот так:
>
>struct _cfg {
>  char *var;
>  char *val;
>  struct _cfg *next;
>} *cfg;
>
>struct _cfg *ptr;
>while(...)
>{
>        for(ptr = cfg; ptr != NULL; ptr = ptr->next);
>
>        ptr = calloc(1, sizeof(struct
>_cfg));
>        ptr->var = malloc(strlen(var));
>        ptr->val = malloc(strlen(val));
>        strcpy(ptr->var, var);
>        strcpy(ptr->val, val);
>}
>
>но это не конченая штука. Не работает так как надо.
>Надо что-то добавить, чтобы всё заносилось в cfg.
>А то ента штука всё на первом уровне только изменяет (next не
>трогает).

struct _cfg *head=NULL;
struct _cfg *ptr=NULL, *ptr1=NULL;

while(!feof())
{
   ptr =(struct _cfg *)malloc( ... );
   ptr->next = NULL;  

   ptr->var = ...
   ptr->val = ...

   if( head == NULL ) head = ptr; else ptr1->next = prt;

   ptr1 = ptr;
}

Что-то типа этого если хочешь список делать
в head будет голова списка


"calloc"
Отправлено Fagot , 27-Сен-06 18:38 
Спасибо работает. Я тут сам вариант придумал, но ваша версия покороче будет!
Вот мой вариант:

struct _cfg *cfg, *ptr;
if(cfg == NULL)
{
  cfg = calloc(1, sizeof(struct config));
  cfg->var = malloc(strlen(var));
  cfg->val = malloc(strlen(val));
  strcpy(cfg->var, var);
  strcpy(cfg->val, val);
}
else
{
  ptr = calloc(1, sizeof(struct config));
  ptr->next = calloc(1, sizeof(struct config));
  ptr->var = malloc(strlen(var));
  ptr->val = malloc(strlen(val));
  strcpy(ptr->var, var);
  strcpy(ptr->val, val);
  ptr->next = cfg;
  cfg = ptr;
}


"calloc"
Отправлено Fagot , 30-Сен-06 10:31 
Вот что ещё спросить хочю, сформировал я эту цепочку,
а как в ней изменить какое-нибудь значение?
Напрмер cfg->next->next->...->val ?