Re: паскаль, преобразование типов

asdf123

как real в string перевести? и наоборот.

viktor954

Гугл запрещён?
http://delphi.wikia.com/wiki/Object_Pascal

Routine Description
¤ Chr Converts an ordinal number into an ANSI character.
¤ Ord Converts an ordinal-type value into the number indicating its order.
¤ Round Converts a real-type value into an Integer-type value, rounding its value.
¤ Trunc Converts a real-type value into an Integer-type value, truncating its value.
¤ Int Returns the Integer part of the floating-point value argument.
¤ IntToStr Converts a number into a string.
¤ IntToHex Converts a number into a string with its hexadecimal representation.
¤ StrToInt Converts a string into a number, raising an exception if the string does not represent
a valid integer.
¤ StrToIntDef Converts a string into a number, using a default value if the string is not correct.
¤ Val Converts a string into a number (traditional Turbo Pascal routine, available for
compatibility).
¤ Str Converts a number into a string, using formatting parameters (traditional Turbo Pascal
routine, available for compatibility).
¤ StrPas Converts a null-terminated string into a Pascal-style string. This conversion is
automatically done for AnsiStrings in 32-bit Delphi.
¤ StrPCopy Copies a Pascal-style string into a null-terminated string. This conversion is done with a
simple PChar cast in 32-bit Delphi.
¤ StrPLCopy Copies a portion of a Pascal-style string into a null-terminated string.
¤ FloatToDecimal Converts a floating-point value to record including its decimal representation
(exponent, digits, sign).
¤ FloatToStr Converts the floating-point value to its string representation using default formatting.
¤ FloatToStrF Converts the floating-point value to its string representation using the specified formatting.
¤ FloatToText Copies the floating-point value to a string buffer, using the specified formatting.
¤ FloatToTextFmt As the previous routine, copies the floating-point value to a string buffer, using the
specified formatting.
¤ StrToFloat Converts the given Pascal string to a floating-point value.
¤ TextToFloat Converts the given null-terminated string to a floating-point value.

asdf123

и что из этого есть в стандарте? фоаттостр не работает, инттостр-тоже. или назови версию паскаля в которой это реализовано.

kruzer25

как real в string перевести? и наоборот.
"Наоборот" - это уже не преобразование типов. Да и насчёт real в string есть у меня сомнения.

PooH

можно самому написать

yroslavasako

тебе же сказали, дельфи. В стандарте string - это packed array [1..n] of char, и никаких методов для работы с ним не предусмотрено. Самому реализовать слабо?

viktor954

1) это в программинг
2) Это есть в Object Pascal.
в BP7 были str и val, если я правильно помню
http://www.geocities.com/SiliconValley/Park/3230/pas/pasl100...

asdf123

мне в паскале надо. причем в стандарте :(

asdf123

В стандарте string - это packed array [1..n] of char, и никаких методов для работы с ним не предусмотрено
придется думать над реализацией...

PooH

придется думать над реализацией...
а чего думать? дели на 10 и остатки записывай в массив

kokto

а чего думать? дели на 10 и остатки записывай в массив
У него real, а не integer.

durka82

Ну так бьётся на до и после точки, которые потом делением/умножением на 10 и отбором в массив остатка/целой части переводятся в 2 массива, которые уже пишутся в стринг.
А вообще это скорее в Программинг.

Amvit

str(r:1:3, s);
val(s, r, error_code);

apl13

(traditional Turbo Pascal routine, available for compatibility)
(traditional Turbo Pascal routine, available for compatibility)
Неграмотный анонимус очень неграмотный.

Amvit

и что?

yroslavasako

в паскале таких функций нет. Более того, борландовских строк в паскале тоже нет

agent007new

причем в стандарте
А че, уже и на паскаль есть стандарт? Я всю жизнь думал, что он нужен только Борланду (ну или, как там называлась/называется счас эта конторка)

apl13

Я всю жизнь думал, что он нужен только Борланду
Причем настолько сильно, что они специально отправили суперагента в прошлое, в 1968 год, чтобы он подкупил Вирта, а потом заслали во флосс-коммьюнити специально обученных пчел-гипнотизеров, чтобы те наркотиками заставляли людей писать Free Pascal и GPC.

pitrik2

причем в стандарте
ой
а можно ссылку на стандарт паскаля?
вон сишные/сипласпласные стандарты все знают, а паскалевские думаю не многие видели
год хотя бы какой если ссылки нет?
P.S.
вопрос без подкола, правда очень интересно почитать

okis

например
http://pascal-central.com/docs/iso7185.pdf
важный момент:
Do not read under the inuence of alcohol (although there have been several unconfirmed reports that alcohol actually improves the readability) .

Serab

ой
а можно ссылку на стандарт паскаля?
вон сишные/сипласпласные стандарты все знают, а паскалевские думаю не многие видели
год хотя бы какой если ссылки нет?
На ВМК на первом курсе обучают _стандарту_ паскаля, который довольно заметно отличается от многим известных борладнов и дельфи.

Serab

Ну так бьётся на до и после точки, которые потом делением/умножением на 10 и отбором в массив остатка/целой части переводятся в 2 массива, которые уже пишутся в стринг.
Плохо, очень плохо советуешь. Вещественные числа это вам не тут.

Dasar

Плохо, очень плохо советуешь. Вещественные числа это вам не тут.
а что? как-то по другому - вещественные числа в строки переводятся?
так все и делается, надо только помнить, что сравнивать с нулем надо хитро.

Serab

Умножается не на десять.

Dasar

Умножается не на десять.
а на сколько? на 10.0? :)

kill-still

ну или, как там называлась/называется счас эта конторка
Дельфу они продали КодеГиру.

kill-still

тебе число в строковый формат перевести надо, или преобразование типа сделать, чтобы увидеть что в переменной в машинном коде?
1ое - FloatToStr(x)
2ое - string(x)
если в турбопаскале/fpc нет таких функций - выдери их из изходников дельфи, или сам напиши - ничего сложного если не заморачиваться с производительностью.

yroslavasako

выдери их из изходников дельфи
глупый совет. Дельфа написана на дельфях, и паскалем не скомпилится

kill-still

function FloatToText(BufferArg: PChar; const Value; ValueType: TFloatValue;
Format: TFloatFormat; Precision, Digits: Integer): Integer;
var
Buffer: Cardinal;
FloatRec: TFloatRec;
SaveGOT: Integer;
DecimalSep: Char;
ThousandSep: Char;
CurrencyStr: Pointer;
CurrFmt: Byte;
NegCurrFmt: Byte;
asm
PUSH EDI
PUSH ESI
PUSH EBX
MOV Buffer,EAX
{$IFDEF PIC}
PUSH ECX
CALL GetGOT
MOV SaveGOT,EAX
MOV ECX,[EAX].OFFSET DecimalSeparator
MOV CL,[ECX]
MOV DecimalSep,CL
MOV ECX,[EAX].OFFSET ThousandSeparator
MOV CL,[ECX].Byte
MOV ThousandSep,CL
MOV ECX,[EAX].OFFSET CurrencyString
MOV ECX,[ECX].Integer
MOV CurrencyStr,ECX
MOV ECX,[EAX].OFFSET CurrencyFormat
MOV CL,[ECX].Byte
MOV CurrFmt,CL
MOV ECX,[EAX].OFFSET NegCurrFormat
MOV CL,[ECX].Byte
MOV NegCurrFmt,CL
POP ECX
{$ELSE}
MOV AL,DecimalSeparator
MOV DecimalSep,AL
MOV AL,ThousandSeparator
MOV ThousandSep,AL
MOV EAX,CurrencyString
MOV CurrencyStr,EAX
MOV AL,CurrencyFormat
MOV CurrFmt,AL
MOV AL,NegCurrFormat
MOV NegCurrFmt,AL
MOV SaveGOT,0
{$ENDIF}
MOV EAX,19
CMP CL,fvExtended
JNE @@2
MOV EAX,Precision
CMP EAX,2
JGE @@1
MOV EAX,2
@@1: CMP EAX,18
JLE @@2
MOV EAX,18
@@2: MOV Precision,EAX
PUSH EAX
MOV EAX,9999
CMP Format,ffFixed
JB @@3
MOV EAX,Digits
@@3: PUSH EAX
LEA EAX,FloatRec
CALL FloatToDecimal
MOV EDI,Buffer
MOVZX EAX,FloatRec.Exponent
SUB EAX,7FFFH
CMP EAX,2
JAE @@4
MOV ECX, EAX
CALL @@PutSign
LEA ESI,@@INFNAN[ECX+ECX*2]
ADD ESI,SaveGOT
MOV ECX,3
REP MOVSB
JMP @@7
@@4: LEA ESI,FloatRec.Digits
MOVZX EBX,Format
CMP BL,ffExponent
JE @@6
CMP BL,ffCurrency
JA @@5
MOVSX EAX,FloatRec.Exponent
CMP EAX,Precision
JLE @@6
@@5: MOV BL,ffGeneral
@@6: LEA EBX,@@FormatVector[EBX*4]
ADD EBX,SaveGOT
MOV EBX,[EBX]
ADD EBX,SaveGOT
CALL EBX
@@7: MOV EAX,EDI
SUB EAX,Buffer
POP EBX
POP ESI
POP EDI
JMP @@Exit

@@FormatVector:
DD @@PutFGeneral
DD @@PutFExponent
DD @@PutFFixed
DD @@PutFNumber
DD @@PutFCurrency

@@INFNAN: DB 'INFNAN'

// Get digit or '0' if at end of digit string

@@GetDigit:

LODSB
OR AL,AL
JNE @@a1
MOV AL,'0'
DEC ESI
@@a1: RET

// Store '-' if number is negative

@@PutSign:

CMP FloatRec.Negative,0
JE @@b1
MOV AL,'-'
STOSB
@@b1: RET

// Convert number using ffGeneral format

@@PutFGeneral:

CALL @@PutSign
MOVSX ECX,FloatRec.Exponent
XOR EDX,EDX
CMP ECX,Precision
JG @@c1
CMP ECX,-3
JL @@c1
OR ECX,ECX
JG @@c2
MOV AL,'0'
STOSB
CMP BYTE PTR [ESI],0
JE @@c6
MOV AL,DecimalSep
STOSB
NEG ECX
MOV AL,'0'
REP STOSB
JMP @@c3
@@c1: MOV ECX,1
INC EDX
@@c2: LODSB
OR AL,AL
JE @@c4
STOSB
LOOP @@c2
LODSB
OR AL,AL
JE @@c5
MOV AH,AL
MOV AL,DecimalSep
STOSW
@@c3: LODSB
OR AL,AL
JE @@c5
STOSB
JMP @@c3
@@c4: MOV AL,'0'
REP STOSB
@@c5: OR EDX,EDX
JE @@c6
XOR EAX,EAX
JMP @@PutFloatExpWithDigits
@@c6: RET

// Convert number using ffExponent format

@@PutFExponent:

CALL @@PutSign
CALL @@GetDigit
MOV AH,DecimalSep
STOSW
MOV ECX,Precision
DEC ECX
@@d1: CALL @@GetDigit
STOSB
LOOP @@d1
MOV AH,'+'

@@PutFloatExpWithDigits:

MOV ECX,Digits
CMP ECX,4
JBE @@PutFloatExp
XOR ECX,ECX

// Store exponent
// In AH = Positive sign character ('+' or 0)
// ECX = Minimum number of digits (0..4)

@@PutFloatExp:

MOV AL,'E'
MOV BL, FloatRec.Digits.Byte
MOVSX EDX,FloatRec.Exponent
DEC EDX
CALL PutExponent
RET

// Convert number using ffFixed or ffNumber format

@@PutFFixed:
@@PutFNumber:

CALL @@PutSign

// Store number in fixed point format

@@PutNumber:

MOV EDX,Digits
CMP EDX,18
JB @@f1
MOV EDX,18
@@f1: MOVSX ECX,FloatRec.Exponent
OR ECX,ECX
JG @@f2
MOV AL,'0'
STOSB
JMP @@f4
@@f2: XOR EBX,EBX
CMP Format,ffFixed
JE @@f3
MOV EAX,ECX
DEC EAX
MOV BL,3
DIV BL
MOV BL,AH
INC EBX
@@f3: CALL @@GetDigit
STOSB
DEC ECX
JE @@f4
DEC EBX
JNE @@f3
MOV AL,ThousandSep
TEST AL,AL
JZ @@f3
STOSB
MOV BL,3
JMP @@f3
@@f4: OR EDX,EDX
JE @@f7
MOV AL,DecimalSep
TEST AL,AL
JZ @@f4b
STOSB
@@f4b: JECXZ @@f6
MOV AL,'0'
@@f5: STOSB
DEC EDX
JE @@f7
INC ECX
JNE @@f5
@@f6: CALL @@GetDigit
STOSB
DEC EDX
JNE @@f6
@@f7: RET

// Convert number using ffCurrency format

@@PutFCurrency:

XOR EBX,EBX
MOV BL,CurrFmt.Byte
MOV ECX,0003H
CMP FloatRec.Negative,0
JE @@g1
MOV BL,NegCurrFmt.Byte
MOV ECX,040FH
@@g1: CMP BL,CL
JBE @@g2
MOV BL,CL
@@g2: ADD BL,CH
LEA EBX,@@MoneyFormats[EBX+EBX*4]
ADD EBX,SaveGOT
MOV ECX,5
@@g10: MOV AL,[EBX]
CMP AL,'@'
JE @@g14
PUSH ECX
PUSH EBX
CMP AL,'$'
JE @@g11
CMP AL,'*'
JE @@g12
STOSB
JMP @@g13
@@g11: CALL @@PutCurSym
JMP @@g13
@@g12: CALL @@PutNumber
@@g13: PO

yroslavasako

И что ты хотел этим доказать? В паскале нет ни таких функций, ни таких типов, да и ассемблерных вставок тоже нет.

apl13

О, да. Для портирования этой функции на стандартный паскаль придется воспользоваться стандартным ассемблером. :applause:

kill-still

ассемблерных вставок тоже нет.
Пи***** и провокация.
Отлично помню зелёненькие ассемблерные вставочки в турбопаскале.
В паскале нет ни таких функций, ни таких типов

Т.Е. ты предлагаешь всё за топикстартера сделать и тут выложить уже готовое?

apl13


В паскале нет ни таких функций, ни таких типов, да и ассемблерных вставок тоже нет.

Пи***** и провокация.
Отлично помню зелёненькие ассемблерные вставочки в турбопаскале.
Слушай, ты можешь пока уйти из треда? Как все будет решено, сразу возвращайся! :4u:
ЗЫ. "Пиздеж" пишется без мягкого знака.
Оставить комментарий
Имя или ник:
Комментарий: