|
Гашение незначащих нулей, кто как делает? |
|
|
|
Aug 31 2008, 10:55
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Пока вижу два варианта вывода числа на ЖКИ с гашением незначащих нулей: Код #include <stdlib.h> div_t dtmp; char str_tmp[6]; str_tmp[5] = 0; OborotiZaMin = (OborotiZaMinConst + (PPeriod >> 1)) / PPeriod;
#if 0
dtmp = div(OborotiZaMin, 10); str_tmp[4] = dtmp.rem + '0'; dtmp = div(dtmp.quot, 10); str_tmp[3] = dtmp.rem + '0'; dtmp = div(dtmp.quot, 10); str_tmp[2] = dtmp.rem + '0'; dtmp = div(dtmp.quot, 10); str_tmp[1] = dtmp.rem + '0'; str_tmp[0] = dtmp.quot + '0'; // Гашение незначащих нулей for (i = 0; i < 4; ++i) if (str_tmp[i] == '0') str_tmp[i] = ' '; else break;
#else i = 0; dtmp = div(OborotiZaMin, 10000); if (dtmp.quot != 0) str_tmp[i++] = dtmp.quot + '0';
dtmp = div(dtmp.rem, 1000); if (i || (dtmp.quot != 0)) str_tmp[i++] = dtmp.quot + '0'; dtmp = div(dtmp.rem, 100); if (i || (dtmp.quot != 0)) str_tmp[i++] = dtmp.quot + '0'; dtmp = div(dtmp.rem, 10); if (i || (dtmp.quot != 0)) str_tmp[i++] = dtmp.quot + '0'; str_tmp[i++] = dtmp.rem + '0'; str_tmp[i] = 0; #endif // LCD_Write Дабы на ЖКИ небыло такого, например "0750", а было такое "750". Какой алгоритм используете?
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Aug 31 2008, 12:39
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(sKWO @ Aug 31 2008, 13:55)  Дабы на ЖКИ небыло такого, например "0750", а было такое "750". Какой алгоритм используете? Ваш вариант перегружен громоздкими делениями. Все намного проще. Я немного переработал код уважаемого =AVR=. Теперь эта функция заполняет буфер с начала без лидирующих нулей: Код char* itoa(unsigned int val, char *s) { register unsigned int temp; register char n=0, atemp=0; atemp=0; temp=10000; if(val >= temp) {n=1; while(val >= temp) {atemp++; val-=temp;} *s++ = atemp+'0';} atemp=0; temp=1000; if((val >= temp)||(n)) {n=1; while(val >= temp) {atemp++; val-=temp;} *s++ = atemp+'0';} atemp=0; temp=100; if((val >= temp)||(n)) {n=1; while(val >= temp) {atemp++; val-=temp;} *s++ = atemp+'0';} atemp=0; temp=10; if((val >= temp)||(n)) {while(val >= temp) {atemp++; val-=temp;} *s++ = atemp+'0';} *s++ = (char)val+'0';
*s = '\0'; return s; }
|
|
|
|
|
Aug 31 2008, 13:31
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(sKWO @ Aug 31 2008, 14:55)  Какой алгоритм используете? Cтандатные библиотечные функции itoa, utoa, ltoa и ultoa. Код #include <stdlib.h>
{ char str_tmp[6]; unsigned int OborotiZaMin; ... utoa (OborotiZaMin, str_tmp, 10); ... } Анатолий.
Сообщение отредактировал aesok - Aug 31 2008, 13:34
|
|
|
|
|
Aug 31 2008, 13:45
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Павлик @ Aug 31 2008, 15:26)  ...если оно равняется 0х30 то записываю в то место пробел и все . Здорово-то как! Все нули а не только начальные заменить на пробелы  Цитата(aesok @ Aug 31 2008, 15:31)  Cтандатные библиотечные функции itoa, utoa, ltoa и ultoa. Хорошо написанные они работают хорошо, проблема только в том, что они как-раз и не стандартные ANSI C  Хотя многие библиотеки имеют. Ну и унивесализм, как по радиксу, так и по количеству цифирей, естественно, пожирает ресурсы.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 31 2008, 14:14
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата Ну и унивесализм, как по радиксу, так и по количеству цифирей, естественно, пожирает ресурсы. Код сгенерированый GCC для функции itoa предложенной alux, с фиксированым радиксом (которая на самом деле являеться utoa): Код .global itoa .type itoa, @function itoa: .LFB0: .LM1: .LVL0: push r16 push r17 push r28 push r29 /* prologue: function */ /* frame size = 0 */ movw r28,r24 movw r16,r22 .LM2: ldi r18,hi8(10000) cpi r24,lo8(10000) cpc r25,r18 brsh .L2 .LVL1: ldi r24,lo8(0) .LVL2: rjmp .L3 .LVL3: .L2: .LM3: movw r30,r24 subi r30,lo8(-(-10000)) sbci r31,hi8(-(-10000)) movw r24,r30 .LVL4: ldi r22,lo8(10000) ldi r23,hi8(10000) call __udivmodhi4 movw r28,r24 .LM4: movw r24,r30 ldi r22,lo8(10000) ldi r23,hi8(10000) call __udivmodhi4 subi r22,lo8(-(49)) movw r30,r16 st Z+,r22 movw r16,r30 ldi r24,lo8(1) .LVL5: .L3: .LM5: ldi r31,hi8(1000) cpi r28,lo8(1000) cpc r29,r31 brsh .L4 tst r24 breq .L5 .L4: movw r24,r28 .LVL6: ldi r22,lo8(1000) ldi r23,hi8(1000) call __udivmodhi4 mov r18,r22 movw r24,r28 ldi r22,lo8(1000) ldi r23,hi8(1000) call __udivmodhi4 movw r28,r24 subi r18,lo8(-(48)) movw r30,r16 st Z+,r18 movw r16,r30 ldi r24,lo8(1) .LVL7: .L5: .LM6: cpi r28,100 cpc r29,__zero_reg__ brsh .L6 tst r24 breq .L7 .L6: movw r24,r28 .LVL8: ldi r22,lo8(100) ldi r23,hi8(100) call __udivmodhi4 mov r18,r22 movw r24,r28 ldi r22,lo8(100) ldi r23,hi8(100) call __udivmodhi4 movw r28,r24 subi r18,lo8(-(48)) movw r30,r16 st Z+,r18 movw r16,r30 ldi r24,lo8(1) .LVL9: .L7: .LM7: cpi r28,10 cpc r29,__zero_reg__ brsh .L8 tst r24 breq .L9 .L8: movw r24,r28 .LVL10: ldi r22,lo8(10) ldi r23,hi8(10) call __udivmodhi4 mov r18,r22 movw r24,r28 ldi r22,lo8(10) ldi r23,hi8(10) call __udivmodhi4 movw r28,r24 subi r18,lo8(-(48)) movw r30,r16 st Z+,r18 movw r16,r30 .LVL11: .L9: .LM8: movw r18,r28 subi r18,lo8(-(48)) movw r30,r16 st Z+,r18 .LM9: movw r28,r16 .LVL12: std Y+1,__zero_reg__ .LM10: movw r24,r30 .LVL13: /* epilogue start */ pop r29 pop r28 pop r17 pop r16 .LVL14: ret .LFE0: Код функции uitoa из avr-libc c радиксом: Код X_movw ZL, r_str_lo; &string X_movw r_lstr_lo, ZL; save &string cpi r_radix, 2; no radix < 2 brlt 99f cpi r_radix, 37; no radix > 36 brge 99f 1: mov r22, r_radix; radix clr r23; dividend in r25:r24, divisor in r23:r22 XCALL _U(__udivmodhi4); quotient in r23:r22, remainder in r25:r24 ; clobbered: r0, r21, r26, r27 ; call-used but preserved: r18,r19,r20,r30,r31 subi r24, 0xd0; + '0' cpi r24, 0x3a; > '9' ? brlt 10f subi r24, 0xd9; + 'a' - 10 - '0' 10: st Z+, r24; write char to string in reverse order! X_movw r_val_lo,r22; quotient -> dividend sbiw r_val_lo,0; value == 0 ? brne 1b 99: st Z, __zero_reg__; terminate string X_movw r_val_lo, r_lstr_lo; restore &string as return value XJMP _U(strrev); reverse string Обе используют __udivmodhi4, размер strrev используемой в uitoa из avr-libc - 16 инструкций. Анатолий.
Сообщение отредактировал aesok - Aug 31 2008, 14:35
|
|
|
|
|
Aug 31 2008, 15:09
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(aesok @ Aug 31 2008, 18:14)  Обе используют __udivmodhi4, размер strrev используемой в uitoa из avr-libc - 16 инструкций. Единственное замечание, что в случае большой загруженности проца, надо __udivmodhi4 срочно менять на поразрядное вычитание числа 10^n. С точки зрения эргономики - масса вариантов: выравнивание, положение знака, правые незначащие, возникающие, если у Вас фиксированная точка. Лично я руководствуюсь критерием минимальных перемещений выводимого числа, т.к. все числовые поля должны привлекать одинаковое количество внимания оператора. С этой точки зрения, сколько цифр заложено, столько и вывожу, как правило, и ноль или другая цифра - пофиг. Формат- священная корова  Исключения - имхо, если меняются не числа в фиксированных полях, а целые экраны. Тогда, ессно, пробелы вместо нулей обязательны.
|
|
|
|
|
Aug 31 2008, 15:20
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(rezident @ Aug 31 2008, 17:14)  Как только в строке... Я комментирую то, что было написано - перечитайте, а не то, что можно было додумать, дописать, и т.д... Два варианта рецептов, включая Ваш, были приведены уже Автором. Так вот к чему была ремака Павлика это действительно загадка (почти  ).
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 31 2008, 15:41
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Ох, что-то, вы, господа, мрачно тут начали, деление и т.д. Вот - без лидирующих нулей для unsigned short. Заточена под IAR'овское соглашение о связях. Код RSEG CODE:CODE:NOROOT(1) PUBLIC _i2a // 13 __z void i2a(char *s, UINT16 v) _i2a: // 14 { // 15 UINT8 m0; //R16 // 16 UINT8 m1; //R17 //R18-R20 - 24bit fmul result //R21 - c,b,a ->06 8D B9 //R22 - zero reg CLR R22 LDI R21,0x06 // v=__multiply_unsigned(m0,0x06)+3; MUL R16,R21 MOVW R19:R18,R1:R0 SUBI R18,0xFD SBCI R19,0xFF // v+=__multiply_unsigned(m1,0x06)<<8; MUL R17,R21 MOV R20,R1 ADD R19,R0 ADC R20,R22 // v+=__multiply_unsigned(m1,0x8D); LDI R21, 0x8D MUL R17, R21 ADD R18, R0 ADC R19, R1 ADC R20, R22 // v+=__multiply_unsigned(m0,0x8D)>>8; MUL R16, R21 ADD R18, R1 ADC R19, R22 ADC R20, R22 // v+=__multiply_unsigned(m1,0xB9)>>8; LDI R16,0x10 ; Counter & flags LDI R21,0xB9 MUL R17, R21 LDI R21, 10 ; Next multiplicand ADD R18, R1 ADC R19, R22 ADC R20, R22 BREQ ??i2a_0 SUBI R20,208 ST Z+,R20 INC R16 ??i2a_0: // 39 UINT16 hv; // 40 UINT8 bv; // 41 bv=v>>8; MOV R17, R19 // 42 v=__multiply_unsigned(v,10); MUL R18, R21 MOVW R19:R18, R1:R0 // 43 hv=__multiply_unsigned(bv,10); MUL R17, R21 // 44 v+=(hv&0xFF)<<8; ADD R19, R0 // 45 if (SREG_Bit0) hv+=0x100; ADC R1, R22 // 46 bv=hv>>8; MOV R17, R1 // 47 if ((i|bv)&0x8F) MOV R20, R1 OR R20, R16 ANDI R20, 0x8F BREQ ??i2a_1 // 48 { // 49 *s++=bv+'0'; SUBI R17,208 ST Z+,R17 // 50 i|=1; // ORI R18, 0x01 ??i2a_1: // 51 } // 52 i<<=1; ROL R16 // 54 while(!SREG_Bit0); BRBC 0, ??i2a_0 // 55 *s=0; ST Z, R22 // 56 } RET Правда, требует аппаратного умножителя, но теперь уже и камней нету без него...
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Aug 31 2008, 18:00
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Код // convert and output decimal value int IntToStrPrint( S32 val ) { U8 c, len = 0; U8 buf[ 10 ]; // max size for text representation of S32 value
if (val < 0) { putchar('-'); val = -val; }
do { c = val % 10 + '0'; val /= 10; buf[ len++ ] = c; } while (val != 0); while (len) putchar(buf[ --len ]); return SUCCESS; } S32 - signed long U8 - unsigned char Предлагаю пользовать этот алгоритм, и просто оптимизировать операцию деления на 10 (y = x / 10). которая сводится к: y = x * 0xCCCCCCCD >> 35; для 32-х битных чисел. y = x * 0xCCCD >> 19; для 16-ти битных y = x * 0xCD >> 3; для 8-ми битных
|
|
|
|
|
Aug 31 2008, 20:08
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Ну и до кучи - чтобы все варианты были и чтобы было из чего выбирать. Ведь критерии могут быть разными - если действительно нужно максимальное быстродейстиве (ascii протоколы, например) или минимальный код - тогда лучше всего асм-вариант с умножениями, приведенный Rst7 либо вычитания степеней 10 (где-то я уже приводил свой вариант "без восстановления остатка", когда вычитаются десятки тысяч, потом добавляются единицы тысяч, потом вычитаются сотни и добавляются десятки - каждый раз порогом есть переход через 0 и после этого назад вычитаемое не добавляется - код ещё немного короче и немного быстрее). Если в программе деление всё равно нужно в других местах (уже линкуется и ещё одно использование на размер не влияет) и преобразование нужно только для пользовательского интерфейса (медленного по сути), то itoa по коду не проигрывает (а то и выигрывает), а его тормознутость не мешает. Ну а если кроме "лишних полтора килобайта не жалко" (если без плавающих форматов и переменных ширин полей и прочих режко используемых возможностей, про которые не все и знают, то fprintf тянет где-то столько), не хочется компоновать вывод, вручную соображая форматирование - от перемешивания строк и чисел и включая усечение вывода приведенных вариантов до, скажем, 3 знаков, то printf ничем не хуже. Причём в зависимости от инструмента sprintf (требующий опять таки врукопашную выделять буфер и потом его копировать куда надо) можно отложить и использовать fprintf avr-gcc Код #include <stdio.h> #include <lcd.h>
int lcd_file_putc(char ch, FILE * stream) { (void) stream; lcd_putchar(ch); return 0; }
FILE lcd_file = FDEV_SETUP_STREAM(lcd_file_putc, 0, _FDEV_SETUP_WRITE); #define flcd (&lcd_file)
... // тут и с гашением, и без гашения, и с фиксированной шириной поля, и с переменной // - как угодно fprintf_P( flcd, PSTR("%d 0x%04X"), -20121, 0xBEEF); А если ещё и через терминалку общение всё равно идёт Код int console_putc(char ch, FILE * stream) { (void) stream; uart_putchar(ch); return 0; }
int console_getc(FILE * stream) { (void) stream; return uart_getchar(); }
FILE console_file = FDEV_SETUP_STREAM(console_putc, console_getc, _FDEV_SETUP_RW); #define fconsole (&console_file)
void report_ex_time(const prog_char *header, const prog_char *comment, uint32_t cpu_ticks) { uint32_t ex_time = (cpu_ticks * CPU_TICK_SCALE + 128) / 256; // CPU ticks to us if (comment) fprintf_P(fconsole, PSTR("%-38S = %6luus (%S)\n"), header, ex_time, comment); else fprintf_P(fconsole, PSTR("%-38S = %6luus\n"), header, ex_time); } То и сам fprintf уже не тянет карман, а удобства хватает. В конце концов у какой-нибудь зачуханной меги32 ресурсов - почитай как у "Электроники-60" в неплохой комплектации, а за мегу128 я и не говорю.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 1 2008, 13:01
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
У меня сделано два отдельных преобразования: целое в распакованное двоично-десятичное (здесь никаких хитростей нет, просто последовательно вычитаем 10000, 1000, 100 и т.д.) и двоично-десятичное в семисегментный код. Вот на этом этапе и гасятся нули. CODE // // Перекодировка в 7-сегментные цифры // // Input: // R24:R25 - указатель на массив цифр (6 байт) // R22 - признак гашения ведущих нулей // // используются: // R18 //
BCDto7Segm:ldi r18, 6 mov r26, r24 mov r27, r25 clt sbrc r22, 0 set ; уст. T - гашение ведущих нулей conv: ldi r30, lo8(SegmTable) ldi r31, hi8(SegmTable) ld r0, X brtc addx ; если не гасим нули, то получить 7-сегментный код tst r0 ; если 0 breq cont ; то продолжить clt ; иначе - прекратить гашение нулей sub r24, r26 neg r24 dec r24 ; в r24 - позиция последнего погашенного символа addx: add r30, r0 adc r31, r1 lpm st X, r0 cont: adiw r26, 1 dec r18 brne conv brtc exit ; если все нули sbiw r26, 1 ldi r18, 0x3f; то последний не гасить st X, r18 ldi r24, 4
exit: ret Используются соглашение WinAVR, прототип выглядит так: uint8_t BCDto7Segm(uint8_t*, bool); В функцию передаются массив из распакованных двоично-десятичных цифр и признак, означающий, требуется ли гашение. Из функции возвращается позиция последнего погашенного символа - она требуется если число отрицательное, тогда вызываемая программа помещает туда минус.
Сообщение отредактировал IgorKossak - Jul 7 2013, 13:18
|
|
|
|
|
Jul 7 2013, 11:55
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Rst7 @ Aug 31 2008, 19:41)  Ох, что-то, вы, господа, мрачно тут начали, деление и т.д. Вот - без лидирующих нулей для unsigned short. Заточена под IAR'овское соглашение о связях. CODE RSEG CODE:CODE:NOROOT(1) PUBLIC _i2a // 13 __z void i2a(char *s, UINT16 v) _i2a: // 14 { // 15 UINT8 m0; //R16 // 16 UINT8 m1; //R17 //R18-R20 - 24bit fmul result //R21 - c,b,a ->06 8D B9 //R22 - zero reg CLR R22 LDI R21,0x06 // v=__multiply_unsigned(m0,0x06)+3; MUL R16,R21 MOVW R19:R18,R1:R0 SUBI R18,0xFD SBCI R19,0xFF // v+=__multiply_unsigned(m1,0x06)<<8; MUL R17,R21 MOV R20,R1 ADD R19,R0 ADC R20,R22 // v+=__multiply_unsigned(m1,0x8D); LDI R21, 0x8D MUL R17, R21 ADD R18, R0 ADC R19, R1 ADC R20, R22 // v+=__multiply_unsigned(m0,0x8D)>>8; MUL R16, R21 ADD R18, R1 ADC R19, R22 ADC R20, R22 // v+=__multiply_unsigned(m1,0xB9)>>8; LDI R16,0x10; Counter & flags LDI R21,0xB9 MUL R17, R21 LDI R21, 10 ; Next multiplicand ADD R18, R1 ADC R19, R22 ADC R20, R22 BREQ ??i2a_0 SUBI R20,208 ST Z+,R20 INC R16 ??i2a_0: // 39 UINT16 hv; // 40 UINT8 bv; // 41 bv=v>>8; MOV R17, R19 // 42 v=__multiply_unsigned(v,10); MUL R18, R21 MOVW R19:R18, R1:R0 // 43 hv=__multiply_unsigned(bv,10); MUL R17, R21 // 44 v+=(hv&0xFF)<<8; ADD R19, R0 // 45 if (SREG_Bit0) hv+=0x100; ADC R1, R22 // 46 bv=hv>>8; MOV R17, R1 // 47 if ((i|bv)&0x8F) MOV R20, R1 OR R20, R16 ANDI R20, 0x8F BREQ ??i2a_1 // 48 { // 49 *s++=bv+'0'; SUBI R17,208 ST Z+,R17 // 50 i|=1; // ORI R18, 0x01 ??i2a_1: // 51 } // 52 i<<=1; ROL R16 // 54 while(!SREG_Bit0); BRBC 0, ??i2a_0 // 55 *s=0; ST Z, R22 // 56 } RET Чисто из академического интереса попробовал скомпилировать Ваш код. Переменная i - неизвестна. Да и алгоритм гашения моему неокрепшему уму непонятен. если не трудно на пальцах объясните плиз. Заранее спасибо.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Jul 7 2013, 14:21
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(V.K @ Jul 7 2013, 17:50)  Никогда не думал, что подобные вопросы могут быть проблемой и достойны обсуждения. Ну, понадобилось гасить - гаси. Сам не люблю незначащих нулей. Каким образом это делаю я привел ещё в первом посту. повторяю вопрос академический . Наверное надо было в личку к автору.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Jul 7 2013, 19:33
|
Частый гость
 
Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299

|
вот тут неплохо разжованы разные алгоритмы преобразования: http://we.easyelectronics.ru/Soft/preobraz...lye-chisla.htmlдля себя вывел самый оптимальный - преобразование в BCD, вывод - справа-налево (начиная с младшей тетрады), для каждой цифры - сдвиг вправо на 4 бита. гашение лидирующих нолей получается проще пареной репы - как только число стало равно нулю, пишу в буфер пробелы. понятно, нужно проверять на начальную равность 0, и показать хотя бы один ноль. установка точки тоже просто - проверяется, равна ли текущая позиция позиции точки, если равна - ставлю, и двигаюсь к следующему разряду.
Сообщение отредактировал zöner - Jul 7 2013, 19:34
|
|
|
|
|
Jul 8 2013, 10:03
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Rst7 @ Jul 8 2013, 11:42)  Ничего удивительного. Ибо Вам не стоило смотреть на сишный код в комментариях, он является остатком рыбы для последующей ручной оптимизации кода, сгенерированного компилятором. Спасибо. Тогда вопрос снят.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|