ブログ記事127件
構造体はPascal用語ではレコード型変数と言います。Recordという単語はVectorScriptではデータベース関連で使用済みなので、StructureというC言語みたいな呼び方に代わっています。VectorScriptではあらかじめ定義されている構造体があります。Vector型はMiniPascalの頃から存在しますが、当時は構造体でなく配列という扱いでした。VectorScriptではVer.9以降からどちらの方法でも扱えます。定義を書くと、vector=array[
Swap手続きの手続き名が全てSwspになっていたので修正しました。『Swap手続き:VS-基本ライブラリ(4)』Swap手続きを作ります。Swap手続きは2つの変数の値を交換します。2つの変数は同じ型でないといけません。また変数の型ごとに関数が必要です。例えば、S…ameblo.jp
Log関数とModR関数はVectorScriptにありそうでありません。組込み関数であるModは整数値しか返しません。自然対数を返すLn関数はありますが、他の底、例えば10を底にした常用対数はありません。2つとも簡単なので作ってみました。ModR関数は割り算の余りを実数で返します。例えば長さ10.5mの材料から0.31mの部材を取って行って最後に余りが何mになるかを求める場合に使えます。普通にやると、n:=Trunc(10.5);{部材の数=33}rem:=10.5-
多くのプログラミング言語では複数の変数に同じ値を代入するときにa=b=3;と書けます。これは代入式が値を持っているからです。a=bは変数aにbの値を代入しますが、式そのものも代入されたのと同じ値を持ちます。ですからa=b=3;はまずb=3で変数bに3を代入し、その式の値である3を変数aに代入します。この仕組みのおかげで複数の変数に同じ値を代入するときに簡潔に書けます。例えば変数a,b,c,d,e,fに4.5を代入
RoundOff関数、RoundDown関数、RoundUp関数は、数値を指定した桁で丸めます。RoundOff関数は四捨五入、RoundDown関数は切捨て、RoundUp関数は切上げを行います。{数値の丸め(桁位置は正が小数点以下、負が小数点以上)}functionRoundOff(source:real;keta:integer):real;{指定した桁で四捨五入する}varn:real;beginn:=10^round(keta);RoundO
Sign関数、Odd関数、Even関数は数値の状態を返します。Sign関数は、数値の符号を返します。値が負なら-1、正なら1、ゼロなら0を返します。数値/Abs(数値)で符号は分かりますが、数値がゼロだとゼロ除算でエラーになってしまいます。条件分岐で書けば下のようになります。functionSign(source:real):integer;beginifsource<0thenSign:=-1elseif0<sourcethenSign:
長整数型のCalcL手続きは、関数名とパラメータsourceの型がlongint型になる他はCalcIと同じなのでソースコードは記載しません。実数型のCalcR手続きも大半は整数型と同じですが、変数の値を指定した桁で丸める'round'四捨五入、'roundDown'切捨て、'roundUp'切上げも使えます。少数点以下で丸める場合は正の整数で、小数点以上で丸める場合は負の整数で丸める桁を指定します。{Calc手続き(実数型)}procedureCalcR(varsourc
Calc手続きは数値型の変数に対して様々な演算を行います。変数の種類はinteger型、longint型、real型の3つです。Calc(a,'+',3);を実行すると、a:=a+3;と同じ結果になります。行える演算は'='代入、'+'加算、'-'減算、'*'乗算、'/'除算、'^'べき乗、'div'切捨て除算、'mod'除余、'log'対数、'loge'自然対数で、文字または文字列で指定します。{Calc手続き(整数型)}procedureCalcI(v
Add、PreAdd、PostAddは整数型変数に整数値を加算します。文字型は値が文字コードという整数であり、ループカウンタやcase文の制御変数として使えるので、ここでは整数型として取り扱います。ただし、文字型を整数型として扱うにはChr関数とOrd関数が必要です。Add、PreAdd、PostAddの違いは手続きか関数か、そして加算のタイミングが関数の値を返す前か後かです。Add手続きは整数型変数に整数値を加算します。Add手続きはa:=a+1;をAdd(a,
下のスクリプトは2000個のランダムな数字(0〜10000)を生成して、昇順に並べ替えます。進捗状況はMessageで表示します。『SwapByOrder手続き(2):VS-基本ライブラリ(6)』SwapByOrder手続きの使い方の例として、数個の変数の値を順列に並べ替える例を書いてみます。まず3個の例。SwapByOrderR(a1,a2)…ameblo.jpproceduretest;{$DEBUG}constMaxN=2000;Messagestep
最近はVer.2015デモ版でばかり動かしていたから無頓着に{関数XXX}なんて書いてましたが、深刻なエラーが出たのでVer.11.5で実行したらエラーの嵐!『動的配列のパラメータでアプリが強制終了:VectorScript(3)』下のスクリプトを実行するとVectorWorksアプリがシャットダウンしてしまいます。『SwapByOrder手続き(2):VS-基本ライブラリ(6…ameblo.jpすぐにインクルード・ファイルの中のコメント文が原因だと思いました。思った通り、
下のスクリプトを実行するとVectorWorksアプリがシャットダウンしてしまいます。『SwapByOrder手続き(2):VS-基本ライブラリ(6)』SwapByOrder手続きの使い方の例として、数個の変数の値を順列に並べ替える例を書いてみます。まず3個の例。SwapByOrderR(a1,a2)…ameblo.jpproceduretest;{$DEBUG}vari:integer;x:array[1..6]ofreal;{$INCLUDE:vs_
SwapByOrder手続きの使い方の例として、数個の変数の値を順列に並べ替える例を書いてみます。まず3個の例。SwapByOrderR(a1,a2);SwapByOrderR(a2,a3);{a3が確定}SwapByOrderR(a1,a2);{a1,a2が確定}次は4個の例。SwapByOrderR(a1,a2);SwapByOrderR(a2,a3);SwapByOrderR(a3,a4);{a4が確定}SwapByOrderR(a2,a3);
SwapByOrder手続きを作ります。SwapByOrder手続きは、2つの変数の値を小さい順になるように交換します。例えば変数aとbの値を小さい順になるように交換するとき、Swap手続きを使えばifa>bthenSwap(a,b);と書くことが出来ますが、SwapByOrder手続きを使った場合はSwapByOrder(a,b);となります。以下がソースコードです。種類はLarge手続きやSmall手続きと同じです。比較方法も同じなので説明は省略します
Swap手続きを作ります。Swap手続きは2つの変数の値を交換します。2つの変数は同じ型でないといけません。また変数の型ごとに関数が必要です。例えば、Swap手続きならSwap(a,b);と書けますが、Swap手続きを使わない場合はtmp:=a;a:=b;b:=tmp;となります。※赤字は'Swsp'を'Swap'に2022/09/02に修正しました。{Swap手続き(char型)}procedureSwapC(vardt1,dt2:char);v
Small関数を作ります。Small関数は、2つの値を比較して小さい方の値を返します。Large関数とは関数名と不等号の向きが違うだけなので、エディタで文字を置き換えながらあっという間に出来ました。{Small関数(文字型)}{文字型の比較は文字コードの比較である}functionSmallC(dt1,dt2:char):char;beginifdt1<dt2thenSmallC:=dt1elseSmallC:=dt2;end;{Small関
Large関数を作ります。Large関数は、2つの値を比較して大きい方の値を返します。例えば、ifa>bthenc:=aelsec:=b;は、Large関数を使うとc:=Large(a,b);と書けます。あ関数名はLargeXとします。Xの部分には関数の返す変数型の頭文字が入ります。以下がコードと説明です。{Large関数(文字型)}{文字型の比較は文字コードの比較である}functionLargeC(dt1,dt2:char)
MS-ExcelのIF関数みたいなものを作ります。例えば、ifa>bthenc:=aelsec:=b;は、IF関数を使うとc:=IF(a>b,a,b);と書けます。Ifは使えないのでIf_Xのような名前にします。Xには関数の返す変数型の頭文字を入れます。VectorScriptでは返す型ごとに別の関数が必要です。種類はchar,integer,longint,real,vector,boolean,string,handle,p
ビット列演算のまとめです。
ビット列のローテートは、1文字左右にシフトして余ったビットを空いた位置に書き込みます。ビット長分の回数実行すると元のビット列に戻ります。余ったビットが関数の返り値になります。{ビット文字列を左ローテート(返り値はキャリーフラグ)}functionBitsRotL(varsource:string):boolean;varn:integer;c:char;result:boolean;beginn:=Len(source);c:=Copy(source,1,
ビット文字列を右に1文字ずらします。フラグがtrueなら'1'、falseなら'0'で空いた左端を埋めます。外にはみ出た文字が'1'ならtrueを、'0'ならfalseを返します。{ビット文字列を右シフト(返り値はキャリーフラグ)}functionBitsShiftR(varsource:string;flg:boolean):boolean;varn:integer;c:char;result:boolean;beginifflgthenc:='1'
ビット文字列を左に1文字ずらします。フラグがtrueなら'1'、falseなら'0'で空いた右端を埋めます。外にはみ出た文字が'1'ならtrueを、'0'ならfalseを返します。{ビット文字列を左シフト(返り値はキャリーフラグ)}functionBitsShiftL(varsource:string;flg:boolean):boolean;varn:integer;c:char;result:boolean;beginifflgthenc:='1'
【障害者クリエイターズバンク求人紹介】正社員の募集です!ユタカ株式会社事業内容:ホテル、施設のホールを中心に行われる各種イベントの企画、運営実施から、ステージ美術装飾、看板、ディスプレイなどの空間プロデュースをお手伝いしています。業務内容:空間デザイナーホテルやホールで行われるイベントのステージデザイン、展示会のブースデザイン、オフィス・ショールームなどのスペースデザインなど、多種多様な空間デザインをお願いいたします。★Vectorworksを使用しての空間デザインです。
ビット文字列を左右逆転します。文字列を左右逆転するだけなので普通の文字列でも構いません。ただし多バイト文字は文字化けします。サブルーチンは"BitStrings.vss"に追加します。{ビット文字列を左右逆転}procedureBitsReverse(varsource:string);vari,n:integer;bits1,bits2:dynArray[]ofchar;beginn:=Len(source);bits1:=source;bit
ビット文字列の演算です。反転(NOT)、論理積(AND)、論理和(OR)の3つです。{ビット文字列の反転(NOT)}procedureBitsNot(varsource:string);vari,n:integer;bits:dynArray[]ofchar;beginn:=Len(source);bits:=source;fori:=1tondoifbits[i]='1'thenbits[i]:='0'elseifbits[
OrBit手続きの検証です。s1は元のビット列、s2はtrueまたはfalseとの論理和です。trueとfalseで2回ループを回しています。trueとの論理和は必ずtrueになり、falseとの論理積は必ず元の値になります。つまり最初のループではs2='11111111'、2番目のループではs1=s2になるはずです。proceduretest;{$DEBUG}vari:integer;t0,t1:longint;{$INCLUDE:vs_subrout
AndBit手続きの検証です。s1は元のビット列、s2はtrueまたはfalseとの論理積です。trueとfalseで2回ループを回しています。trueとの論理積は必ず元の値になり、falseとの論理積は必ずfalse('0')になります。つまり最初のループではs1=s2、2番目のループではs2='00000000'になるはずです。proceduretest;{$DEBUG}vari:integer;t0,t1:longint;{$INCLUDE:vs_
NotBit手続きの検証です。s1は元のビット列、s2は反転後の文字列です。1文字ずつ比べて、もしも同じ文字だったらバグがあるということです。proceduretest;{$DEBUG}vari,j:integer;t0,t1:longint;{$INCLUDE:vs_subroutins:BitStrings.vss}procedureWriteBits(i:longint);varj:integer;s1,s2:string;begins1:
昨日、別ファイルをインクルード出来ないと書きましたが、$INCLUDEを$INCLUDESと書き間違えていただけでした。ということで、次からはサブルーチンを別のファイルに追加してインクルードファイルにするので、検証スクリプトのほうにコピペするのはやめます。このブログは前のブログの複製を取って編集したつもりでしたが、今確認したら複製せずに編集していたことが判明しました。したがって、前のブログ『インクルードファイルについて(1):VectorScript(2)』の内容は消えてし
指定した位置のビットをビット演算するスクリプトです。ビット番号は左端を1番とします。最初はビットを反転するスクリプトです。指定したビットが'1'なら'0'に、'0'なら'1'に書き換えます。{指定したビットの反転(NOT)}procedureNotBit(varsource:string;i:integer);varbts:dynArray[]ofchar;beginbts:=source;ifbts[i]='0'thenbts[i]:='1'