![]() |
![]() |
![]() |
|
Бинарные операции в 1С 7.7 Ø |
☑ | ||
---|---|---|---|---|
0
Klio
19.07.05
✎
23:24
|
Для записи на дискету нужно посчитать контрольную сумму в 1С по вот такому алгоритму :
int CRCTAB_16[]={ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, ....... // 256 значений DWORD calcCRC16(DWORD iPrevSumm, BYTE *btArr, UINT iLen) { for (int i=0;i<iLen;i++) iPrevSumm=(CRCTAB_16[(iPrevSumm>>8)&0xFF] ^ iPrevSumm<<8 ^ btArr[i])&0xFFFF; return iPrevSumm; } На вход подаем btArr столько раз, сколько строк iLen - длина входной строки Сделал в 1С через работу со строками - ужасные тормоза. Самому писать ВК - ломает, давно уже на сях не лепил. Мож есть уже готовая ? Киньте ссылкой плз. или алгоритм для 1С - мож кто более быстрый придумает. |
|||
1
IAm
19.07.05
✎
23:29
|
Причем тут строки, все операции делаются с числами и работают вполне быстро. Раскладывай коды символов на степени дойки и производи с ними нужные операции.
|
|||
2
Klio
19.07.05
✎
23:35
|
Помоему 1С не позволяет делать ПОБИТНЫЕ ОПЕРАЦИИ "Логическое ИЛИ" и т.д.
Мож я не прав ? Тогда строчку кода плз. |
|||
3
Klio
19.07.05
✎
23:41
|
+(2) Ну получу я код буквы "А" - 145,
как мне его побитно ксор сделать с 30467 ? |
|||
4
IAm
19.07.05
✎
23:41
|
(2) Код писать лень.
Простейший алгоритм, нам нужна функция для получения логического ИЛИ двух чисел Раскладываешь их по степеням двойки в две строки 10010001 00101101 потом проходишь по каждому символу, получаешь 10111101 и преобразовываешь эту строку в число, умножая каждую единицу на нужную степень двойки. |
|||
5
Klio
19.07.05
✎
23:43
|
+(0) ===> Сделал в 1С через работу со строками - ужасные тормоза.
Я это и имел ввиду ! |
|||
6
IAm
19.07.05
✎
23:44
|
(5) Покажи код.
|
|||
7
smaharbA
19.07.05
✎
23:44
|
(0) подскажи iPrevSumm>>8 и iPrevSumm<<8 на сях что? счас свояю
|
|||
8
IAm
19.07.05
✎
23:46
|
И скажи сколько символов в файле.
(конечно через длл га С++ будет быстрее, но тут роде бы тоже большим тормозам взяться неоткуда) |
|||
9
smaharbA
19.07.05
✎
23:46
|
(0) необязательно на 1Сэ, ест ВБС и наконец офис(можно хоть свой ГУИ своять)
|
|||
10
IAm
19.07.05
✎
23:51
|
собственно вот описанное в (4)
http://1c.realnet.ru/cgi-bin/forum.cgi?ask=12755 |
|||
11
Klio
19.07.05
✎
23:52
|
На вход алгоритма дается не менее 100 строк с длиной от 1 до не менее 100 символов.
У меня получилось каждый символ через 2 цикла пропускать на каждой логической операции - которых 3, Жуть ! Еще сдвиг - тоже символьные опреации Лев() - Прав(). Ща код вывалю. (7)iPrevSumm>>8 - Это логический сдвиг на 8 битов вправо. |
|||
12
smaharbA
20.07.05
✎
00:01
|
еще вопрос с возвратом на первый бит (и сразу или через бит четности или как еще) ?
|
|||
13
Klio
20.07.05
✎
00:06
|
(10) IAm спасибо за ссылку - только не могу оттуда достать файлы Ж:0~
А вообщем там помоему еще хуже ( в смысле медленнее ), чем у меня сделано. Вот творение моего гения :) - оптимизированное до невозможности ! ;) ЗначенияБитов[ 1 ] = 1 ; ЗначенияБитов[ 2 ] = 2 ; ЗначенияБитов[ 3 ] = 4 ; ЗначенияБитов[ 4 ] = 8 ; и т.д. до 32 // Сдвиг // Направление 1 - вправо >> // -1 - влево << // оптимизируем поднужды !!!!!!!!!!!!!!!!!!!!! //============================================================= Функция Сдвиг( Код, Размер, Направление ) Экспорт Перем кс ; Если Направление > 0 Тогда кс = Лев( Код, СтрДлина( Код ) - Размер ) ; Для ф = 1 По Размер Цикл кс = "0" + кс ; КонецЦикла ; Иначе кс = Прав( Код, СтрДлина( Код ) - Размер ) ; Для ф = 1 По Размер Цикл кс = кс + "0" ; КонецЦикла ; КонецЕсли ; Возврат кс ; КонецФункции // Ксор // Длина кодов должна быть одинакова !!! //============================================================ Функция Ксор( Код1, Код2 ) Экспорт Перем Длина ; Перем кс ; Длина = СтрДлина( Код1 ) ; кс = "" ; Для ф = 1 По Длина Цикл т1 = Сред( Код1, ф, 1 ) ; т2 = Сред( Код2, ф, 1 ) ; кс = кс + ?( т1 = т2, "0", "1" ) КонецЦикла ; Возврат кс ; КонецФункции // // Расчет контрольной суммы // С - входная строка, по которой считать кс //================================================================= Функция РасчетКС( ПредСум, С ) Экспорт Перем Длина ; Перем ч1 ; Перем ч2 ; Перем ч3 ; // Сообщить(С) ; Длина = СтрДлина( С ) ; Для ф = 1 По Длина Цикл ч1 = Лев( ПредСум, 8 ) ; ч2 = Прав( ПредСум, 8 ) + БинарныеЗначения[ КодСимв(Сред( С, ф, 1 )) + 1 ] ; ПредСум = Ксор( CRCTAB_16[ Десятичное( ч1, 8 ) + 1 ], ч2 ) ; КонецЦикла ; Возврат ПредСум ; КонецФункции |
|||
14
Klio
20.07.05
✎
00:13
|
+(13) Не захватил немного
// Перевод бинарного представления в десятичное // Размер - длина бинарного слова //=================================================================== Функция Десятичное( Код, Размер = 16 ) Экспорт Перем кс ; Перем Р ; кс = 0 ; Р = Размер + 1 ; Для ф = 1 По Размер Цикл Если Сред( Код, ф, 1 ) = "1" Тогда кс = кс + ЗначенияБитов[ Р - ф ] ; КонецЕсли ; КонецЦикла ; Возврат кс ; КонецФункции |
|||
15
smaharbA
20.07.05
✎
00:14
|
замени
Для ф = 1 По Размер Цикл кс = "0" + кс ; КонецЦикла ; нули="000000000000000000000000000000000000000000" длинакода=стрдлина(код) на прав(нули+кс,длинакода) и определяй длинукода один раз в начале функции |
|||
16
Klio
20.07.05
✎
00:19
|
(15) Я так и знал, что можно еще что-то придумать !!!
Спасибо smaharbA !!! Одним циклом меньше. |
|||
17
Klio
20.07.05
✎
00:39
|
+(13) БинарныеЗначения[] - это таблица строк, представляющих числа
для быстрого перевода кода символа, заполняется 1 раз при старте 1С : БинарныеЗначения[ 15 ] = "00001111" БинарныеЗначения[ 16 ] = "00010000" и т.д. до 256 |
|||
18
smaharbA
20.07.05
✎
00:55
|
(17) слушай у тебя нет "арифметического" алгоритма сдвига влево
вправо просто CS=a / (2 ^ n) (правда проблеммы с округлением, но решаемо) |
|||
19
smaharbA
20.07.05
✎
01:00
|
+(18) ^ - здесь это степень
|
|||
20
Klio
20.07.05
✎
01:09
|
Таак !!! Сейчас взглянул на свой алгоритм еще разок,
я ж отказался от процедуры сдвига !!! Ж:) Вместо сдвигов у меня в РасчетКС() : ч1 = Лев( ПредСум, 8 ) ; ч2 = Прав( ПредСум, 8 ) + и т.д. Отказался от универсальности, Принял длину ПредСум = 16. |
|||
21
Klio
20.07.05
✎
01:15
|
(19) Потом число все-равно переводить в строку,
а переводить на лету все-ж таки медленнее, чем выбрать значение из массива. К слову вот процедурка, которой я заполняю БинарныеЗначения[], повторюсь, она работает всего один раз при старте 1С : // Возвращает бинарное представление символа // Код - Символ // Размер - Длина бинарного кода //==================================================== Функция Бинарное( Код, Размер = 16 ) Экспорт Перем Токен ; Перем Токен2 ; Перем кс ; Перем Бит ; Токен = Число( Код ) ; кс = "" ; Пока Токен > 0 Цикл Токен2 = Цел( Токен / 2 ) ; Бит = Токен - Токен2 * 2 ; кс = "" + Бит + кс ; Токен = Токен2 ; КонецЦикла ; Л = СтрДлина( кс ) ; Пока Л < Размер Цикл кс = "0" + кс ; Л = Л + 1 ; КонецЦикла ; Возврат кс ; КонецФункции |
|||
22
Klio
20.07.05
✎
01:19
|
+(21) В смысле один раз для каждого значения массива.
Сначала хотел универсальности, но жизнь в лице 1сv7 сказала, что не будет мне счастья на её платформе с такими замашками. |
|||
23
smaharbA
20.07.05
✎
02:25
|
вобщем так тупенько(мож где ошибся)
Dim CRCTAB_16(255) Sub main() CRCTAB_16(0) = 0 For i = 1 To 255 CRCTAB_16(i) = CRCTAB_16(i - 1) + &H1021 Next End Sub ' 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, ....... // 256 çíà÷åíèé Function sdvig(a, n, leftorright) astr = "" res = 0 If a > 0 Then For i = Int(Log(a) / Log(2)) To 0 Step -1 If res + 2 ^ i > a Then astr = astr + "0" Else astr = astr + "1" res = res + 2 ^ i End If Next Else astr = "0" End If astr = "000000000000000000000000000000000000000000000000000" & astr alen = Len(astr) If leftorright Then cs = Right(astr, alen - n) cs = Right("000000000000000000000000000000000000000000000000000" & cs, Len(astr)) Else cs = Left(astr, alen - n) cs = Left(cs & "000000000000000000000000000000000000000000000000000", Len(astr)) End If res = 0 cslen = Len(cs) For i = 1 To cslen If Mid(cs, cslen - i + 1, 1) = "1" Then res = res + 2 ^ (i - 1) End If Next sdvig = CLng(res) End Function Function calcCRC16(iPrevSumm, btArrStr) For i = 1 To Len(btArrStr) iPrevSumm = (CRCTAB_16(sdvig(iPrevSumm, 8, True) And &HFF) Xor sdvig(iPrevSumm, 8, False) Xor Asc(Mid(btArrStr, i, 1))) And &HFFFF Next calcCRC16 = iPrevSumm End Function Wscript.echo calcCRC16(0, "kl;sfj ;lskdjf;dfj1") (вроде все верно) |
|||
24
smaharbA
20.07.05
✎
02:48
|
Немного пичасал (для универсальности) теперь прикрутить к 1Сэ проблем несоставит, можно и под ней запускать через содатьобъект и т.д.
.... Dim CRCTAB_16(255) ... Sub main() CRCTAB_16(0) = 0 For i = 1 To 255 CRCTAB_16(i) = CRCTAB_16(i - 1) + &H1021 Next End Sub ' 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, ....... // 256 значений Function sdvig(a, n, leftorright) astr=Dec2BinStr(a) astr = "000000000000000000000000000000000000000000000000000" & astr alen = Len(astr) If leftorright Then cs = Right(astr, alen - n) cs = Right("000000000000000000000000000000000000000000000000000" & cs, Len(astr)) Else cs = Left(astr, alen - n) cs = Left(cs & "000000000000000000000000000000000000000000000000000", Len(astr)) End If res=BinStr2Dec(cs) sdvig = CLng(res) End Function ... Function calcCRC16(iPrevSumm, btArrStr) For i = 1 To Len(btArrStr) iPrevSumm = (CRCTAB_16(sdvig(iPrevSumm, 8, True) And &HFF) Xor sdvig(iPrevSumm, 8, False) Xor Asc(Mid(btArrStr, i, 1))) And &HFFFF Next calcCRC16 = iPrevSumm End Function ... function Dec2BinStr(a) astr = "" res = 0 If a > 0 Then For i = Int(Log(a) / Log(2)) To 0 Step -1 If res + 2 ^ i > a Then astr = astr + "0" Else astr = astr + "1" res = res + 2 ^ i End If Next Else astr = "0" End If Dec2BinStr=astr end function ... function BinStr2Dec(a) res = 0 alen = Len(a) For i = 1 To alen If Mid(a, alen - i + 1, 1) = "1" Then res = res + 2 ^ (i - 1) End If Next BinStr2Dec=res end function ... main WScript.echo hex(calcCRC16(0, "kl;sfj ;lskdjf;dfj1")) |
|||
25
callisto
20.07.05
✎
03:07
|
нестыковочка в (11) :))
"длиной от 1 до не менее 100 символов" - т.е. длина в диапазоне от 2 до 99 в условие не попадает... :)) |
|||
26
orefkov
20.07.05
✎
08:51
|
// Никаких строк ненадо
Перем МассивКодов[256]; Функция ЛогическоеСложение(Знач Число1, Знач Число2) Бит=1; Результат=0; Пока (Число1>0) и (Число2>0) Цикл Результат = Бит * (((Число1 % 2) + (Число2 % 2)) % 2) + Результат; Бит = Бит*2; Число1 = Цел(Число1/2); Число2 = Цел(Число2/2); КонецЦикла; Возврат Результат; КонецФункции // ЛогическоеСложение Функция ЛогическоеИ(Знач Число1, Знач Число2) Бит=1; Результат=0; Пока (Число1>0) и (Число2>0) Цикл Результат = Бит * Цел(((Число1 % 2) + (Число2 % 2)) / 2) + Результат; Бит = Бит * 2; Число1 = Цел(Число1/2); Число2 = Цел(Число2/2); КонецЦикла; Возврат Результат; КонецФункции // ЛогическоеИ Функция СдвигНа8Вправо(Знач Число1) Возврат Число1 * 256; КонецФункции // СдвигНа8Вправо Функция СдвигНа8Влево(Знач Число1) Возврат Цел(Число1 / 256); КонецФункции // СдвигНа8Влево Функция Контролька(Знач ПредСумма, тСтрока) Длина=СтрДлина(тСтрока); Для Номер=1 По Длина Цикл КодСимвола=КодСимв(Сред(тСтрока, Номер, 1)); Ч1=МассивКодов[ЛогическоеИ(СдвигНа8Влево(ПредСумма), 255)]; Ч1=ЛогическоеСложение(Ч1, СдвигНа8Вправо(ПредСумма)); Ч1=ЛогическоеСложение(Ч1, КодСимвола)); ПредСумма=ЛогическоеИ(Ч1,65535); КонецЦикла; Возврат ПредСумма; КонецФункции // Контролька |
|||
27
orefkov
20.07.05
✎
08:54
|
+26.
Блин, сдвиг влево/вправо перепутал, чуть подправить надо. |
|||
28
orefkov
20.07.05
✎
09:07
|
// Вот еще упростил.
Перем МассивКодов[256]; Функция ЛогическоеСложение(Знач Число1, Знач Число2) Бит=1; Результат=0; Пока (Число1>0) и (Число2>0) Цикл Результат = Бит * (((Число1 % 2) + (Число2 % 2)) % 2) + Результат; Бит = Бит*2; Число1 = Цел(Число1/2); Число2 = Цел(Число2/2); КонецЦикла; Возврат Результат; КонецФункции // ЛогическоеСложение Функция Контролька(Знач ПредСумма, тСтрока) Длина=СтрДлина(тСтрока); Для Номер=1 По Длина Цикл КодСимвола=КодСимв(Сред(тСтрока, Номер, 1)); Ч1=МассивКодов[(Цел(ПредСумма)/256) % 256)]; Ч1=ЛогическоеСложение(Ч1, ПредСумма * 256); ПредСумма=ЛогическоеСложение(Ч1, КодСимвола) % 65536; КонецЦикла; Возврат ПредСумма; КонецФункции // Контролька |
|||
29
smaharbA
20.07.05
✎
09:16
|
(26) ты это чего, если так сдвиг понимать то все просто, но сдвиг то с "уходом" последнего/первого бита, вот тут и проблемма...
|
|||
30
smaharbA
20.07.05
✎
09:27
|
да конечно мне тож надо подправить (сделал минимальную длинну кода 2 байта)
Function sdvig(a, n, leftorright) astr=Dec2BinStr(a) alen = Len(astr) if alen<16 then astr = right("000000000000000000000000000000000000000000000000000" & astr,n*2) alen=16 end if If leftorright Then cs = Right(astr, alen - n) cs = Right("000000000000000000000000000000000000000000000000000" & cs, Len(astr)) Else cs = Left(astr, alen - n) cs = Left(cs & "000000000000000000000000000000000000000000000000000", Len(astr)) End If res=BinStr2Dec(cs) sdvig = CLng(res) End Function |
|||
31
orefkov
20.07.05
✎
09:38
|
// Вот еще чуть упростил
Перем МассивКодов[256]; Функция ЛогическоеСложение(Знач Число1, Знач Число2) Бит=1; Результат=0; ~повтор: Результат = Бит * (((Число1 % 2) + (Число2 % 2)) % 2) + Результат; Бит = Бит*2; Число1 = Цел(Число1/2); Число2 = Цел(Число2/2); Если Число1 = 0 Тогда Возврат Результат + Число2 * Бит; ИначеЕсли Число2 = 0 Тогда Возврат Результат + Число1 * Бит; КонецЕсли; Перейти ~повтор; КонецФункции // ЛогическоеСложение Функция Контролька(Знач ПредСумма, тСтрока) Длина=СтрДлина(тСтрока); Для Номер=1 По Длина Цикл КодСимвола=КодСимв(Сред(тСтрока, Номер, 1)); Ч1=МассивКодов[(Цел(ПредСумма)/256) % 256)]; Ч1=ЛогическоеСложение(Ч1, ПредСумма * 256); ПредСумма=ЛогическоеСложение(Ч1, КодСимвола) % 65536; КонецЦикла; Возврат ПредСумма; КонецФункции // Контролька |
|||
32
orefkov
20.07.05
✎
09:44
|
(29) При сдвиге вправо уход первого бита отсекается Цел()
При сдвиге влево надо тогда задавать еще разрядность числа, например при 16 разрядах надо тогда сделать так: Число * 256 % 65536; те отсекать путем остатка от деления на 2^(разрядность числа), Но конкретно в данном случае уход за 16 разряд несущественен, так как все равно к первому сдвигу применяется &0xFF (отброс битов старше 8), и потом &0xFFFF (отброс битов после 16) |
|||
33
Кукуруза
20.07.05
✎
09:47
|
Написал бы dll, как OLE сервер, и дело с концом
|
|||
34
smaharbA
20.07.05
✎
09:49
|
(32) точно...
|
|||
35
orefkov
20.07.05
✎
10:04
|
// Вот, теперь все поправил, нумерация массива в 1С то с 1!!!
Перем МассивКодов[256]; Функция ЛогическоеСложение(Знач Число1, Знач Число2) Бит=1; Результат=0; ~повтор: Результат = Бит * (((Число1 % 2) + (Число2 % 2)) % 2) + Результат; Бит = Бит*2; Число1 = Цел(Число1/2); Число2 = Цел(Число2/2); Если Число1 = 0 Тогда Возврат Результат + Число2 * Бит; ИначеЕсли Число2 = 0 Тогда Возврат Результат + Число1 * Бит; КонецЕсли; Перейти ~повтор; КонецФункции // ЛогическоеСложение Функция Контролька(Знач ПредСумма, тСтрока) Длина=СтрДлина(тСтрока); Для Номер=1 По Длина Цикл КодСимвола=КодСимв(Сред(тСтрока, Номер, 1)); Ч1=МассивКодов[1+((Цел(ПредСумма)/256) % 256))]; Ч1=ЛогическоеСложение(Ч1, ПредСумма * 256); ПредСумма=ЛогическоеСложение(Ч1, КодСимвола) % 65536; КонецЦикла; Возврат ПредСумма; КонецФункции // Контролька .... Если надо, кину код для ^, |, &, ~, <<, >> |
|||
36
smaharbA
20.07.05
✎
10:23
|
(35) тока подправь % 255 и % 65535
это FF и FFFF соответственно |
|||
37
orefkov
20.07.05
✎
10:26
|
(36)
Не, "& 0xFF" в С++ == "% 256" в 1С, тк остаток от деления на 256 как раз от 0 до 255. |
|||
38
Klio
20.07.05
✎
10:40
|
( 25 ) Очепятался - длина или 1, или >= 100
2 All - Спасибо за помощь, сегодня попробую все, вечером скажу чья метода быстрее. 2 orefkov : Если Вы автор 1С++, подскажите что будет быстрее работать в цикле ? а) код на 1С б) вызов Wscript 10000 раз в) вызов функции DLL ( OLE ) 10000 раз г) Что-нибудь еще? Я слышал, вызов функций через OLE в 1С не самая оптимальная разработка. |
|||
39
IAm
20.07.05
✎
10:42
|
Хоть и не автор 1С++, но быстрее всего будет работать длл на С++ со встроенными побитовыми операциями
|
|||
40
orefkov
20.07.05
✎
10:43
|
Я не автор 1С++, хотя часть моего кода там есть.
А по поводу быстродействия - хз, смотря что за код в каждом конкретном случае. Тестировать надо. |
|||
41
Klio
20.07.05
✎
10:43
|
2 orefkov :
=============> Если надо, кину код для ^, |, &, ~, <<, >> Надо :) для XOR ! - для скорости теста. |
|||
42
ВоВаК
20.07.05
✎
10:55
|
А что этот процент (%) значит? Остаток от деления?
|
|||
43
orefkov
20.07.05
✎
11:01
|
+(39) и выполненная по технологии Rainbow.
(41) XOR - это и есть ЛогическоеСложение (код уже был) ... // ^ Функция БитовыйXOR(Знач Число1, Знач Число2) Бит=1; Результат=0; ~повтор: Результат = Бит * (((Число1 % 2) + (Число2 % 2)) % 2) + Результат; Бит = Бит*2; Число1 = Цел(Число1/2); Число2 = Цел(Число2/2); Если Число1 = 0 Тогда Возврат Результат + Число2 * Бит; ИначеЕсли Число2 = 0 Тогда Возврат Результат + Число1 * Бит; КонецЕсли; Перейти ~повтор; КонецФункции // БитовыйXOR // & Функция БитовыйAnd(Знач Число1, Знач Число2) Бит=1; Результат=0; ~повтор: Результат = Бит * Цел(((Число1 % 2) + (Число2 % 2)) / 2) + Результат; Бит = Бит*2; Число1 = Цел(Число1/2); Число2 = Цел(Число2/2); Если (Число1=0) или (Число2=0) Тогда Возврат Результат; КонецЕсли; Перейти ~повтор; КонецФункции // БитовыйAnd // | Функция БитовыйOR(Знач Число1, Знач Число2) Бит=1; Результат=0; ~повтор: Результат = Бит * Цел((((Число1 % 2) + (Число2 % 2) + 1)/2) + Результат; Бит = Бит*2; Число1 = Цел(Число1/2); Число2 = Цел(Число2/2); Если Число1 = 0 Тогда Возврат Результат + Число2 * Бит; ИначеЕсли Число2 = 0 Тогда Возврат Результат + Число1 * Бит; КонецЕсли; Перейти ~повтор; КонецФункции // БитовыйOR //~ Функция БитовыйNOT(Знач Число1, Знач КолРазрядов) Бит=1; Результат=0; Для Номер=1 По КолРазрядов Цикл Результат=Бит * (1-(Число1 % 2)) + Результат; Результат = Цел(Результат / 2); Бит = Бит * 2; КонецЦикла; КонецФункции // БитовыйNOT // << Функция БитовыйСдвигВлево(Знач Число1, Знач Число2, Знач КолРазрядов=32) Разряд=1; Для Номер=1 По КолРазрядов Цикл Разряд = Разряд * 2; КонецЦикла; Для Номер=1 По Число2 Цикл Число1 = Число1 * 2; КонецЦикла; Возврат Число1 % Разряд; КонецФункции // БитовыйСдвигВлево // >> Функция БитовыйСдвигВправо(Знач Число1, Знач Число2) Пока (Число1>0) и (Число2>0) Цикл Число1 = Цел(Число1/2); Число2 = Число2 - 1; КонецЦикла; Возврат Число1; КонецФункции // БитовыйСдвигВправо |
|||
44
orefkov
20.07.05
✎
11:09
|
//~ правильный
Функция БитовыйNOT(Знач Число1, Знач КолРазрядов) Бит=1; Результат=0; Для Номер=1 По КолРазрядов Цикл Результат=Бит * (1-(Число1 % 2)) + Результат; Число1 = Цел(Число1 / 2); Бит = Бит * 2; КонецЦикла; КонецФункции // БитовыйNOT |
|||
45
smaharbA
20.07.05
✎
11:18
|
(43) похоже алгоритм (0) будет верно работать только с побитовыми (относится только к ксор) операциями, так что кучу циклов в КСОР необойти...
|
|||
46
orefkov
20.07.05
✎
11:20
|
Щас прогнал тестик, 100 раз по строке 100 символов,
на Cel-2.4G примерно 4 сек. |
|||
47
smaharbA
20.07.05
✎
11:23
|
(46) на ВБС тот же результат для файла 60 кб строк 1373 но на цел667, да там еще и файл читает и результат в файл записывает по строке на контр.сумму.
|
|||
48
smaharbA
20.07.05
✎
11:26
|
вот мой вариант (с учетом обнаруженного у orefkov, спасибо) но на ВБС
... Dim CRCTAB_16(255) Const ForReading = 1 Const ForWriting = 2 Set fso = CreateObject("Scripting.FileSystemObject") '... Sub main() CRCTAB_16(0) = 0 For i = 1 To 255 CRCTAB_16(i) = CRCTAB_16(i - 1) + &H1021 Next End Sub ' 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, ....... // 256 значений '... Function calcCRC16(iPrevSumm, btArrStr) For i = 1 To Len(btArrStr) iPrevSumm = (CRCTAB_16(sdvigNew(iPrevSumm, 8, True) And 255) Xor sdvigNew(iPrevSumm, 8, False) Xor Asc(Mid(btArrStr, i, 1))) And 65535 Next calcCRC16 = iPrevSumm End Function '... Function sdvigNew(a, n, leftorright) if a=0 then sdvigNew = 0 exit function else at=2^(Int(Log(a) / Log(2)))+1 end if if at<2^15+1 then at=2^15+1 end if if lefttoright then res=a / (2 ^ n) else res=a * (2 ^ n) mod at end if sdvigNew = res end function '... main If WScript.Arguments.Count > 0 Then Set f = fso.OpenTextFile(Wscript.arguments.item(0), ForReading, True) Set crc = fso.OpenTextFile(Wscript.arguments.item(0)&".crc", ForWriting, True) crcSTR="" Do While Not f.AtEndOfStream crcSTR="" & hex(calcCRC16(0, f.ReadLine())) & vbCrLf & crcSTR loop crc.write crcSTR crc.close f.close else WScript.echo hex(calcCRC16(0, "kl;sfj ;lskdjf;dfj1")) end if (прикрутить к 1Сэ труда несоставит, но у orefkov лучче по той причине что написано все на 1Сэ) |
|||
49
smaharbA
20.07.05
✎
11:29
|
небольшая поправка вместо 2^15+1 надо 2^16-1
|
|||
50
ВоВаК
20.07.05
✎
11:52
|
Прикольная реализация исключающего ИЛИ. Сам придумал?
Результат = Бит * (((Число1 Mod 2) + (Число2 Mod 2)) Mod 2) + Результат |
|||
51
orefkov
20.07.05
✎
12:50
|
(50) В некоторых источниках "Исключающее ИЛИ" называется
"Сложение по модулю 2" |
|||
52
Klio
20.07.05
✎
12:57
|
(35) 2 orefkov :
Прогнал Ваш алгоритм - ошибка. Здесь : ========> 1+((Цел(ПредСумма)/256) % 256)) Если ПредСумма = 12504, должно быть 49 !!! Это 5-й символ, первые 4 на ура, я уж и обрадовался. 2 smaharbA : я тоже подумал, если доделаем алгоритм оrefkov, тогда можно избежать геморроя с wScript, машины везде разные, 98, XP, 2000 :) Но все-равно спасибо за поддержку. |
|||
53
orefkov
20.07.05
✎
13:34
|
(52) Так 49 и получается.
|
|||
54
orefkov
20.07.05
✎
13:36
|
+53 вот блин
1+((Цел(ПредСумма/256) % 256) |
|||
55
smaharbA
20.07.05
✎
14:14
|
(52) можешь закинуть в ворд, и по оле открывать вернет в 1С строку, файл можно и не показывать... (ворд счас практически у всех есть), делаем проверку на скрипт - запускаем скрипт, нет - запускаем через ворд...
|
|||
56
ВоВаК
20.07.05
✎
14:47
|
(51) Угу, у них математиков, а у нас смертных это булева операция :) Если приёмник или (Или) источник истина, при условии что они неравны (исключение), то и результат тоже истина.
|
|||
57
NS
20.07.05
✎
14:52
|
Ниасил ветку.
Сделай массивы. Для NOT(на 256 элементов),XOR,OR(на 256*256 элементов). Остальное из них сварганишь. И очень быстро будет считать. Хранить массивы можешь в файле. |
|||
58
ВоВаК
20.07.05
✎
15:03
|
Что ни говори, как не извращайся, а процессор выполняет булевые операции над регистрами за 1 такт.
|
|||
59
smaharbA
20.07.05
✎
15:24
|
(58) если данные в 1 - 2 байта, счас и 4 обрабатывает (но там не все так просто), но и при этом надо комманду загрузить + данные, если длинна данных до 3 байт то в некоторых операциях и за такт
|
|||
60
NS
20.07.05
✎
15:49
|
(59) не понял - это к чему?
Даже ММХ работает с восьмью. Не говоря о том, что сейчас. А процессор - 32битный, и обрабатавает соответственно 4 байта за операцию. Насчет тактов - там есно всё не так просто. А вот с двумя как раз всё плохо. У Пня четвертого на 16 разрядных операциях затыкается конвеер - легко проверить даже в тех-же делфях. Скорость обработки 8битных и 32битных примерно одинаковая (в расчете на бит - 32 битные в четыре раза быстрее, ММХ еще почти в два раза быстрее) |
|||
61
ВоВаК
20.07.05
✎
15:53
|
(59) А почему до 3-х? За 1 такт выполняются почти все операции с регистрами в качестве операндов.
Это я вообще всё к чему говорю, нашёл в инете перекомпилированную в DLL ollydbg и через VB-шную ActiveX.DLL сделал к ней интерфейс. Саму библиотеку выложил у себя на сайте: http://basicproduction.nm.ru/TOOLS/olly_dll.zip Кто хочет действительно быстро что то посчитать вполне может ей воспользоваться. Я проверял - всё работает. |
|||
62
ВоВаК
20.07.05
✎
15:56
|
А 10 байт MMX не берёт? Ведь в сопроцессор можно и BCD грузить.
|
|||
63
ВоВаК
20.07.05
✎
16:00
|
(60) Может из за того что 16-разрядные операции длиннее за счёт префикса размера операнда?
|
|||
64
smaharbA
20.07.05
✎
16:01
|
(60) (61) а куда вы команду денете из тех 4 байт? ребята, новые знаю слабовато но принцыпы неизменились начиная с 4040/8080... (тока ненадо про всякие конвееры и такуюже лабуду АЛУ как работало на 4 битах так и работает + команду надо отправить, если все отправлять за такт то и выходит 8 бит команда 24 бита данные, но это утрированно)
|
|||
65
ВоВаК
20.07.05
✎
16:36
|
Действительно на старых процессорах эти операции выполнялись за несколько тактов, но начиная с 486, за один.
|
|||
66
ВоВаК
20.07.05
✎
16:42
|
http://www.5ka.ru/95/27252/1.html
. Элементарные операции целочисленного АЛУ. Логическое сложение, ИЛИ|V, |, or . Именно эти операции выполняются за один такт микропроцессора, и имеют наибольшую скорость выполнения. |
|||
67
smaharbA
20.07.05
✎
16:43
|
(65) не читайте публицистику, там все врут...
подумай как сделать операцию с двумя словами (пусть уже каждое и в регистре) нужно отправить команду(такт) и выполнить действие(такт)... и незабудьте что в регистрах данные сами по себе не рождаются шина то 32 тоесть чтоб запихать из озу в каждый регистр по слову надо 2 такта - итого 4 такта, конечно сама логика выполняется за такт(невсегда, тут все упрощенно описал) но данные надо передать |
|||
68
NS
20.07.05
✎
16:47
|
(67) То, что я привел цифры - тестировалось мной в Делфях.
Делфи тоже врут? Код ассеблерный на таких операциях у них идеальный. |
|||
69
smaharbA
20.07.05
✎
16:47
|
+(67) и еще, ребята на 8080 сваял не один контроллер, даже нашол ошибку в выполнении аппаратного прерывания в нашем варианте 580ик80... не изменилась даже система команд(почти)... и данные хоть 8 битные хоть 32 битные идут все по темже 8 и 32 "проводкам" соответственно (если не принимать в счет последовательную/параллельнопоследовательную передачу)
|
|||
70
ВоВаК
20.07.05
✎
16:58
|
(68) В смысле код идеальный? Ты опкоды имеешь ввиду?
|
|||
71
ВоВаК
20.07.05
✎
17:23
|
(67) Во первых у пенька вроде уже 64-битная шина данных, а во вторых зачем работать со словами? Лучше уж с байтами или двойными словами. Слова скорее нужны для совместимости со старым, 16-разрядным режимом процессора.
|
|||
72
NS
20.07.05
✎
17:25
|
(70) Я имею в виду ассемблерный код, поле компиляции, который, например, можно увидеть при отладке.
|
|||
73
smaharbA
20.07.05
✎
17:32
|
(71) ну я имел в виду двойные слова
|
|||
74
ВоВаК
20.07.05
✎
17:45
|
Вообще кому нибудь будет интересен рантаймовый ассемблер? Можно мнемоники на русский попереводить, щоб вообще как у 1С было :)
|
|||
75
Klio
20.07.05
✎
18:47
|
2 All : Все это очень интересно, НО !!!
Мой алгоритм эмулирования бинарных операций через строки (13) создает файл размером 82 кб за 8 сек. (восемь) Алгоритм г-на orefkov (35) при формировании того-же файла работал 52 сек. (Пятьдесят две) :(О) !!! Я открыт для вопросов и замечаний ! Одна тонкость : Данные для РасчетКС и соответсвенно Контролька подаются по 10 - 50 байт, может из-за этого ? Система : P4-3.2 HT 512mb 2channel DDR 400, WinXP SP1 1C:Предприятие вер. 25 сетевая - комплексная. Тестировал локально. |
|||
76
smaharbA
20.07.05
✎
19:10
|
(75) а (23) не проверял?
|
|||
77
Klio
20.07.05
✎
19:29
|
(76) Только пришел домой, сразу налепил две обработочки - для сравнения. После результатов - кинулся смотреть почему ?
Видимо конкатенация и анализ строк в 1С быстрее, чем деление-умножение ??? Кто не верит, могу кинуть на мыло - 30 кг. Обработки работают с любой конфой. Щас попробую (23), но с wScript-aми совсем не дружу, результаты если появятся, то не сразу. Здесь можно как-либо файлик выложить ? Или скриншот ? Вставил бы сам в шаблон - все быстрее чем я. |
|||
78
Klio
20.07.05
✎
19:50
|
+(77) Сейчас поковырял (23) и понял что ничего не понял.
Не знаю даже с какой стороны подступиться. Попробуй пошагово объяснить что делать, если не в лом. |
|||
79
smaharbA
20.07.05
✎
20:25
|
создай файл с расширением VBS как параметр передай имя файла из тойже директории (конечно лучче простой текст, но для сложности можно что попало), создаст файл имяфайлапреданногокакпараметрсрасширением.crc
там будут контрольные суммы всех строк в хексе... |
|||
80
smaharbA
20.07.05
✎
20:42
|
+(79) используй (48)
|
|||
81
Klio
20.07.05
✎
20:59
|
(80) Запустил, алгоритм немного не тот.
контрольная сумма должна быть одна по всему файлу. Результат расчета первой строки должен попасть на вход к расчету второй строки в iPrevSumm Пробовал поправить, ошибка сравнения типов :( А главное, как мне результат к 1С прикрутить ? И придется её из командной строки из 1С вызывать постоянно ? |
|||
82
smaharbA
20.07.05
✎
21:04
|
(81) нет ненадо постоянно позже покажу, понял нужно результат строки запихивать в начало
|
|||
83
smaharbA
20.07.05
✎
21:16
|
подправил последний кусок (48) чтоб и общюю ЦРЦ вписывало
main iPrevSummTemp=12504 If WScript.Arguments.Count > 0 Then Set f = fso.OpenTextFile(Wscript.arguments.item(0), ForReading, True) Set crc = fso.OpenTextFile(Wscript.arguments.item(0)&".crc", ForWriting, True) crcSTR="" Do While Not f.AtEndOfStream iPrevSummTemp=calcCRC16(iPrevSummTemp, f.ReadLine()) crcSTR="" & hex(iPrevSummTemp) & vbCrLf & crcSTR loop crcONE=hex(iPrevSummTemp) crc.write crcSTR & vbCrLF & vbCrLF & "Вот и общая контролка " & crcONE crc.close f.close else WScript.echo hex(calcCRC16(0, "kl;sfj ;lskdjf;dfj1")) end if ... чуть позже напишу как 1Сэ присобачить |
|||
84
Klio
20.07.05
✎
21:29
|
(83) Работает !
Отдельно от 1С по времени вроде быстро, а если этой функции по 50 байт скармливать из 1С? Смысл в том, что файл содержит в себе несколько секций со своими КС, а потом в конце считается общая КС по файлу. Добавь только плз в первую и последнюю строку выходного файла текущее время, у меня нет секундомера в наличии :) |
|||
85
smaharbA
20.07.05
✎
22:27
|
делаешь обработку на кнопку вешаешь сформировать(), длбавляешь поле ввода с кнопкой тип-строка, длинна 255
в модуле формы вот это (можно переделать и под "поток" строк не из файла, это уж силами 1Сэ) .... Перем Путь, Имя; //******************************************* Процедура Сформировать(Файл) Попытка scrptCtrl=createobject("MSScriptControl.ScriptControl"); scrptCtrl.language="vbscript"; scrptCtrl.addcode("Dim iPrevSummTemp |Dim CRCTAB_16(255) |Const ForReading = 1 |Const ForWriting = 2 |'... |Sub main() | CRCTAB_16(0) = 0 | For i = 1 To 255 | CRCTAB_16(i) = CRCTAB_16(i - 1) + &H1021 | Next |End Sub |' 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, ....... // 256 значений |'... |Function calcCRC16(iPrevSumm, btArrStr) | For i = 1 To Len(btArrStr) | iPrevSumm = (CRCTAB_16(sdvigNew(iPrevSumm, 8, True) And 255) Xor sdvigNew(iPrevSumm, 8, False) Xor Asc(Mid(btArrStr, i, 1))) And 65535 | Next | calcCRC16 = iPrevSumm |End Function |'... |Function sdvigNew(a, n, leftorright) | if a=0 then | sdvigNew = 0 | exit function | else | at=2^(Int(Log(a) / Log(2)))+1 | end if | if at<65535 then | at=65535 | end if | if lefttoright then | res=a / (2 ^ n) | else | res=a * (2 ^ n) mod at | end if |sdvigNew = res |end function |'... |Function startCRC() |Call main |iPrevSummTemp=12504 |Set fso = CreateObject(""Scripting.FileSystemObject"") | Set f = fso.OpenTextFile("""+Файл+""", ForReading, True) | Set crc = fso.OpenTextFile("""+Файл+"""&"".crc"", ForWriting, True) | crcSTR="""" | Do While Not f.AtEndOfStream | iPrevSummTemp=calcCRC16(iPrevSummTemp, f.ReadLine()) | crcSTR="""" & hex(iPrevSummTemp) & vbCrLf & crcSTR | loop | crcONE=hex(iPrevSummTemp) | crc.write crcSTR & vbCrLF & vbCrLF & ""Вот и общая контролка "" & crcONE | crc.close | f.close |startCRC = crcONE |end function"); Сообщить(scrptCtrl.run("startCRC")); Исключение Сообщить("Непонятки "+ОписаниеОшибки()); КонецПопытки; КонецПроцедуры Процедура ПриНачалеВыбораЗначения(Идент,Флаг=1) Файл1=""; фс.ВыбратьФайл(0,Файл1,Путь,,"*.*"); Файл=Путь+Файл1; КонецПроцедуры // ВыбратьФайл Процедура ПриОткрытии() Имя = ""; Путь = ""; ПолноеИмя = РасположениеФайла(Путь, Имя); КонецПроцедуры // ПриОткрытии |
|||
86
smaharbA
20.07.05
✎
22:36
|
+(85) но тут ограничено время действия скрипта, так что лучче запускать внешний, но не командасистемы(), а темже WSH, а как вернуть параметры в 1Сэ позырю, делал...
|
|||
87
smaharbA
20.07.05
✎
22:42
|
файл ERT - Работало 741 мс., размер файла 25088, Терминал, не очень скоро вышло, но надо учесть время на Сообщить() да и работает с файлами на чтение и на запись, а не с "потоком" строк...
заменил Сообщить(scrptCtrl.run("startCRC")); на следующее...(чтоб время считать) фс.АтрибутыФайла(Файл,РазмерФайла); ВремяНач=_GetPerformanceCounter(); Состояние(scrptCtrl.run("startCRC")); ВремяКон=_GetPerformanceCounter(); Сообщить("Работало "+(ВремяКон-ВремяНач)+" мс., размер файла "+РазмерФайла); |
|||
88
smaharbA
20.07.05
✎
23:39
|
ну вот с внешним скриптом в 100!!! раз быстрее, вариант для 1Сэ (можно убрать создания файла, пусть все время будет)...
.... Перем Путь, Имя, РазмерФайла; //******************************************* Процедура Сформировать(Файл) Попытка WshShell = CreateObject("WScript.Shell"); scrptCtrl=createobject("MSScriptControl.ScriptControl"); scrptCtrl.language="vbscript"; СтрокаДействия="Dim iPrevSummTemp |Dim CRCTAB_16(255) |Const ForReading = 1 |Const ForWriting = 2 |'... |Sub main() | CRCTAB_16(0) = 0 | For i = 1 To 255 | CRCTAB_16(i) = CRCTAB_16(i - 1) + &H1021 | Next |End Sub |' 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, ....... // 256 значений |'... |Function calcCRC16(iPrevSumm, btArrStr) | For i = 1 To Len(btArrStr) | iPrevSumm = (CRCTAB_16(sdvigNew(iPrevSumm, 8, True) And 255) Xor sdvigNew(iPrevSumm, 8, False) Xor Asc(Mid(btArrStr, i, 1))) And 65535 | Next | calcCRC16 = iPrevSumm |End Function |'... |Function sdvigNew(a, n, leftorright) | if a=0 then | sdvigNew = 0 | exit function | else | at=2^(Int(Log(a) / Log(2)))+1 | end if | if at<65535 then | at=65535 | end if | if lefttoright then | res=a / (2 ^ n) | else | res=a * (2 ^ n) mod at | end if |sdvigNew = res |end function |'... |Function startCRC() |Call main |iPrevSummTemp=12504 //| Wscript.echo iPrevSummTemp |Set fso = CreateObject(""Scripting.FileSystemObject"") | Set f = fso.OpenTextFile("""+СокрЛП(Файл)+""", ForReading, True) | Set crc = fso.OpenTextFile("""+СокрЛП(Файл)+""" &"".crc1"", ForWriting, True) | crcSTR="""" | Do While Not f.AtEndOfStream | iPrevSummTemp=calcCRC16(iPrevSummTemp, f.ReadLine()) | crcSTR="""" & hex(iPrevSummTemp) & vbCrLf & crcSTR | loop | crcONE=hex(iPrevSummTemp) | crc.write crcSTR & vbCrLF & vbCrLF & ""Вот и общая контролка "" & crcONE | crc.close | f.close |startCRC = crcONE |end function |'End"; Текст=СоздатьОбъект("Текст"); СтрокаДействия=СтрЗаменить(СтрокаДействия,"'End","startCRC"); Текст.ДобавитьСтроку(СтрЗаменить(СтрокаДействия,".crc1",".crc2")); Текст.Записать(Путь+"testCRC.vbs"); Текст=СоздатьОбъект("Текст"); СтрокаДействия2="Function RemoteCRC() |Set Controller = CreateObject(""WSHController"") |Set RemoteScript = Controller.CreateScript("""+Путь+"testCRC.vbs"") |ConnectObject RemoteScript, ""startCRC"" |RemoteScript.Execute |Do While RemoteScript.Status <> 2 |Sleep 100 |Loop |DisconnectObject RemoteScript |End Function"; scrptCtrl.addcode(СтрокаДействия); фс.АтрибутыФайла(Файл,РазмерФайла); ВремяНач=_GetPerformanceCounter(); Сообщить(scrptCtrl.run("startCRC")); ВремяКон=_GetPerformanceCounter(); Сообщить("Работало "+(ВремяКон-ВремяНач)+" мс., размер файла "+РазмерФайла); ВремяНач=_GetPerformanceCounter(); oExec = WshShell.run("%WinDir%\System32\wscript.exe "+Путь+"testCRC.vbs"); ВремяКон=_GetPerformanceCounter(); Сообщить("Работало с внешним скриптом "+(ВремяКон-ВремяНач)+" мс., размер файла "+РазмерФайла); Исключение Сообщить("Непонятки "+ОписаниеОшибки()); КонецПопытки; КонецПроцедуры Процедура ПриНачалеВыбораЗначения(Идент,Флаг=1) Файл1=""; фс.ВыбратьФайл(0,Файл1,Путь,,"*.*"); Файл=Путь+Файл1; фс.АтрибутыФайла(Файл,РазмерФайла); КонецПроцедуры // ВыбратьФайл Процедура ПриОткрытии() Имя = ""; Путь = ""; ПолноеИмя = РасположениеФайла(Путь, Имя); КонецПроцедуры // ПриОткрытии .... результаты на П4-2.8.... ... Работало 737 мс., размер файла 25088 Работало с внешним скриптом 6 мс., размер файла 25088 5180 Работало 746 мс., размер файла 25088 Работало с внешним скриптом 5 мс., размер файла 25088 5180 Работало 753 мс., размер файла 25088 Работало с внешним скриптом 7 мс., размер файла 25088 5180 Работало 737 мс., размер файла 25088 Работало с внешним скриптом 6 мс., размер файла 25088 5180 Работало 740 мс., размер файла 25088 Работало с внешним скриптом 5 мс., размер файла 25088 |
|||
89
smaharbA
20.07.05
✎
23:49
|
сменил -
oExec = WshShell.run("%WinDir%\System32\wscript.exe "+Путь+"testCRC.vbs"); на - oExec = WshShell.Exec("%WinDir%\System32\wscript.exe "+Путь+"testCRC.vbs"); и вот еще в 3-4 раза быстрее стало )да файл неочч большой 20 кб и 394 строки) результаты (все иду спать): Работало 743 мс., размер файла 25088 Работало с внешним скриптом 1 мс., размер файла 25088 5180 Работало 745 мс., размер файла 25088 Работало с внешним скриптом 2 мс., размер файла 25088 5180 Работало 741 мс., размер файла 25088 Работало с внешним скриптом 2 мс., размер файла 25088 5180 Работало 739 мс., размер файла 25088 Работало с внешним скриптом 1 мс., размер файла 25088 5180 Работало 739 мс., размер файла 25088 Работало с внешним скриптом 2 мс., размер файла 25088 5180 Работало 738 мс., размер файла 25088 Работало с внешним скриптом 2 мс., размер файла 25088 |
|||
90
Klio
21.07.05
✎
00:05
|
То smaharbA - Результаты говорят сами за себя !
Сажусь изучать работу с wScript. Спасибо !!! На моем файле 4 сек. без WshShell.run() против лучшего результата 1С - 8 сек. То All : Тема исчерпана. Модератору : Как закрыть ветку ? |
|||
91
Z1
21.07.05
✎
09:30
|
(90) Изучай сразу С,С++ на нем еще быстрее будет
|
|||
92
Прохожий
21.07.05
✎
09:57
|
(90)
Перед публикацией сообщений следует сразу читать пост №0 |
|||
93
Прохожий
21.07.05
✎
09:59
|
Поправлю:
Сообщение 92 для (91). |
|||
94
Z1
21.07.05
✎
10:47
|
(93) Это написано после цитаты из (90) "Сажусь изучать работу с wScript. Спасибо !!!"
Вся ветка имеет чисто спортивный интерес. Каждый язык программирования имеет свое назначение и писать subj на 1c это как анектот про гланды |
|||
95
Прохожий
21.07.05
✎
11:27
|
Для Z1:
Автор этой ветки - Klio. Поэтому всё же читать пост №0 следует:) |
|||
96
Z1
21.07.05
✎
11:50
|
(95) Автор поста (90) тоже Kilo. В течении обсуждения от 0 до 90
автор ветки пришел к выводу что решить задачу (0) лучше на wsh. я же его автора Kilo прошу обратить внимание что на языке "С" будет работать на порядок быстрее чем на wsh и ничего более о чем кстати тоже говорилось в некоторых постах. Больше в эту ветку не буду писать а то уже неконструктивный разговор пошел :))). |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |