Автор | Сообщение |
|
| |
Пост N: 125
Зарегистрирован: 08.11.05
|
|
Отправлено: 25.12.06 13:08. Заголовок: Странности с PADR'ом
Делаю в программе cString := " 1" (Длина 13, 13-ый символ "1", остальное пробелы.) PADR( cString,".",13) (Да-да, НЕ ПО УСТАВУ Если по уставу то все нормально работает) Получаю строку, но длиной 46 символов, дополненную пробелами справа = cString + space(33) Так и задумывалось?
|
|
|
Ответов - 3
[только новые]
|
|
|
| Администратор
|
Пост N: 464
Зарегистрирован: 23.05.05
|
|
Отправлено: 25.12.06 13:17. Заголовок: Re:
Да, это фича xHb Строка длиной 1 рассматривается как число И поведение такое же т.е "." считается как 46 ЗЫ мне тоже такая фича не нравится, но я еще не нарывался на неприятности из-за этого
|
|
|
|
| |
Пост N: 126
Зарегистрирован: 08.11.05
|
|
Отправлено: 26.12.06 10:12. Заголовок: Re:
Мне кажется, в этой функции две странности: \RTL\PADR.C /* right-pads a date, number, or string with spaces or supplied character */ HB_FUNC( PADR ) { ULONG ulSize; BOOL bFreeReq; char * szText; if ( ISNUM( 2 ) ) { szText = hb_itemPadConv( hb_param( 1, HB_IT_ANY ), &ulSize, &bFreeReq ); } else { szText = NULL; } if( szText ) { LONG lLen = hb_parnl( 2 ); if( lLen > ( LONG ) ulSize ) { char * szResult = ( char * ) hb_xgrab( lLen + 1 ); LONG lPos; char cPad; hb_xmemcpy( szResult, szText, ( LONG ) ulSize ); cPad = ( ISCHAR( 3 ) ? *( hb_parc( 3 ) ) : ' ' ); for( lPos = ( LONG ) ulSize; lPos < lLen; lPos++ ) { szResult[ lPos ] = cPad; } hb_retclenAdopt( szResult, ( ULONG ) lLen ); } else { if( lLen < 0 ) { lLen = 0; } hb_retclen( szText, lLen ); } if ( bFreeReq ) { hb_xfree( szText ); } } else { hb_retc( "" ); } } 1. ISNUM( 2 ) дает True на CHR(46), то есть отрабатывает его ASCI-код и считает что это число а не символ. 2. LONG lLen = hb_parnl( 2 ) возвращает длину строки, тоже интерпретирует второй параметр как число и работает с ASCI кодом символа.(отсюда длина 46) Но главное - как мне кажется - это работа ISNUM(). Может я не прав?
|
|
|
|
| Администратор
|
Пост N: 465
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.12.06 10:40. Заголовок: Re:
Да, так и есть #define ISNUM( n ) ( hb_param( n, HB_IT_NUMERIC ) != NULL ) и hb_param (фрагмент): if( ( HB_TYPE ) lMask == HB_IT_NUMERIC && HB_IS_NUMERIC( pItem ) ) { return pItem; } и hbapi.h: #define HB_IS_NUMERIC( p ) ( ( HB_ITEM_TYPE( p ) & ( HB_IT_NUMERIC | HB_IT_DATE ) ) != 0 || ( HB_IS_STRING(p) && (p)->item.asString.length == 1 ) ) такая вот странная фича
|
|
|
|