C言語でも多次元の動的配列使おうぜ!!
前回のブログの続きです
cagayakemiracl/Miracle-C · GitHub
宣言どうり動的配列作りました。
今のところIntクラスだけです
ただの線形リストなんですがちょっと変わってます。
こんな感じです
もうちょっとわかりやすくすると
これで[3][3][3](緑、青、赤)配列です。実体があるのは赤だけで緑と青は各要素を指すためだけの空ノードです。ノードの手は一つ前の要素を指すprevと次の要素を指すnextと子ノードまたは自分自身を指すchildで構成されています。親ノードをさすポインタを作ってもよかったのですが面倒だし、いらないのでやめました。
Arrayクラスを実装したかったのですが全てのクラスが何かしらのデータ型を扱うクラスでありかつその多次元配列を実現するものとすればいらないのでないかと考えました。これの弱点は一つ一つのインスタンスが大きくなってしまうことです。でもArrayクラスの実現が難しいので我慢します。
あと手の数が少ないのはいいのですが,空ノードの分のメモリが非常に無駄です.ここをどうにかしたいです。
インスタンスメソッドは数は少ないし多次元配列に対応しているものもあまりありません
このあとそこらへんを修正していきたいです。冬休みはいろいろまだやる事があるのでこのくらいにしといて落ち着いたら再開したいと思います
来年もいい年でありますように
C言語でオブジェクト指向プログラミングしようぜ!!
わたしは四つん這いで優雅に真昼のティータイムを過ごしていた。そんな時、ふとこう思った
そんなわけで作成したものがこちら
cagayakemiracl/Miracle-C · GitHub
使い方はREADMEを参照してください。(適当
今のところ整数と文字列を扱うクラスのみ実装してます
メリット
- 一般的なC言語のプログラミングですとint型の入力。char型の配列(文字列)の入力と全く別者として扱ってきましたがこのMiracle-C libraryを使えば何かを入力するという動作があってそれがIntクラスだとかStringクラスだとかになるのでごちゃごちゃせずにすむ。
- 同じインスタンスの動作をメソッドチェーンで繋ぐ事が出来るので処理の流れを追いやすくなる。
- ポインタをあまり意識せずにプログラムがかける。最初からポインタなので関数に渡すと値が変わる
- 不要になったら削除できる
デメリット
- 型とクラスが混在してキモいコードになる
- deleteメソッドを呼び忘れるとメモリリークを起こす
- getメソッドがうざい
- C++とかObjective-Cでいいじゃん
このようにMiracle-C Libraryはメリットもデメリットもあります。
私個人が遊びで作ったものなのですが使ってくれる人がいたらうれしいなーー
これからも更新していくつもりです
このあとは動的配列を実装しようかなと思います
Rubyに似せたい願望があったので例えばInt(整数)クラスの配列を実現したいときArrayクラスのインスタンスの要素がIntクラスのインスタンスにしたかったのですが、Intクラスのインスタンス自身で線形リスト構造でとりあつかい動的配列を実現することにしました
理由はいくつか有ります
Arrayクラスをつくろうと思ったとき、まずインスタンス変数は線形リストのheadとtailを指すポインタ(void **)になります。なのでArrayクラスは先頭と最後の要素がなんのオブジェクトなのかわかりません。また各オブジェクトも前と後ろも同様です。こうなると各要素のインスタンスメソッドを呼びだそうとしたときそのクラスの型でキャストしなければなりません。この型はArrayクラスが知っておかなければならないのですが標準型だけならArrayクラスのインスタンス変数にクラスを識別する配列みたいなの作ればどうにかなるのですが自分で新しく定義したクラスのインスタンスを要素にすることが出来ないし、静的配列になってしまいます。
Arrayクラスを作って各要素が違うクラスのインスタンスにするということはとりあえずおいておきましょう
これでIntクラス自体で配列を実現するということになりましたIntクラス自身で動的配列を作ることは出来ます。prevポインタがNULLならhead。nextポインタがNULLならtailで判別可能なのです。その上Intクラスのインスタンスを生成したときそれをさす変数がheadになります
例えば要素が一つのIntクラスの値を初期化するにはfillメソッドを呼び出すかsetメソッドで1番めの要素である事を示す。要素が3つのIntクラスのインスタンスの2番目の要素を初期化したい時setメソッドを呼び出して2番めの要素であることを示す。全ての要素をある値にしたい時はfillメソッドを呼び出すというふうになります。(余談
しかしこれでは困ったことがあって今まではメモリリークを防ぐため各クラスのインスタンスのポインタを指す変数の型は読み取り専用にしていたのですが先頭の要素を取り出すshiftとかsortを実装すると考えたときそうではいけません。なのでユーザー側でキチンとメモリを開放したか管理しないといけません。まぁGCを実装すればいいんですね。わかります(白目
長ったらしく語りましたが相当適当なので間違ってたらごめんなさい。
またArrayクラスとGCを実装する方法がありましたら教えていただけたら嬉しいです
それではまた。
セキュリティ・キャンプ2013感想
どうも。組み込みゼミに参加したみらくるです
キャンプの流れをおおまかにまとめていきます
一日目
割りと早く来たのに人がたくさん.ビビりながら名刺交換
ぎこちない昼食の会話
NICTの井上大介さんのプレゼンが上手すぎて引き込まれる
夕食の時にSFが好きそうだったのでマクロスについて話してみるがあまり好きそうじゃなかったので残念
グループワークではテーマがなかなか決まらず爆死。不安を残す結果となる
二日目
一日中開発
事前学習で作るはずだった機能を実装w
中途半端な感じでおわる
三日目
企業訪問でYahoo!に行く
アイディアソン全く考えずに参加したので序盤は一言も喋らなかったが、いろんな意見を聞いているうちに面白いアイデアを思いつきそれが採用される。自分の少ない知識を絞り出して考えた案で、この時は最高のアイデアだと思っていたが帰宅後思い介してみると酷かったww中には大学のなんかに使いたいとか言ってる人がいて冗談であると信じたい
午後の専門で初期シーケンス番号のランダム化とMACアドレスフィルタを実装
実際のDOS攻撃を 防ぐ事に成功。コマンド入力も普通に受け付ける
BoFではハッカーがモテるにはどうすればいいか、どのようなアニメを作れば女性のハッカーが増えるのかを話しあったが、一般人はアニメを見ている男の人ー>ゴミクズなので総崩れ。僕なら突然キーボードを叩きながら歌い出すさすらいの天才ハッカーを主人公にします(白目
グループワークではテーマが決まっていなかったためYahoo!の続きをしようと試みるがチューターにボッコボコにされボツ。結局2次元嫁の3次元化が採用される
四日目
自分の成果物のプレゼンの作成
早く終わったので講師である坂井さんとSF談義。
肝心のプレゼンの方はファーストガンダムの画像を使ってしらける。デモ失敗。踏んだり蹴ったり
CTFは足手まとい。持ってきた実践パケット解析がただの飾りと化す。結果は4位
このキャンプでの一番の反省点は事前に実践パケット解析を読み終えてなかったこと。
あとルールを間違えていた点。検索用PCじゃないとインターネットが使えないと勘違いしていたところ
これができていたら3位に食い込めていたかもしれない
一つの部屋にグループのみんなで集まり HEYYEYAAEYAAAEYAEYAA大熱唱
五日目
グループワーク発表では最初はバラバラだったもの協力的な行動がとることが出来た
ユニーク賞もいただき良い結果となった
クラス別発表では同じゼミの福島くんのプレゼンを見守る形となり自分の実力不足を思い知った
宮本さんと坂井さんにサインを頂きました。その時宮本さんから
「本は読まないと意味ないからね」
全部お見通しですねwwww心に響きました
このキャンプでの一番の教訓は何事も中途半端にしないということ!
これからキャンプに参加しようと思ってる人
セキュリティキャンプを知っている。興味がある人はぜひ参加すべきだと私は思います
あと応募用紙の答えは案外ググったら出てきます。でもコピペはダメ。自分なりの考えを盛り込んでいい感じにまとめてみてください。講師に「この人面白い!!」と思わせる事も重要です。あとはやる気ですかね??
キャンプで実力が上がるわけではありません。ただいいキッカケになります
僕みたいなクズでも少しはまともになるとかwwww
とりあえずでもいいので応募用紙は書くべきです
もらった物まとめ
本!!
色々ww
サイン!!
賞状!!
大・本・命wwww
ウイルスお守り
これで町中を歩けば安全!!
セキュリティキャンプに関わった皆さん!ありがとうございました!!
おわり