tec memo

メモです。

Go Lunch はじめました。

社内でGoの機運が高まってきたので、GoLangをもくもくとやる、GoLunchを毎週金曜日のランチタイムに集まってやることにしました。

第1回目は、9名の参加。 以下の書籍をみんなで買って、それぞれが好きなスピードで進めていくようにしてます。かなりゆるいです。

スターティングGo言語

スターティングGo言語

mac book airで環境構築。 Goのインストールから。バージョン変わった時にさくっと変えたいので、anyenvから、goenvをインストールしたのち、

# goenv install 1.6
# goenv global 1.6
# goenv rehash
# go version
go version go1.6 darwin/amd64

無事入りました。 anyenvのインストール方法や使い方は以下のリンクで。

qiita.com

頭のなかでgo buildができると豪語している @pyama 氏がvim-goが便利だという情報を聞きつけ、以下を参考にいれてみました。

qiita.com

加えて、.vimrcgoimportsを自動でやってくれるように設定します。

$ vi ~/.vimrc

let g:go_fmt_command = "goimports"

以下のようなコードを書いてみます。fmtがインポートされてないので、当然エラーになります。

package main

func main() {
        fmt.Println("Hello Golang")

}

が、vim-go入っていると、以下の通りファイルを保存する際に、自動で足りないパッケージをimportしてくれます!

f:id:atani:20160909135111g:plain

すごい!

スターティングGO言語本までいきつかずに本日はここまで。

C言語: NULLポイント

ポインタ変数は宣言直後はでたらめな値が格納されているので、このまま利用するのはバグとなり危険。 これを防ぐために、アドレスを代入したかどうかを区別する必要がある。 NULL をポインタ変数に代入しておくことで、区別をつけることができる。

  • 書き方

int *p = NULL;

  • サンプル
  1 #include <stdio.h>
  2
  3 int main(void)
  4 {
  5     int *p = NULL;
  6     if (! p) {
  7         printf("p = Null\n");
  8     }
  9     int i;
 10     p = &i;
 11     if (p) {
 12         printf("p = Not null\n");
 13         printf("p = %p\n", p);
 14     }
 15     return 0;
 16 }
  • 実行結果
# ./a.out
p = Null
p = Not null
&i = 0x7fff5690b83c

C言語: ポインタ、事はじめ

  • ポインタ型

    アドレスを記憶する変数の型。 他の型と合体して型を生成する。

  • ポインタ値

    変数のアドレスの値のこと。

  • ポインタ変数の宣言

int *p;
int* p;

どちらも同じ。

int* p1, p2;

と書いた場合、p2はint型になる。そのため、変数の前に*をつけて明示してあげたほうが良さそう。

アドレスを代入

#include <stdio.h>

int main(void)
{
    int *p, i;
    p = &i;
    printf("p = %p\n", p);
    printf("&i = %p\n", &i);
    return 0;
}

上記をコンパイルして実行すると以下の通りとなる。

# ./a.out
p = 0x7fff535df83c
&i = 0x7fff535df83c

C言語: メモリーのアドレスを知る。

変数が格納されている、メモリ上のアドレスを知るには printf%p で表示できる。

変数には、&をつける。配列のアドレスを知りたい場合は、&は不要。

#include <stdio.h>

int main(void)
{
    int i1, i2, i3;
    printf("i1(%p)\n", &i1);
    printf("i2(%p)\n", &i2);
    printf("i3(%p)\n", &i3);

    int array[10];
    printf("array___(%p)\n", array);
    printf("array[0](%p)\n", &array[0]);
    printf("array[1](%p)\n", &array[1]);
    printf("array[2](%p)\n", &array[2]);
    return 0;
}

コンパイル後、実行結果。

# ./a.out
i1(0x7fff510de818)
i2(0x7fff510de814)
i3(0x7fff510de810)
array___(0x7fff510de820)
array[0](0x7fff510de820)
array[1](0x7fff510de824)
array[2](0x7fff510de828)

10進数にすると、4バイトで区切られていることがわかる。 これは、int型が4バイトであるため。

C言語のキーボードからの文字列の入力

C言語で、キーボードからの文字列の入力を処理するには、 scanf を使う。

#include <stdio.h>

int main(void)
{
    char str[32];
    scanf("%s", str);
    printf("%s\n", str);
    return 0;
}

上記ファイルを作成して、gcc or ccコンパイルしたのちに実行する。 入力待ち受け状態になるので、入力してエンター。

文字が表示されることを確認。

C言語のプロトタイプ宣言

自作関数を作成する。 sum関数を作成する。

#include<stdio.h>

int main(void)
{
    sum(); /* sum関数を呼び出す */
    return 0;
}

int sum(void)
{
    printf("%d\n", (1 + 100) * 100 /2);
    return 0;
}

これをコンパイルしてみると以下のようなエラー。

sample2.c:6:5: warning: implicit declaration of function 'sum' is invalid in C99 [-Wimplicit-function-declaration]
    sum(); /* sum関数を呼び出す */
    ^
1 warning generated.

sum関数がmainより後ろに記述されているため、エラーとなった。このエラーを解決するには、最初にこの関数が存在することを明記する必要がある。 以下の通り記述する。

#include<stdio.h>

int sum(void); /* プロトタイプ宣言 */

int main(void)
{
    sum(); /* sum関数を呼び出す */
    return 0;
}

int sum(void)
{
    printf("%d\n", (1 + 100) * 100 /2);
    return 0;
}

そして、コンパイルすると成功した。