%CATALINA_HOME%は環境変数CATALINA_HOMEの値を意味します。つまりTomecatのインストールホルダーです。
Tomecatのインストールホルダーの標準では
TomecatXXXX bin conf Catalina lib logs webapps works
%CATALINA_HOME%は環境変数CATALINA_HOMEの値を意味します。つまりTomecatのインストールホルダーです。
Tomecatのインストールホルダーの標準では
TomecatXXXX bin conf Catalina lib logs webapps works
正規表現(Regular Expression)とは、複雑な検索処理を行う手法です。
まず、RegExpオブジェクトを作成し、その後testメソッドでテキストが指定のパターンとマッチしているかを確認します。
RegExpオブジェクトへの検索パターンの登録
var regexp = /正規表現のパターンテキスト/
正規表現のパターンテキスト例)
^¥?¥d+$
^ テキストの先頭
$ テキストの末尾
¥- 半角の-(マイナス)、
? 直前の文字の0~1回の繰返し(-があってもなくても良い)
¥d 半角の数字
+ 直前の数字の1回以上の繰返し
¥w 英数字
¥. ピリオド
¥/ /
[abc] []で囲まれた文字のいづれか
[a-z] []で囲まれたa-zの文字のいづれか
テキストが数値化、それ以外かの判定
function validDigit(event){ var str=document.getElementById('txt_digit').value; var regexp = /^\-?\d+$/; var output = document.getElementById('output_digit'); if(regexp.test(str)) { output.innerHTML = ''; } else { output.innerHTML = '数値ではありません'; } }
C言語では動的にメモリー領域を確保するために、malloc()があります。
malloc()はヒープ領域(長期的に使用される大きなサイズのメモリを格納する領域)に指定されたメモリー空間を確保します。
この空間はプログラムが終了してmallocで確保したポインター(スタック領域に確保されたポインター変数)が解放されても、プログラムでfree()しない限り他のプログラムが使うことが出来ない領域として残ります。
そこで、malloc()した場合は必ず不要になったメモリー空間はfree()します。
同じことはC++ではnew演算子とdelete演算子で行います。
tvp = new Tv(); // テレビクラスのオブジェクトをヒープ領域に確保 delete tvp; // new で確保したオブジェクトは delete で解放
構造体へのポインターを確保した後、構造体へのポインター(アドレス)を代入してからでないと、構造体メンバーへはアクセスできません。
struct cell *p;
と構造体へのポインターを確保しても、直ぐに
p->value = 10;
と書いてもエラーになります。
確保したポインターに実際のアドレスを代入する必要があります。
struct cell a;
p = &a;
もしくは、
p = (struct cell *)malloc(sizeof(struct cell));
としてから、構造体へのポインターへのアクセスが可能になります。
線形リストの途中に新たな要素を指定要素の前に追加します。
// 線形リストの作成 #include <stdio.h> #include <stdlib.h> struct list { int key; struct list *next; }; struct list *get_list(void); void print_list(struct list *p); int get_data(void); void insert_before(struct list *x, struct list *p); #define EOD -1 /* 初期データリスト */ int a[ ] = { 1, 2, 3, 4, 5, 6, EOD }; int main( ) { struct list *listptr, *new; listptr = get_list( ); print_list( listptr ); new = (struct list *)malloc(sizeof(struct list)); new->key = 888; new->next = NULL; insert_before( new, listptr->next->next ); print_list( listptr ); return 0; } /* 入力データが空になるまでリストを作成 */ struct list *get_list( void ) { int d; struct list *p,*newp; p = NULL; // リストの先頭項目を終端するNULLを入れる while( ( d = get_data( ) ) != EOD) { // 一項目分の記憶領域を確保し,その領域へのポインタを返す // (struct list *)はmallocの返すデータの型をlist構造体型の情報にキャスト(変換) newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; // mallocで取得した一項目分の記憶領域にデータを書き込む newp->next = p; // pに保管していた一つ前の項目のアドレス(最初はNULL)をnextアドレスとして書込む p = newp; // 現記憶領域へのポインタをpに保管 print_list( p ); } return p; // この時点で、pはリストの最終項目へのポインア(のアドレス) } /* データ取得 */ int get_data(void) { static int i=0; return a[i++]; } /* リストの印刷 */ void print_list(struct list *p) { while (p != NULL) { printf("<%d> [%0x %0x] ", p->key, p, p->next); p = p->next; } printf("\n"); } /* リストへの挿入: 指定要素の直前 */ /* pで示される構造体の前にxで示される構造体を挿入 */ void insert_before(struct list *x, struct list *p) { struct list tmp; printf("<Insert [%0x] before [%0x]>\n", x, p); printf("<p key=%d next=%0x>\n", p->key, p->next); printf("<x key=%d next=%0x>\n", x->key, x->next); tmp = *x; printf("<tmp [%0x] key=%d next=%0x>\n", tmp, tmp.key, tmp.next); *x = *p; printf("<x [%0x] key=%d next=%0x>\n", x, x->key, x->next); *p = tmp; printf("<p [%0x] key=%d next=%0x>\n", p, p->key, p->next); p->next = x; printf("<p [%0x] key=%d next=%0x>\n", p, p->key, p->next); }
実行結果は
C:\TDM-GCC-64\work>linklistInsertBackword <1> [9b1390 0] <2> [9b74f0 9b1390] <1> [9b1390 0] <3> [9b7510 9b74f0] <2> [9b74f0 9b1390] <1> [9b1390 0] <4> [9b7530 9b7510] <3> [9b7510 9b74f0] <2> [9b74f0 9b1390] <1> [9b1390 0] <5> [9b7550 9b7530] <4> [9b7530 9b7510] <3> [9b7510 9b74f0] <2> [9b74f0 9b1390] <1> [9b1390 0] <6> [9b7570 9b7550] <5> [9b7550 9b7530] <4> [9b7530 9b7510] <3> [9b7510 9b74f0] <2> [9b74f0 9b1390] <1> [9b1390 0] <6> [9b7570 9b7550] <5> [9b7550 9b7530] <4> [9b7530 9b7510] <3> [9b7510 9b74f0] <2> [9b74f0 9b1390] <1> [9b1390 0] <Insert [9b7590] before [9b7530]> <p key=4 next=9b7510> <x key=888 next=0> <tmp [62fdf0] key=888 next=0> <x [9b7590] key=4 next=9b7510> <p [9b7530] key=888 next=0> <p [9b7530] key=888 next=9b7590> <6> [9b7570 9b7550] <5> [9b7550 9b7530] <888> [9b7530 9b7590] <4> [9b7590 9b7510] <3> [9b7510 9b74f0] <2> [9b74f0 9b1390] <1> [9b1390 0]
挿入処理の本体は
void insert_before(struct list *x, struct list *p) { struct list tmp; tmp = *x; //step1 printf("<tmp [%0x] key=%d next=%0x>\n", tmp, tmp.key, tmp.next); *x = *p; //step2 printf("<x [%0x] key=%d next=%0x>\n", x, x->key, x->next); *p = tmp; //step3 printf("<p [%0x] key=%d next=%0x>\n", p, p->key, p->next); p->next = x; //step4 printf("<p [%0x] key=%d next=%0x>\n", p, p->key, p->next); }
実行イメージは
ドット演算子とアロー演算子は構造体のメンバーを表すという機能はほとんど同じですが、使う上では違いがあります。
ドットは実体に、アローはポインタにつける
例えばlistという構造体があったとします。
struct list { int key; struct list *next; };
この構造体から構造変数を作ります。
struct list *new; (ポインタ変数として)
struct list tmp; (構造体変数として)
この場合、newは構造体へのポインタを持ち、temは変数の実体を持っています。
従って、メンバー関数の呼び出しは前者がアロー演算子、後者がドット演算子を使います。
typedefは既にある「型」に対して新しい名前をつけ「型」の同義語を作ります。型の用途を分かり易くしたり、型宣言を容易(字数を減らす)にします。
例)用途を分かり易く
ビット演算をする場合には演算対象の変数は「unsigned(符号なし)」であることが条件ですが、ビット演算の対象である事を明示するためにunsigned型として宣言するのではなく、Bits16と言った同義型を作ります。
typedef unsigned char Bits16; //と宣言しておくと、このあとは Bits16 data; //と宣言できます。これは、 unsigned char data; //と宣言することと全く同じです。
例)型宣言を容易に
構造体の宣言では、頭にstructが付くので型名が長くなります。構造変数を多数作る場合には、typedefによりこの手間を省くことが出来ます。
#include <stdio.h> typedef struct { int no; // 背番号 char name[20]; // 氏名 double average; // 打率 } SEISEKI; int main(void) { int i; SEISEKI sensyu1 = { 5, "YAMADA", .302 }; SEISEKI sensyu2[20] = { { 1, "HAYASHI", .281 }, { 2, "SATOH", .275 }, { 3, "OUCHI", .293 }, }; | }
変数は、ブロック内で「宣言」されると、
・そのブロックの中でずっと有効。
・名前(変数名)がある。
動的領域確保によって確保された領域は、
・プログラムの実行中にmalloc()により「割当て」。
・free()により「解放」。
・名前はない。(アドレスを記録しないと使えない。)
※必要なときだけ、必要な量を確保し、使い終わったら解放して、他のプログラム使用可能にする。
// 変数と動的領域確保 #include <stdio.h> #include <stdlib.h> struct list{ int key; struct list *next; }; int main(void) { struct list a, *p; a.key = 20; a.next = NULL; p = (struct list*)malloc(sizeof(struct list)); p->key = 21; p->next = NULL; printf("a:%0x=[%d,%0x]\n", &a, a.key, a.next); printf("p->%x=[%d,%x]\n", p, p->key, p->next); free(p); printf("p->%x=[%d,%x]\n", p, p->key, p->next); return 0; }
C:\TDM-GCC-64\work>prog00
a:62fe30=[20,0]
p->9b1380=[21,0]
p->9b1380=[10158416,9b74f0]
#include
main(int argc, char *argv[])
{
int c;
FILE *infp,*outfp;
if (argc != 3) { /* 引数の数が合わない時は,使い方を表示 */
fprintf(stderr,”Usage: %s inputfile outputfile\n”, argv[0]);
exit(1);
} else {
if ((infp = fopen(argv[1],”r”)) == NULL) {
/* 入力ファイルが開けない場合はエラー */
fprintf(stderr,”%s: %s: No such file or directory\n”, argv[0],argv[1]);
exit(1);
} else if ((outfp = fopen(argv[2],”w”)) == NULL) {
/* 出力ファイルが開けない場合はエラー */
fprintf(stderr,”%s: Cannot open %s\n”, argv[0],argv[2]);
exit(1);
} else {
while ((c = getc(infp)) != EOF)
/* EOFが現れるまで入力ファイルから文字を読み */
putc(c,outfp); /* 出力ファイルに書き込む */
fclose(infp); /* 各ファイルを閉じる */
fclose(outfp);
exit(0);
}
}
exit(0);
}