カスタム記述関数でさまざまなデータテーブルにアクセスするみなさん、こんにちは。
2つ以上のデータテーブルがあります
//First I define my function:
MyFunction = Function({Table},
For each row(Table,
shift some coordinates;
store some values;
do some other things;
)
);
//Then I would like to run the function on some existing data tables
MyFunction(dt1);
MyFunction(dt2);
MyFunciton(dt3);現時点では機能していません。スクリプティングガイドいくつかの影響を与える可能性のあるName Expr()を使用した詳細を見つけましたが、今のところ、それは私にはとらえどころのないものです。
ご協力いただきありがとうございます
再:カスタム作成された関数で異なるデータテーブルにアクセスする暗号形式のコードを使用してコードをデバッグするのは非常に困難です。 ログにエラーメッセージが表示されていますか?
For Each Row()は、スクリプト内で一度に1つのインスタンスしか実行できません。 私は関数でそれを避ける傾向があります。 私は通常、完全な列参照にも行きます
Table:a[15] = 43;
// or
column( Table, "a" )[15] = 43;
関数が間違ったテーブルを指すのを避けるため。
再:カスタム作成された関数で異なるデータテーブルにアクセスするこんにちはジム、
あなたの言ってる事がわかります。私は構文が根本的に間違っているという印象で作業していたので、あまり多くの詳細を共有する必要はありませんでしたが、そうではないようです。上記のとおりに機能します。
私は問題を修正するために3時間を費やし、それからこの質問を書きました。次に、2つの方法で回避策を実装し、コードを初期状態に戻してエラーメッセージを再現しようとしたところ、すべて正常に動作しました。おかげで、私は推測する:)
再:カスタム作成された関数で異なるデータテーブルにアクセスする
また会ったね、
問題はコードを変更せずに一晩で再発しました。実際には、いくつかの変数が何らかの形で格納されているように見え、ソフトウェアを再起動した後にそれらが削除されるため、それはかなり頻繁に起こります。以下は、使用したいコードです。
カスタム関数Tabfunctionを使用して、以下に示すように、dtinitial、dtoptimizerなどと呼ばれる特定の数のテーブルを作成します。
以下のコードを実行すると、エラーメッセージは
"名前未解決: 'dtinitial'のアクセスまたは評価におけるdtinitial、dtinitial / * ### * /"
最後から2番目の行をポイントします。
関数の引数を間違って使用しているようですが、違いますか?
ありがとう
Tabfunction = Function({Table},
Xlist={};
Ylist={};
NumDieX=10;
NumDieY=10;<BR /> x_mm=10;
y_mm=20;<BR /> SLW = 0.1;<BR />
//Define X-List
For (jj=0, jj <= NumDieY+2, jj++,
For (ii=0, ii <= NumDieX+2, ii++,
InsertInto(Xlist,ii)
);
);
//Define Y-List
For (kk=0, kk <= NumDieY+2, kk++,
For (mm=0, mm <= NumDieX+2, mm++,
InsertInto(Ylist,kk)
);
);
Table = New Table (Char(Table),
Add Rows((NumDieX+2)*(NumDieY+2)),
New Column ("DieX", Set Values (Xlist)),
New Column ("DieY", Set Values (Ylist)),
New Column ("DieCorXBL"), New Column ("DieCorYBL"),
New Column ("DieCorXTL"), New Column ("DieCorYTL"),
New Column ("DieCorXTR"), New Column ("DieCorYTR"),
New Column ("DieCorXBR"), New Column ("DieCorYBR")
);
For each row (Table,
:DieCorXBL=:DieX*(SLW+x_mm);
:DieCorYBL=:DieY*(SLW+y_mm);
:DieCorXTL=:DieX*(SLW+x_mm);
:DieCorYTL=:DieY*(SLW+y_mm)+y_mm;
:DieCorXTR=:DieX*(SLW+x_mm)+x_mm;
:DieCorYTR=:DieY*(SLW+y_mm)+y_mm;
:DieCorXBR=:DieX*(SLW+x_mm)+x_mm;
:DieCorYBR=:DieY*(SLW+y_mm);
);
Table << New Column ("Invalid Die", numeric, Set each value (0));
);
Tabfunction(dtinitial);
Tabfunction(dtoptimizer);
再:カスタム作成された関数で異なるデータテーブルにアクセスするちなみに、これは機能します:
次に、最初のテーブルで、無効なダイが適切な列で計算されます。
New Table()との組み合わせでのみ、問題があるようです。
CalcInvalidDies = Function({Table},
For Each Row(Table,
If(SQRT((:DieCorXBL-100)^2+(:DieCorYBL-100)^2)>(WaferSize/2-EE), :Invalid Die = :Invalid Die +1);
If(SQRT((:DieCorXTL-100)^2+(:DieCorYTL-100)^2)>(WaferSize/2-EE), :Invalid Die = :Invalid Die +1);
If(SQRT((:DieCorXTR-100)^2+(:DieCorYTR-100)^2)>(WaferSize/2-EE), :Invalid Die = :Invalid Die +1);
If(SQRT((:DieCorXBR-100)^2+(:DieCorYBR-100)^2)>(WaferSize/2-EE), :Invalid Die = :Invalid Die +1);
If(:DieCorYBL<FLATEE></FLATEE>再:カスタム作成された関数で異なるデータテーブルにアクセスするコードの問題は、関数を呼び出すときにdtinitialとdtoptimizerが何も指していないことです。 したがって、エラーメッセージが表示されます。 いくつかの提案:
- 変数Tableは使用しないでください。 予約語に近すぎます。 多分tblまたはtbl_name?
- 関数はテーブルを作成するので、テーブル名を引数として取り、テーブルポインターを返します。
dtinitial = Tabfunction("Initial");
dtoptimizer = Tabfunction("Optimizer");
再:カスタム作成された関数で異なるデータテーブルにアクセスするこんにちは、
これは機能します。まだ完全ではありませんが、別のファイルにTab関数があり、Include( "that別のfile.jsl")を使用しているためです。しかし、その別のファイルのさらに下には、何かを作成するいくつかのバグがあります。最初の部分の下にあるすべてのものを/ *コメント* /取り除いても機能します。私は問題が何であるかを見つけるのに前向きです。ありがとう!
</CODE></P><P><CODE class=" language-jsl">
</CODE></P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-257097" slang="en-US">再:カスタム作成された関数で異なるデータテーブルにアクセスする</LINGO-SUB><LINGO-BODY id="lingo-body-257097" slang="en-US"><P>また、Table変数を関数の最後の参照として追加して、テーブルへの参照として渡されるようにする必要もあります。</P>
<PRE><CODE class=" language-jsl">abfunction = Function( {Table},
Xlist = {};
Ylist = {};
NumDieX = 10;
NumDieY = 10;
x_mm = 10;
y_mm = 20;
SLW = 0.1;
//Define X-List
For( jj = 0, jj <= NumDieY + 2, jj++,
For( ii = 0, ii <= NumDieX + 2, ii++,
Insert Into( Xlist, ii )
)
);
//Define Y-List
For( kk = 0, kk <= NumDieY + 2, kk++,
For( mm = 0, mm <= NumDieX + 2, mm++,
Insert Into( Ylist, kk );
)
);
Table = New Table( Char( Table ),
Add Rows( (NumDieX + 2) * (NumDieY + 2) ),
New Column( "DieX", Set Values( Xlist ) ),
New Column( "DieY", Set Values( Ylist ) ),
New Column( "DieCorXBL" ),
New Column( "DieCorYBL" ),
New Column( "DieCorXTL" ),
New Column( "DieCorYTL" ),
New Column( "DieCorXTR" ),
New Column( "DieCorYTR" ),
New Column( "DieCorXBR" ),
New Column( "DieCorYBR" )
);
For Each Row(
Table,
:DieCorXBL = :DieX * (SLW + x_mm);
:DieCorYBL = :DieY * (SLW + y_mm);
:DieCorXTL = :DieX * (SLW + x_mm);
:DieCorYTL = :DieY * (SLW + y_mm) + y_mm;
:DieCorXTR = :DieX * (SLW + x_mm) + x_mm;
:DieCorYTR = :DieY * (SLW + y_mm) + y_mm;
:DieCorXBR = :DieX * (SLW + x_mm) + x_mm;
:DieCorYBR = :DieY * (SLW + y_mm);
);
Table << New Column( "Invalid Die", numeric, Set each value( 0 ) );
Table;
);
再:カスタム作成された関数で異なるデータテーブルにアクセスするこんにちは、
今、私はそれを働かせました、ありがとう。以下は、誰かが偶然ここに上陸した場合に機能する構文を示す簡単なスクリプトです。
Tabfunction = Function({Tablevar},
Tablevar = New Table((Char(Tablevar)),
Add Rows(5),
New Column ("X1", Numeric, Set Values({1,2,3,4,5})),
New Column ("Test", Character)
);
Tablevar; //pass back Tablevar
);
CalcInvalidDies = Function({Tablevar},
For Each Row(Tablevar,
If(:X1>2,:Test="fail",:Test="pass")
)
);
dtinitial = Tabfunction("initial"); //use pointer
dt2 = Tabfunction ("dt2");
CalcInvalidDies(dtinitial);
CalcInvalidDies(dt2);