purebasic.info

PureBasic forum
Текущее время: Вт дек 11, 2018 5:36 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
СообщениеДобавлено: Сб июл 16, 2016 11:47 am 
Не в сети
доцент

Зарегистрирован: Вс май 15, 2016 5:08 pm
Сообщений: 55
Благодарил (а): 1 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Собственно, сабж. Хотелось бы написать универсальный обработчик различных структур с данными, но для этого необходимо перебирать поля этих структур последовательно в цикле. Навскидку не нашел как это сделать, но есть вероятность, что навелосипедить такое реально.

Нужны именно структуры. Карты и массивы со списками - не подойдут.

_________________
Чат по PureBasic в Telegram


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб июл 16, 2016 11:59 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
Структуру конвертировать в json или xml и перебирать в цикле.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт сен 01, 2016 12:53 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
так в том то и была прелесть структуры - что в любой участок можно дописать, или прочитать напрямую. а с хмл - это ж придется перебирать перебором чтоб найти тот пункт что нужно.

я думаю, если структура... эээ... как это сказать? простая :) без какой-либо иерархии внутри, то просто использовать массив вместо структуры, держа в уме правда какой индекс за что будет отвечать.

ну у меня пока без массива, пока структуры имеют названия чтоб я сам понимал что куда пишу и задача коим-то образом сравнивать эти структуры друг с другом. как это делается? это самое сравнение всмысле. поясняю:
трек состоит из 6 дорожек, но пока разбираю только одну дорожку. в этой дорожке может быть несколько инструментов, а если же это барабаны - то вобще капец. там удар (нота), смена инструмента, удар, смена инструмента, удар, смена инструмента... так вот инструмент это список из 30 чтоль параметров, вот я их все засовываю в структуру. прочитав первый инструмент, запоминаем. читаем второй инструмент - надо сравнить с первым. если одинаковый - игнор, если разнится хоть один параметр - значит это новый инструмент надо запомнить. дальше уже сравнивать с двумя инструментами новый. и так далее по нарастающей пока конец трека не наступит.

вот собственно вопрос как сравнивать значения, которые со структурами, точнее видимо значения всей структуры оптом? как обычные переменные через равно и он поймет?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
Structure instrum
  odin.i
  dva.i
  tri.i
EndStructure
Instrument1.instrum
Instrument2.instrum
Instrument3.instrum
 
Instrument1\odin = 1
Instrument1\dva = 2
Instrument1\tri = 3
 
Instrument2\odin = 1
Instrument2\dva = 2
Instrument2\tri = 3
 
Instrument3\odin = 1
Instrument3\dva = 4
Instrument3\tri = 9
 
If Instrument1 = Instrument2
  Debug "1 и 2 одинаковые"
Else
  Debug "1 и 2 разные"
EndIf
 
If Instrument1 = Instrument3
  Debug "1 и 3 одинаковые"
Else
  Debug "1 и 3 разные"
EndIf
 



предположим нельзя, придется тогда структуру сделать в виде массива, как я упомянул ранее - что для меня будет несколько запутанно какому индексу что писать :) но предположим я все сделал правильно - сравнение массивов есть какое-то простое? без перебирания в цикле? через массив мне ненравится...
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
Structure instrum
 param.i[4]
EndStructure
Instrument1.instrum
Instrument2.instrum
Instrument3.instrum
 
Instrument1\param[1] = 1
Instrument1\param[2] = 2
Instrument1\param[3] = 3
 
Instrument2\param[1] = 1
Instrument2\param[2] = 2
Instrument2\param[3] = 3
 
Instrument3\param[1] = 1
Instrument3\param[2] = 4
Instrument3\param[3] = 9
 
result = 0
For i = 1 To 3
  If Instrument1\param[i] <> Instrument2\param[i]
    result = 1
  EndIf
Next
If result
  Debug "1 и 2 разные"
Else
  Debug "1 и 2 одинаковые"
EndIf
 
 
result = 0
For i = 1 To 3
  If Instrument1\param[i] <> Instrument3\param[i]
    result = 1
  EndIf
Next
If result
  Debug "1 и 3 разные"
Else
  Debug "1 и 3 одинаковые"
EndIf
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт сен 01, 2016 1:04 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
еще думаю писать инструмент в файл, второй инструмент писать во временный файл, после сравнивать срс и если разный - то временный файл переименовывать в инструмент номер 2, писать третий во временный, сравнивать с первым и потом со вторым если хоть с одним совпалось - игнор, если не совпалось, переименовывать в третий инструмент.

однако это будет куча писанины в файл. подумал наверное можно тогда в память писать. посмотрел вроде команда CompareMemory подойдет.
Description
Compares the content of two memory areas.

о круто! то что надо... однако:
Return value
Returns nonzero if the two areas contain the same bytes or zero if the content does not match.

contain the same bytes? эээ... а нафига мне сранивать получается... размер получается? :) я думал в команде речь идет про содержимое, а не про размер. бред кто-то в хелпе написал... content это вроде содержимое, но the same bytes это по моему не содержимое, а про размер речь шла.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт сен 01, 2016 1:10 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
хотя... видимо работает :) и писать в память ненад, структура это ж уже получается память.
Код:
1
2
Debug CompareMemory(Instrument1, Instrument2, SizeOf(instrum))
Debug CompareMemory(Instrument1, Instrument3, SizeOf(instrum))



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт сен 01, 2016 1:31 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
SereZa писал(а):
однако:
Return value
Returns nonzero if the two areas contain the same bytes or zero if the content does not match.
contain the same bytes? эээ... а нафига мне сранивать получается... размер получается? :) я думал в команде речь идет про содержимое, а не про размер. бред кто-то в хелпе написал... content это вроде содержимое, но the same bytes это по моему не содержимое, а про размер речь шла.

Чего? :D Ты хоть попробуй чтоли
Код:
1
2
3
s.s = "sdf"
s1.s = "123"
Debug CompareMemory(@s, @s1, 3)


К тому же размер последним параметром задается, смысл тогда сравнивать размеры? :D


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт сен 01, 2016 1:38 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
тогда в хелпе следовало бы написать не contain the same bytes а contain the same data. так то вроде работает. определяет новые инструменты правильно, меня сбило с толку описание...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт сен 01, 2016 2:08 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Цитата:
Returns nonzero if the two areas contain the same bytes or zero if the content does not match

Дословно: возвращает не ноль, если две области содержат те же байты, или ноль, если содержание разное.
Где ты там про размер увидел? :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт сен 01, 2016 2:57 pm 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1717
Откуда: Алматы
Благодарил (а): 16 раз.
Поблагодарили: 47 раз.
Пункты репутации: 5
ну вот как-то увидел... еще раз повторюсь data - в том описании было бы корректнее, нежели bytes.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Чт сен 01, 2016 3:18 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
SereZa писал(а):
было бы корректнее

Да все там корректно. Ну если не нравится, то напиши Фреду, что у тебя проблемы с переводом. Может он тебе отдельную справку сделает :D


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB