· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.A&O —› Вот и хеши пошли...

<< . 1 . 2 . 3 . 4 . 5 . >>

Посл.отвђт Сообщен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

Так, забей и думать об этом топике забудь. Куда тебе книги заливать? Или линк дать?

<< . 1 . 2 . 3 . 4 . 5 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.038