C言語スタートアップ勉強会に行ってきました。
プログラム言語や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画面
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]