2011|08|
2013|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|05|06|07|08|09|10|11|12|
2016|01|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|

2017-12-12 関数のポインタの使い方 [長年日記]

/*
  gcc -g func_pointer.c -o func_pointer
*/ 
 
 
#include<stdio.h>
 
typedef void (* FUNC_POINTER)(char *); //関数ポインタのtypedef
 
typedef int (* FUNC_POINTER2)(int, int, int, int); //関数ポインタのtypedef
 
void func1(char *s){
  printf("%s\n",s);
}
 
void func2(char *s){
  int i;
  for(i=0;i<2;i++){
	printf("%s\n",s);
  }
}
 
void func_null(char *s){
}
 
 
void func(char *s,FUNC_POINTER p){
  p(s);
}
 
int shortcut_func1(int a, int b, int c, int d)
{
  return a * b * c * d;
}
 
int shortcut_func2(int a, int b, int c, int d)
{
  return a + b + c + d;
}
 
 
int shortcut_func(int a, int b, int c, int d, FUNC_POINTER2 p2){
  p2(a,b,c,d);
}
 
 
 
 
int main(){
  FUNC_POINTER p;
 
  p = func1;
  func("ありがと",p);
 
  p = func2;
  func("Thanks",p);
 
  p = func_null;
  func("何も出ないよ",p);
 
 
  FUNC_POINTER2 p2;
 
  p2 = shortcut_func1;
  printf("%d\n", shortcut_func(1,2,3,4,p2));
 
  p2 = shortcut_func2;
  printf("%d\n", shortcut_func(1,2,3,4,p2));
 
  return 0;
}
syntax2html

2017-12-14 よく使うpsqlコマンドの一覧 [長年日記]

コマンド機能
\?psqlコマンドの一覧を表示する
\hSQLコマンドの一覧を表示する
\h SQLコマンド名SQLコマンドの使い方を表示する
\lデータベースの一覧を表示する
\dt表の一覧を表示する
\d 表名表の項目一覧を表示する
\dT項目の型の一覧を表示する
\dSシステム表の一覧を表示する
\copy table {from | to} ファイル名表をファイルにコピーする
\i ファイル名指定したファイル内のSQLを実行する
\! OSコマンドOSのコマンドを実行する
\qpsqlを終了する

2017-12-15 Windows版のPostgreSQLを、D:の直下にインストールした場合、以下のコンパイルで通った [長年日記]

/*
  ソースコード→https://www29.atwiki.jp/m_shige1979/pages/605.html
 
  Windows版のPostgreSQLを、D:の直下にインストールした場合、以下のコンパイルで通った
 
  gcc -I"D:\PostgreSQL\pg96\include" pgsql_sample01.c -o pgsql_sample01.exe -L"D:\PostgreSQL\pg96\lib" -llibpq
 
 
  <期待される出力結果> 
 
  postgres=# \c db_hanabi
  db_hanabi=# \l
  データベース一覧
  名前    |  所有者  | エンコーディング |      照合順序      | Ctype(変換演算子)  |      アクセス権
  -----------+----------+------------------+--------------------+--------------------+-----------------------
  db_hanabi | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
  postgres  | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
  template0 | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
  |          |                  |                    |                    | postgres=CTc/postgres
  template1 | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
  |          |                  |                    |                    | postgres=CTc/postgres
  testdb1   | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
  
  
  db_hanabi=# SELECT * FROM testtable1;
  商品コード |        商品名         | 単価
  ------------+-----------------------+------
  1002       | 山の幸御膳            | 1200
  1003       | 海の幸御膳            | 1400
  1001       | 地方御膳              | 1000
  1004       | 七福神御膳            | 3000
  1005       | 松竹梅御膳            | 2000
  1006       | 鶴亀御膳              | 2500
 
*/
 
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"
 
static void exit_nicely(PGconn *conn);
 
int main(void){
  
 
  const char *conninfo = "host=localhost user=postgres password=c-anemone dbname=db_hanabi";
  
  PGconn     *conn;
  PGresult   *res;
  int         nFields;
  int         i,j;
  
  printf("江端智一\n");
  
  /* データベースとの接続を確立する */
  conn = PQconnectdb(conninfo);
  
  /* バックエンドとの接続確立に成功したかを確認する */
  if (PQstatus(conn) != CONNECTION_OK){
	fprintf(stderr, "Connection to database failed: %s",
			PQerrorMessage(conn));
	exit_nicely(conn);
  }
  
  /* トランザクションブロックを開始する。 */
  res = PQexec(conn, "BEGIN");
  if (PQresultStatus(res) != PGRES_COMMAND_OK) {
	fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
	PQclear(res);
	exit_nicely(conn);
  }
  
  /*
   * 不要になったら、メモリリークを防ぐためにPGresultをPQclearすべき。
   */
  PQclear(res);
  
  /*
   * データベースのシステムカタログpg_databaseから行を取り出す。
   */
  res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from testtable1");
  if (PQresultStatus(res) != PGRES_COMMAND_OK) {
	fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn));
	PQclear(res);
	exit_nicely(conn);
  }
  PQclear(res);
 
  res = PQexec(conn, "FETCH ALL in myportal");
  if (PQresultStatus(res) != PGRES_TUPLES_OK) {
	fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn));
	PQclear(res);
	exit_nicely(conn);
  }
  
  /* まず属性名を表示する。 */
  nFields = PQnfields(res);
  for (i = 0; i < nFields; i++){
	printf("%-15s", PQfname(res, i));
  }
  printf("\n\n");
  
  /* そして行を表示する。 */
  for (i = 0; i < PQntuples(res); i++) {
	for (j = 0; j < nFields; j++) {
	  printf("%-15s", PQgetvalue(res, i, j));
	}
	printf("\n");
  }
  
  PQclear(res);
  
  /* ポータルを閉ざす。ここではエラーチェックは省略した… */
  res = PQexec(conn, "CLOSE myportal");
  PQclear(res);
  
  /* トランザクションを終了する */
  res = PQexec(conn, "END");
  PQclear(res);
  
  /* データベースとの接続を閉じ、後始末を行う。 */
  PQfinish(conn);
  
  return 0;
}
 
static void exit_nicely(PGconn *conn){
  PQfinish(conn);
  exit(1);
}
syntax2html

2017-12-26 構造体のポインタの嵐の中で文字列を表示する [長年日記]

// 駅の変数用構造体
typedef struct station2{
  char* name;
} STATION2;
 
// カートの変数用構造体
typedef struct train{  
  STATION2* stop_station2;  // 停止中にはStationのポインタを入力し、移動中にはNULLとする
} TRAIN;
 
// 乗客の変数用構造体
typedef struct person {
  TRAIN *train; // カートに乗車した時ににカートのメモリアドレスを付与する。降車時にNULLを入れる
} PERSON;
 
 
/////////////////////  絶対消すな /////////////////////
PERSON* p_person = p_first_person->next;
  while (p_person != p_last_person) {
	if (p_person->train != NULL){
	  printf("列車番号:%d\n ", p_person->train->counter);
	  if (p_person->train->stop_station2 != NULL){
		printf("停車駅;%s\n", (*(p_person->train->stop_station2)).name);
	  }
	}
  }
 }
/////////////////////  絶対消すな /////////////////////
syntax2html

2017-12-28 Windows Media PlayerでのCD-ROMの焼き方 [長年日記]

(Step 1) 最初にWindows Media Playerを立ち上げる

(Step 2) その後にCD-ROMを挿入する

(Step 3) 挿入すると、「取り込み」のボタンが登場する

あとはなんとなく分かる