From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <4235FDED.20506@altlinux.ru> Date: Tue, 15 Mar 2005 00:11:09 +0300 From: Alexey Rusakov User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20050202 Thunderbird/1.0 Mnenhy/0.7 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> <4235C282.5000701@ricom.ru> In-Reply-To: <4235C282.5000701@ricom.ru> Content-Type: multipart/mixed; boundary="------------070306090204040206090308" 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 21:11:11 -0000 Archived-At: List-Archive: List-Post: This is a multi-part message in MIME format. --------------070306090204040206090308 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Alexey Morsov wrote: >>> {"user", "vasya"}, >>> {"host", "vasya@com.ru") >>> >>> >>А здесь не помешало бы либо добавить , { NULL, NULL }, а в функции >>проверять на NULLовость ну например name, либо передавать в функцию >>отдельным параметром размер массива (в примерах этот параметр не использую). >> >> >Хм.... ну если вы имеет ввиду типа для определения конца массива при его >переборе.... так оно вроде и работает как есть >Т.е. для текущей структуры конструкция вида > >while (cmd[i].user != NULL ) > printf("%s\n", cmd[i++].host); > >вполне себе работает :) > > Кхм. Вам крупно повезло. >Тут наверное лучше пояснить на живом примере так сказать. >Структура >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) { > > Здесь лучше const 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' > > >_< Вот я понимаю что я тут как-то не прав? Но где именно я не прав? > > Что-то вы не договариваете. Я пришпилил к этому письму файлик - он прекрасно компилируется через 'gcc-3.4 -o test test.c'. -- Alexey "Ktirf" Rusakov --------------070306090204040206090308 Content-Type: text/plain; name="test.c" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="test.c" I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjb25zdCBjaGFyICpu YW1lOwogICAgY2hhciAqdmFsOwp9IE9wdGlvbnM7CgpPcHRpb25zIGNtZFtdID0gewogICAg eyJzcXVpZGxvZyIsICJhY2Nlc3MubG9nIn0sCiAgICB7ImNvbmZpZyIsICJ0cmFmZmljZC5j b25mIn0sCiAgICB7TlVMTCwgTlVMTH0KfTsKCmNoYXIgKk9wdGlvbkdldFZhbChPcHRpb25z ICpvcHQsIGNvbnN0IGNoYXIgKm5hbWUpIHsKICAgIGludCBpPTA7CiAgICB3aGlsZSAob3B0 W2ldLm5hbWUpIHsKICAgICAgIGlmICghc3RyY21wKG5hbWUsb3B0W2ldLm5hbWUpKQogICAg ICAgICAgcmV0dXJuKG9wdFtpXS52YWwpOwogICAgICAgaSsrOwogICAgfQogICAgcmV0dXJu IE5VTEw7Cn0KCmludCBtYWluKCkgewogICAgcHJpbnRmKCJzcXVpZGxvZz0lc1xuIiwgT3B0 aW9uR2V0VmFsKGNtZCwgInNxdWlkbG9nIikpOwogICAgcmV0dXJuIDA7Cn0K --------------070306090204040206090308--