ホーム » スタッフ » 斉藤徹 (ページ 117)

斉藤徹」カテゴリーアーカイブ

2025年7月
 12345
6789101112
13141516171819
20212223242526
2728293031  

検索・リンク

サービス問題なのに…

3年のプログラミング応用(C言語)のテストで、 説明問題の1つで、 「以下のプログラムが動かない理由を答えよ」 というサービス問題。

double tr_S( double w , double h ) {
return (1/2) * w * h ;
}

『return文は、()の中の値を返すから、0.5 が返り値となるから…』
『…(同様)… なので()の後ろの "* w * h" が文法エラー…』
(@_@;; クラクラ…
# 答え: int型で1/2は0になるため…

高専技科大連携・力覚フィードバック

豊橋技科大と高専連携による力覚フィードバックの実験。

豊橋技科大と他の8高専がネットワークでつながり、 操作バーを動かしたときに、他の高専の操作の力が操作バーに反映される。

この力覚フィードバックが、自然に感じられるかを確認するため、 簡単なゲーム操作をしている様子。 ゲームでは、4拠点と4拠点で、綱引きをするゲーム。力を入れ過ぎると、 綱が切れてしまう。

1402221318_1024x768.JPG
1402221318-1_1024x768.JPG
1402221318_1280x720.JPG
1402221318-2_1024x768.JPG

福井県を当てるクイズ問題、第一ヒント「歯みがきロボコン」…

そういえば、昨日のテレビ朝日のクイズ番組で、 写真や動画から県を当てる都道府県クイズ。 『福井県』を当てる問題で、 第1ヒントが「歯みがきロボコン」だったそうだ。
# 丁度その時間は、風呂に入っていて、見そこねた…(x_x;

第1ヒント:「歯みがきロボコン」 第2ヒント:「ペンギンの初詣」、 第3ヒント:「越前ガニ・ミュージアム」、 第4ヒント:「東尋坊」

ようやく第4ヒントで回答ボタンが押され、 一発目は「石川県」と答えられてしまったようだが…

(授業アンケート)情報構造論

総合ポイントは、80.9 例年通りかな。 あっ、一昨年度と比べると、ちょいと落ちてる…(x_x;

相変わらずに板書のポイントが低いのよね…

ホワイトボードで、マーカーのペン濃いのつかうべしとの注文 もあって、まだまだ改善は必要かな。

1402071717_399x351.png

構造体の配列渡しの質問

構造体を使ったプログラムで、構造体のデータを配列全部を渡すのか、 配列の1つを渡すのか…の違いが判らずに混乱している人がいるので、 簡単なサンプルプログラムを示す。

// 構造体のサンプル
struct A {
int data ;
} ;
// 構造体の全部を渡す場合
void foo( struct A* p ) {
// struct A p[]
// 引数宣言は上のように書いても同じ。
for( int i = 0 ; i < 100 ; i++ ) {
p[i].data = ... ;
// 上の1行は下の2つでも同じ意味
// (*(p+i)).data = ... ;
// (p+i)->data = ... ;
}
}
// 構造体の1件を渡す場合
void baa( struct A* p ) {
p->data ....
}
void main() {
// 局所的な配列
struct A a[100] ;
// 配列全体を渡す(a[]の先頭アドレス)
foo( a ) ;
// 配列のi番目を渡す
for( int i = 0 ; i < 100 ; i++ ) {
bar( &a[i] ) ;
}
}

技科大連携、力覚フィードバック

豊橋技科大の三好先生との、技科大、高専連携の力覚フィードバックシステムの実験で、三好先生に機材の持ち込みと、使い方の講習を受けました。

VPNで豊橋技科大と接続し、遠隔地とパドルを動かす操作で、その操作時の力をお互いに感じながら、8拠点で操作するシステムです。

このシステムでは、8拠点同時で綱引きゲームのような操作で、力覚を共有できるそうです。 今日は、その事前実験ということで、VPN接続テスト・3拠点での力覚フィードバックを行いました。 ネットワークの遅延なども制御系でうまく融和させ、リアルタイムに別拠点の操作の力のかけ具合が、 パドルに伝わってきます。

1402041758_640x480.JPG

コンテナクラスとテンプレート

例年より情報構造論が早く進んだので、STLとかBoostを少しだけ紹介するために、 その基本のコンテナとテンプレートを紹介する。

コンテナクラス

情報構造論の授業では、リストといった様々なアルゴリズムの説明では、 ひとまず整数でリストを…演習で名前と年齢の構造体で…といった 方式で進めてきたが、リストは次のデータのポインタと、実体のデータと考えれば、 実体データは、整数や名前と年齢といったように、必要に応じて変わってくる。

しかし、アルゴリズムが単純リスト・双方向リスト・2分木と変わっても、 実体データが違うだけで、自分自身で全てを記述することになる。 ただ、複雑なアルゴリズムになればなるほど、この作業が大変になる。

ここで、コンテナクラスという考え方が出てくる。 オブジェクト指向の派生・継承の考え方を使い、例えば単純リストを作りたい場合、 次のポインタだけの基本クラスを作り、そのリストを扱う処理をライブラリとして作っておく。 整数のリスト処理がしたければ、単純リストクラスに、整数を加えた派生クラスを作ったり、 名前と年齢を加えた派生クラスを作れば良い。

// 概念の説明用のクラス宣言であり、
// このままでは使いやすいクラスにはならない
class List {
private:
List* next ;
public:
List( List* n ) : next( n ) {}
} ;
class ListInt : public List {
private:
int data ;
:
} ;
class ListNameAge : public List {
private:
char name[20] ;
int  age ;
:
} ;

ただ、上記のプログラムでは、小さなオブジェクトでも仮想関数を使ったり、 肝心のアルゴリズムに相当する部分が記述が困難になるので、実際はもう少し 面倒な宣言になってしまう。 このため、C++などではテンプレートクラスがよく利用される。

テンプレート機能

C++でのテンプレート機能とは、型の部分を「仮の型名」としてプログラムを記述し、 そのプログラムを使用する時に具体的な型名を"<>"の中に記載する方式。 コンパイラ的には、異なる型でテンプレートが利用される度に、 その型用の機械語を生成するので、コードが肥大化する可能性があるのが問題ではある。

#include <stdio.h>
template <class T>
class List {
public:
T data ;
List<T>* next ;
public:
List<T>( T x , List<T>*n ) : data( x ) , next( n ) {}
} ;
int main() {
// 整数型のリスト処理
List<int>* p = new List<int>( 1 ,
new List<int>( 2 , NULL ) ) ;
for( ; p != NULL ; p = p->next ) {
printf( "%d\n" , p->data ) ;
}
// 実数型のリスト処理
List<double>*	r = new	List<double>( 1.2 ,
new List<double>( 2.3 , NULL ) ) ;
for( ; r != NULL ; r = r->next ) {
printf( "%f\n" , r->data ) ;
}
return 0 ;
}

このテンプレートクラスの考え方を、究極まで活用したものとして、STL(Standard Template Library)や、 Boostといったライブラリが有名である。

// Cの場合
#include <stdio.h>
int main() {
int* a ;
// 配列の作成
if ( (a = (int*)malloc( sizeof( int ) * 10 )) != NULL ) {
// 配列の初期化
for( int i = 0 ; i < 10 ; i++ )
a[ i ] = i ;
// 配列の合計
int sum = 0 ;
for( int i = 0 ; i < 10 ; i++ )
sum += a[ i ] ;
printf( "%d¥n" , sum ) ;
}
return 0 ;
}
// STLの場合
#include <numeric>
#include <vector>
#include <list>
using namespace std ;
int main() {
vector<int> a ; // 配列サイズはSTL任せ...
for( int i = 0 ; i < 10 ; i++ )
a.push_back( i ) ; // 配列末尾にiを追加
int sum = accumulate( a.begin() , a.end() , 0 ) ;
printf( "%d¥n" , sum ) ;
// 同じ処理を実数型の単純リストで...
list<double> b ;
for( int i = 0 ; i < 10 ; i++ )
b.push_back( (double)i ) ;
printf( "%f¥n" , accumulate( b.begin() , b.end() , 0.0 ) ) ;
return 0 ;
}

優秀学生表彰と学生総会

今日は、短縮授業としたなか、昼休み時間に、優秀学生表彰と学生が開かれました。

1401231250_320x240.JPG

C++11を使う

情報構造論のシメとして、簡単なジェネリック型とかテンプレート型などを 紹介して終わろうかと、Boost や STL の資料を見ていて、C++を使っていても 解らない点がでてくる。 C++11あたりの新しい文法もからむので、改めて C++11の概要をWikipediaで見てみる。 なかなか、Boostなどのライブラリなどを的確に記述できるための文法なんだろうけど、 クラッシックなC++の理解に留まっていると (@_@) である。

興味深い文法があったので試すけど、動かないのであれ?っと思ったけど、 コマンドラインオプションで “-std=c++11″とか指定する必要があるのね。

void foo(int x) { std::cout << "foo(int)" << std::endl ; }
void foo(char*p) { std::cout << "foo(char*)" << std::endl ; }
int main() {
   foo(0) ;
   foo(NULL) ;    // 曖昧だからコンパイルエラーだってさ。
   foo(nullptr) ; // これが試してみたかった。
   return 0 ;
}

こういったC++11の文法を使いたかったら、

$ g++ -std=c++11 test.cxx

OS X Mavericks(10.9)の ntp 挙動

自宅 Windows7 の時計の自動同期がおかしくて、 設定を変更などをしていたけど、 ちゃんと動いているのか確認をしていたら、職場の Mac OS も 5分ずれている。

おかしい…と思い、"システム環境設定・日付と時刻"を表示させたら、 ずれていた時計が勝手に治っている。

改めて、NTPの設定を確認したら、このような記事を見つける。 日付と時刻を起動したら治るという点では同じ状況。

ということで、下記の設定を行い、再起動となった。

(( /etc/ntp.conf ))
server 学内TimeServer       minpoll 6 maxpoll 10
server ntp1.jst.mfeed.ad.jp minpoll 6 maxpoll 10
server time.asia.apple.com  minpoll 6 maxpoll 10


システム

最新の投稿(電子情報)

最近の投稿(斉藤 徹)

アーカイブ

カテゴリー