문제

이후 시대의 공룡,터보 파스칼은 델파이 그리고 요즘에는 쓰기()및 WriteLn()하는 절차를 조용히 하시기 바랍니다.

  • 숫자의 매개 변수를 변수입;

  • 각각의 변수할 수 있습의 모든 종류의 형식당신을 공급할 수 있습니다 정수,배,문자열,부울,혼합 모두에서 그들을 어떤 순서

  • 을 제공할 수 있습에 대한 추가적인 매개변수를 각각 인수:

Write('Hello':10,'세계로!':7);//정렬 매개변수

  • 그것도 나타 특별한 방법으로는 코드에서 완성 drowdown:
    • 쓰([var F:파일];P1;[...,PN])
    • WriteLn([var F:파일];[P1;[...,PN]])

이제는 내가 이것을 타자를 치고 있는 것으로 나타났고 쓰는 WriteLn 없 같은 괄호 안에서의 코드 완료]드롭다운.따라서 그것은 다음과 같이 자동으로 생성되지 않지만,하드 코딩하여 사람입니다.

어쨌든,내가 쓸 수 있는 절차 다음과 같이 이러한 자,또는 이 모든 일부는 마법의 하드 컴파일러가 속임수?

도움이 되었습니까?

해결책

Writeln은 컴파일러 "Magic"기능이라고 부르는 것입니다. System.pas를 보면 기대할 수있는 것과 같은 것으로 선언 된 Writeln을 찾을 수 없습니다. 컴파일러는 문자 그대로 다양한 특수 런타임 라이브러리 기능으로 개별 통화로 분리합니다.

요컨대, 컴파일러를 수정하지 않고 내장 된 Writeln과 동일한 일을 수행하는 자신의 버전을 구현할 방법이 없습니다.

다른 팁

Allen이 말했듯이, 당신은 똑같은 일을하는 자신의 기능을 쓸 수 없습니다.

그러나 사용자 정의를 수행하고 표준 쓰기 (LN)를 사용하여 TextFile 드라이버에 글을 쓰는 TextFile 드라이버를 작성할 수 있습니다. 우리는 당신이 오래된 dos days에 그렇게했습니다 :)

(이전 명령문의 맥락에서 "드라이버"는 시스템 장치 IIRC에서 포인터를 전환하여 시스템에 연결된 파스칼 코드 일뿐입니다. 마지막 으로이 트릭을 사용한 지 오래되었습니다.)

내가 아는 한, 파스칼 표준에는 변수 인수가 포함되지 않습니다.

IIRC, Gnu Pascal은 다음과 같은 말을하겠습니다.

컴파일러의 언어 문서에서 "변수 인수 목록"또는 "적합한 배열"을 검색하십시오. 다음은 이후의 예입니다. http://www.gnu-pascal.de/demos/conformantdemo.pas.

이전 포스터가 말했듯이 Writeln ()은 마술입니다. 나는 문제가 파스칼 기능으로 스택이 어떻게 조립되는지와 관련이 있다고 생각하지만, 스택에있는 것이 어디에 있는지 생각한 이후로 오랜 시간이 지났다 :)

그러나 "Writeln"기능 (이미 작성된) 기능을 작성하지 않는 한 필요 변수 인수가있는 절차를 구현합니다. 대신 반복이나 재귀를 시도하십시오 :)

정기적 인 절차보다는 마법 컴파일러 동작입니다. 그리고 아니요, 그러한 서브 루틴을 쓸 방법이 없습니다 (불행히도!). 코드 생성은 실제 매개 변수 수와 해당 유형의 수를 해결하고 적절한 RTL 호출 (예 : str ()) 컴파일 시간에. 이것은 자주 제안되는 반대입니다 Const의 배열 (단일 변형 배열 공식 매개 변수)는 런타임에서 동일한 작업으로 이어집니다. 나중에 접근이 서투른 접근 방식을 발견하고 코드 가독성을 다소 손상시키고 Bugland (Borland/Inprise/Codegear/Embarcadero/Name IT) 변형 오픈 어레이 생성자에 대한 코드 통찰력을 깨뜨 렸습니다 (예, 치료, I outputdebugstring을 사용합니다. ( '...', [...])))) 및 코드 완료는 제대로 작동하지 않습니다 (또는 전혀). 따라서, 마법 행동을 시뮬레이션하는 가장 가까운 방법은 과부하 된 서브 루틴을 많이 선언하는 것입니다 (실제로 특정 위치에 특정 공식 매개 변수 유형에 따라 하나씩). 이것을 kludge라고 부를 수도 있지만, 이것은 변수 매개 변수 목록의 유연성을 얻는 유일한 방법이며 별도의 모듈에 숨겨 질 수 있습니다.

추신 : 구문은 세미콜론 사용을 허용하지 않기 때문에 의도적으로 형식 지정자를 제외하고 제외했습니다. str (), 쓰다() 그리고 writeln () 그들을 받아들이고 있습니다.

예, 델파이와 친구 (예 : 무료 파스칼, 카일릭스 등)에서 할 수는 있지만 더 "표준"파스칼은 아닙니다. 구문과 함께 사용되는 변형 오픈 배열 매개 변수를 찾으십시오.

procedure MyProc(args : array of const);

(몇 년이 지났고 매뉴얼 손이 없으므로 진행하기 전에 세부 정보를 확인하십시오). 이것은 당신에게 열린 배열을 제공합니다 TVarData (또는 그와 비슷한 것) RTTI를 추출 할 수 있습니다.

하나의 참고 사항 : x : y 형식 구문 (특별한)을 일치시킬 수 없을 것이라고 생각합니다.

대부분의 이미 말했다,하지만 나는 같은 추가 몇 가지 있습니다.

첫번째 형식을 사용할 수 있습 기능이다.그것은 위대한 변환의 거의 모든 종류의 변수 문자열과 제어의 크기입니다.하지만 그것은 그것의 하자:

myvar := 1;
while myvar<10000 do begin
  Memo.Lines.Add(Format('(%3d)', [myVar]));
  myvar := myvar * 10;
end;

생산:

(  1)
( 10)
(100)
(1000)

그래서 크기는 최소 크기(바로와 같은:x:y 건설).

을 얻을 최소 금액을 변수의 인수와 함께 작업 할 수 있습니다 기본 매개 변수와 과부하 기능:

procedure WriteSome(const A1: string; const A2: string = ''; const A3: string = '');

procedure WriteSome(const A1: string); overload;
procedure WriteSome(const A1: Integer); overload;

Old Pascal에서 자신의 Write/Writeln을 쓸 수 없습니다. 컴파일러, 형식, 정당화 등에 의해 생성됩니다. 그래서 C 언어와 같은 일부 프로그래머, 심지어 Printf, Scanf, Scanf와 같은 유연한 표준 기능조차도 모든 유능한 프로그래머가 구현할 수있는 이유입니다.

C 공급 업체가 구현 한 것보다 더 성능있는 것을 만들려면 C에 대해 동일한 printf 함수를 만들 수도 있습니다. 마술 속임수는 없으며, 코드는 변수 인수를 "걷기"해야합니다.

추신

그러나 Markusq가 지적했듯이 Pascal의 일부 변형 (Free Pascal, Kylix 등)은 가변적 인 인수를 촉진 할 수 있습니다. 나는 Dos Days, Turbo Pascal 7 이후 Pascal과 마지막으로 땜질합니다.

Writeln은 "Const의 배열"이 아니지만 컴파일러에 의해 인수를 문자열로 변환 한 다음 Primitive Writestring을 호출하는 다양한 호출로 분해됩니다. "LN"은 라인 렌딩을 문자열로 쓴 함수 일뿐입니다. (OS 종속). 프리미티브에 대한 프로 시저 변수 (함수 포인터)는 파일 유형 (TexTrec/Filerec)의 일부이므로 사용자 정의 할 수 있습니다. (예 : TP의 할당)

{$ i+} 모드가 켜져있는 경우 각 요소 후에 iocheck 함수에 대한 호출이 이루어집니다.

위에서 만들어진 GPC 구조는 무한한 C 오픈 어레이입니다. FPC (및 Afaik Delphi)도 이것을 지원하지만 구문이 다릅니다.

절차 약간의 hting (a : const의 배열); cdecl;

C, Printf 스타일과 호환되는 ABI로 변환됩니다. 이는 관련 함수 (이 경우 일부)가 인수 수를 얻을 수 없지만 형식 스트링 구문 분석에 의존해야 함을 의미합니다. 따라서 이것은 안전한 Const와는 다른 것입니다.

질문에 대한 직접적인 답변은 아니지만 다음 주석을 추가하고 싶습니다. 최근에 writeln (...) 구문을 사용하여 일부 코드를 StringList를 사용하여 '줄'을 형식 (...)로 채우고 채우고, (...)를 채우고 작성했습니다. 단지 평범한 inttostr (...), floattostr (...) 기능 등.

이 변화의 주된 이유는 속도 개선이었습니다. StringList와 SaveFileTo를 사용하는 것은 Writeln보다 훨씬 빠르며 Write Combinly입니다.

많은 텍스트 파일을 생성하는 프로그램을 작성하는 경우 (웹 사이트 작성 프로그램에서 작업 중이 었음) 많은 차이를 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top