%CATALINA_HOME%

%CATALINA_HOME%は環境変数CATALINA_HOMEの値を意味します。つまりTomecatのインストールホルダーです。

Tomecatのインストールホルダーの標準では

TomecatXXXX
 bin
 conf
  Catalina
 lib
 logs
 webapps
 works
カテゴリー: JSP_Servlet | コメントする

正規表現

正規表現(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 = '数値ではありません';
	}
}
カテゴリー: Javascript | コメントする

動的領域確保

C言語では動的にメモリー領域を確保するために、malloc()があります。
malloc()はヒープ領域(長期的に使用される大きなサイズのメモリを格納する領域)に指定されたメモリー空間を確保します。
この空間はプログラムが終了してmallocで確保したポインター(スタック領域に確保されたポインター変数)が解放されても、プログラムでfree()しない限り他のプログラムが使うことが出来ない領域として残ります。
そこで、malloc()した場合は必ず不要になったメモリー空間はfree()します。

同じことはC++ではnew演算子とdelete演算子で行います。

tvp = new Tv(); // テレビクラスのオブジェクトをヒープ領域に確保

delete tvp;     // new で確保したオブジェクトは delete で解放
カテゴリー: C | コメントする

構造体ポインター確保後の構造体メンバーへのアクセス

構造体へのポインターを確保した後、構造体へのポインター(アドレス)を代入してからでないと、構造体メンバーへはアクセスできません。
 struct cell *p;
と構造体へのポインターを確保しても、直ぐに
 p->value = 10;
と書いてもエラーになります。

確保したポインターに実際のアドレスを代入する必要があります。
 struct cell a;
 p = &a;
もしくは、
 p = (struct cell *)malloc(sizeof(struct cell));
としてから、構造体へのポインターへのアクセスが可能になります。

カテゴリー: C | コメントする

線形リストに要素をBackward(指定要素の直前)追加

線形リストの途中に新たな要素を指定要素の前に追加します。

// 線形リストの作成
#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);
}

実行イメージは
線形リストへの要素追加

カテゴリー: C | コメントする

ドット演算子とアロー演算子

ドット演算子とアロー演算子は構造体のメンバーを表すという機能はほとんど同じですが、使う上では違いがあります。

ドットは実体に、アローはポインタにつける

例えばlistという構造体があったとします。

struct list {
  int key;
  struct list *next;
};

この構造体から構造変数を作ります。
 struct list *new; (ポインタ変数として)
 struct list tmp;  (構造体変数として)

この場合、newは構造体へのポインタを持ち、temは変数の実体を持っています。
従って、メンバー関数の呼び出しは前者がアロー演算子、後者がドット演算子を使います。

カテゴリー: C | コメントする

WordPressのコンテンツにプログラムコードを書き込む

wordpressのコンテンツにプログラム言語のソースをそのままペーストすると、サイトでのページ表示が崩れてしまいます。
そこで、
wordpressにSyntaxHighlighter Evolvedをプラグインします。
コンテンツに挿入するプログラム言語のソースコードを[code language=”○○○○”]と[/code]で挟みます。
○○○○の部分にはhtml、css、php、 javascript、c、cpp、csharp、java、perl、sql、textなどのプログラム言語名を書き込みます。

またはソースコードを[○○○○ パラメータ]と[/○○○○]で挟んで指定することも出来ます。○○○○の部分には上記と同じ。
※この指定法はパラメータとの組み合わせ(?)で有効にならない場合があるので要注意。

パラメータには
行番号を表示しない場合        gutter="false"
指定の行をハイライトしたい場合 highlight="2,4-5"
などを記述します。
カテゴリー: WP 機能 | タグ: , , , | WordPressのコンテンツにプログラムコードを書き込む はコメントを受け付けていません

typedef

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 },
	};
		|
}
カテゴリー: C | コメントする

変数と動的領域確保(malloc)

変数は、ブロック内で「宣言」されると、
・そのブロックの中でずっと有効。
・名前(変数名)がある。

動的領域確保によって確保された領域は、
・プログラムの実行中に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]

カテゴリー: C | コメントする

入力ファイルを出力ファイルにコピーする

#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);
}

カテゴリー: C | コメントする