C/C++

インクリメント演算子とか未定義とか。思考の垂れ流し

#include <stdio.h> int main(void){ int i=0; i = i++; printf("%d\n",i); } みたいなのの話。私はこれは1になるだろうなあなどと考えていたんですが、動作は未定義だそうです。 とりあえず未定義だと言うことは承服したけど、未定義にする必要あるの?なかなか納得</stdio.h>…

gcc拡張を使って、main関数より前にFizzBuzzを実行させてみた

gcc拡張を使うとmain関数の前に色々出来ると聞いたので、遊んでみた。 結論からいうと、二通りのやりかたがありそうで、私の環境*1ではどちらも問題無く動作した。 __attribute__((constructor)) という指定 関数の宣言に際して、__attribute__で関数にconst…

itoa書いてみた

なんか面接で出されるらしいんで、itoaを書いてみた。 mainの第一引数をchar*型で受け取ったものを標準関数でintに直し、それを改めてchar配列にぶち込むというエネルギーの無駄遣い的プログラム。 Ascii限定。エラーチェックも無し。mallocの前に付ける(cha…

minipyのLexerが動いた

Cで書いていた、minipyの字句解析器が動いた。6つのテストケースのうち5つで完璧に成功した。 とはいえ、まだまだソースはひどいもので、switchで書くべき大量のif文が直列に続いていたりする。 また可変長配列を準備しないと、長い文字列や識別子を入力で…

echoクライアント用のソースの一部

どうも、検索ワード"echo クライアント"で引っかかってるようなんで、夏に書いたやつの一部をとりあえずコピペ。参考資料はbit別冊の。 connect_sock("192.168.51.33","echo","TCP")とかconnect_sock("www.yahXX.ne.jp","7","UDP")とかすると、それぞれ適宜…

ヘッダファイルのインクルード

「例解UNIXプログラミング教室」のはじめの一章だけ読んだら、だんだんC言語が分からなくなってきた。 ヘッダファイルをインクルードするというのは、関数のプロトタイプ宣言を読み込むためだけの行為らしい。つまりコンパイラ部分に関数の使い方を知らせる…

printfであそぼう(2)

最近は全然何も作ってないんですが、本読んでてprintfの動作について思い当たる節があったんで、ちょろーんとメモ。 スタックの積まれ方 |--------|--------|--------|--------| |--------|------〜 | | | | | → | | |ローカル| | 直前の |リターン| 積 |ロ…

printfであそぼう(1)

printf文って、printf("hogehoge");という形式を守ってさえすればコンパイルエラーが出ない。それがたとえ、 printf("%d %d %d %d\n"); という文でも。 こういった場合、その出力はよく「無意味な数字」だと言われる。 ほんとに? 「意味のない」数字なんて…

コンセントからの情報漏洩を防ぐプログラム1

http://www.realcreate.net/ 上のページの情報を良く読むと、このプログラムがハッカーの進入をブロックするのは「コンセントからの」もの、ということらしい。2.5KByteなら可能かも知れない。 ほとんど負荷にならずに常駐し、サイズが小さく、電源からのハ…

Brainfuckインタープリタを書いてみた

あまりにやる気がしないので、試しにBrainfuckのインタープリタを書いてみた。バッファサイズを固定しているのでわりかし楽に書けた。とりあえず、WikipediaのHello,World!プログラムは動作を確認した。 brainfuck関数に渡している引数は、1命令バッファ 2…

echoクライアント完成

いくつかのしょうもないミスを乗り越え、ようやっとechoクライアント&サーバ完成。最後まで悩んでいたのがポインタの不理解によるものだったのが何とも恥ずかしい。 …今、emacsの癖が初めて出た。一文消そうと思って何気なくC-kしたら、検索窓にカーソルが移…

SIGCHLDに反応して子プロセスのゾンビを償却する関数。

まずは関数の仕様から説明。 signal関数は、シグナルをきっかけとして動作する関数を登録するための関数。第一引数に「反応するシグナル番号」を入れ、第二引数には「返す型がvoidで引数がintひとつの関数へのポインタ」を入れる。これをメイン関数などに入…

ただのC言語では関数名のオーバーロードは出来ない。

やっぱりC言語では関数名のオーバーロードはできないのね。C言語らしいや。 名前空間とオーバーロードだけは、C++を使いたくなるかも。オブジェクト指向は大好きだけど、いま作ってる程度の大きさのプログラムでは冗長だと思う。

bindが失敗するのは何故?

問題の部分。 /*make socket*/ sock = socket(PF_INET, socktype, pproto->p_proto); if(sock<0){ return -2; /* somehow we couldn`t make the socket */ } /*bind socket*/ if( bind(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1 ){ close(sock); r…

echoクライアント多分できた

echoクライアントを作った。クライアント用のライブラリはわりあいきれいに出来たと思う。 コンパイルは通ったけれども本当にできているかどうかは分からない。明日サーバを作ってから確認しよう。バグってたら探すの大変だなあ。 それにしても、www.linux.o…

echoクライアント作ってます

echoクライアントを作っているけど、久しぶりのC言語はたのしい。 ほんとならテストしながら書いた方がいいんだろうけど、困ったらgoogle検索しつつプログラムを大きいところから書いていくっていうのはなんだかとても気持ちのいいものだ。やはりただ漫然と…