[Comm] send pointer on struct to function in C

Alexey Morsov =?iso-8859-1?q?samurai_=CE=C1_ricom=2Eru?=
Пн Мар 14 19:57:38 MSK 2005


Alexey Rusakov wrote:
> On 14.03.2005 17:58, Alexey Morsov wrote:
> 
>>Привет,
>>
>>Не могу никак понять, как в Си передать в функцию ссылку на массив 
>>структур ?
>>
>>Пояснение:
>>есть структура
>>
>>typedef struct {
>>  char *name;
>>  char *val;
>>} Options;
>>
>>далее я ее инициализирую
>>Options cmd = {
> 
> Options cmd[] = ... , вы хотели сказать, я думаю.
Точно точно - описался - в коде то нормально написано

> 
> 
>>  {"user", "vasya"},
>>  {"host", "vasya на com.ru")
> 
> А здесь не помешало бы либо добавить , { NULL, NULL }, а в функции 
> проверять на NULLовость ну например name, либо передавать в функцию 
> отдельным параметром размер массива (в примерах этот параметр не использую).
Хм.... ну если вы имеет ввиду типа для определения конца массива при его 
переборе.... так оно вроде и работает как есть
Т.е. для текущей структуры конструкция вида

while (cmd[i].user != NULL )
   printf("%s\n", cmd[i++].host);

вполне себе работает  :)

>>Теперь хочу передать своей функции ссылку на структуру cmd и имя 
>>параметра "user" а она должна вернуть мне значение этого параметра :)
> 
> void fn(Options *o, char **user)
Тут наверное лучше пояснить на живом примере так сказать.
Структура
typedef struct {
    const char *name;
    char *val;
} Options;

инициализация
Options cmd[] = {
    {"squidlog", "access.log"},      // path to squid access.log file
    {"config", "trafficd.conf"}   // path to trafficd conf file
};


функция

char *OptionGetVal(Options *opt, char *name) {
    int i=0;
    while (opt[i].name != NULL ) {
       if (!strcmp(name,opt[i].name))
          return(opt[i].val);
       i++;
    }
    return NULL;
}

вызов ее такой

printf("squidlog=%s\n", OptionGetVal(cmd,"squidlog"));

при компиляции имею:

In file included from common.c:1,
                  from main.c:2:
trafficd.h:23: error: conflicting types for `Options'
trafficd.h:23: error: previous declaration of `Options'
trafficd.h:32: error: conflicting types for `OptionsGetVal'
trafficd.h:32: error: previous declaration of `OptionsGetVal'

 >_< Вот я понимаю что я тут как-то не прав? Но где именно я не прав?

-- 
Всего наилучшего,
Системный Администратор ЗАО "ИК "РИКОМ-ТРАСТ"
Алексей Морсов
ICQ: 196766290
Jabber: Samurai на jabber.pibhe.com
http://www.ricom.ru
http://www.fondmarket.ru



Подробная информация о списке рассылки community