I117 プログラミング演習II

Similar documents
/ SCHEDULE /06/07(Tue) / Basic of Programming /06/09(Thu) / Fundamental structures /06/14(Tue) / Memory Management /06/1

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

PowerPoint プレゼンテーション

Taro-ポインタ変数Ⅰ(公開版).j

Prog1_10th

PowerPoint プレゼンテーション

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

情報ネットワーク演習 2006年10月5日

PowerPoint プレゼンテーション

memo

Microsoft PowerPoint pptx

memo

PowerPoint プレゼンテーション

memo

Microsoft PowerPoint - 計算機言語 第7回.ppt

Microsoft PowerPoint - lec10.ppt

02: 変数と標準入出力

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint - 11.pptx

ポインタ変数

02: 変数と標準入出力

02: 変数と標準入出力

Microsoft PowerPoint pptx

第1回 プログラミング演習3 センサーアプリケーション

02: 変数と標準入出力

02: 変数と標準入出力

Microsoft PowerPoint L07-Imperative Programming Languages-4-students ( )

プログラミング実習I

第2回

ポインタ変数

PowerPoint Template

プログラミング及び演習 第1回 講義概容・実行制御

02: 変数と標準入出力

プログラミングI第10回

Microsoft Word - Cプログラミング演習(12)

02: 変数と標準入出力

Microsoft PowerPoint - 09.pptx

講習No.12

Microsoft Word - Cプログラミング演習(10)

program7app.ppt

プログラミング基礎

02: 変数と標準入出力

Prog1_15th

Prog1_12th

Microsoft Word - no12.doc

Microsoft PowerPoint - 5Chap15.ppt

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

(2) 構造体変数の宣言 文法は次のとおり. struct 構造体タグ名構造体変数名 ; (1) と (2) は同時に行える. struct 構造体タグ名 { データ型変数 1; データ型変数 2;... 構造体変数名 ; 例 : struct STUDENT{ stdata; int id; do

情報処理Ⅰ演習

JavaプログラミングⅠ

Microsoft Word - no15.docx

Taro-リストⅠ(公開版).jtd

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Microsoft PowerPoint - handout07.ppt [互換モード]

Microsoft Word - Cプログラミング演習(9)

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi9.ppt

Microsoft Word - Cプログラミング演習(11)

02: 変数と標準入出力

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

2006年10月5日(木)実施

02: 変数と標準入出力

Microsoft PowerPoint ppt

Microsoft Word - 3new.doc

ファイル入出力

kiso2-03.key

メソッドのまとめ

Microsoft PowerPoint - 12.ppt [互換モード]

ポインタ変数

Taro-ファイル処理(公開版).jtd

gengo1-11

02: 変数と標準入出力

ポインタ変数

Microsoft PowerPoint - C++_第1回.pptx

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

情報処理演習 B8クラス

Microsoft PowerPoint - 6.pptx

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

PowerPoint プレゼンテーション - 物理学情報処理演習

計算機プログラミング

講習No.12

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

PowerPoint プレゼンテーション

第3回 配列とリスト

Microsoft PowerPoint - 13.ppt [互換モード]

< F2D837C E95CF CF68A4A94C5816A2E6A>

Microsoft PowerPoint - 12.ppt [互換モード]

プログラミング基礎

演算増幅器

I117 II I117 PROGRAMMING PRACTICE II SOFTWARE DEVELOPMENT ENV. 1 Research Center for Advanced Computing Infrastructure (RCACI) / Yasuhiro Ohara

Microsoft PowerPoint - CproNt02.ppt [互換モード]

プログラミング実習I

Taro-リストⅢ(公開版).jtd

プログラミングI第6回

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

デジタル表現論・第6回

slide5.pptx

講習No.9

I117 II I117 PROGRAMMING PRACTICE II 2 SOFTWARE DEVELOPMENT ENV. 2 Research Center for Advanced Computing Infrastructure (RCACI) / Yasuhiro Ohara yasu

Transcription:

I117 プログラミング演習 II I117 PROGRAMMING PRACTICE II メモリ管理 1 MEMORY MANAGEMENT 1 情報社会基盤研究センター Research Center for Advanced Computing Infrastructure (RCACI) 小原泰弘 / Yasuhiro Ohara yasu@jaist.ac.jp

スケジュール / SCHEDULE 1. 2011/06/07(Tue): プログラミングの基礎 / Basic of Programming 2. 2011/06/09(Thu): 基本データ構造 / Fundamental data structures 3. 2011/06/14(Tue): メモリ管理 1 / Memory Management 1 4. 2011/06/16(Thu): メモリ管理 2 / Memory Management 2 5. 2011/06/21(Tue): デバッグ / Debugging 6. 2011/06/23(Thu): ソフトウェア開発環境 1 / Software Development Env. 1 7. 2011/06/28(Tue): ソフトウェア開発環境 2 / Software Development Env. 2 8. 2011/06/30(Thu): 木 / Data Structure : Tree 9. 2011/07/05(Tue): ハッシュ / Data Structure: Hash 10. 2011/07/07(Thu): プログラム理解 1 / Understanding Programs 1 11. 2011/07/12(Tue): プログラム理解 2 / Understanding Programs 2 12. 2011/07/14(Thu): スクリプト言語 1 / Script Language 1 13. 2011/07/19(Tue): スクリプト言語 2 / Script Language 2 14. 2011/07/21(Thu): その他の言語 / Other Languages 15. 2011/07/26(Tue): 試験 / Examination

今日の目次 C 言語の基礎 構造体 メモリ管理 malloc () 基本データ構造 配列と連結リスト 木 スタック キュー 演習 プログラミング環境の整備 マルコフ連鎖プログラムの解説

VI の使い方 h j k l Ctrl-[ Esc で移動モード / 検索文字 : 検索文字までジャンプ Ctrl-G 状態表示 ':': コマンドモード u: Undo {: 前の空行へ : 次の空行へ編集モード i: 挿入モード a: 追加モード o: 次行挿入モード O: 前行挿入モード C: 後続行置き換え x: 一文字削除 dd: 一行削除 D: 後続行削除 J: 次の行を連結 1,$s/hoge/hage/g ( 置き換え ) 行数 : 行数へジャンプ r ファイル名 : ファイルを読み込み sp ファイル名 : 画面二分割で編集 e ファイル名 : 編集ファイルを変更 w: 保存 q: 終了 G: ファイルの最後まで t[ 文字 ]: 同行内次の文字の直前 f[ 文字 ]: 同行内次の文字 d[ 移動 ]: 移動先まで削除 c[ 移動 ]: 移動先まで置き換え c2f' ': 2 個先の空白まで置き換え 0: 行の先頭 $: 行の終わり

C 言語基礎

構造体

構造体 変数と配列の限界 同じ型のデータだけでは表現し切れない 異なる型の変数を一まとめにして使いたい 構造体

構造体の例 struct sockaddr_in { u_char sin_len; u_char sin_family; u_short sin_port; ; 構造体 struct in_addr sin_addr; char sin_zero[8]; 名前 struct xxx { ; ; 8bit 8bit 16bit 8bit x 4 8bit x 8 メンバー sin_len sin_family sin_port sin_addr sin_zero[0] sin_zero[4] sin_zero[1] sin_zero[5] sin_zero[2] sin_zero[6] sin_zero[3] sin_zero[7]

関数 関数 同じような処理を一まとめにしたもの 名前を付けられる 名前で呼び出すことができる 引数で呼び出した側からデータを渡すことができる { で囲まれている ( ブロック ) 処理の結果 あるいは処理中に発生したエラーを返り値で呼び出し側に伝えることができる ライブラリ関数 システムあるいは誰かが予め用意した関数群 printf(), str (), atoi() など 画像処理用の関数群 数学の関数群 データベース操作関数群

関数 (CONT'D) 関数の例 引数で渡された文字列の文字数を返す (strlen() と同じ ) int my_strlen(char *str) 関数名 引数 返り値 { 関数のはじまり char *cp; int nbyte = 0; for(cp = str; *cp!= 0; cp++) { 文字数を数える変数 nbyte++; return(nbyte); 文字を数える 文字配列走査のためのポインタ 関数の終わり 渡された文字列に 0 が現れない間繰り返す 数えた文字数を返り値として返す

関数 (CONT'D) main() { char buf[] = "this is test"; int nbyte; nbyte = my_strlen(buf); printf("buf: %s, length: %d n", buf, nbyte); 関数の呼び出し int my_strlen(char *str) {.

関数とポインタ 関数を呼び出す側の変数を関数の処理で変更したい時 upper(char *str) { while(*str!= NULL) { if(*str > 'a' && *str < 'z') { *str = *str - 26; str++; main() { char buf[256]; strcpy(buf, "This Is Test String."); upper(buf); printf("%s n", buf);

ポインタ VS 配列 巨大な配列があったときにどちらのアクセスが早いか? 100000 個の配列 gettimeofday() delta_timeval(struct timeval *begin, struct timeval *end);

構造体 データをまとめて格納可能な型 C 言語での例 /* 日付を表す構造体を定義 */ struct date { int year; int month; int day; ; /* 構造体へのアクセスはメンバアクセス演算子 (.) を用いる */ Void func() { struct date today; /* 構造体宣言 */ today.year = 2010; /* today.month = 6; * 構造体のメンバ変数にアクセス today.day = 9; */

HOSTENT 構造体 struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses from name server */ #define h_addr h_addr_list[0] /* address, for backward compatiblity */ ;

HOSTENT 構造体 hostent h_name h_aliases h_addrtype h_length h_addr_list AF_INET 4 ホスト名 (NULL) (NULL) エイリアス名エイリアス名 in_addr IP address IP address IP address h_length = 4

メモリレイアウト a.out の例 プログラムの実行可能コードはテキストセグメントに配置される 初期化済みの静的変数はデータセグメントに配置される 未初期化の静的変数は bss セグメントに配置される 動的変数はヒープ上に確保される malloc などで確保する領域 ローカル変数はスタック上に確保される 関数の引数 ローカル変数 ( 関数内の変数 ) 戻り値 テキストセグメント ( 読み出し専用 ) データ bss ヒープ スタック 0x1000 higher address

ポインタとメモリレイアウトの関係 普通の変数もポインタ変数も同じメモリ上に配置される 普通の変数には値が入っている ポインタ変数にはアドレスが入っている スタック領域 Void func() { int var = 10; 0xff000000 int *p = &var; int **pp = &p; pp p var 0xff000004 0xff000008 10 0xff000004 0xff000008

構造体のポインタ 構造体ポインタを用いて メンバ変数へアクセスするためには アロー演算子 (->) を用いる /* 構造体 dateのポインタを引数にとる関数 */ Void func(struct date *today) { today->year = 2010; /* アロー演算子を用いて today->month = 6; * 構造体のメンバ変数にアクセス today->day = 9; */

値渡しと参照渡し 値渡し データをまるごとコピーして 関数に渡す方法 渡したデータの内容が変更されない 渡すデータのサイズが大きいと オーバヘッドも大 参照渡し データの参照 (C 言語ではポインタ ) だけを関数に渡す方法 データのコピーは行われないのでオーバヘッド小 渡したデータの内容が変更される場合がある Void val_func(struct date today) { today.year = 2010; today.month = 6; today.day = 9; Void ref_func(struct date *today) { today->year = 2010; today->month = 6; today->day = 9; Void main(void) { struct date d1 = {0, 0, 0; struct date d2 = {0, 0, 0; val_func(d1); ref_func(&d2); d1 と d2 の値はどうなるか?

様々な言語の値渡しと参照渡し C++ 基本的にすべて値渡し ポインタ変数と参照変数がある JavaScript Java 数値や真偽値などの基本データ型は値渡し その他の リストやオブジェクトは値渡し Python Ruby すべて参照渡し

参照渡しに関する問題 ( 上級者向け ) 以下の C 言語のプログラムは 777 を出力する Void func(int *var) { *var = 777; Void main(void) { int n = 0; func(&n); printf( %d n, n); /* 777と出力される */ しかし 以下の Pythonプログラムは0が出力される 参照渡しなのに値が変更されないのは何故か? def func(var): var = 777 n = 0 func(n) print n # 0 が出力される

キャスト ある変数 構造体を無理やり違う型の変数や構造体として扱う方法 変数を使う時に扱いたい型をカッコで括る (int)no_int_variable; int 型にキャスト 関数の引数を一般化するのに便利 sockaddr の例 struct sockaddr_in sin; (struct sockaddr)sin; 型やサイズに依存せず 1 バイトずつ読みたいときにも使う long addr = 1234567; char *cp = (char *)&addr; for(j = 0; j < 4; j++) { printf("%c ", *cp++);

メモリ管理

配列 (ARRAY) 連続した記憶領域 文字列等の記憶に利用 char array[ ] = program ; N 次元表記 配列の添え字が 2 次 P r o g r a m 0 char array[n][m]; N M

メモリ関数 malloc () free () strdup ()

新しく必要となるメモリの確保 #include <stdlib.h> void * malloc (size_t size); void free (void *ptr); malloc: Memory ALLOCate の略 size バイト分のメモリを確保し 帰り値として返す free: malloc () で確保したメモリを解放する * 注 ) いらなくなった malloc () メモリはちゃんと free すること 例 ) struct listnode *target = (struct listnode *) malloc (sizeof (struct listnode)); free (target);

2 次元配列の動的割り当て char * の配列ではなく 実体を持ったcharの2 次元配列にすること malloc() を2 度使うこと free() すること strdup() は利用禁止 strncpy() を使うこと #include <stdio.h> 2 3 main () 4 { 5 int i, j; 6 char *alpha[] = { "abc", "def", "ghi", "" ; 7 8 for (i = 0; alpha[i][0]; i++) 9 printf (" %s", alpha[i]); 10