構造体は初期化することが出来る。 例えば一度に全て0を入れたい場合、memset関数を使う。 #ifndef KOUZOUTAI_H #define KOUZOUTAI_H typedef struct p_kouzoutai { char *a; char *b; char *c; }POINT; typedef struct a_kouzoutai { char a[10]; char b[1…
少し難しいが非常に有用なプログラム。 #include<stdio.h> #include<string.h> int list(void) { printf("func list\n"); return 1; } int show(void) { printf("fanc show\n"); return 1; } int quit(void) { exit(0); } struct command{ char *com_str; int (*com_func)(void)</string.h></stdio.h>…
メンバに文字列をコピーする。なお上で作成したヘッダファイルkouzoutai.hを使う。 #include<stdio.h> #include<string.h> #include "kouzoutai.h" int main(void){ struct p_kouzoutai copy; strcpy(copy.a,"testcopy"); printf("%s\n",copy.a); } 結果 異常終了 <|| 結果うま</string.h></stdio.h>…
struct p_kouzoutai { char *a; char *b; char *c; } と struct a_kouzoutai { char a; char b; char c[]; } の違いは何だろうか?関数とポインタの項でやったが大きさ分のメモリを取るのが配列でアドレス分だけを取るのがポインタである。 早速見てみると、…
もし、コードが複数ファイルにまたがっていた時、プロトタイプ宣言はどこでするのか。 答えから言うとヘッダファイルにするべきである。 そして、その関数を使う全てのコードファイルにそのヘッダをインクルードする。そうすれば仮にaというファイルのafanc…
関数を理解するには何といってもスタック(メモリ)の動作である。 詳しくはスタックの項にあるが、 void B(int b,int c) { int d=4; } void A(void) { int a=1; B(2,3); } このような関数を呼び出したときに | | | | | | |4 |d |復帰情報 |2 |b …
プロトタイプ宣言に並んでヘッダファイルを作成する価値のあるものは構造体である。 構造体のヘッダファイルの書き方にはコツがある。 #ifdef KOUZOUTAI_H #define KOUZOUTAI_H typedef struct p_kouzoutai { char *a; char *b; char *c; }POINT; typedef st…
mallocを使って行う典型的な仕事はエラーを処理することである。 メモリが足りないときに対処するわけですが、処理をするのにもメモリが必要になるわけです。 そこでmallocであらかじめ無駄なメモリを確保しておいていざとなったらfreeする。 という方法がと…
メモリを管理するというのは重要である。 メモリを管理しなくてもプログラムは作れる。 だが、オーバーフローの原因となったり柔軟性が無くなったりメモリを無駄に取ってしまったりと公開するには支障が出る。 そこで考え出されたのは「○○個までのデータが扱…
constとは変数を読み込み専用にするために使うものです。 #include<stdio.h> main(){ const int i=432526; i=536; printf("%d",i); }エラー E2024 const.c 4: const オブジェクトは変更できない(関数 main ) と怒られてしまった。関数の引数として使うときに書き方に</stdio.h>…
初心者がつまづきやすいこの問題は、まず 配列の初期化と代入は別物であるという認識から始めようと思う。 #include<stdio.h> main(){ char a[]="ABCDEF"; int i; for(i=0;a[i]!=0;i++) printf("%c",a[i]); printf("\n"); } 結果 ABCDEF非常に脆弱性を抱えているがひ</stdio.h>…
配列 配列を出力するとなると大体こんな風に書く。 #include<stdio.h> #define size 10 main() { int i; int array[size]={232,21,4,142,412,532,643,745,12,543}; for(i=0;i<size;i++) printf("%d\n",array[i]); }ではこの時メモリ上ではどうなっているのだろうか? %pで表してみると #include<stdio.h> #define size 10 main() { int i; int array[size]; for(i=0;i</size;i++)></stdio.h>
型とはメモリ領域をどれくらい取るかというのをコンパイラに教えるためのものである。 型を知る上で非常に重要な機能はsizeofという命令。sizeofで得られた結果はsize_t型になる。 #include<stdio.h> int main(){ printf("char =%u\n",sizeof(char)); printf("short =</stdio.h>…
typedefは型を自分の好きな名前で宣言するときに利用するもので、 たとえばunsigned longが書くのがめんどうくさいのでulongとかに変えて ulong a;とか宣言することでunsigned longを意味するようにします。 具体的な書き方は #include<stdio.h> main(){ typedef unsi</stdio.h>…
#include<stdio.h> main() { int a=0x12345678; int i; unsigned char *p=(unsigned char*)&a; for(i=0;i<4;i++) { printf("%x\t",p[i]); } puts("\n"); } 実行結果 78 56 34 12 0x123・・と%xはどちらも16進数であるということである。 現在のCPUは32bitベースが殆</stdio.h>…
メモリ さて、すべてのプログラムはメモリ上にデータをのせて実行するわけなのだが、 プログラム全体には5つの領域(セグメント)に分けられて実行される。 スタックもその1つである。 -1テキストセグメント(コードセグメント) ここにマシン語で記述されたプ…
前日記憶クラスの実践的な基本を載せた。 今日はもう少し詳しい内容を載せる。一般的な変数にはローカル変数とグローバル変数がある。 ローカル変数はコードブロック(分かりやすくいうと{ }←この中の部分)の先頭で宣言することができる その寿命はコード…
そもそも宣言とは ・register static extern等の記憶域クラス指定子(Storage Class Specifiers) ・const等の型修飾子(Type Qualifiers) ・int char float long等の型指定子(Type Specifiers) ・a i m等の宣言子(Declarators) ・inti=0;とかするとき…
記憶クラスにはauto,register,static,externがある。 どこに変数を入れたいかで使い所が違う。「auto」は一般的な変数で通常は記述しない。 大抵はこれにintやcharをつけてauto int a;とか宣言するのを省いてint a;とか書いている。 関数の中で宣言され、そ…
void sort(int input[],int output[],int size) { int i,j; int flg=1; int temp; for(i=0;i<size;i++) {output[i]=input[i];} for(i=size-1;i>=0&&flg==1;i--) { for(j=0;j<i;j++) { if(output[j]>output[j+1]) { temp=output[j]; output[j]=output[j+1]; output[j+1]=temp; flg=1; } else {flg=0;} } } } どれも数分で書いたのでバ</i;j++)></size;i++)>…
void sort(int input[],int output[],int size) { int i,j; int minNo; int temp; for(i=0;i
一番好きなソート。挿入するときにずらすための変数kは後ろから順に入れ替えると言うところがミソ そうすればスムーズにずらすことが出来る。 void sort(int input[],int output[],int size) { int i,j,k; int temp; for(i=0;i<size;i++) {output[i]=input[i];} for(i=1;i<size;i++) { for(j=0;j<i&&output[i]<output[j];j++); if(j<i) { temp=output[i]; for(k=i-1;k>=j;k--) {output[k+1]=ou…</size;i++)>
void sort(int input[],int output[],int size) { int i,j; int h=size/2; int temp; for(i=0;i<size;i++) {output[i]=input[i];} while(h>=1) { for(i=0;i+h<size;i++) { for(j=i;j>=0&&output[j]>output[j+h];j-=h) { temp=output[j]; output[j]=output[j+h]; output[j+h]=temp; } } h=h/2; } }</size;i++)></size;i++)>
覚えてしまえば一番よく使うと思われるソート。 個人的には基本ソートの中ではマージソートに続いて難しい。 void qsort(int data[],int start,int end); //*プロトタイプ宣言*// void sort(int input[],int output[],int size) { int i; for(i=0;i
これがアルゴリズムによってソートされる検体 inputから適当な数を入れて sort関数に繋げてoutputへ出力するだけのプログラム。 #include<stdio.h> #define N 8 void sort(int input[],int output[],int size); main(){ int i; int input[N]={21,124,523,1,5,2,463,35</stdio.h>…