Upload
sho-iizuka
View
281
Download
3
Embed Size (px)
Citation preview
本題に入る前に• 多くの人がポインタで挫折しています
• 「ポインタを理解してしまった人」は「ポインタを勘違いしている」状態を思い出すことができません
• どのような勘違いをしていたのか教えてください(ブログのネタになります)
なぜメモリを直接扱う必要が?• 組み込み界隈の人…デバイスの状態の読み書きをメモリアドレスを指定して行います (Memory Mapped IO)
• OS界隈の人…
ソフトウェアが使用するメモリの割り当てを管理する必要があります
• メモリの番地を指定してゴリゴリやる機能が必要
なんでそんなヤバい機能が?ほとんどの人にはいらなくね?→ ググってみましょう
「もともとシステムの記述用に開発された」
(引用元:e-Words)
要するに…
• ポインタは「プログラミングを楽にする」といった理想的な目的で導入されているわけではありません(お察しください)
• 多くの人にとって、ポインタの機能はオーバースペックです
• C言語は決して万人向きではない
1. 配列or構造体を入力として関数に渡す
// C言語標準ライブラリint puts(const char *s);size_t strlen(const char *s);int strcmp(const char *s1, const char *s2);!// Win32APIATOM RegisterClassEX(const WNDCLASSEX *lpwcx);
2. 配列or構造体を出力として関数に渡す
// C言語標準ライブラリchar *gets(char *s);void memset(void *s, int c, size_t n);void strcpy(char *s1, const char *s2);!// Win32APIBOOL GetWindowRect(HWND hWnd, RECT *lpRect);BOOL GetCursorPos(POINT *lpPOINT);
3. 配列or構造体を入出力として関数に渡す
// C言語標準ライブラリvoid qsort(void *data, size_t num_memb, size_t elem_size, int (*cmp)(const void *, const void *));
演習問題配列の最大値を返す関数int max_element(const int *data, int n);があるとします。!int xs[] = { 1, 1, 4, 5, 1, 4 };の最大値を求める処理を書いてください。
演習問題配列の中に特定の値xがいくつ含まれているか数える関数countを実装してください。!int x = 4;int xs[] = { 1, 1, 4, 5, 1, 4 };int k;!k = count(xs, /* 配列の要素数 = */ 6, x);!みたいに呼び出したいです。
演習問題配列を特定の値xで埋める関数fillを定義してください。!int x = 72;int xs[10];!fill(xs, /* 配列の要素数 = */ 10, x);!みたいに呼び出したいです。
演習問題渡された文字列に含まれるアルファベットをすべて大文字に変更する関数to_upper_stringを定義してください。!char s[] = "u-hyogo";to_upper_string(s);puts(s); // U-HYOGO!1文字がアルファベットかどうかの判定はint isalpha(int c)アルファベット1文字を大文字に変換するにはint toupper(int c)を使うと便利です。!※isalphaやtoupperはctype.hに含まれています。
演習問題配列の連続する重複要素を消してくれる関数int unique(int *data, int n);があり { 1, 1, 2, 1, 3, 3, 3 } は { 1, 2, 1, 3 } になるとします。戻り値は消した後の要素数です。!int xs[10] = { 1, 1, 1, 2, 3, 3, 3, 3, 4, 4 };の連続する重複要素を消してから消した後の配列を表示する処理を書いてください。
演習問題直交座標で表される点(x,y)を極座標(r,theta)に変換する関数to_polarを実装してください。!引数のデザインはお任せします。偏角はatan(y/x)ではなくatan2(y,x)を使って計算しましょう。
演習問題配列の最大値とそのインデックスを計算する関数int max_argument(const int *data, int n, int *max_value);があるとします。!max_valueにintのポインタを渡すと最大値が代入されます。ただし最大値が不要な場合はNULLを渡せばOKです。!int xs[6] = { 1, 1, 4, 5, 1, 4 };の最大値のインデックスを求める処理を書いてください。
演習問題OpenCVでは画像の色表現を変換する関数cvCvtColorを使ってカラー画像をグレースケール画像に変換します。!void cvCvtColor(const IplImage *src, IplImage *dst, int code);!IplImage *color = cvLoadImage("azunyan.jpg", CV_LOAD_IMAGE_COLOR);IplImage *gray = cvCreateImage(cvGetSize(color), IPL_DEPTH_8U, 1);// グレースケールに変換する処理を書いてください// codeはCV_BGR2GRAYを使います!※実際はメモリを解放する処理が必要です