On-line: Andrey, Dr. Oldwarez, гостей 0. Всего: 2 [подробнее..]
АвторСообщение





Пост N: 125
Зарегистрирован: 08.11.05
ссылка на сообщение  Отправлено: 25.12.06 13:08. Заголовок: Странности с PADR'ом


Делаю в программе
cString := " 1" (Длина 13, 13-ый символ "1", остальное пробелы.)
PADR( cString,".",13) (Да-да, НЕ ПО УСТАВУ Если по уставу то все нормально работает)
Получаю строку, но длиной 46 символов, дополненную пробелами справа = cString + space(33)
Так и задумывалось?

Спасибо: 0 
Профиль
Ответов - 3 [только новые]


Администратор




Пост N: 464
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 25.12.06 13:17. Заголовок: Re:


Да, это фича xHb
Строка длиной 1 рассматривается как число
И поведение такое же
т.е "." считается как 46

ЗЫ мне тоже такая фича не нравится, но я еще не нарывался на неприятности из-за этого

Спасибо: 0 
Профиль





Пост 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().
Может я не прав?

Спасибо: 0 
Профиль
Администратор




Пост 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 ) )

такая вот странная фича


Спасибо: 0 
Профиль
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 119
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет