新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

新人をバイナリアンに育てる ~ その8 ~

新人で C の初心者高橋君。4週間本を読んで配列を理解し、配列を VRAM に見立てて線を書いたりしています。ラインを書くプログラムは出来たようですが、まだまだ改良点があるようです。

argc や argv の解析は C 初心者には難しいのでごく簡単な字句解析を教えてもらいます。

そして、プログラム構築の方法として step by step で実現する方法を伝授されます。

社長のコメント 7/19(火) 23:26

*プログラムの集約
 ー線分を描画するプログラムの手直し
線分をかくのはもっと集約できると思う。中間的には4パターン、最終的には2パ
ターンかな、、、
傾きが 0~1, 1以上,-1~0,-1以下
これがもっと集約されるかな?

*入力に応じて、、、
>  ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保
> 存するプログラムの作成
ある”テキスト”を読んで、そのテキスト内容に応じて描画するプログラムにした
い。
簡単な仕様としては、最初に一文字があってそれがコマンド。そのあと、空白区切り
で引数。
引数は整数。例えば

P 10 10
L 10 10 20 20
B 10 10 20 20
F 10 10 20 20

P が点を打つ
L がライン
B がbox四角を書く
F が四角を塗りつぶす
引数は整数で x0 y0 あるいは x0 y0 x1 y1
あとは自分で必要なコマンドを考える。(<=ここ重要。自分で考えることが重要)

*円を書くについて
>   ーまた円を描画する方法について調べる
>    ー円を描画させるアルゴリズムはあるようなので利用したい
簡単にはサインコサインをつかえばできるね。
あと 1/8 の円を書けばあとは書けるかな。

ということで、
まずは
*プログラムの集約
*入力に応じて、、、
 これを実現するために、
1) 1行読むプログラム(<= それ以外はしない。新たに作る)
2) 1行読んで1文字目を表示するプログラム
3) 1行読んで、1文字目と空白で区切った列を”文字列”として表示するプログラム
4) 1行読んで、1文字目と空白で区切った列を”数字”として表示するプログラム
5) 1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
 最終形態を考えてプログラムする。
[例] P 10 10
なら
(10, 10) に点を打つ
と英語で表示する。など(ここも仕様の詳細は自分で考える)
6)複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログ
ラム
7)複数行読んで、最初の計画通り各コマンドを実行するプログラム

古典的だけど、バッファと空白をうまく使うと、使用メモリ量が減る。
うまく使わないと文字列なのでバグだらけになるのでよく考えましょう。
領域があるかどうかに注意する。

*円を書く
まぁ時間があったら自分でやってください。

社長さらにコメント 7/19(火) 23:32

>  ー線分を描画するプログラムの手直し
今日、私が出したヒントで、方法に気が付いたようです。
よく、すぐに気が付いたと思います。

このように、知識を増やしていけば(=経験を積めば)技術はついていきます。
ソースを読むなどして習得していってください。

もう一つの習得方法は、方法論です。
難しい問題(<=どうしたらよいかアイデアが出ない問題)は
より簡単な問題ならどのように解くかを考えていきます。
難しい問題はいろんなパターン(というか45度で)で線を引くでした。
これをもっと簡単な問題に置き換えてやればいいわけです。
例えば、0-10 まで加算する。10-100まで加算する。1から-10まで加算する。など、
これは2次元が難しいので、1次元に優しくして、さらに、描画を加算にしました。

このように”問題を簡略化して解く”という方法論を手に入れると突破力が付きま
す。

ここまで読んだら(読んでいるか読んでいないか心配なので)、メールの返事として
感想をください。

コメント

哲学的なことを言い過ぎかな?コミュニケーションもメールでしろと。結構敷居が高いかも。今考えたら、ちゃんと顔あわせて話した方がよかったかも。じゃなかったら、別の人が顔あわせるべきだったのかな。社長じきじきだと緊張するよね。
と思ったら、間髪入れずに、ほかの社員に指示している(次のメール参照)。それでも、哲学的なことを言い過ぎかな~~~。もっと具体的に指示は出せないものなのだろうか?具体的すぎると考えなくなってしまうかもしれないなぁ~~~。ここは難しい。

SK くんという別の社員に社長から指示 7/19(火) 23:34

SK へ
>   ー行列計算を用いるため要確認
>   ー変換後の座標の判定方法についても考える必要がある
これを実現するための API を設計してください。
設計して、高橋君に渡してください。
難しい設計をしないように。
特に OpenCV などは参考に”しない”ように。難しすぎるので。
以下に簡単な API を作るかがポイントかな。
(あと、”これを実現するため”というあいまいな仕様をどこまで具体化できる
か、、、も重要)

SK くんの回答

void rotate( double srcX, double srcY, double *dstX, double *dstY, double angle );

でどうでしょうか。

一般的な行列の計算用の API、こんな感じでどうでしょう。
API の名前を名前を matrix_2x2_2x1 などと工夫したいところですが、とりあえず

// ( out_x ) ( a11 a12 )(x)
// =
// ( out_y ) ( a21 a22 )(y)

void
matrix( double a11, double a12, double a21, double a22,
double x, double y, double *out_x, double *out_y )
{
}

新人高橋君 日報 7/20(水)

作業報告します

今日行ったこと
 ー"初めて使うMule/Emacs"を229ページ中52-66ページまで読み進める
 ー"明解C言語"を311ページ中2-22ページまで読み進める

プログラム関連
 ー線分を描画するプログラムの手直し
 ー線分を描画するプログラムの手直し
 ー1行読むプログラムの作成

今後のtodo
 ー"初めて使うMule/Emacs"を読む
 ー"明解C言語"を読む


 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログ
ラムの作成

  ー1行読んで1文字目を表示するプログラム 
  ー1行読んで、1文字目と空白で区切った列を”文字列”として表示するプログラム 
  ー1行読んで、1文字目と空白で区切った列を”数字”として表示するプログラム 
  ー1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  ー複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  ー複数行読んで、最初の計画通り各コマンドを実行するプログラム

  ー円を描画するプログラムの作成
 
 ー図を回転させるプログラムの作成

コメント

具体性が増してきた。さすがに「1行読んで1文字目を出すプログラム」はクリアした。でも、これを本人がどうとらえるかが重要。「初心者だからこうしている」ととらえないでプログラムを作るときは「常にこれくらい易しいのから始める」ととらえてくれてるのがよい。
SK 君の提案難しいけど、ちゃんとこなせるのだろうか?

社長のコメント 7/22(金) 14:22

> void
> matrix( double a11, double a12, double a21, double a22,
> double x, double y, double *out_x, double *out_y ) { }
out_x と out_y をグローバル変数にして、ポインタを使わないようにしますか。

いっそのこと、全部、グローバル変数にするかね、、、、

> 3) 1行読んで、1文字目と空白で区切った列を”文字列”として表示するプ
> ログラム

1行読んで
1文字目+改行を出力
更に各、空白で区切った”語”を1行ずつ”文字列”として表示する
プログラム

コメント

やっぱり、ポインタが鬼門か。ポインタを回避するためにグローバル変数にしようとしている(私が)。ちゃんと説明してあげろよ!?なのか。しかも金曜日の 14:22 にこんなこと言われて対応できるのか?ピ~~~ンチ。
あと、3) のプログラムできてなかったのか?より詳細に説明している。進捗はどうなっているんだ?

新人高橋君 日報 7/22(金)

作業報告します

今日行ったこと
 ー"C言語入門書の次に読む本"を409ページ中2-38まで読み進める
 ー"明解C言語"を325ページ中22-40まで読み進める

 ー線分を描画するプログラムの簡単な手直し
 ー1行読んで、1文字目と空白で区切った列を文字列として表示するプログラムの作成

今後のtodo
 ー"C言語入門書の次に読む本"を読み進める
 ー"明解C言語"を読み進める


 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成

  ー1行読んで、1文字目と空白で区切った列を”数字”として表示するプログラム 
  ー1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  ー複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  ー複数行読んで、最初の計画通り各コマンドを実行するプログラム

  ー円を描画するプログラムの作成
 
 ー図を回転させるプログラムの作成

コメント

結局、ポインタの理解まで行かなかった(のだと思う)。まぁ、金曜日の 14:30 位に言われてすぐには対応できないでしょう。そして、rotate とか matrix とか関数名を言われてもすぐにプログラミングは出来ません。
がんばれ!!