読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

外部変数と外部マクロ呼び出し

AdvanceCAD

"AdvanceCAD"には、関数のような観念がない・・・。
簡単なものなら構わないが、ある程度ボリュームがある物は
やっぱり無理です。
幸い "外部変数" と "マクロからマクロ呼び出し" の機能があるため
これで関数を作るしかないような。

以前、喜多技研さんに相談したときも
"そこまでやったことが無いので、わからない"
と言う回答を頂いたのですが、最近になってわかったので
記載しておきます。


配列arrはローカル変数で、一度extern宣言した外部変数
に投げ込みます。
呼び出された側のマクロで+10してreturnします。
外部変数名は一致させておく必要があり、絶対にclearしない。
配列としては宣言しなくても大丈夫なようです。

VBAのイミディエイトウィンドウやMsgBoxのような便利な物が無い為、
最後はファイルにダンプさせます。

こちらが呼び出し側マクロ。

/* AdvanceCAD_macro */
/* 外部マクロと配列のテスト MainArrTest.MAC */

clear();

/* ローカルな配列 */
arr=array(100);
for (i=0;i<length(arr);i+=1) {
	arr[i]=i;
}

/* 外部な変数 */
extern gArr;
gArr=arr;

/* 外部マクロ呼び出し */
MACRO NEW "FuncArrTest.MAC" <CE>

/* 外部マクロ処理後戻す - 戻す必要ないけど */
arr=gArr;
clear();/* 外部な変数は消す */

/* ダンプ */
vdump("C:/temp/dump.txt","w",arr);

/* 終わり */
echo "end";

こちらが関数代わりの外部マクロ。

/* AdvanceCAD_macro */
/* 外部マクロと配列のテスト FuncArrTest.MAC */
/* 絶対に clear しない */

/* 外部な変数 - 同じ名前で!*/
/* 配列として宣言する必要なし */
extern gArr;

if(vtype(gArr) != 30) {return;} /* 配列以外は返す */

for (i=0;i<length(gArr);i+=1) {
	gArr[i]+=10;
}

/* 戻り */
return;


結果はこちら

arr=array(100);
arr[0]=10;
arr[1]=11;
arr[2]=12;
arr[3]=13;
arr[4]=14;
arr[5]=15;
arr[6]=16;
arr[7]=17;
・・・

出来ています。 少し希望の光が見えてきました。
配列は有るものの、動的配列が存在せず・・・。どうしよう。