C言語スタートアップ勉強会に行ってきました。


cstartupC言語スタートアップ勉強会に行ってきました。

プログラム言語やArduinoを触っているとC/C++言語影響下の話が出てくるので、勉強会に行ってきました。

自分一人だとなかなか難しかったのですが、第一歩を踏み出すことができました。さらに本やネットで勉強を進めることができそうです。
第二回も予定されているようなので、また参加したいと思います。

北神先生、ありがとうございました!
http://kitagami.org/

以下、習ったことのメモです。
主に自分向けなのでわかりにくいとは思いますが、仕様なのでご容赦ください。
実感としてこのあたりが一番躓きやすいポイントなので、自分的には最重要メモです(笑)。

コンパイラ

MinGWを使う。
http://sourceforge.net/projects/mingw/

mingw-get-inst-20120426.exe
http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/mingw-get-inst-20120426/mingw-get-inst-20120426.exe/download

MinGWはGNUのコンパイラのWindows版

インストール時、Select Componentsでは、MinGW Developer ToolKitも含んでおく。

エディタ

なんでも良いけど、今回はTeraPadを使ってみる。

Hallo World画面

c2

Hello World

[code lang=”c”]
#include<stdio.h>
main(){
printf("Hello World");
}
[/code]

保存場所

C:\MinGW\msys\1.0\home\mba7の下に保存。
結果
C:\MinGW\msys\1.0\home\mba7\test.c

MinGW Shell

ls ファイル表示
cd(dir) 移動
ctrl+c 終了(interrupt)

コンパイル

MinGW Shellで「gcc test.c」すると、a.exeが生成される。
makeでコンパイルと実行を同時に行えるけど、今回は割愛。

アセンブラ

MinGW Shellで「gcc -S test.c」すると、test.sが生成される。
テキストエディタで開くとアセンブリを確認できる。
[code]
.file "test.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "Hello World\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB6:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
call ___main
movl $LC0, (%esp)
call _puts
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE6:
.def _puts; .scl 2; .type 32; .endef

[/code]

動作確認

MinGW Shell「a.exe」

改行

test.c
[code lang=”c”]
#include<stdio.h>
main(){
printf("Hello World\n");
}
[/code]

ビープ音

test.c
[code lang=”c”]
#include<stdio.h>
main(){
printf("Hello World\a");
}
[/code]
\aのところで、「ピッ」という音が鳴る。

特殊文字

http://www.cppdrive.jp/cstart/num/index5.html

stdio.h

スタンダードIOヘッダ
printfなどが定義されている。

コメント

//
または
/*
*/

警報音

test.c
[code lang=”c”]
//#include<stdio.h>
main(){
printf("Hello World\a");
}
[/code]
stdio.hにはprintf()があるので
コメントにすると警告が出る。

for文

[code lang=”c”]
#include<stdio.h>
main(){
int i;
for(i=0;i<10;i++)
{
printf("Hello World\n");
}
}
[/code]

一行の場合forの{}を省略できる
[code lang=”c”]
#include<stdio.h>
main(){
int i;
for(i=0;i<10;i++)
printf("Hello World\n");
}
[/code]

printfのフォーマット

http://www.cppll.jp/cppreference/stdio_details.html#printf
[code lang=”c”]
#include<stdio.h>
main(){
int i;
for(i=0;i<10;i++)
{
printf("Hello World %d",i);
printf("\n");
}
}
[/code]

三桁

[code lang=”c”]
#include<stdio.h>
main(){
int i;
for(i=0;i<10;i++)
{
printf("Hello World %03d",i);
printf("\n");
}
}
[/code]

複数の値

[code lang=”c”]
#include<stdio.h>
main(){
int i;
int j = 5;
for(i=0;i<10;i++)
{
printf("Hello World %d %d",i,j);
printf("\n");
}
}
[/code]

if文

[code lang=”c”]
#include<stdio.h>
main(){
int i;
for(i=0;i<10;i++)
{
if(i==4)
printf("i=%d\n",i);
}
}
[/code]

else if文

[code lang=”c”]
#include<stdio.h>
main(){
int i;
for(i=0;i<10;i++)
{
if(i==4)
printf("i=%d\n",i);
else if(i==6)
printf("i=%d\n",i);
}
}
[/code]

else if文2

[code lang=”c”]
#include<stdio.h>
main(){
int i;
for(i=0;i<10;i++)
{
if(i==4)
printf("OK\n");
else if(i==6)
printf("BAD\n");
else{
printf("i=%d\n",i);
}
}
}
[/code]

関数

[code lang=”c”]
#include<stdio.h>
void upcnt(int n);
void downcnt(int n);

main(){
int p = 0;
while(p < 5)
{
upcnt(5);
downcnt(10);

p ++;
}
}
void upcnt(int n){
int i;
int j;
for(i=0;i<n;i++){
for(j=0;j<i+1;j++){
printf("*");
}
printf("\n");
}

};
void downcnt(int n){
int i;
int j;
for(i = n;i>0;i–){
for(j=0;j<i;j++){
printf("*");
}
printf("\n");
}
};

[/code]

関数の帰り値

[code lang=”c”]
#include<stdio.h>
int upcnt(int m, int n);
int downcnt(int m, int n);
main(){
int a = 0;
int p = 0;
while(p < 2)
{
a = upcnt(a,a+10);
printf("%d\n",a);
a = upcnt(a,a+10);
printf("%d\n",a);
a = downcnt(a,a-10);
printf("%d\n",a);

p ++;
}
}
int upcnt(int m, int n){
int i;
int j;
for(i=m;i<n;i++){
for(j=0;j<i+1;j++){
printf("*");
}
printf("\n");
}
return i;
};
int downcnt(int m, int n){
int i;
int j;
for(i = m;i>n;i–){
for(j=0;j<i;j++){
printf("*");
}
printf("\n");
}
return i;
};
[/code]