From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <4235C282.5000701@ricom.ru> Date: Mon, 14 Mar 2005 19:57:38 +0300 From: Alexey Morsov User-Agent: Mozilla Thunderbird 1.0 (Windows/20041206) X-Accept-Language: en-us, en MIME-Version: 1.0 To: community@altlinux.ru Subject: Re: [Comm] send pointer on struct to function in C References: <4235A6A7.9020801@ricom.ru> <4235BB5D.7020109@altlinux.ru> In-Reply-To: <4235BB5D.7020109@altlinux.ru> Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: by amavisd-new at ricom.ru X-BeenThere: community@altlinux.ru X-Mailman-Version: 2.1.5 Precedence: list Reply-To: community@altlinux.ru List-Id: Mailing list for ALT Linux users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Mar 2005 16:57:42 -0000 Archived-At: List-Archive: List-Post: 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