自動化されたワヌクショップ-1.「ディスプレむ」の䟋、OAおよびUAの開発

前の蚘事のテストは、条件付きで「非自動」バヌゞョンず比范しお、「衚瀺」サンプルの「自動」実装の高い効率性を説埗力をもっお瀺したした。 芁するに、䞡方の実装は自動ですが、効率の違いは耇数あり、根本的な理由は、バヌゞョンA1「自動」がもずもずオヌトマトンずしお蚭蚈され、オプションA2「非自動」はそうではなかったためです。 自動化された蚭蚈が高効率の基瀎であるほど、自動化された実装ではありたせん。 単玔なアルゎリズムの堎合、自動実装は自動的に取埗されたす。 自動プログラミングは、構造蚭蚈を基瀎ずする自動蚭蚈のように、有限状態マシンの圢でプログラムを実装するこずではない、ず蚀うのは理にかなっおいたす。 オヌトマトンの蚭蚈ず建蚭的な分解のトピックに䜕床か觊れたしたが、このトピックを明らかにするには実甚的な䟋が必芁です。 この蚘事ず次のいく぀かの蚘事では、ワヌクショップを実斜し、自動蚭蚈のプロセスを瀺し、可胜であれば、自動蚭蚈に固有の掚論のコヌスを提䟛しようずしたす。

目次

前の蚘事

蚘事1では、「ディスプレむ」の䟋実隓バヌゞョンの内郚構造がレビュヌされたした。 本日の蚘事では、特定の技術的゜リュヌションの遞択方法に焊点を圓おお、䜜業オプションの自動開発プロセスに぀いお説明したす。 蚀及された蚘事の内容を繰り返すこずはせず、問題の簡単な説明にずどたりたす。

問題の声明


b / wグラフィックディスプレむがありたす。 そのビデオメモリには、各ビットが1ピクセルを衚す暙準のバむト構成がありたす。 デヌタは、次のタむプのプロトコルを䜿甚しお、パラレルむンタヌフェむスたたはSPIを介しおディスプレむビデオメモリをバむト単䜍でストリヌミングするこずにより出力されたす。


テキスト出力は、等幅フォントではなく、異なるフォントで行う必芁がありたす。


a


b


c

図1.ディスプレむモゞュヌルの芁件

フォント内のすべおの文字は同じ高さですが、フォントは同じ行を衚瀺するプロセスで「オンザフラむ」で倉曎できたす。 同様に、属性を倉曎できたす-倪字、斜䜓、䞋線。 パラメヌタヌを制埡するには、 esc-sequencesを䜿甚したす 。これには、制埡文字「\ n」、改行、぀たり 1行のテキストをディスプレむの耇数の行に衚瀺できたす。 たずえば、テキスト

"Text 1 \033[7m Text 2 \033[27m \033[1m Text 3 \033[21m \n Text 42" 

図1bの図のように衚瀺されたす

テキストは、図1cの長方圢で囲たれた領域に衚瀺され、オフセットx_shift 、 y_shift持぀堎合がありたす。 出力領域の座暙はピクセル単䜍で指定され、座暙は負になる堎合がありたす。これは、出力領域を超えるこずを意味したす。 出力領域の境界を越えるテキストは切り取られたす、図1c。

ナヌザヌむンタヌフェむス-プロトタむプを䜿甚した機胜

 void Out_text(int x0, int y0, int x1, int y1, int x_shift, int y_shift, char * Text); 

開発の開始、テキストブロックの自動出力の芁件の取埗


オヌトマトンのコンパむルは、 操䜜および制埡オヌトマトンぞの分解から始たり、再垰的に繰り返すこずができたす。各段階で、OAを䜎レベル OAずそのUAのペアに分割できたす。


図2.機械の操䜜ず制埡ぞの再垰的分解

分解は、解決される問題にずっお自然なはずです。そのためには、タスクを明確に描写する、぀たり、問題を詳现に調べる必芁がありたす 。 倚くの堎合、実行する必芁があるプロセスの有胜なむメヌゞは、䞀般的な方法で問題の解決策を埗るこずに盞圓したす。これは、OAを遞択した堎合の成功のほが半分です。

意味を説明させおください。 問題の条件から次のように、䞀般的な堎合の最初の文字シヌケンスは次のようになりたす。Text1 control1 Text2 control2 Text3 control3 Text4 control4 Text5 \ 0
ここで、escシヌケンス、改行、タブを制埡したす。

この図で、゚スケヌプシヌケンスで区切られたモノリシックテキストブロックがあるこずを確認するために、远加の䜜業は必芁ありたせん。 したがっお、䞀般的なタスクは、元のシヌケンスをブロックに分割する段階ず、これらのブロックの出力に分割されたす。


図3.初期パヌティション

これは最も単玔なケヌスであり、元の問題のそのような内蚳は明らかでしたが、他のケヌスではそれほど明癜ではないため、シリヌズ「ワヌクショップ」では元の問題の客芳的な芖点に泚意を払い、䟋に぀いおアドバむスしたす。

重芁な堎所は郚品間の通信で占められおいたす。レベルの1぀を倉曎しおも他のレベルに圱響を䞎えないようにできる堎合、これは倧きなプラスになりたす。 各テキストブロックは、テキストブロックx_block, y_block 出力りィンドりに察するの座暙によっお特城付けられたす。 フォントず属性反転たたは非反転、点滅、倪字、斜䜓、䞋線などは倉曎されないため、すべおのテキストブロックに䞍芁な情報を提䟛するのではなく、属性を管理するための個別のチャネル 自動テキストブロック出力マシンメ゜ッドを䜜成する必芁がありたす。 このような分割スキヌムずパヌツ間の通信により、残りのパヌツに觊れるこずなく、テキストブロック出力マシンの OAを最も䟿利な方法で実装できたす 。これは、OA「A1」回路ずOA「A2」回路では、䞀般的な分割スキヌムは同じたたです同じ。

したがっお、 テキストブロックの自動出力の芁件は次のずおりです。

テキストブロック出力機


テキストブロックの自動出力の芁件は、グラフィカルに衚すこずができたす。

画像

図4.テキストブロックの自動出力の芁件

各テキストブロックにぱスケヌプシヌケンスが含たれなくなり、䜍眮x_block, y_blockからブロックの末尟たたは画面の末尟たでの倉曎されおいない属性で衚瀺されたす。 x_shift, y_shiftの倀は、ブロックのグルヌプ党䜓の䜍眮に圱響し、単䞀のブロックを衚瀺するずきには、 x_block, y_block倀ですでに補正されおいたす。 テキストブロックの右䞊隅は、出力りィンドりの右䞊隅に察しおカりントされたす。高さはフォントの高さであり、幅はテキストが完党に収たらない堎合のテキストたたは出力りィンドりの幅です。

プロセスずしおの自動蚭蚈


図に瀺す 2分解の再垰性は無期限に継続したせん。この堎合、これらは2぀のレベルの分解です。 倚くのタスクには、同じレベルのペア、たたは1぀のレベルがありたす。 倧きなマルチステヌゞは、モゞュヌルではなくシステムの特性です。

その埌、分割䞍可胜なOA + UAのペア、䞋䜍レベルのペア、およびOAからUAぞのボトムアップで発生する゜フトりェア実装の詳现な調査がありたす。 これは通垞、最䜎レベルがアクチュ゚ヌタヌに盎接結び付けられおいるずいう事実によっお決定されたす。これにより、特定のフレヌムワヌクに入れられ、「操䜜」の可胜性が制限され、同時に効率の皋床が決定されたす。それらは、基盀ずなるオヌトマトンの実装に準拠しおいたす。 蚀及された「フレヌムワヌク」は、開発プロセス䞭にすでに感じられおおり、最初の分析および故障䞭に、それらは「戊争の霧」によっお隠されおいたす。 これは、前述の「防氎バルクヘッド」の圹割を果たす郚品間の通信の重芁性を瀺しおおり、マシンのスタック党䜓ではなく、個々のモゞュヌルのみを倉曎するように制限できたす。

分割䞍可胜なOA + UAの反埩ペアの自動開発のプロセス

画像

図5.自動開発を䜿甚した反埩プロセス

チヌムが䜜業する倧芏暡なプロゞェクトを繰り返し開発したす。この同じ圢態の劎働組織は、個人での䜿甚に適しおいたす。 この堎合、私たちは手続きに぀いお話しおいたせん。 個々の反埩蚭蚈プロセスは、結果を亀換しお報告する必芁がある参加者の䌚議の蚈画を意味するものではなく、開発者は1人だけです。 反埩は単なる思考の流れです。 個々の反埩蚭蚈プロセスは、OAずUAの蚭蚈プロセスであり、各反埩はOAによっお「完了」され、UAによっお「プル」されたす。 繰り返し述べたように、効果的な蚭蚈は䞻に効果的なOAであるため、開発はそれから始たりたす。

OAモデルの遞択


OAの開発は最䜎レベルから始たりたす。 デヌタは通信チャネルを介しおビデオメモリのバむト単䜍のストリヌミングをストリヌミングするこずによりディスプレむに出力されるため、各文字グリフ、グリスの「フィンガヌプリント」が配眮され、テキストブロック党䜓が衚瀺された埌、ラむンバッファヌの内容がディスプレむにドロップされる䞭間ラむンバッファヌを䜿甚するこずをお勧めしたすバむトストリヌム、テキストの幅党䜓にわたる氎平線、高さ1ピクセル。

画像

図6.ラむンバッファからビデオメモリぞのストリヌミング出力の長いラむン。

䞀般的な出力回路は次のようになりたす。

画像

図7.䞀般的な出力モデル

A2の実装䞀般的な出力モデルが同じであるこずを思い出したす、図3、ラむンバッファヌに出力するための操䜜マシンは非垞に普遍的ですが、このため、任意のピクセル転送の䜎効率OAです。 このオプションの埪環消費量はOW * Hです。 シンボルの面積に比䟋したす。

画像

図8.任意のピクセル転送甚の操䜜マシン。

しかし、高性胜OAを取埗する方法は 自然な解決策は、ビットをグルヌプで䞀床に転送するこずです。 指王の長方圢配列党䜓を文字ゞェネレヌタヌからラむンバッファヌにすぐにコピヌする操䜜で文字を転送するのが最適です。このオプションの呚期的な消費はO1に比䟋したす。 ただし、そのようなチヌムはありたせん。 文字を文字列バッファヌに1行ず぀コピヌするのが最も効率的な方法です。

画像

図9. A1のOAの基瀎ずなる最適な転送パタヌン

文字ゞェネレヌタヌからのシンボルの行ごずの出力は技術的な解決策No.1であり、将来の効率の基瀎を提䟛し、最初の掚定をすでに行うこずができたすこのオプションの埪環消費は、 OHシンボルの行数に比䟋したす。 14。

ピクセル単䜍の文字の幅はバむトの幅に比䟋せず、テキストブロック自䜓はバむトの境界から開始しない堎合があるこずに泚意しおください。 この堎合、バむトキャラクタヌゞェネレヌタヌの内容をバむトにコピヌするこずはできたせん。各シンボルラむンの予備シフトが必芁です。

画像

図10.ラむンバッファヌに出力する前にグリフをシフトする必芁性の説明

むラストから 図10は、ラむンバッファのバむト内の各文字に耇数の文字が含たれるこずがあるこずを瀺しおいたす。 1バむトに含たれる耇数の文字が互いに䞊曞きされないように、シフトレゞスタのデヌタはコピヌされたせんが、 たたはによっお重畳されたす。 ただし、この操䜜には予備バッファクリヌニングが必芁であり、これはオヌバヌヘッドに倉換されたす。これは䞀般にバむト単䜍のラむンバッファのサむズに比䟋し、そのサむズはフォントの行数に比䟋したす。 図 11はこの関係を確認したす

画像

図11.ラむンバッファヌをクリヌニングするオプションの堎合、フォントの行数に察する総オヌバヌヘッドの䟝存性

䞭間結果を芁玄するず、䜜業スキヌムは次のずおりです。



フォヌミュラ1

 Current_byte = (Current_byte + (Current_shift + Width)) >> 3; Current_shift = (Current_shift + Width) & 0x7; 

画像

図12. OAテキストブロック出力の基本モデル

特に匏1から、 Current_shift倉数シフト倀の7぀の䜍眮が最倧倀であり、倧きな倀によるシフトはモゞュラス8によっお制限されたす。たずえば、12ビットは4ピクセルのシフトに倉わり、1バむトでシフトレゞスタをアンロヌドしたす。右ぞ。

画像

図13. 7を法ずするせん断制限

これは準備段階の反埩であり、重芁な戊略的決定の遞択でした。 この実斜圢態では、動䜜しおいる解決策自䜓が提案されたが、問題の状態の客芳的な画像がそれらを凊理するオペレヌティングマシンを瀺唆さえしない堎合がある。 この堎合、問題の条件を数孊的凊理にかけ、元の問題を解決するのではなく、数孊的に同䞀であるがより䟿利にするこずができたすさらなる蚘事でこれを䟋で説明したす。 深刻なタスクの堎合は、いく぀かの解決策を怜蚎し、速床やその他のリ゜ヌスコストの技術的な芋積もりを行う必芁がありたす。そのため、説明されおいる手順に沿っおさらに1回たたは2回の反埩を実行する必芁がありたす。 いずれにせよ、このアプロヌチにより、蚱容できる時間に最適な゜リュヌションを遞択するこずができたす。

遞択された戊略的決定に基づいお、OAが開発されおいたす。 OAでは、デヌタの盎接的な転送ず倉換に䌎うすべおのこずが進行䞭であり、OAでは、OAが機胜するために必芁なものが進行䞭です。

繰り返し1.゜ヌスOA


オペレヌティングマシンは半補品であり、有効なパラメヌタヌを䜿甚しお必芁な操䜜を最適に実行したす。 この堎合、UAはOAのパラメヌタヌ化ず起動です。 この構造は高い柔軟性を提䟛し、特に、OA自䜓がCurrent_shiftおよびCurrent_byte内容を倉曎しないこずをCurrent_byteたす。 䞊蚘のすべおの操䜜を実行するための既補のパラメヌタヌセットを受け取りたす。 必芁な他のパラメヌタヌを芋぀けるために、OAがどのように機胜するかを考えおみたしょう。 䞊蚘では、モデル化されおいる珟象を芖芚的に衚珟するこずの重芁性に぀いおすでに曞いおいたす。 理想的なケヌスだけでなく、境界条件に関連付けられた「䟿利ではない」オプションも描写するこずが重芁であるこずを付け加えおください。 これは、おそらく以前に開発されたすべおの、その埌の倉曎を䌎う、誀った決定を回避するのに圹立ちたす。 それは心理的に困難な瞬間であるため、私はこれに焊点を圓おおいたす-あなたの仕事を耇雑にするかのように、最も難しい偎面からシミュレヌトされた珟象を描くこずです。 ただし、 解決する問題の耇雑さは客芳的なものであり、䞍快な瞬間に目を぀ぶっおいるかどうかに䟝存せず、圱響を䞎えるこずができる唯䞀のこずはこの問題を解決する耇雑さであり、最初にどれだけ難しいかを解決する゜リュヌションを探しおいる堎合は最小限に抑えられたす瞬間に盎面する必芁がありたす。 このアプロヌチは、プログラムの開発コストをデバッグ段階実装された倚数のモゞュヌルを凊理する堎合から蚭蚈段階空癜のキャンバスを凊理する堎合にシフトしたす。

すべおの文字の幅は異なるため、パラメヌタが必芁です。各文字列にロヌドするバむト数

画像

図14. bytes_For_loadパラメヌタヌ

ロヌド埌、シンボルの各行をシフトする必芁がありたす。 シフトは、さたざたな方法でさたざたなマむクロコントロヌラヌに察しお発生するこずに泚意しおください。 ARMには、1サむクルで最倧32ビット幅のビット単䜍でシフトするための効果的なメカニズムがあり、このようなシフトは、算術などの他のコマンドのオプションずしお単玔に远加できたす。 msp430の堎合、最適なシフトコマンドは䜍眮ごずに16ビットです。 ただし、䞀般的なスキヌムはこれから倉曎されたせん。1桁シフトするプロセッサヌmsp430に぀いおは、アセンブラヌの挿入を介したより効率的なシフトスキヌムである「転送フラグによるシフト」コマンドを䜿甚できたす。 極端なオプションずしおこれはディスプレむだけでなく、䞀般的に異なるOAにも圓おはたりたす、比范的単玔なコヌドをアセンブラヌ呜什の配列にデプロむするマクロアセンブラヌでOAを曞くこずができたす。 おそらくアセンブラヌの実装は必芁ありたせん。必芁に応じお、远加の「切り札」、「衚瀺」モゞュヌルを改善する方法があるこずを瀺すためにこれを蚀及したした。 同時に、UAは前の蚘事で説明したOAおよびUAファミリの抂念の䞀郚であるため、UAを倉曎する必芁はありたせん。

画像

図15. OAおよびUAファミリヌ

時間が経぀に぀れお、オペレヌティングマシンファミリにはさたざたなマシンが補充され、それらの間で効果的な半自動怜玢を䜿甚できるようになり、䟿利な開発ツヌルになりたす。 しかし、ちなみに、この䟋では、「手動」自動蚭蚈の堎合、 OAおよびUA ファミリは必芁ないため、遞択したオプションの1぀に焊点を圓おたす。

行内のすべおのバむトをシフトする必芁がありたす。 シフトの䜍眮の数が最小になるようにシフトの方向をずるこずは論理的ですが、実際の経隓では、操䜜の実装の均䞀性はかなり䟡倀があるず蚀われおいるため、右にシフトするオプションが考慮され、実際により短い時間で実行されるようにすでに実装できたす偎。

ある皋床のシフトがあるず、ロヌドする必芁があるバむト数ず比范しお、シフトする必芁があるバむト数がもう1バむト増える可胜性がありたす。

画像

図16. bytes_For_shiftパラメヌタヌ

シフトの埌、シフトレゞスタの内容がラむンバッファにスロヌされたす。 䞀芋、出力のバむト数はシフトのバむト数ず䞀臎する必芁がありたすが、この文字の巊端のピクセルが画面の端の巊偎にあるず想像するず、出力のバむト数はシフトのバむト数ず䞀臎したせん。

画像

図17. bytes_For_outパラメヌタヌ

したがっお、OAの䞀般的な抂芁は次のようになりたす。

 class tShift_buffer { public: void Load (u1x *Source, int Bytes_amount); void Shift(int Bits_amount, int Bytes_amount); void Out (u1x *Destination, int Bytes_amount); }; //////////////////////////////////////////////////////////////////////////// //  void Out_symbol() { //   for(int y = 0; y < Height; y++) { u1x * Glyph_line = Current_font->Image_for(* Text) + y * bytes_Width; Shift_buffer.In (Glyph_line, bytes_For_load); Shift_buffer.Shift (Current_shift, bytes_For_shift); Shift_buffer.Out (&String_buffer [y][Current_byte], bytes_For_out); }// for(int y = y0; y < Height; y++) }// void Out_symbol() 

明らかに、このOAの有効性は、シフトレゞスタを䜿甚した操䜜の実装方法に盎接䟝存したす。 さらにこれに぀いおは、圓分の間、それらを効果的に実珟するのに耇雑なこずは䜕もないようです。

これで、制埡マシンのモデルのコンパむルを開始できたす。 OAをさらに詳しく説明するず、行き詰たりに぀ながる可胜性がありたす。 これは、非垞に効果的なOAを遞択するず、UAで法倖なオヌバヌヘッドが発生し、それに応じおスキヌム党䜓が非効率になる可胜性があるためです。 さらに、既補のOAスキヌムを開発し、AAモデルさえ持っおいない堎合、このモデルを念頭に眮いおおく必芁がありたす。これは、実行できない競合する芁件に぀ながる可胜性がありたす。 最埌に、最も重芁なこずは、前のリストからOAモデルがどの皋床適切であるかを理解するには、いわば鳥の飛翔の高さからプロセス党䜓を芋る必芁があるずいうこずです。

反埩1.゜ヌスUA


そのため、AAの初期実装が必芁です。これにより、OAの詳现を考慮し、UAの芳点からこれが䜕をもたらすかを詳现に怜蚎するこずができたす。 UAの開発は、最初のものが2番目のパラメヌタヌを管理するずいう事実により、OAの開発ず切り離せたせん。 UAを開発するずき、OAずそのパラメヌタヌの説明をやめたせんが、逆に、これらのパラメヌタヌずその初期倀の蚈算を远加したす。

画像

図18. OAずAAの密接な関係

したがっお、初期化されおいないパラメヌタヌやUAの制埡なしにパラメヌタヌが远跡されないようにし、パラメヌタヌの数が枬定倀を超えお倧きくならないようにするこずをお勧めしたす。

衚1. OAのパラメヌタヌ

可倉パラメヌタヌ

匏

幅

キャラクタヌゞェネレヌタヌからの読み蟌み

current_byte、current_shift

current_byte =current_byte +current_shift + width>> 3;

current_shift =current_shift + width0x7;

current_byte 0 = 0;

current_ shift 0 = x_block0x7;

bytes_for_load、bytes_for_shift、bytes_for_out

さらに定矩


このようなテヌブルは、機械がドラフト䞊で補助的なものずしおコンパむルされるずきに構築されたす。 ただし、前の蚘事の「 Looking to the Future 」の章で説明されおいる「䞀般化されたナニバヌサルオヌトマトンテンプレヌト」の線集に戻るず、そのようなテヌブルを䜿甚しお、UAずOAを盞互゚クスポヌト/パブリックアナりンスの圢で説明し、それらを接続するこずができたすこれは、コンピュヌタヌ支揎蚭蚈システムで䜿甚されるパラメヌタヌのセットず䞀臎したす。

UAの詊甚版。

䜍眮0から始たる無限に長い行バッファヌに無限のテキストを衚瀺する堎合、UAは次のようになりたす。

 uchar * Text; uchar String_buffer[y_string][x_max /* 0.Infinity */ ]; //////////////////////////////////////////////////////////////////////////// //  void Out_text_block(uchar * Text) { Current_shift = Current_byte = 0; while(1) { Witdh = Current_font->Width_for(* Text); bytes_For_load = (Width + 7) >> 3; bytes_For_shift = (Width + Current_shift + 7) >> 3; bytes_For_out = bytes_For_shift; Out_symbol(); Current_shift = (Current_shift + Width); Current_byte = (Current_byte + Current_shift) >> 3; Current_shift &= 0x7; Text++; } }// void Out_text_block(uchar * Text) 

ただし、有限の長さの実際のテキストを凊理しおおり、さらに、出力りィンドりに察しお初期シフトがあり、このテキストは、䞊䞋、巊右の䞡方で出力りィンドりに収たらない堎合がありたす。

テキストが出力りィンドりの䞊たたは䞋の端を超えお広がる堎合。

䞋ず䞊からの制限を考慮するこずは、右ず巊からよりも簡単なので、それから始めたす。文字の高さが出力ストリップよりも広い堎合や、テキストの最初のシフトにより、テキストの䞀郚が䞊、䞋、たたはすぐ䞊ず䞋に衚瀺される堎合がありたす。

画像

図19.瞊長のテキストのバリ゚ヌション

OAの芳点から芋るず、この動䜜は単玔に実装されおいたす。行を列挙し、「垂盎呚期」のリストに倉曎十分0アップHeightそれには、線を経おStart_lineたでEnd_lineどこStart_line-バッファに入る䞊段番号グリフ、End_line-の範囲に該圓しない最初の行番号䞋の倀を怜玢したした。぀たり、バッファに完党に収たる6x9文字の堎合ですEnd_line = 9。

最初に決定Start_line

 if(y_block < y0) { Start_line = y0 - y_block; } else { Start_line = 0; } if( Start_line >= Height) //      ,   

End_line倀に基づいお怜玢されたすStart_line。

 if( (y1 – y_block) >= Height) { End_line = Height; } else { End_line = y1 – y_block; } 

テキストが出力りィンドりの端を越えお右たたは巊に䌞びる堎合。

氎平は、列のバむトグルヌプ化により耇雑です。ブロックの始たりの座暙x_block。倀はx_shift補正されたすが、それを思い出すこずはできたせん。

画像

20.

x_block > x0 , , , , – . x_block < x0 -, . . 20, . , Left_shift , .

« » . 21。

画像

21. .

Left_shift , ( 1 ). .

, ( 2 ). ( 3 ), 2 ( ) , 3 . , — . , , .

, 2 3 .

画像

22.

, 2, 2', 3 3' . , , . , . , . ( ) .

1. .

left_shift

if ( x _ block >= x 0)
left _ shift = 0;
else {
left _ shift = x 0 – x _ block ;
x _ block = x 0;
}



, , . 23

画像

23.

前述したように、状態図は、オヌトマトンの蚘述に加えお、グラフ図の代替アルゎリズムであるアルゎリズムを蚘述するためのスキヌムでもありたす。その䞊で、単に゜フトりェアの実装を行うこずができたす。色は、状態に察応するプログラムテキストを匷調衚瀺したす。

リスト1. UAフレヌムワヌク。
画像



パラメヌタヌLine_widthは、出力りィンドりの最埌に到達したかどうかを瀺したす

衚1. OA操䜜のパラメヌタヌ。継続

可倉パラメヌタヌ

匏

line_width

line _ width = line _ width - width ;
line _ width 0 = x 1 -x _ block ;



コミットの䜜成

これはただ動䜜䞭のアプリケヌションではありたせん。OAの代わりに、デバッグメモに衚瀺されるスタブシンボル、幅、分類2.2a、3.3aが䜿甚されたす。タむプ2 / 2a文字の堎合、オフセット倀も衚瀺されたすLeft_shift。

状況は䞀般的に明らかです。次のタスクは、最初の近䌌ずしお、OA䜜業モゞュヌルを取埗するこずです。

繰り返し2. OA


3぀のタむプ1、2、3のシンボルず2぀のサブタむプ2 '、3'がありたす。出力のタむプごずに専甚のOAを䜿甚するこずは論理的です。

文字が完党に出力りィンドりに収たらない。

巊シフトのために衚瀺領域に完党に収たらなかった文字は、図の番号1で瀺されたす。衚瀺領域に収たらないすべおの文字を「スクロヌル」するだけで、凊理が最も簡単です。

 //   , while(Text < Text_end) { Width = Current_font->Width_for(*Text); //         if(Left_shift >= Width) { Left_shift -= Width; Text++; } else goto Type_2; }// while(Text < Text_end) 

出力りィンドり党䜓に配眮される文字。

タむプ3は、すでに説明したメむンキャラクタヌタむプです。その凊理ニヌズパラメヌタのCurrent_byte前のシンボルから知られおいるCurrent_shift前の文字から知られおいたすbytes_For_load, bytes_For_shift, bytes_For_out。

画像

図24.文字パラメヌタヌタむプ3

実際の蚈算は代数リングで行われるため、゚ッゞ効果は避けられたせん。

画像

図25. タむプ3のパラメヌタヌ蚈算の説明

図の図を䜿甚したす。25パラメヌタの蚈算匏は簡単に定匏化できたす。

  bytes_For_load = (Width + 7) >> 3; bytes_For_shift = (Width + Current_shift + 7) >> 3; bytes_For_out = bytes_For_shift; Current_shift_next = (Current_shift + Width) & 0x7; Current_byte_next = Current_byte + ( (Current_shift + Width) >> 3 ); 

右偎にのみ衚瀺される蚘号。

画像

a

画像

b
図26.文字パラメヌタヌタむプ3a

䟡倀

Source: https://habr.com/ru/post/J342048/


All Articles