今日は寝坊しました
起きたとき、すっきり目覚めたし、
いつもより良く寝た感じもしたし、
目覚ましがならないなーって、iPhone見たら・・・!?
話は変わりますが、おろし金を持ってないので、
山芋は薄切りとか、千切りにして食べています。
素手で触るとチクチクするらしいのですが、
そんなにひどくはなかった気がします。
麺つゆと、削り節と、小女子を振りかけて頂きました。
あと2つ、この調子でC言語について書く予定ですが、
コードが出てこないかも知れません。
では、おやすみなさい。
起きたとき、すっきり目覚めたし、
いつもより良く寝た感じもしたし、
目覚ましがならないなーって、iPhone見たら・・・!?
話は変わりますが、おろし金を持ってないので、
山芋は薄切りとか、千切りにして食べています。
素手で触るとチクチクするらしいのですが、
そんなにひどくはなかった気がします。
麺つゆと、削り節と、小女子を振りかけて頂きました。
あと2つ、この調子でC言語について書く予定ですが、
コードが出てこないかも知れません。
では、おやすみなさい。
ポインタのポインタまで理解したなら、
あとは良書を読んで知識を深めてね。
今日、紹介するのは、このサイトだよ。
Cプログラミング診断室
どういうコードが良いコードかは、
そのコードを読むヒトの知識や経験によっても違うけど、
悪いコードっていうのは共通項があって、
このサイトは、悪い見本が何故悪いのか?も含めて紹介してあるよ。
もしも、お仕事でC言語を扱う場合は、
後で読むヒトの工数を増やすような
悪いコードを書かないように気を付けてね!
今日はアドレスを見るよ!
#include <stdio.h> void showMessage(const char * const *pp) { printf( "in func, *pp = %s\n", *pp ); printf( "pp = 0x%016lX\n", (unsigned long)pp ); printf( "*pp = 0x%016lX\n", (unsigned long)(*pp) ); } int main(int argc, char *argv[]) { const char message[] = "hello."; const char *p = message; printf( "message = 0x%016lX\n", (unsigned long)message ); printf( "&p = 0x%016lX\n", (unsigned long)(&p) ); showMessage( &p ); return 0; }
実行結果
message = 0x00007FFF5FBFF900
&p = 0x00007FFF5FBFF8F8
in func, *pp = hello.
pp = 0x00007FFF5FBFF8F8
*pp = 0x00007FFF5FBFF900
今日はポインタのポインタのアドレスを見るよ。
配列の先頭アドレスをポインタに入れてるよ。
そのポインタのアドレス、つまりポインタのポインタが&pだね。
そのアドレスを関数の引数に渡してるよ。
だから、&pとppが一致してるよ。
そして、*ppでmessageの先頭アドレスが取得できるよ。
ここまで理解出来れば、あとは習うより慣れろだから、
いっぱいコードを書いて覚えてね!
一人Advent CalendarをC言語でとか、
勢い余って始めたものの、もういいかなーって思ってます。
もちろん、あと4つ書きますけどね。
惰性っぽくなったらゴメンなさい。
正確には、終盤のポインタのポインタを復習する感じで。
こんな所でポインタを習うより、
良書を探して、習うより慣れろが本音です。
私自身が、そう教えられたし、そうやって覚えたので。
でも、あんまり見かけないんだよね、この辺って。
そんな訳で、良書を見つけましょう。
おしまい。
constが2つ???
#include <stdio.h> void printStrings(const char * const *p) { // p[0][0] = 'c'; error: assignment of read-only location // p[0] = p[1]; error: assignment of read-only location printf( "p = %s\n", *p ); p++; printf( "p = %s\n", *p ); p++; printf( "p = %s\n", *p ); } int main(int argc, char *argv[]) { const char str1[] = "a"; const char str2[] = "bc"; const char str3[] = "def"; const char *pStrArray[] = { str1, str2, str3 }; printStrings( pStrArray ); return 0; }
実行結果
p = a
p = bc
p = def
今日は、constが2つだよ。
これは、str1の最初の文字を書き換えるコードだけど、
p[0][0] = 'c';
1つ目の const char * でエラーになるよ。
これは、pStrArray[0]の値(アドレス)を、
p[0] = p[1];
pStrArray[1]の値(アドレス)で書き換えるコードだけど、
2つ目の const * でエラーになるよ。
書き換えてはいけない変数や配列も、
こうやってCコンパイラさんに監視して貰えば、
後々のメンテナンスもきっと楽になるからちゃんと理解してね!
今日もポインタのポインタだよ。
#include <stdio.h> void swapMessage(const char **ppA, const char **ppB) { const char *p; p = (*ppA); (*ppA) = (*ppB); (*ppB) = p; } int main(int argc, char *argv[]) { const char messageHello[] = "hello."; const char messageBye[] = "bye."; const char *p[] = { messageHello, messageBye }; printf( "p[0] = %s, p[1] = %s\n", p[0], p[1] ); swapMessage( &(p[0]), &(p[1]) ); printf( "p[0] = %s, p[1] = %s\n", p[0], p[1] ); return 0; }
ポインタも配列にできるよ。
配列の使い方は大丈夫だよね。
そして、今日もポインタのポインタだよ。
今日は、ポインタの中身を交換するよ。
そのためには、変数を書き換えてもらうためのアドレスである、
ポインタのポインタを渡して、変数の中身を交換してるよ。
交換するには、一時的にアドレスを入れる変数を用意するよ。
2つの皿に乗ったケーキを交換する場合、もう1枚お皿を用意するよね。
考え方はこれと同じで、一時的に使用するポインタを使って、
アドレスを書き換えてるよ。
メモリをイメージすることが大事だから、
分からないときは絵を描いてがんばってね。
金曜日は、テクノのパーティーに行ってきました。
実はこの日がパーティー最初の日でした。
つまり、バースディーな訳です。
やっぱり、クラブで聴くテクノは気持ちいいですね。
何もかも忘れて、テクノに浸れるっていうのは、
何にも代え難い楽しみであります。
こればっかりは、上手に文章に出来ないです。
ただただ楽しい時間が流れていました。
最終的に、寝ながら踊ったのか、
踊りながら寝たのか良く分からない状況に陥りましたが、
次回はもっと楽しめるように、体作りを始めようと思います。
次も楽しみ、おやすみなさい。
ハッカソンに参加したときに、
MovableTypeをインストールしたのでメモ。
DLしたのはVer. 5.04
そのときは、b-mobileを使って、DLとアップロードしました。
それぞれ5分くらい掛かったけど、
使えなくもないかなぁ、って速度です。
その後は、cpanmをインストールしたけど、活躍せず。
(多分、数日中に使いまくる予定)
インストールは、zipのままアップロードしたものを、
サーバー上でunzipしてリネーム、
そして、フォルダにアクセスすればインストール開始。
特にハマりポイントはない予定でしたが、
MySQLでハマりました。
普段は、WordPressを使っているので、
MySQLのユーザーに与えた権限は、
DELETE, INSERT, SELECT, UPDATEだけでしたが、
INDEX, ALTERを求められたので、
この権限も含めて設定しました。
あと、メールの設定が、まだ終わっていないので、
この辺は残念な感じでしたが、インストールは出来ました。
次に記事を書こうとしたら、ブログの作成を求められたので、
複数のブログを管理できるタイプなのかなーって思いました。
ここもWordPressと違って、焦りました。
そんなこんなで、今日も少し勉強をしました。
おしまい。
12月18日 MTDDC HOKKAIDO
(Movable Type Developers & Designers Conference HOKKAIDO)の
翌日の、ハッカソンに参加してきました。
ハッカソンは、「ハッカー」+「マラソン」を意味してて、
限られた時間で開発して、即発表っていうイベントのようです。
とは言うものの、
本当は「モダンPerl入門」にサインを貰うためだけに行ったのですが、
昼前に着いてすぐ、お寿司をダーターて頂いたので、
本当は苦手な分野なんだけど、がんばってMTをインストールしてみました。
これがその成果です(公開期間は短めデス)
http://www.nekonotechno.com/nekotype/mt/
実のところ、ほんとうに何も考えてなかったです。
でも、参加して良かったと思ってます。
ハッカソンに参加して良かったと思う理由
個人的な感想を言うと、
みんなすごく黙々してるのね。
これがハッカソンなのか、と。
もちろん、その後の発表を聴いても、すごいのね。
そういう、すげー!!を経験した事が最近なかったので、
今日は非常に興味深い体験をさせて頂きました。
みなさま、おつかれさまでした。
あと、ごちそうさまでした!
みなさん、お待ちかね!
#include <stdio.h> void setMessage(const char **ppDst, const char *pMessage) { *ppDst = pMessage; } int main(int argc, char *argv[]) { const char messageHello[] = "hello."; const char messageBye[] = "bye."; const char *p = messageHello; printf( "p = %s\n", p ); setMessage( &p, messageBye ); printf( "p = %s\n", p ); return 0; }
実行結果
p = hello.
p = bye.
今日は、ポインタのポインタだよ。
&pは、アドレスが格納された変数のアドレスを表してるよ。
setMessageの中では、最初の引数に*を付けると、
引数に格納されているアドレスをたどってポインタを書き換えることが出来るよ。
もう1つの引数で、そのポインタを書き換えているね。
少しややっこしいかもしれないけど、
ポインタっていうのは、アドレスが格納された変数ということを思い出せば、
きっと理解できるから、ゆっくり考えてね。