Re: паскаль, преобразование типов
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.
и что из этого есть в стандарте? фоаттостр не работает, инттостр-тоже. или назови версию паскаля в которой это реализовано.
как real в string перевести? и наоборот."Наоборот" - это уже не преобразование типов. Да и насчёт real в string есть у меня сомнения.
можно самому написать
тебе же сказали, дельфи. В стандарте string - это packed array [1..n] of char, и никаких методов для работы с ним не предусмотрено. Самому реализовать слабо?
2) Это есть в Object Pascal.
в BP7 были str и val, если я правильно помню
http://www.geocities.com/SiliconValley/Park/3230/pas/pasl100...
мне в паскале надо. причем в стандарте
В стандарте string - это packed array [1..n] of char, и никаких методов для работы с ним не предусмотренопридется думать над реализацией...
придется думать над реализацией...а чего думать? дели на 10 и остатки записывай в массив
а чего думать? дели на 10 и остатки записывай в массивУ него real, а не integer.
А вообще это скорее в Программинг.
val(s, r, error_code);
(traditional Turbo Pascal routine, available for compatibility)Неграмотный анонимус очень неграмотный.
(traditional Turbo Pascal routine, available for compatibility)
и что?
в паскале таких функций нет. Более того, борландовских строк в паскале тоже нет
причем в стандартеА че, уже и на паскаль есть стандарт? Я всю жизнь думал, что он нужен только Борланду (ну или, как там называлась/называется счас эта конторка)
Я всю жизнь думал, что он нужен только БорландуПричем настолько сильно, что они специально отправили суперагента в прошлое, в 1968 год, чтобы он подкупил Вирта, а потом заслали во флосс-коммьюнити специально обученных пчел-гипнотизеров, чтобы те наркотиками заставляли людей писать Free Pascal и GPC.
причем в стандартеой
а можно ссылку на стандарт паскаля?
вон сишные/сипласпласные стандарты все знают, а паскалевские думаю не многие видели
год хотя бы какой если ссылки нет?
P.S.
вопрос без подкола, правда очень интересно почитать
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) .
ойНа ВМК на первом курсе обучают _стандарту_ паскаля, который довольно заметно отличается от многим известных борладнов и дельфи.
а можно ссылку на стандарт паскаля?
вон сишные/сипласпласные стандарты все знают, а паскалевские думаю не многие видели
год хотя бы какой если ссылки нет?
Ну так бьётся на до и после точки, которые потом делением/умножением на 10 и отбором в массив остатка/целой части переводятся в 2 массива, которые уже пишутся в стринг.Плохо, очень плохо советуешь. Вещественные числа это вам не тут.
Плохо, очень плохо советуешь. Вещественные числа это вам не тут.а что? как-то по другому - вещественные числа в строки переводятся?
так все и делается, надо только помнить, что сравнивать с нулем надо хитро.
Умножается не на десять.
Умножается не на десять.а на сколько? на 10.0?
ну или, как там называлась/называется счас эта конторкаДельфу они продали КодеГиру.
1ое - FloatToStr(x)
2ое - string(x)
если в турбопаскале/fpc нет таких функций - выдери их из изходников дельфи, или сам напиши - ничего сложного если не заморачиваться с производительностью.
выдери их из изходников дельфиглупый совет. Дельфа написана на дельфях, и паскалем не скомпилится
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
И что ты хотел этим доказать? В паскале нет ни таких функций, ни таких типов, да и ассемблерных вставок тоже нет.
О, да. Для портирования этой функции на стандартный паскаль придется воспользоваться стандартным ассемблером.
ассемблерных вставок тоже нет.Пи***** и провокация.
Отлично помню зелёненькие ассемблерные вставочки в турбопаскале.
В паскале нет ни таких функций, ни таких типов
Т.Е. ты предлагаешь всё за топикстартера сделать и тут выложить уже готовое?
В паскале нет ни таких функций, ни таких типов, да и ассемблерных вставок тоже нет.
Слушай, ты можешь пока уйти из треда? Как все будет решено, сразу возвращайся!
Пи***** и провокация.
Отлично помню зелёненькие ассемблерные вставочки в турбопаскале.
ЗЫ. "Пиздеж" пишется без мягкого знака.
Оставить комментарий
asdf123
как real в string перевести? и наоборот.