最終更新 2024.04.01
コピー先画像 copy コピー元画像 -shrink -subsample 縮小率
引数は通常は値渡し
アドレス渡ししたい場合は upvar コマンドを使う
proc sub { value ptr1 ptr2 } {
upvar $ptr1 ptr1_ $ptr2 ptr2_
# ptr1 と ptr1_ は同じメモリ空間を共有する
# ptr2 と ptr2_ は同じメモリ空間を共有する
set ptr1_ [ expr $value + 1 ]
set ptr2_ [ expr $value + 2 ]
set ret_val "string"
return $ret_val
}
呼び出し方
sub $value ptr1 ptr2
メインスクリプトの変数は大域変数 関数の中で使うときは global 宣言が必要 global a b c のように宣言する
if { $x == 6 } then {
} elseif { $x != 10 } then {
} elseif { $x >= 8 } then {
} else {
}
if { $x == "yabu" } then {
}
set abc($i) 10
if { [ file exists wave.bat ] == 1 } then {
}
これを知らないとき、次のような方法をとっていた。
ytest というコマンドを作る。内容は
---------- ytest の内容 --------
#!/bin/sh
#
# tcl/tk では test コマンドを使うと戻り値が 0 以外のときに
# エラーとなって関数の実行がそこで打ち切られてしまうので、
# 苦肉の策として、独自のテストコマンド ytest を作成する。
#
if [ -e $1 ]
then
echo yes
else
echo no
fi
--------------------------------
そして、ytest の出力を次のように読み取る。
set ret [ exec ./ytest bergeron.pid ]
if { $ret == "yes" } then {
set fp [ open bergeron.pid r ]
gets $fp pid
close $fp
exec kill $pid
exec rm -f bergeron.pid
}
for { set i 0 } { $i < 10 } { incr i } {
}
while { $i < 10 } {
}
while { 1 } {
if { } then break;
if { } then continue;
}
set script_name [ info script ] set dir_name [ file dirname $script_name ]
set ret [ exec command ]
set str "abc"
append str " def" " ghi" 連結
string first "abc" $line "abc" は $line の何番目の文字列か(0 から)
"abc" が含まれていないとき -1
set num [ llength $line ] $line に含まれている文字列の数(空白区切り)
set moji [ lindex $line 2 ] $line の 3 番目の要素を取り出す(index は 0 から)
set moji [ lindex $line end ] $line の最後の要素
set line ""
for { set i 0 } { $i < $n } { incr i } {
append line [ format " %6.4f " $var($i) ]
}
puts $line
set fontsize 10
font create roman -family helvetica -size $fontsize -weight normal
font create kanji -charset jisx0208.1983 -size $fontsize
font create mix -compound {roman kanji}
pack .aaa .bbb .ccc -side left
-side left 左から右へ並べる
-side top 上から下へ並べる
-expand yes|no ウィンドウサイズの変更に追従するかどうか
-fill both|x|y|none 各部品を一番幅の広い(横に並べるときは高さの高い)もの
に幅を(高さを)合わせるかどうか
-padx 20 部品間の x 方向の余白 20 dot
-pady 10 部品間の y 方向の余白 10 dot
-anchor n|w -fill none の場合、右寄せか、左寄せか、上寄せか、下寄せか
w 左寄せ r 右寄せ n 上寄せ s 下寄せ
(東西南北の頭文字)
-width 10 ラベルの幅 -anchor w ラベルの幅が文字列より広いとき左寄せ -anchor e 右寄せ
宣言
text .left.text -height 5 -width 40 -font font14
書き込み
.left.text insert 1.0 " 1.466 1.452 1.46\n"
.left.text insert 2.0 " 5 8 \n"
最後の改行を怠ると、insert 2.0 と指定しても、その時点で 2 行目が
存在しないため、1 行目の後に append される
読み出し(空白のみの行 or 空行が来たら終了する)
for { set i 1 } { $i <= $memo_height } { incr i } {
set line [ .left.text get $i.0 $i.999 ]
if { [ regexp "^\ *$" $line ] == 1 } then break; 空行で終わり
puts "|$line|"
}
一行前へ詰める
global message_next message_line 次に書き込む位置, 行数
if { $message_next > $message_line } then {
for { set i 1 } { $i <= $message_line-1 } { incr i } {
set j [ expr $i + 1 ]
.left.text2 delete $i.0 $i.999
set line [ .left.text2 get $j.0 $j.999 ]
.left.text2 insert $i.0 $line
set message_next $message_line
}
}
.left.text2 insert $message_next.0 $add_line
set message_next [ expr $message_next + 1 ]
方法が分からないため、launch というコマンドを作り、
exec launch command arg1 arg2
のようにコマンドを実行する。すると command.pid という
ファイルを作り、その中にプロセス ID を保存する。
実装は以下の通り
/*
プログラムのランチャー
起動したプログラムの pid を残す
2004.9.15
< 使い方 >
% launch prog-name arg1 arg2 .......
< 結果 >
起動したプログラムのプロセス id が prog-name.pid に入る
(パスの部分は切り落とされる)
*/
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int i,ret;
pid_t pid;
FILE *fp;
char *argv2[1000],path[1000],command[1000],fname[1000];
if ( argc == 1 ){
fprintf(stderr,"usage : %s command\n",argv[0]);
exit(1);
}
if ( argc > 1000 ){
fprintf(stderr,"too many argument in %s\n",argv[0]);
exit(1);
}
analyze_path(argv[1],path,command);
sprintf(fname,"%s.pid",command);
pid = getpid();
if ( ( fp = fopen(fname,"w") ) == NULL ){
fprintf(stdout,"cannot open %s",fname);
exit(1);
}
fprintf(fp,"%d\n",pid);
fclose(fp);
for(i=1; i<argc; i++){
argv2[i-1] = argv[i];
}
argv2[argc-1] = NULL;
ret = execvp(argv2[0],argv2);
if ( ret != 0 ){
fprintf(stderr,"error in execvp. argv2[0] = %s\n",argv2[0]);
exit(1);
}
exit(0); /* ここへ来ることはないと思う */
}
/*----------- パスとファイル名に分解する -----------
入力 full_name = "/home/Pioneer/graph/nsgraph"
出力 path = "/home/Pioneer/graph"
command = "nsgraph"
*/
int analyze_path(char full_name[],char path[], char command[])
{
int i,len,len2;
len = strlen(full_name);
for( i = len-1; i >= 0; i--){
if ( full_name[i] == '/' ){
strncpy(path,full_name,i);
path[i] = '\0';
len2 = len - i - 1;
strncpy(command,&full_name[i+1],len2);
command[len2] = '\0';
return(0);
}
}
strcpy(path,"");
strcpy(command,full_name);
return(0);
}
int([ expr 99 / 10.0 ]) sqrt() abs()
set a [ expr 100 / 80 ] 「整数 ÷ 整数 = 整数」 a <--- 1