|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 31, 2003 06:54:45 · Поправил: Artem volodya Не понятна задача. Если функция имеет вид hugefunction(char *func_name), то где параметры, которые передаются в функцию func_name, и куда передавать возвращаемое значение? |
|
|
Дата: Авг 31, 2003 18:34:30 Artem Мммм... Ты абсолютно прав, недоглядел, дубина... hugefunction расположена в CGI'ке, так что с возвратом все просто - в stdout его! С передаваемым значением тоже все просто. Смотрится имя функции, а потом уж сама функция подбирает его из http-потока. Т.о. решение о корректности параметров принимает уже сама функция, а не hugefunction - это кажется очень разумным. |
|
|
Дата: Авг 31, 2003 18:46:58 volodya С передаваемым значением тоже все просто. Смотрится имя функции, а потом уж сама функция подбирает его из http-потока. Т.о. решение о корректности параметров принимает уже сама функция, а не hugefunction - это кажется очень разумным. То-то, ведь!!! Тогда и параметры ф-циям не нужны. Так бы сразу. |
|
|
Дата: Сен 1, 2003 12:58:49 С передаваемым значением тоже все просто. Смотрится имя функции, а потом уж сама функция подбирает его из http-потока. Т.о. решение о корректности параметров принимает уже сама функция, а не hugefunction - это кажется очень разумным. Во-во. Я про это и говорил, что не пойму, откуда у тебя параметры берутся и в чем проблема. Сам сейчас cgi на сишке пишу.. :) |
|
|
Дата: Сен 5, 2003 18:41:11 Гм... Народ, к вопросу о птичках. Вот код, он здоровый, но все, что надо - лежит в main.
#include <stdlib.h>
#include <stdio.h>
#include <search.h>
int SeqHoundFini(void);
int SeqHoundInit(void);
int SeqHoundIsNetEntrezOn(void);
int SeqHoundNetEntrezInit(void);
int SeqHoundGetAccFromRetiredGi(void);
int SeqHoundFindName(void);
typedef int function (void);
typedef struct func
{
unsigned CRC32;
function *address;
} aof, *paof;
aof hashtable[] =
{
{0x1d414ade,SeqHoundFini},{0x1d414bf3,SeqHoundInit},{0x1cc28cc9,SeqHou ndIsNetEntrezOn},
{0x20285192,SeqHoundNetEntrezInit},{0x6798c166,SeqHoundGetAccFromRetir edGi},{0x41464dd2,SeqHoundFindName},
{0,0}
};
unsigned hashCrc(char *string)
/* Returns a CRC value on string. */
{
unsigned char *us = (unsigned char *)string;
unsigned char c;
unsigned shiftAcc = 0;
unsigned addAcc = 0;
while ((c = *us++))
{
shiftAcc <<= 2;
shiftAcc += c;
addAcc += c;
}
return shiftAcc + addAcc;
}
int compare (paof num1, paof num2)
{
return ((num1->CRC32) - (num2->CRC32));
}
void main(void)
{
paof f = NULL;
char name[] = "SeqHoundFini";
qsort(hashtable, sizeof(hashtable), sizeof(aof), compare);
if(!(f = (paof)bsearch(hashCrc(name),hashtable, sizeof(hashtable), sizeof(aof), compare)))
f->address;
}
int SeqHoundFini(void)
{
puts ("I'm SeqHoundFini!\n");
return 0;
}
int SeqHoundInit(void)
{
puts ("I'm SeqHoundInit!\n");
return 0;
}
int SeqHoundIsNetEntrezOn(void)
{
puts ("I'm SeqHoundIsNetEntrezOn!\n");
return 0;
}
int SeqHoundNetEntrezInit(void)
{
puts ("I'm SeqHoundNetEntrezInit!\n");
return 0;
}
int SeqHoundGetAccFromRetiredGi(void)
{
puts ("I'm SeqHoundGetAccFromRetiredGi!\n");
return 0;
}
int SeqHoundFindName(void)
{
puts ("I'm SeqHoundFindName!\n");
return 0;
}
|
|
|
Дата: Сен 5, 2003 18:43:39 Смысл прост. Создать массив. Заполнить его адресами на стадии компиляции, а потом использовать crc (ну, не crc это, а хеш, но до фени, в общем!) для поиска в массиве. Для этого массив надо отсортировать и использовать бинарный поиск. Только вот беда, может и идея-то неплоха, но с практической реализацией я чего-то застопорился... Туплю... С одной стороны, теоретически, работать должно, но с другой стороны, что-то здесь не то :((( У кого какие идеи есть? |
|
|
Дата: Сен 6, 2003 07:17:09 volodya
if(!(f = (paof)bsearch(hashCrc(name),hashtable, sizeof(hashtable), sizeof(aof), compare)))
f->address;
Не пойму смысл этой строчки. Может, имелось в виду вот это:
if(f = (paof)bsearch(hashCrc(name),hashtable, sizeof(hashtable), sizeof(aof), compare))
f->address();
|
|
|
Дата: Сен 6, 2003 20:50:42 · Поправил: volodya Artem Спасибо, что откликнулся. Тут проблема в другом. Может, я и ошибся с ! - плевать пока. Смысл в том, что вся эта фигня не работает. :(( Причем, сыплется еще на qsort. :((( Сложно там с приведением типов :((( |
|
|
Дата: Сен 8, 2003 01:58:14 volodya, у тебя статический массив. Зачем его сортировать в рантайме? Надо заранее отсортировать (ручками, написать отдельную прогу на перле, ...) Другое дело - bsearch... |
|
|
Дата: Сен 8, 2003 02:25:47 Quantum Ты прав, родной. Я еще себе тыкву почешу (т.к. мои импортные тушки просто не поймут весь полет моей мысли :() и сделаю, как ты мне раньше советовал. |
|
|
Дата: Сен 8, 2003 07:03:11 · Поправил: Artem volodya Кое-что я тогда проглядел - вместо sizeof(hashtable) в qsort и bsearch надо писать sizeof(hashtable)/sizeof(aof). |
|
|
Дата: Сен 9, 2003 04:25:30 Artem Она все равно падает. Действительно, это хорошая идея сортировать массив отдельным перловским скриптом. Напишу на днях. Потом использовать bsearch. Т.е. ты хочешь сказать, что это дело выглядит так?
if(f = (paof)bsearch(hashCrc(name),hashtable, sizeof(hashtable)/sizeof(aof), sizeof(aof), compare))
f->address();
|
|
|
Дата: Сен 10, 2003 14:41:11 volodya Ещё одна поправка (какой я невнимательный!) :
aof Key={hashCrc(name),0};
if(f = (paof)bsearch(&Key,hashtable, sizeof(hashtable)/sizeof(aof), sizeof(aof), compare))
f->address();
Т.к. поле CRC32 лежит в первых байтах aof, можно написать и так:
DWORD Key=hashCrc(name);
if(f = (paof)bsearch(&Key,hashtable, sizeof(hashtable)/sizeof(aof), sizeof(aof), compare))
f->address();
Но лучше использовать первый вариант (или вообще самому написать бинарный поиск). |
|
|
Дата: Сен 10, 2003 19:38:42 Ох, батюшки. А зачем мне вот это: aof Key={hashCrc(name),0}; - имеется в виду последний нуль в структуре. ОК, сейчас буду разбираться. Ты, кстати, книжки хотел. Куда тебе залить? |
|
|
Дата: Сен 10, 2003 21:46:06 Artem Так, забей и думать об этом топике забудь. Куда тебе книги заливать? Или линк дать? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.038 |