42Tokyo

【42Tokyo】 課題の振り返り – Libft –

palm

初めまして。
42Tokyoに入学してからの1つ目の課題「Libft」に挑戦しました。
もっと理解を深めたくて振り返ることにしました。
「Libft」にはBonusを含めて43個関数があり、それらを今後の課題で活用できるように自作ライブラリとしてまとめます。

42Tokyoのコーディング方法

42Tokyoコモンコアの課題をクリアするためには、レビュー(3回)と機械採点があります。機械採点で合格するためには決まったフォーマットで提出します。(42ヘッダーを付ける、スペースではなくtabで区切る、変数宣言は関数内の先頭など)

おすすめのVScode拡張機能

42 Header(必需ツール、42ヘッダーを生成してくれる)

42 ft count line(1つの関数内のコードの行数を表示)

42-norminette(フォーマットのエラーをわかりやすく赤い文字で可視化)

42 C-Format(フォーマットのルールに従ってコードを自動整形)

man コマンド

manコマンドとは、Linuxでマニュアルを表示するコマンドです。Manuel(マニュアル)の頭文字を取ってmanらしいです。このコマンドをLinuxで打つと英語の説明文が出てきます。C言語の標準ライブラリにあるisupper()などのユーティリティ関数なども対象です。man isupper と打つと isupper() の説明文が出てきて、man ascii と打つとC言語には欠かせないASCIIコード表がでてきます。

man コマンド名

英語のドキュメントを読めるようになることが libft の主な課題なのですが、42の学生がNotionにまとめている日本語の説明文を参考にして実装を進めてしまったのが反省点です。

参考になるサイト

Linux man-pages project(Linux の man ページが日本語版でまとめてあるサイト)

man pageの読み方(初心者向けの man の読み方が載っている)

Makefile

C言語で複数のソースコードを一度にコンパイルするためにコマンドを作ることができる便利なテキストファイルです。42の課題でよくでてきました。

libft では特にボーナス課題をする場合、再リンク(relink)に注意したいです。relinkとは、make コマンドを一度打ってから変更を加えていない場合に、また make コマンドを打ったときに再ビルドされてしまう事です。正しい動作は何も起こりません。よく見るとサブジェクト(課題のPDF)にも書いてありました。依存関係を make で指定したり 、bonus ルールに直接コマンドがあることが原因で再リンクが起こりやすくなります。

your Makefile must not perform unnecessary relinking.(Makefileは不要な再リンクを実行しないでください)

subject.pdf

make コマンドを打つとオブジェクトファイル達がビルドされますが、実行せずに動作確認ができるオプションがあるみたいです。動作チェックに便利です。

make -n

参考になるサイト

【初心者向け】Makefile入門(Makefileを作るための説明がわかりやすい)

トリビアなmakefile入門(Makefile の説明書)

size_t

配列の添字(index, i)、長さ(len)、メモリサイズ(count)などには size_t を使うと安全なコードを書けるということがわかりました。以下のヘッダーを宣言することで size_t を使うことができます。

#include <stdlib.h>

size_t は、符号なしの整数型で、常に0以上の値を持ちます。マイナスが扱えない分正の数をよりたくさん使えます。マイナスの値が渡ってくる時に使うとエラーになるので要注意です。unsigned int の別名ですが、メモリのサイズや配列の要素数などを表すためには unsigned int ではダメで size_t を使うと良いみたいです。

ssize_t という似た型がありますが、エラー処理などで -1 を使いたい時に便利な符号付き整数型です。

unsigned char

char の符号なし整数型です。環境によっては1バイト単位で 「-128 ~ 127」までしか使えない char と比べてunsigned char は「0 〜 225」まで扱うことができ、バイナリ処理をしたい時に使います。バイナリ処理とは、メモリの内容自体を直接操作することです。memcpy()memset() などメモリを正確に扱う必要がある関数で使いました。

(unsigned char *)dest;

壊し屋対策

引数に来るデータを信用してはいけない事を学びました。42のレビューでは優秀な先輩方がせっかく組んだプログラムを壊しにきます。Piscine でも Rush という課題で本科の先輩にオーバーフローとメモリリークで壊されました。私のよくある壊されパターンは、

  • INT_MAX 以上や INT_MIN未満 の値
  • NULL や Empty の値
  • 想定しない範囲外のケース
  • 未定義動作
  • 使わない or 使い終わったメモリの解放し忘れ

です。これらを指摘されたり対策を行うことで安全なコードを書けるエンジニアに一歩近づけます。

特にメモリリークは厳重にしないといけません。一番壊されやすいからです。チェックはこちらのコマンドでできます。

valgrind ./a.out

mallocとfree

malloc()は、動的メモリ確保を行う関数で、確保したメモリ領域へのポインタを返します。確保したメモリの解放にはfree関数を使用します。以下のヘッダーを宣言することで malloc と free を使うことができます。

#include <stdlib.h>

使い方は簡単で、コピー先を指す変数であるdestの範囲を strlen などで計算して、malloc(サイズ)に格納するだけです。文字列を扱う場合は、NULL終端分を長さ +1 して格納します。NULL終端の分がないと無限ループしてクラッシュしてしまいます。メモリが確保できなかった場合のNULL処理もセットで覚えました。main 関数など処理が終わった後に free() で解放することを忘れないようにしたいです。

dest = (char *)malloc(sizeof(char) * strlen(s1) + 1);
if (!dest)
		return (NULL);

リスト構造(単方向リスト)

そろそろC言語らしいデータ構造になってきました。リスト構造は理解するまで時間がかかる分野です。ヘッダーファイルにこのように構造体を定義しました。

typedef struct s_list
{
	void			*content;
	struct s_list	*next;
}					t_list;

content はリストが持つ値そのもので、next は次の要素のポインタ(進む)を指します。next だけで処理ができ、一方向にたどって処理するリストを「単方向リスト」と呼びます。また、これからの課題で出てくるであろう「双方向リスト」では、前の要素を指すポインタの prev (戻る)を扱うのでもっと複雑になりそうです。リスト構造の仕組みは、ポインタを移動させてリストのアドレスを入れ替えています。

Libft を終えた感想

Libft は、Piscineの課題の総復習に感じました。libft の読み方は「リブフト」みたいです。(最近までリブエフティーと呼んでました)私は、ファイル構成を間違えたり最終的に日本語のまとめサイトを見るなど課題の意図を読み解くのが苦手な傾向がありました。英語できるようになりたいし、頑張って本家のPDFを読む努力をしたいです。課題を終えて、C言語の分厚い入門書を一冊読んだかのような達成感がありました。レビューでは、もっと安全な書き方や冗長なコードの発見ができました。すごく丁寧にレビューをしてくれる方がたまにいるのですが話すだけで超勉強になります。

最後まで読んでいただきありがとうございました!

スポンサーリンク

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

  1. * * * Unlock Free Spins Today: https://www.cskwebserver.in/index.php?2l1qt1 * * * hs=75e3a95d2cb85e1c5d66d2323278c9af* ххх*

    uhqozr

  2. Millie

    Nice

    my web blog; thc vape florida

  3. Jefferey

    Good shout.

  4. Malorie

    & Sleep

  5. Charlie

    Nice

    Also visit my site; snow caps

  6. Wendi

    Nice

    Also visit my page: ace ultra premium packaging

  7. Mavis

    best disposable vaporizers area
    52

  8. Jett

    distillate carts area 52

  9. Ernesto

    infused pre rolls
    area 52

  10. Jerrell

    live resin carts area 52

  11. Freddy

    thcv gummies area 52

  12. Elouise

    liquid diamonds area
    52

  13. Lindsay

    thc gummies for pain area 52

  14. Opal

    buy magic mushrooms area 52

  15. Val

    mood thc gummies area
    52

  16. Micah

    thc gummies

  17. Keira

    buy thca area 52

  18. Isla

    best sativa thc edibles
    area 52

  19. Virginia

    thc sleep gummies area 52

  20. Don

    thc gummies for anxiety area 52

  21. Gabriele

    liquid thc area
    52

  22. Roxanna

    hybrid gummies area 52

  23. Horacio

    thc tincture area 52

  24. Mildred

    weed vape area 52

  25. Celina

    full spectrum cbd gummies area 52

  26. Bryan

    live resin area 52

  27. Cody

    microdose thc area 52

  28. Lon

    indica gummies
    area 52

  29. Kirk

    disposable weed pen area 52

  30. Lon

    indica gummies
    area 52

  31. Uwe

    thca gummies area 52

  32. Felicia

    pre rolls area 52

  33. Enid

    best sativa thc carts area 52

  34. Silvia

    thc oil area 52

  35. Lawerence

    thca disposable
    area 52

  36. Hayley

    live resin gummies area
    52

  37. Rebekah

    thca diamonds area 52

  38. Cierra

    hybrid disposable area 52

  39. Natisha

    live rosin gummies area 52

  40. Azucena

    snow caps area 52

  41. Carmelo

    best thca flower area 52

ABOUT ME
PALM
PALM
東京通信大学 42Tokyo
22歳の学生です。 趣味は小説を読むことです。たまに技術の入門書も読みます。
記事URLをコピーしました