Форум: "Основная";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
Вниз
Можно ли создать, заранее не описанную переменную в RunTime? Найти похожие ветки
← →
AllDontFire (2004-01-09 17:55) [0]Привет, Всем!
Есть чат использующий TCP/IP. Список юзеров в ListView.
Как создать "некую" структуру, с помощью которой можно
быстро получать индексы пунктов ListView"а, соответствующих
ip-адресам юзеров, присылающих сообщения.
Вообщем, сейчас сделано так:
есть динамический массив
ip:array of string;
где N - колво юзеров, и соответственно кол-во элементов ListView.
Когда юзер c ip-адресом FromIP присылает сообщение, в обработчике проверяется(ищется его индекс в ListView):
for i:=1 to n do if ip[i]=FromIP Then break;
после выхода по break: i- индекс юзера в ListView.
Но этот метод не устраивает, так как это тупой перебор.
В Visual FoxPro есть "Макроподстановка"(&&) и можно создавать переменные когда угодно во время выполнения программы, заранее не описывая их. Т.о. можно при добавлении нового юзера
с ip-адресом 10_0_0_180
сделать следующее:
N=N+1
svar_&&FromIP=N//всё равно что написать svar_10_0_0_180=N
Затем при приходе от него сообщения, в обработчике пишем:
i=svar_&&FromIP //индекс в ListView
Но нужно на Делфи :-)
Спасибо.
← →
Строитель (2004-01-09 17:58) [1]А интертрепатор FoxPro тупо возьмет, и сделает то же самое - перебором. Только искть будет не IP адрес, а имя переменной.
← →
Тимохов (2004-01-09 18:04) [2]Перебор - нормально,
Если конечно у тебя пользователей 100000, то тогда можно сделать дерево.
← →
Тимохов (2004-01-09 18:07) [3]Вопросик, что настораживает конструкция "for i:=1 to n do if ip[i]=FromIP Then break". Как ты потом пользуешься результатом поиска? В какой переменной у тебя храниться найденная позиция в массиве?
← →
AllDontFire (2004-01-12 14:07) [4]to Тимохов
"конструкция" настороживает только тем, что это перебор, а мне нужно быстрее.Результат поиска "i" - соответствует индексу пункта в Листвью.
Конечно 100000 пользователей не будет, но можно по-подробней как в таких случаях деревья применять?
← →
PVOzerski (2004-01-12 14:41) [5]Переменную с новым именем в рантайме на Delphi не сделать, ибо это компилятор. Я бы сортировал массив IP-адресов при каждом добавлении/ухождении юзера, а в упорядоченном массиве искать нужный элемент можно существенно быстрее. Правда, смысл в этом есть, только если массив действительно большой.
← →
Тимохов (2004-01-12 14:46) [6]AllDontFire (12.01.04 14:07) [4]
Ты все-таки не ответил на вопрос "Как ты потом пользуешься результатом поиска? В какой переменной у тебя храниться найденная позиция в массиве?"
← →
Тимохов (2004-01-12 14:48) [7]"Конечно 100000 пользователей не будет, но можно по-подробней как в таких случаях деревья применять?"
Читай http://algolist.manual.ru/ про красно-черные бинарные деревья. С помощью их ищи. Важно, конечно, сколько у тебя будет пользователей?
← →
GLFox (2004-01-12 14:58) [8]У каждого итема в листвью есть свойство Data!!! Читай хелп.
← →
Тимохов (2004-01-12 15:10) [9]GLFox (12.01.04 14:58) [8]
Это кому?
← →
Erik (2004-01-12 15:12) [10]Блин все понятно, это продвинутый лаймер!
Ты хоть знаеш, что поиск по 1000 элементам выполняется практически мгоновено! А твой FoxPro одну макроподстановку медленей делает. И вобше посмотри элементарный пример:
RMyData = record
IP: STring;
Nodex: Integer;
Name: String; //- Имя юсера
end;
TArrIP = array of RMyData;
...
Var IP: TArrIP;
← →
GLFox (2004-01-12 15:13) [11]>>Тимохов © (12.01.04 15:10) [9]
Что значит кому?
← →
Тимохов (2004-01-12 15:26) [12]GLFox (12.01.04 15:13) [11]
На самом деле, я уже запустал в данном топике.
Просто я хотел указать автору вопроса на то, что
при поиске for i:=1 to n do if ip[i]=FromIP Then break в качестве найденного индекса массива нельзя использовать i по причине "After the for statement terminates, the value of counter is undefined."
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c