プログラミング言語/C
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
//**今はVisual 2010のベータ版がでてるぞ。 [#g1dcf1c2]
//**さっさとDLしろクズども [#w55754a9]
//↑初心者にベータ版勧めんな
*はじめに [#oebef9d9]
-最初はなんだたっけな
-HelloWorldだっけ?
-ある程度教える事はできるけどどうすれば見やすいのか分から...
-最初に書き方だけ書いてくれたらあとはその書き方で追加して...
-間違ってるところがあったら遠慮なく修正してくれるとありが...
-[[FAQも作ってみた>C言語 - よくありそうな質問]]
// いきなりハローワールドがあって、次に関数ポインタが来て...
// bccやgcc導入を読んでくれない人も多いかなと思って編集
// 記述古いから環境設定一旦コメントアウト
//*インストール(環境設定) [#rc229ddb]
//以下では例として3種類のコンパイラを挙げていますが''どれ...
//また、すでに他のコンパイラが入っている場合は無視しても...
//Windowsなら特に理由がないかぎり最初のもの(BCC)をお勧め...
//**Borland C/C++ Compiler [#ncc2ffc0]
//導入方法。
//
//まず、コンパイラを導入しよう。
////[[C++ Compiler 5.5/Turbo Debugger:http://www.codegear...
////FreeCommandLineTool2.exeなんて名前で落ちてくるはず。
////自己解凍形式のソレを実行し、インストールする。
//
////デフォルトの位置はC:\borland\bcc55のはずだ。~
////これでコマンドプロンプトからコンパイルできるようにな...
////ただ、これだけでは一々コマンドプロンプトを開いたり、...
//[[C++ Compiler 5.5/Turbo Debugger:http://www.codegear.c...
//住所などを聞かれるが、適当なものでおk。ただし、解凍パ...
//
//また、[[Visual Windows for BC++:http://www.vector.co.jp...
//[[Turbo Explorer:http://turboexplorer.com/jp]]からコン...
//Turbo Explorerの場合はコンパイラのバグがいくつか修正さ...
//ただし、いらないものを色々インスコさせられたり、IDEが糞...
//
////しかし、コマンドプロンプトの扱いは重要なので疎かにし...
//
//CPadというツールも導入しよう。(現在のCPadの在り処は[[公...
//具体的な場所は以下のようだよ!~
//http://6005.teacup.com/kitobbs/bbs?BD=16&CH=5&M=ORM&CID...
//
//CPad自体は解凍しただけで使えるC言語用のエディタだ。
//CPadアプリケーションを統合開発環境と呼ぶ。詳しくは[[プ...
//コマンドプロンプトを開かずともエディタから直接コンパイ...
//ただ、上述のとおり、プログラミングをする上でコマンドプ...
//面倒でも必ず統合開発環境を使ってコンパイルする前にコマ...
//ただし、別にコマンドプロンプトについてはスルーしてもC言...
//
//そして、エディタの設定の中にコンパイラのパスを指定する...
//デフォルトだとC:\borland\bcc55\bin\bcc32.exeなはずだ。...
//
//コマンドプロンプトからbcc32 hoge.cのようにコンパイルす...
//
// -----その他のツール-----
// setbcc(BCCセットアップお助けツール)
// http://www.cmagazine.jp/setbcc.html
// http://www.vector.co.jp/soft/win95/prog/se149182.html
//
// BCC Developer(無料BCCをIDEにしてしまう)
// http://www.hi-ho.ne.jp/jun_miura/bccdev.htm
//
// Visual Windows for BC++(Borland C++ Compiler 5.5付)
// http://www.vector.co.jp/soft/win95/prog/se326602.html
//
//Borland C++ Compiler 5.5の使い方については 『[[Borland ...
//
//**Visual Studio Express [#n52444a0]
//***VC 2008 Express Edition [#l7d7fb6d]
//[[Visual Studio 2008 Express Editions:http://www.micros...
//>
// Visual C++ はよりパワフルで柔軟な開発環境を提供し、
// Windows ネイティブなアプリケーションやおよび 3D の2Dゲ...
// Win32 API を完全活用したアプリケーションを作成できる
// Windows Platform SDK も同梱されています。
//
////**だけど今は2010のベータバージョンがある。どうせ無料...
//// ベータ版の位置づけを考えろ。機能の問題じゃないだろ。...
//// 見出し要素などWikiの編集も分らずに適当な事を書くんじ...
//// 煽り文句書き殴るんじゃなくてちゃんと情報載せろ。/項...
//
//:Web インストール版|
//[[Visual Studio 2008 Express Editions:http://www.micros...
//::[[はじめての方のための Visual C++ 2008 Express Editio...
//中盤の 『時計を作ってみましょう』 は飛ばしてページの終...
//
//:オフライン インストール版|
//[[Visual Studio 2008 Express Edition の DVD イメージか...
//
//Webインストール版、オフラインインストール版 どちらか一...
//
//
//***VC 2005 Express Edition [#ja8dc75c]
//[[Visual Studio 2008 Express Editions:http://www.micros...
//>
// Visual Studio 2005 Express Edition 提供終了のお知らせ
//
// Visual Studio 2005 Express Edition の提供を 2009 年 3 ...
// Visual Studio 2008 Express Edition は継続して提供いた...
// 今後は最新の開発環境をご活用ください。(2009 年 3 月 12...
//
//
//
//// CD(.iso)イメージをダウンロード
////http://www.microsoft.com/japan/msdn/vstudio/express/m...
//// Webからインストール
////http://www.microsoft.com/japan/msdn/vstudio/express/v...
//// CDイメージはdeamontoolを使用する、または、CDに一旦焼...
//// Webからインストールより厄介なんだけど、
//// Webからインストールする方法だと、"ちょっとした個人情...
//
//http://www.microsoft.com/japan/msdn/vstudio/express/200...
// これをやっておくと、Windowアプリケーションが作りやすく...
// というか、やんないと悩むこと請け合いだから、やっとけ。...
//
//''公式での提供は終了しているものの以下ブログで紹介され...
//http://winmac.blog33.fc2.com/blog-entry-64.html
//
//***[[Microsoft Visual Studio 2010:http://www.microsoft....
//%%現在のバージョンは Beta 2です。(2009年12月29日現在)...
//%%ベータ版はあくまで評価用であって初心者向けではありま...
//%%利用の際には十二分に注意して下さい((参考:[[Visual St...
//
//以下より正式版をダウンロード可~
//http://www.microsoft.com/japan/msdn/vstudio/express/def...
//ブラウザの日本語の言語設定を削除している、または優先順...
//http://search.microsoft.com/?mkt=en-USに飛ばされてダウ...
//
//-ブラウザの言語設定について
//--Internet Explorer7及び8(6と9も方法は同じ)~
//"Internet Explorer に言語を追加するには"を参照~
//http://windows.microsoft.com/ja-JP/windows-vista/Change...
//
//--Internet Explorer9~
//"Internet Explorer に言語を追加するには"を参照~
//http://windows.microsoft.com/ja-JP/windows-vista/Change...
//
//--Firefox4~
//ツール→オプション→コンテンツ→言語設定~
//
//--Opera~
//http://jp.opera.com/browser/tutorials/settings/#language
//
//--Google Chrome~
//"ウェブページの言語設定"を参照~
//http://www.google.com/support/chrome/bin/answer.py?hl=j...
//
//**Cygwinによる「gcc30秒HelloWorld!」 [#mef1e506]
//***GCC(Cygwin)の導入方法 [#kf705dc8]
//''※初心者非推奨!!''~
//[[詳しい導入法>GCCを使うためのCygwinのセットアップ]]~
//コレ入れればココで扱うコンソールベースのテストプログラ...
//***ソース生成から実行まで [#i06fc3b3]
//デスクトップ上に生成された「Cygwin(又は'Cygwin BASH She...
//(コンソールへのコピペはコンソールウインドウ上で右クリ...
// echo -e "#include <stdio.h>\nint main(int argc ,char *...
// echo -e "CC=gcc\n\nALL : test.exe\n\ntest.exe : test.c...
// make
// ./test.exe
//これだけでソースの生成から実行結果の確認まで可能。環境...
*HelloWorld [#odc80b47]
まずは"HelloWorld"と表示するプログラム。
#include <stdio.h>
int main(void){
printf("HelloWorld\n");
return 0;
}
メモ帳で保存してコンパイラに食わせるなり、なんなりして実...
HelloWorld
が表示される。「つまらんソフトだな」なんて思うことなかれ。...
ではひとつずつ見ていこう。
#include <stdio.h>
これは、コンパイラに対するもので、「stdio.hというファイル...
stdio.hとは「○○関数( { ~ } までの命令のこと)はこういうも...
stdio.hには基本的な関数がたくさん入っているので初心者から...
int main(void){
○○
△△
}
C言語のプログラムは、main関数に書かれた命令が真っ先に実行...
上記のコードでは○○や△△がmain関数の中身であり、○○や△△が真...
printf("HelloWorld\n");
これは「("")の中のものを表示する」という関数だ。~
だが、「HelloWorld\n」とではなく、"HelloWorld"と表示される。~
「\n」とは「エスケープシーケンス」と言う記号の一種で、「改行」...
「エスケープシーケンス」とは文字では表せない特殊なものを記...
それから、1つの命令の終わりには;(セミコロン)を必ずつける。
return 0;
この行は今のところプログラムの終わりに書くものと思ってお...
本来はちゃんとした意味があるのだが、それは今の段階では難...
関数の概念を理解すれば自然と分かるようになる。
*C言語におけるスペースと改行 [#wbce115d]
C言語ではスペース、改行は殆ど意味を持たない。~
しかし、書いた本人以外の人が見ても見やすい・修正しやすいコ...
前回の「Hello World」では
int main(void){
printf("HelloWorld\n");
return 0;
}
というコードを書いたと思うが、main関数を下記のように書い...
int main(void){printf("HelloWorld\n");return 0;}
しかし、これでは見づらい。~
よって、C言語にはスペース・改行に関する明確な書式はないが...
例として下記のコードを記述した。
int main(void)
{
printf("VIPWorld!\n");
○○
{
××;
□□
{
☆☆;
}
}
}
ご存知のとおり、全く問題はない。しかしmain関数の中に中括...
そこでスペースを利用して下記のように書くと、
int main(void){
printf("VIPWorld!\n");
○○{
××;
□□{
☆☆;
}
}
}
幾分かみやすくなった。どの中括弧に何が入っているのかが分...
スペース入れ放題、といっても以下の場合エラーが出る
p r i n t f ( " hello world " );
関数名、後に出てくる変数名などにスペースを入れてはいけな...
printf ( " hello world " ) ;
↑これならOKである~
他の言語では、改行、スペースに明確な決まりがあるものも多...
そんな場合でも有効だ。~
上述のとおり、明確な決まりというものはない。自分で見やす...
*変数と計算 [#o8d9f2b9]
**変数とは [#kd6a6673]
毎回同じ文字列を出力するだけなら、プログラムどころか判子...
今回は加減乗除( + - ÷ × の4つ)をするプログラムを作る。~
今回扱う「変数」はとても重要なのでしっかり覚えよう。
#include <stdio.h>
int main(void){
int wa;
int sa;
int seki;
int shou;
wa = 10 + 5;
sa = 10 - 5;
seki = 10 * 5;
shou = 10 / 5;
printf("和=%d ", wa);
printf("差=%d ", sa);
printf("積=%d ", seki);
printf("商=%d\n", shou);
return 0;
}
CPUは物覚えが悪いので、単純な足し算でも答えを書き留めて置...
この入れ物のことを変数と呼ぶ。~
ここでは、和、差、積、商それぞれの答えを置く4つの変数を作...
変数にはいろんな種類があるが、今回作るのは整数用の入れ物...
例として、下記のソースを見てほしい。~
int x;
intは整数用(正式には整数型)を表し、上記のソースはxという...
従って、4行目は「整数型の変数waを作る」という意味。
5~7行目も同様に整数型の変数sa、seki、shouを作っている。...
ついでに、4~7行目までは以下のように省略することも出来る。
int wa, sa, seki, shou;
ちなみに今は「変数を作る」と書いたが、正しくは「変数を宣言す...
9~12行目では実際に計算を行う部分。C言語で計算する場合、...
1行目は「変数waに10+5の答えを入れる」と言う意味になる。~
これも実は変数の宣言と同時に行うことが出来る。~
int wa = 10 + 5;
そして14~17行目で計算した結果を表示する。~
例として下記のコードを見てほしい。
printf("%d",x);
上記のコードは「%dにxの中身を表示する」という意味になる~
つまり、14~17行目では変数(wa, sa, seki, shouそれぞれ)を"...
従って、waの中身である("10 + 5"の計算結果)15が"和=%d"の"...
ついでに14~17行目は下記のように省略することが出来る。
printf("和=%d 差=%d 積=%d 商=%d\n", wa, sa, seki, sh...
よって実行結果は
和=15 差=5 積=50 商=2
となるはずだ。前述のとおり、変数は重要だからしっかりマス...
**変数の型 [#r244da95]
今やったプログラムで、 int というのが出てきました。~
これは簡単に言えば「変数の種類」を表し、これを''変数の型'...
変数はその型によって代入できるものが決まっています。'''(...
では、変数の型にはどんなものがあるのか一覧にまとめておき...
|型名|入れられるもの|使用例|サイズ|
|BGCOLOR(pink):int|BGCOLOR(pink):整数|BGCOLOR(pink): int ...
|BGCOLOR(pink):char|BGCOLOR(pink):文字または整数|BGCOLOR(...
|BGCOLOR(pink):float|BGCOLOR(pink):小数|BGCOLOR(pink): fl...
|BGCOLOR(pink):double|BGCOLOR(pink):小数|BGCOLOR(pink): d...
|short|整数| short sh = 10; | 2バイト |
|long|整数| long l = 10; | 4バイト |
|long long|整数| long long ll = 10; | 8バイト |
|long double|小数|long double ld = 3.14; | 12バイト |
ところで、表のなかに「サイズ」という項目がでてきました。...
サイズがnバイトの整数型には、-2^(n*8 -1) ~ 2^(n*8 - 1) -...
例えば、int型なら、n = 4 なので、-2^31 0 2^31 - 1 までで...
小数型については難しいのでここでは省きますが、通常double...
''(要は、初心者のうちは整数なら int、小数なら double を使...
注意
-ここで示した「サイズ」は一般的な値です。一般的ではない環...
-コンパイラによっては、(内部処理をすべてint型で行うため...
*繰り返し [#j8065196]
今回は繰り返し同じ処理を実行したいときに使うループ制御。~
コードを簡潔にすることが出来るが、下手に使うと無限ループ...
注意しよう。
**For文 [#afbaa9f2]
最も使われていると思われるFor文。~
下記のソースを見てほしい。
#include <stdio.h>
int main(void){
int i;
for ( i = 0 ; i < 5 ; i++ ) printf( "ただいまループ%d...
printf( "ループから抜けました。\n" );
return 0;
}
新しく出てきた「For」だが、これで同じ動作を繰り返すことが出...
for ( × = 0 ; × < ○ ; ×++ ) ☆☆;
上記のコードで繰り返すことが出来る。~
「 × = 0 ; 」というのは変数の初期化だ。変数に0を代入してい...
「 × < ○ ; 」というのは処理を続けるための条件である。×が○未...
そして「 ×++ 」だが、処理が終わったあとに行う文である。~
i++ は「iを1増やす」という意味なので、総合すると7行目は「i...
ということになる。~
ここで注目してもらいたいのは、printf関数の引数にiを使って...
iは繰り返しの度に動的・規則的に変化していくから、iを使うこ...
従ってこのコードの実行結果は、
ただいまループ1回目です。
ただいまループ2回目です。
ただいまループ3回目です。
ただいまループ4回目です。
ただいまループ5回目です。
ループから抜けました。
となる。~
注
-処理の途中で抜け出したい場合は break; と記述すればループ...
-i++ の他に、i-- もあり、これは「iを1減らす」という意味で...
***条件の書き方 [#n77d8a9a]
for文の条件には、次のようなものを入れられる。これは後に出...
|条件の例|意味|
| i < 10 | iが10未満 |
| i <= 10 | iが10以下 |
| i > 0 | iが0より大きい |
| i >= 0 | iが0以上 |
| i == 2 | iが2と等しい |
| i != 2 | iが2と等しくない |
| i>0 && i<10| iが0より大きく、かつ10より小さい |
| i>=20 || i<=-20 | iが20以上、またはマイナス20...
特に5番目のものは i = 2 と書いてしまいがちなので注意が必...
これ以外にも、実は条件には「式であればなんでも入れられる...
**While文 [#bbc83549]
whileを使うことでも繰り返し処理が出来る。~
(例)
#include <stdio.h>
int main(void)
{
int i = 0;
while( i < 5 )
{
printf( "ただいまループ%d回目です。\n", (i+1) );
i++;
}
printf( "ループから抜けました。" );
return 0;
}
whileの基本的な文法は以下のとおり。
while (条件) { 処理 }
条件というのはループを続けるかどうか判定するためのもので...
例ではint型の変数iの値が5未満の場合、処理を行うということ...
#iが5未満かどうか調べる(5未満なら処理を行い、5以上ならル...
#printf( "ただいまループ%d回目です。", i );を実行
#i++を実行
#1に戻る
従って実行結果は
ただいまループ1回目です。
ただいまループ2回目です。
ただいまループ3回目です。
ただいまループ4回目です。
ただいまループ5回目です。
ループから抜けました。
となる。~
While文もForと同様にbreakを使うことが出来る。
**ForとWhileの違い [#kc367617]
For文とWhile文は文法も違うのだが、For文は主に、回数が決ま...
While文の項目の例では5回と回数が決まっていたが、i++;を忘...
しかし、ゲーム制作などで半永久的に処理を続けたいという場...
while( 1 )
{
処理;
if ( 終わるための条件を書く ) break;
}
理由は難しいのでまだ書かないが1を条件にすると無限ループと...
While文ならこのような場合に便利である。
**do ~ while [#l93157c4]
forとwhile以外に、もう一つループ構文がある。~
これはマイナーだし while で簡単に置き換えらえるので特に覚...
do{
処理;
} while(条件);
この構文は、まずとりあえず 処理; を一回行う。次に条件をチ...
通常の while は初めから条件が成り立たなければ処理を一回も...
while(条件) の後の ; を忘れがちなので注意しよう。
ちなみにdo~while文にはこのような使い方もある。
#define swap(type, x, y) do { type t = x; x = y; y = t; ...
このマクロを以下のように用いて、値を交換することができる。
if (a > b)
swap(int, a, b);
else
swap(int, a, c);
これはプリプロセッサによって、次のように置換される。
if (a > b)
do { int t = a; a = b; b = t; } while(0);
else
do { int t = a; a = c; c = t; } while(0);
仮にこのマクロをこのように定義すると
#define swap(type, x, y) { type t = x; x = y; y = t; }
このように置換されることとなる。
if (a > b)
{ int t = a; a = b; b = t; };
else
{ int t = a; a = c; c = t; };
これは以下のような構造を持つ。なぜならばセミコロンを空文...
if (expr)
stmt
stmt
else
stmt
したがってブロックのないif文ではコンパイルエラーとなる。
*入力 [#k2dea5c7]
キーボードから文字、数字の入力を求め、処理します。~
これにより、プログラムの幅が飛躍的に広がります。~
以下のコードを見てください
#include <stdio.h>
int main(void) {
int x,y;
printf("Xを入力してください\n");
scanf("%d",&x);
printf("Yを入力してください\n");
scanf("%d",&y);
printf("XとYの和は%dです",x+y);
return 0;
}
今回新しく出てきた「scanf」ですが、scanf関数を使うことによ...
scanf("%d",&x);
上記の式は、「xという変数に整数型として入力された値を代入...
scanf関数を使う時に最も気をつけるべきことは、代入される変...
理由は難しいのでここでは説明しませんが、必ず付けてくださ...
従ってこのコードは7行目と10行目でキーボードから入力された...
その和をprintf関数で表示するということになります。
また、入力には getchar();やgetch();などが存在する。~
複数の文字入力ではなくて、文字を1つ入力することができる。~
ただし、getch();は#include<stdio.h>とは別に、#include<con...
具体的に説明すると~
getchar();は、1文字入力して、Enterを押すまで処理が止まる...
getch();は、1文字入力すると、すぐに反応して処理を行う。~
*条件分岐 [#s56a2a0f]
もしも○○ならば△△という処理を実行したいなんて時に使います。~
下記のコードを見てください。
#include <stdio.h>
int main(void){
int val;
printf("数を入力してください>");
scanf("%d", &val);
if( val > 0 ) printf("正の数です\n");
else if( val < 0 ) printf("負の数です\n");
else printf("0です\n");
return 0;
}
「if」というものが出てきました。ifは
if (○○) △△;
上記のコードは、「もし、○○ならば、△△を実行」という意味にな...
従って9行目は、「もしvalの値が0より大きければ、"正の数です...
次に「else」ですが、「if」の条件が満たされなかった場合にelse...
じゃあ、「○○が満たされた場合、△△と××の2つの処理を実行した...
if ○○ {
△△;
××;
}
また、8行目には「else if」という文がありますが、ただ「else」...
イメージとしては、
else {
if (○○) △△;
}
という文が、
else if (○○) △△;
という文に省略された、と考えてください。
**条件分岐(switch編) [#wafbb5d1]
さて、ifを覚えました。早速使ってみましょう。1~3の数字...
#include <stdio.h>
int main(void){
int val;
do{
printf("数を入力してください(1~3)\n");
scanf("%d", &val);
}while(val > 3 || val < 1); /* valの値が4以上か、...
if(val == 1){
(処理1)
}else if(val == 2){
(処理2)
}else{
(処理3)
}
return 0;
}
変数valの値によってifやelseを使って別の処理をしています。~
別にこのままでもいいのですが、値の範囲が広くなるにつれてi...
そこで今回のテーマ"switch"を使いましょう。switchの文法は
switch(変数){
case 値:
(処理)
(default:
(処理))
}
です。case 値: の部分はいくらでも増やせます。defaultの部...
これと先ほどのifを変えてみると
switch(val){
case 1:
(処理1)
break;
case 2:
(処理2)
break;
default:
(処理3)
break;
}
となります。今回defaultを使ったのは、このプログラムの場合...
という意味になるからです。
breakについて説明します。~
breakはこのプログラムの場合"switch文を抜ける"という処理を...
case 1:内のbreak; に到達すると、一番下の } に飛ぶといった...
もし、このbreakが無ければ次にbreakかswitch文の}が来るまで...
処理を実行してしまいます。つまり1を入力しても2や3の時の処...
なので、場合にもよりますが普通はbreakを書くようにしましょ...
*構造体 [#s56a2a0e]
そもそも構造体って何?~
たとえば君がプログラミングをしてるときに~
int man_age, man_height, man_weight;~
int woman_age, woman_height, woman_weight;~
って感じの変数を使って、男性や女性の情報を得るプログラム...
まあ男性と女性2人だけならあまり見にくいとは感じないけども...
int taroh_grade, taroh_height, taroh_weight;~
int jiroh_grade, jiroh_height, jiroh_weight;~
int saburoh_grade, saburoh_height, saburoh_height;~
見たいな感じにしなきゃそしたら面倒でしょ。~
でもこの中の成績、身長、体重って三人とも共通するデータだ...
だからこれをまとめちゃうんだよ。それが構造体。~
具体的には~
struct stat {
int grade;
int height;
int weight;
};
と言う感じで成績、身長、体重をstatという名前でまとめられ...
ちなみにこれを変数として使いたい時は~
struct stat taroh, jiroh, saburoh;
見たいな感じでできる。~
そしてそれぞれの成績、身長、体重(これをメンバと呼ぶ)にア...
taroh.gradeという形でアクセスできる。~
taroh.grade = 120;と言う形で代入もできる。~
え?これじゃただ宣言が短くなっただけで実際ほとんど変わら...
いえいえそんなことはありません。たとえばあなたが100人分の...
1_grade, 1_height, 1_weight;~
2_grade, 2_height, 2_weight;~
3_grade, 3_height, 3_weight;~
以下省略~
なんてことしてたら確かに無理ではないけど面倒すぎて死んで...
でもこれが構造体を使うと
struct stat students[100];
これだけになります。なんとこれは99行の省略になります。~
99行書いてる間にはいろいろなことができます。だからこれは...
他にも利点はあります。~
たとえば関数を呼び出すとき~
hyper_ultra_super_function(baka, aho, doji, manuke, usero...
と言う長い引数を渡したい場合があります~
これって見にくいですよね。~
でもこのbaka, aho, doji, manuke, usero, kiero, shine, kim...
hyper_ultra_super_function_ver2(batou);
と言う感じで済みます(構造体のメンバにいちいち代入しなきゃ...
どうですか?すごいと思いませんか?~
ちなみに構造体のポインタと言うものも作ることはできます~
struct stat taroh;
struct stat *students;
taroh.grade = 4;
taroh.height = 156;
taroh.weight = 50;
students = &taroh;
と言う感じでいつも通りの代入ができます。~
しかし、studentsからメンバにアクセスする場合、students.gr...
構造体のポインタからアクセスするにはstudents->gradeという...
これが構造体と言うものです。~
*自作関数 [#dcffc8f3]
今まではmain関数の中にいろんな処理を詰め込んできたが、関...
C言語の構造化プログラミングでは関数がサブルーチンとなる。~
**関数を作る [#u2530ec0]
例として以下のコードを参照。
void hoge(void)
{
printf("関数です\n");
}
int main(void)
{
hoge();
return 0;
}
1行目から4行目までがhoge関数である。~
まず、main関数が実行される。その中の「hoge();」でhoge関数が...
void hoge()のvoidとは返り値が無いことをあらわす。~
返り値については後ほど説明する。
**プロトタイプ宣言 [#r4b770d5]
コンパイラはソースを上から順に処理していくので、作成した...
そのため、main関数より後に記述してた関数をmain関数内で使...
これをプロトタイプ宣言と言う。
(例)
#include <stdio.h>
void hoge(void); // プロトタイプ宣言
int main(void)
{
hoge();
return 0;
}
void hoge(void)
{
printf("関数です\n");
}
上記のコードではmain関数内でmain関数より後に記述したhoge...
そのため、3行目で、プロトタイプ宣言をしている。
**返り値と引数 [#x7c7256e]
関数の呼び出しの際に値(引数)を渡し、その値を使って処理す...
また、関数の終了時に任意の値(返り値)を返すことが出来る。~
(例)
#include <stdio.h>
int addition(int x, int y); //プロトタイプ宣言
int main(void)
{
int a;
a = addition( 2, 9 ); //addition関数に2と9を渡して返り...
printf( "%d", a );
return 0;
}
int addition(int x, int y)
{
return x + y; //xとyの和を返す
}
まず3行目でaddition関数のプロトタイプ宣言。~
addition関数の返り値がint型で、引数にint型の変数x,yを取る...
8行目で、int型の変数aにaddition関数の返り値を代入。~
addition関数の引数には、2と9を渡している。
ここから重要であるが、addition関数では渡された2と9をそれ...
プロトタイプ宣言などで宣言した引数はそのまま関数内で使用...
分かりにくいかもしれないが、8行目で渡された2と9がxとyに入...
ここで必ず気をつけるべきことは、~
・関数の宣言の際に宣言した引数の型と、関数呼び出しの際に渡...
・関数の宣言の際に宣言した返り値の型と関数内でreturn文を使...
//・引数を取らない関数を作るときは必ず ( ) の中にvoidを記...
// ↑スレでもちょっと出てましたが、現在では(オーバーロード...
ということである。
従って上記のコードの実行結果は、
11
と表示される。
*ポインタの基礎 [#j6f90b12]
**ご案内 [#u7bb7ad2]
なんとページ一覧を見るとポインタについて超詳しく解説され...
ということで、[[こちら>プログラミング言語/C/ポインタ]]を...
でもせっかく書いたのでこっちの説明も残しておきます・・・
**はじめに [#c27bc58a]
ついにC最大の鬼門と言われるポインタの解説です。~
でも大丈夫。''たいして難しくありません。''~
注意)'''この項目は初心者にポインタを感覚的に理解して貰う...
**アドレス [#e451da5a]
ポインタを説明する上でアドレスというものは避けて通れませ...
ではアドレスとはなんでしょうか。~
アドレス。日本語にすると住所です。つまり、~
&size(20){''アドレスとは、変数の住所のことである''};~
3回復唱してみましょう。~
''アドレスとは、変数の住所のことである''~
''アドレスとは、変数の住所のことである''~
''アドレスとは、変数の住所のことである''~
もう覚えましたね。変数が分からない人は上のほうで解説して...
ではその住所とはどんなものか見てみましょう。変数のアドレ...
&変数名
とします。例えば、int型の変数aのアドレス(=住所)なら、
&a
が、変数のアドレスを表す数字になります。~
ためしに下のようなプログラムを実行してみましょう。
#include <stdio.h>
main(){
int a = 5;
printf("%d\n", &a); /** aのアドレスを、数字として表示。...
}
実行結果
-1081884848
えっ?実行結果が例と違う?~
それはなぜかというと、変数のアドレスを何番にするかは、PC...
実行したときのPCの気分(状態)によってころころ変わります。~
でも、一回の実行中でアドレスが変わってもらっては困ります...
#include <stdio.h>
main(){
int a = 5;
int b, c;
printf("%d\n", &a);
b = 10; // なんか適当な処理
c = b * a + 2; // なんか適当な処理
printf("いろいろ処理してるうちにaのアドレスが変わったり...
printf("%d\n", &a);
}
を実行すると、
-1079031288
いろいろ処理してるうちにaのアドレスが変わったりして・・・
-1079031288
となります。2回 &a を表示していますが、もちろん値は変わり...
なぜマイナスなのか気になるって?~
これには意外と深いようでものすごく浅い事情があるのですが...
**ポインタ[#oa1e7a6e]
ではいよいよポインタの説明です。ポインタとはなんでしょう...
ズバリ言うと、~
&size(20){''ポインタとは、アドレスを入れるための変数で...
これ以上のなにものでもありません。~
intなら整数、charなら文字、と入れるものによって変数の型を...
では復唱しましょう。~
''ポインタとは、アドレスを入れるための変数である''~
''ポインタとは、アドレスを入れるための変数である''~
''ポインタとは、アドレスを入れるための変数である''~
はい、覚えましたね。~
では具体的にポインタはどうやって使うのでしょうか。~
一例として、int型変数のアドレスを入れるためのポインタを作...
int型変数のアドレスを入れるためのポインタを作るには、
int* ポインタの名前;
とします。例えば、
int* ptr;
のように。~
それでは実際のプログラムにしてみましょう。
#include <stdio.h>
main(){
int a = 5;
int* ptr; /** int型変数のアドレスを入れるためのポインタ...
ptr = &a; /** aのアドレスを入れた **/
}
このように使います。まだ何の役にも立ちませんね。~
ここでちょっと注意があります。~
世の中の9割以上の本やソースコードには、 int* ptr; ではな...
int *ptr;
と書いてあります(スペースの位置が違う)。~
これは int* ptr; と同じ意味なので慣れればどっちを書いても...
&size(20){''int* ptr; と書くことを強くすすめます''};~
これには三つほど理由があるのですが、現時点で言える理由は、~
+int *ptr; と書くと、int型の変数 *ptr に見える
+''int* という型が、int型変数のアドレスを入れるための型だ...
ということです。~
intと同様に、char型変数のアドレスを入れるためのポインタは...
またその他の型用のポインタについても、
型の名前* ポインタの名前;
で宣言できます。
**ポインタの使い道 [#a2c2261e]
さて、ポインタの概念と作り方はわかりましたが、このままで...
そこで使い道を説明していきます。~
***演算子 * について [#m6916aa3]
まず、変数の頭に & を付けるとその変数のアドレスを表したよ...
ポインタの先頭に * を付けると「''そのポインタに書いてある...
''アドレスとは変数の住所のことである''でしたから、アドレ...
「え? * ってポインタを作るときに使うやつでしょ?」はい、...
ー は普通「引く」を表すけど、「数字の前についたらマイナス...
では早く具体例をみて把握してしまいましょう。
#include <stdio.h>
main(){
int a = 5;
int* ptr;
ptr = &a; /** aのアドレスを、ptrに代入した **/
printf("%d\n", *ptr); /** 「ptrに書いてあるアドレス」に...
}
実行結果
5
~
ここで int *ptr; と書いてほしくないもうひとつの理由が出て...
上のプログラムを int *ptr; と書くと、
#include <stdio.h>
main(){
int a = 5;
int *ptr;
ptr = &a;
printf("%d\n", *ptr);
}
となります。''(ポインタを宣言するための * と、中身を得る...
しかし数学的センスのあるあなたはこう考えます。~
「そうか! *ptr が int型の変数だ と思えばいいんだ!」~
確かに5行目( int *ptr; )と7行目( printf(...) )を見るとそ...
ptr = &a;
が意味不明になります。つい
*ptr = a;
としてしまいそうです。~
これがなぜ間違いか考えてみましょう。~
5行目(int *ptr;)までの状態では、ptrには「何が入っているか...
なので、この状態で *ptr = a; とすると、「ptrに書いてある...
これはいけませんよね。
***本題 [#ufc3017d]
さて、だいぶ * の説明が長くなってしまいましたが、いよいよ...
次のコードがどんな結果を生じるか考えてみてください。
#include <stdio.h>
void inc(int x){
x = x + 1;
}
main(){
int a = 5;
inc(a);
printf("%d\n", a);
}
さてどうでしょうか?一見6が表示されそうですが、残念ながら...
学歴が低い人がinc を呼び出すと、「 x に a の値がコピー」...
例で理解しましょう。~
いま、あなたがmain関数だと思いましょう。あなたは a とい...
あなたにはincという友達がいます。あなたは彼の持っている...
そして彼が x にかいてある 5 を 6 に書き換えて、その後あ...
さて、どうなるでしょうか?~
そうです。''この方法ではaの値変わらない''のです。~
ここでポインタの登場です。上のプログラムをポインタを使っ...
#include <stdio.h>
void inc(int* x){
*x = *x + 1;
}
main(){
int a = 5;
inc(&a);
printf("%d\n", a);
}
友達のinc君が持っている int* 型の変数x(int型変数のアドレ...
この状態でincは *x に、 *x + 1 を代入します。~
*x は「xに書いてあるアドレスにある変数の、中身」でし...
(aの中身) = (aの中身) + 1;
となり、めでたくmainの持つ a が 6 に書き換わります!~
このように、ポインタは呼び出された関数から呼出し元の持つ...
**まとめ [#lb0799a6]
重要ポイントのまとめです。~
''アドレスとは、変数の住所のことである''~
''ポインタとは、アドレスを入れるための変数である''~
''*ptr とは、ptrに書いてあるアドレスにある変数の、中身...
分からなくなったときはこれを思い出してください。
**最後にちょっと注意 [#wd753712]
int* ptr; と書け と強くすすめましたが、ちょっとだけ問題が...
それは次のようにポインタをいくつかまとめて宣言する場合で...
int* a, b, c;
これは
int *a, b, c;
と同じだとみなされて、b と c はただのint型になってしまい...
int *a, *b, *c;
と書いてください。~
(本当は (int*) a, b, c; と書きたいんだけど、こうかくとキ...
*ポインタのいろいろ [#fe8e394c]
**演算子 -> について [#k44715ff]
さて、今、ある構造体と、それを指すポインタ(その構造体の...
struct PC{
double CPU_Hz;
int Monitor_size_tate;
int Monitor_size_yoko;
int HDD_GB;
};
main(){
struct PC myPC = {1.66, 1024, 1240, 500};
struct PC* PC_ptr = &myPC;
}
このとき、PC_ptr経由でmyPCのメンバにアクセスするにはどう...
printf("%f\n", PC_ptr.CPU_Hz);
こうでしょうか?~
ポインタの基礎でやった通り、PC_ptr の中には myPC のアドレ...
では構造体の本体はどこにあるかというと、「ポインタに入っ...
その中身を取得するには、演算子 * を使うのでした。なので、...
printf("%f\n", (*PC_ptr).CPU_Hz);
これで「PC_ptrに入っているアドレスにある構造体(myPC)の、C...
さて、(*PC_ptr).CPU_Hz のカッコがいるのかという問題ですが...
なぜなら、 10*1.5 を正しく 10*(1.5) と解釈( (10*1).5では...
なので、*PC_ptr.CPU_Hz とすると、*(PC_ptr.CPU_Hz) だと解...
これがどういう問題を引きこすかというと、例えば構造体がさ...
(*(*ptr1).ptr2).member
のようになり、非常に煩雑でわかりにくくなってしまいます。~
そこで、救世主 -> の登場です。~
この演算子を使うと、先ほどの例が次のようにかけます。~
printf("%f\n", PC_ptr->CPU_Hz);
これで「PC_ptrに書いてあるアドレスにある構造体の、CPU_Hz...
この演算子が威力を発揮するのは、さきほどわかりにくくなる...
ptr1->ptr2->member
カッコがなくなってスッキリしました。ポインタが何個連なっ...
(*(*(*(*ptr1).ptr2).ptr3).ptr4).member /** -> を使わない...
ptr1->ptr2->ptr3->ptr4->member /** 分かりやすい...
構造体とポインタを使ったプログラムでは、積極的に -> を使...
// 入門用とそれ以外の区切り
#br
#hr
CENTER:&color(red){ここから下は初心者の入門用ではありませ...
#hr
#br
// 入門用とそれ以外の区切り
// 自作関数の項目から外してポインタの後に移動しました
*関数ポインタ [#d011c48b]
**関数ポインタ [#d171c1de]
''(注意!)これは初学者向けではありません。最低でも関数と...
関数のアドレスを保持するポインタです。
実行する関数を動的に変えられたり、関数の配列を作ったり、...
まずは関数の宣言から見ていきます。
int MyFunc(float);
これはint型の値を返し、引数にfloat型をとる関数の宣言です...
定義時に引数名を省略しても、関数内部で使えないだけで問題...
関数ポインタは、入る関数の引数と戻り値が分かっている必要...
宣言の形は、
関数の戻り値 (*関数ポインタ名)(関数のとる引数)
です。
上記のMyFunc関数が入る関数ポインタpFuncを宣言するには、
int (*pFunc)(float);
とします。
これは、
-int型の戻り値を返す
-ひとつのfloat型が仮引数の
-"pFunc"という名前の関数ポインタ
です。
今まで秘密にしてきましたが(?)、関数ポインタは通常のポ...
入れる値とは、関数のアドレスです。
以下は関数、関数ポインタ、それへの代入の一通りの例です。
int MyFunc_1(flaot a){ return (int)a + 1; }
int MyFunc_2(flaot a){ return (int)a + 99; }
int (*pFunc)(float);
/* .... */
pFunc=MyFunc_1;
printf("MyFunc_1 %d\n",pFunc(2.0f));
pFunc=MyFunc_2;
printf("MyFunc_2 %d\n",pFunc(1.0f));
実行結果は
MyFunc_1 3
MyFunc_2 100
となります。
関数ポインタですが、変数というからには型があります。型が...
では、関数ポインタの型とは何なのでしょうか。
下のpFuncの場合、
int (*pFunc)(float);
型は
int (*)(float);
です。どう見てもアナルです。爆発はしません。
typedefの使い方は、
typedef int INTEGER;
これでintの別名"INTEGER"の完成でしたね。
よく見てください。
int INTEGER;
後ろ部分は、『int型の変数の宣言』と形が同じです。
という事は、関数ポインタのtypedefも、
『int (*)(float)型の変数の宣言』に"typedef"をくっつけたも...
つまり、下です。
typedef int (*pFunc_t)(float);
これで『int (*)(float)の別名pFunc_t』のできあがりです。
次からは、
pFunc_t pFunc;
として関数ポインタを宣言することができます。
すっきりしましたね。
通常のポインタには、多重ポインタがあります。『ポインタの...
int v=0;
int* p = &v; //int型へのポインタ
int** pp = &p; //int*型へのポインタ
int*** ppp = &pp; //int**型へのポインタ
***ppp = 99; //v = 99
関数ポインタも例外でなく、『関数ポインタへのポインタ』な...
typedef int (*pfunc_t)(void);
pfunc_t* ppfunc; //int (**ppfunc)(void)と同等
pfunc_t** pppfunc; //int (***pppfunc)(void)と同等
pfunc_t*** ppppfunc; //int (****ppppfunc)(void)と同等
int (*****pppppfunc)(void); //pfunc_t**** pppppfuncと同等
こんなに多重ポインタを作ることはまずありえませんが、『関...
関数の引数に関数ポインタのポインタを渡して見る例です。
#include <stdio.h>
int add(int x,int y){ return x+y; } //足し算をする関数
int mlt(int x,int y){ return x*y; } //掛け算をする関数
typedef int (*pfunc_t)(int,int);
void set_1(pfunc_t*f){ *f=add; return; }
void set_2(pfunc_t*f){ *f=mlt; return; }
int main(void){
pfunc_t pf;
set_1(&pf);
printf("add %d\n",pf(99,1));
set_2(&pf);
printf("mlt %d\n",pf(33,3));
return 0;
}
pfunc_t pfの宣言外部で、pfの内容を操作しています。
実行結果は次のようになります。
add 100
mlt 99
**C++に対するアプローチ [#w0199a12]
''(注意)ここはCの範囲ではありません、Cではできないことを...
いやむしろなぜCの項に用意したんだよww(関数ポインタの有...
***関数オーバーロード時の動作 [#g698fbf5]
関数Functionをオーバーロードしています。
#include <stdio.h>
void Function(long int){
printf_s("long intはintよりも大きいから豊乳じゃと!...
}
void Function(short){
printf_s("shortはintよりも小さいからは貧乳じゃと!?...
}
void Function(void){
printf_s("ツルペタ始まったな\n");
}
int main(void){
{
void (*pfunc)(short);
pfunc=Function; //コンパイル時に型が自動推論される
pfunc(short());
}
{
void (*pfunc)(void);
pfunc=Function; //コンパイル時に型が自動推論される
pfunc();
}
return 0;
}
実行結果は
shortはintよりも小さいからは貧乳じゃと!?
ツルペタ始まったな
となります。
***メンバ関数に対する動作 [#vbe096d6]
メンバ関数のポインタをとってみましょう。
class CFoo{
public:
void func_v(){
printf_s("仮想関数だと!?\n");
}
static void func_s(){
printf_s("ぼくは静的関数ちゃん!\n");
}
};
/* .... */
void (*pfunc)();
pfunc=CFoo::func_v; //ここでコンパイルエラー
CFoo::func_vはCFooのインスタンスがないと実行できない関数...
staticがないので当たり前ですね。
では以下はどうでしょうか。
インスタンスを生成してメンバ関数をとってみます。
void (*pfunc)();
CFoo a;
pfunc=&a.func_v; //error C3867 , error C2440
これもエラーです。エラー内容を見てみましょう。~
:error C3867:"CFoo::func_v"のポインタを取得したかったら"...
どうやら、ポインタを取得するには"a.func_v"ではなく、"&CFo...
でもこれではせっかくインスタンスを作ったのに意味がありま...
:error C2440:"a.func_v"は"void(__thiscall CFoo::*)()"型...
という事は"pfunc"を"void(__thiscall CFoo::*pfunc)()"と宣...
結論から言えば、理論的にはこれで解決です。コンパイルでき...
ただし、重要な問題が発生します。~
それは、この場合のpfuncは『関数ポインタ』ではなく『メンバ...
メンバポインタについては『関数ポインタのC++に対するアプロ...
追記:~
gccで同様のコードをコンパイルしたところ、
error: ISO C++ forbids taking the address of a bound mem...
Say ‘&CFoo::func_v’
とのエラーが出ます。'''(訳:ISO C++では、インスタンスのメ...
要は仕様で禁止されている、ということです。~
理由は知りません。ごめんネ
*ソケット [#f4b77e15]
そもそもソケットて何?~
皆さんはインターネットをしたことがありますよね?え、無い...
今あなたはインターネットでこのページにたどり着いたんです...
ちなみにそのインターネットと言うのは1969年にアメリカ国防...
(以下省略)~
と言うものです。~
さてここで本題のソケットですが、ソケットと言うのは簡単に...
ここでは皆さんが使っているであろうWindowsを例に説明したい...
しかし基本的にWindowsのソケット通信もUNIX系のソケット通信...
移植するのは極めて簡単です。だからこの説明も一応有用だと...
まあと言うかこの話は逆でUNIX系のOSであるBSDのソケットをWi...
というわけで本題です。~
まずWindowsでソケットを使いたい場合は~
winsock2.hとWSock32.libをリンクする必要があります。~
そしてプログラムの先頭でWSAStartupと言う関数を実行する必...
これはWinsockをスタートアップする関数です。~
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
という引数を取ります。第一引数のwVersionRequestedはWinsoc...
もしwinsock2.hの2に疑問持った人が居られたらあなたは実にセ...
この2はバージョンをあらわしているんです。
では具体的にこの引数には何を渡せば良いのか。~
winsock2の2がバージョンのことだってあんたさっき言ったじゃ...
と思うかもしれません。でも実際には下位互換性というものが...
もちろんその逆はできません。~
ではとりあえず第一引数には何を指定すれば良いかと言うと、M...
ん?と思った方が居るかもしれません。どうしてバージョン指...
答えはwVersionRequestedにはWORD型の変数で上位バイトにマイ...
そしてこのMAKEWORDでは上位バイトと下位バイトをそれぞれ設...
#define MAKEWORD(a, b) ((WORD)(((BYTE)((DWORD_PTR)(a) & ...
という形で宣言されてます。というわけでこのように指定でき...
それでは次の引数のlpWSADataですがこれはソケットに関する情...
つまりWSAStartupを使うには
WSADATA wsadata;
WSAStartup(MAKEWORD(1, 1), &wsadata);
と言う感じです。~
ちなみに0なら失敗です。~
これでWinsockが使えるようになりました。~
続きはまた今度~
*How to talk 2ch [#f4b77e17]
やあやあ
というわけでパパ、調子に乗ってHow to talk 2chなんて項目作...
これ理解するのにはソケットプログラミングができないといけ...
とりあえず2chに書き込むには皆さんご存知bbs.cgiというのに...
まあ簡単に言うとここに書き込みたいデータをポストするだけ...
具体的に言うとこんな感じ
POST /test/bbs.cgi HTTP/1.1 //まあこれは言わずもがなで...
Host: //これはwwwww.2ch.netみたいなホスト指定すればおk
Content-Length: //これは書き込みデータのサイズだ
Cookie: //これにはクッキーを入れなきゃいけない
Referer: //これは、まあよくわからんがhttp://wwwww.2ch.ne...
User-Agent: //ここにはユーザーエージェントを入れるんだ。...
Connection: close //まあこれもよくわからんがとりあえずこ...
[改行]
//そしてここに書き込む内容を書けばおk
書き込む内容は
hana=mogera&bbs=%s&key=%s&FROM=%s&mail=%s&submit=書き込む...
みたいな感じだまあ大体見ればわかると思うbbsにはnews4vipと...
ちなみにこれら全部URLエンコーディングしなきゃならない
まあ別にしなくてもちゃんと書き込めたりするけど推奨しない
まあ基本これらの内容をポストすれば良いわけだ
だが実際一度ポストしてみればわかるようにクッキーを要求さ...
だからもう一度クッキー込みでポストしなきゃいけないわけで
一度上のような内容でポストしてみればSet-Cookie:とか言うの...
Set-Cookie:以降の部分をそのままコピーしてしまえば良いんだ
とりあえずサンプルまでに俺の作った書き込みプログラムがある~
まあ出来の方は期待するな~
あと悪用するな~
ライセンスは知らん~
自己責任だ。俺は一切責任を負わない~
これでアク禁になろうがブタ箱に入ろうが知ったこっちゃ無い~
%%http://www8.uploader.jp/dl/vipprog/vipprog_uljp00252.zi...
にソースを置いておいたので~
ちなみに流れても俺は知らん
* && と || の特性 [#l13d9672]
文字列処理の関数などで、次のようなコードを見かけることが...
char* proccessed_text(const char* raw_text){
if(raw_text!=NULL && raw_text[0]=='~'){ ... }
}
このような書き方に慣れていないと、「raw_textがNULLのとき...
char* proccessed_text(const char* raw_text){
if(raw_text!=NULL){
if(raw_text[0]=='~'){ ... }
}
}
じゃないのか、と思ってしまいます。~
ですが最初のコードで問題ありません。なぜならば、''「&&演...
例を見てましょう。
#include <stdio.h>
int false(){ puts("false"); return 0; }
int true(){ puts("true"); return 1;}
main(){
if( false() && true() ){
puts("Hello");
}
}
これを実行すると、次のようになります。
false
見ての通り、true は表示されません。つまり、&&で結ばれた第...
つまり、最初の例では、「raw_text!=NULL が偽となった時点で...
&& と同様に、|| も途中で評価をやめることがあります。~
|| の場合は「どこか一つでも真なら全体で真」ですから、左か...
例
#include <stdio.h>
int false(){ puts("false"); return 0; }
int true(){ puts("true"); return 1;}
main(){
if( true() || false() ){
puts("Hello");
}
}
実行結果
true
Hello
*FAQ [#d9d36efd]
よくありそうな質問は[[こちら>C言語 - よくありそうな質問]]
*規格 [#l1bfd8fb]
-[[ISO/IEC JTC1/SC22/WG14 - C:http://www.open-std.org/jtc...
-[[日本工業標準調査会:データベース-JIS詳細表示:http://ww...
-[[C99 - Wikipedia:http://ja.wikipedia.org/wiki/C99]] - ...
*オヌスメサイト [#f4b77e16]
**初心者向け [#n6202dfa]
適当に増やし過ぎだろこれ。
-[[苦しんで覚えるC言語>http://9cguide.appspot.com/]]~
僕も初心者なのですが、このサイトは一般的に売られている入...
既知かもしれませんが僕のおすすめです。
-[[猫でも分かるプログラミング>http://kumei.ne.jp/c_lang/]]~
C/C++向けのページです。(最近C#が出てきたけど、C/C++が多い...
管理者の粂井さんは実際に「猫でも分かるシリーズ」という本...
章ごと分けられていて長すぎず疲れたりすることも少ないかと...
説明自体はVC++を用いられていますが、BCCに流用可能なソース...
ただしDirectXやOpenGLと言ったものは使っていないので、ゲー...
個人的にNo1サイトです。~
2chではよく叩かれています。ちなみに粂井さんは糖尿病の専門...
-[[コンピュータ基礎とプログラミング>http://ipl.sfc.keio.a...
-[[やる夫ブログ やる夫で学ぶプログラミングC言語入門 その...
[[その2>http://yaruomatome.blog10.fc2.com/blog-entry-2034...
[[その3>http://yaruomatome.blog10.fc2.com/blog-entry-2035...
[[その4>http://yaruomatome.blog10.fc2.com/blog-entry-2045...
超初心者向け、配列・ポインタ・構造体は含まない
-[[C言語講座:初級から中級まで>http://www1.cts.ne.jp/~cl...
入門講座、アルゴリズム、標準関数のリファレンスその他
-[[Visual C++ の勉強部屋>http://homepage3.nifty.com/ishid...
画像処理、電気回路の計算、統計、簡単なGUIなど~
**脱初心者向け [#a561a946]
以下のWebサイトを読んだからといっていきなり中級者になれる...
-[[プログラミングの禁じ手Web版>http://web.archive.org/web...
C/C++のコードを書く上でやってはいけないことを列挙したサイ...
サイトが落ちてるのでWeb Archiveで。C MAGAZINEも休刊したし...
-[[Cプログラミング診断室>http://www.pro.or.jp/~fuji/mybo...
-[[C言語 FAQ 日本語訳>http://www.kouno.jp/home/c_faq/c_fa...
**その他 [#g7e2ced0]
ポインタ
http://kmaebashi.com/programmer/pointer.html
リファレンス
http://www.cppreference.com/
Windows API
http://wisdom.sakura.ne.jp/system/winapi/
-[[Visutal C++ 2005/2008 Express Edition(IDE無料化の背景...
無料開発ツール「Visual C++ Express Edition」の活用方法
MacOS X,Emacs,g++の環境でC/C++
-[[俺流逆引きCプログラミング - わだいのたけひこのにっき:h...
FAQ っぽい読み物。和大で教員をされているtakehikom氏のプロ...
-[[CERT C Secure Coding Standards 日本語版 Ver 1.0:https:...
-[[アフォBlog C言語勉強したけどゲーム作れないぞコラって人...
DXライブラリでかいわれ育成ゲームを製作する~
コンソールからGUIへの移行という視点で解説されている~
-[[C言語 - Wikibooks:http://ja.wikibooks.org/wiki/C%E8%A8...
執筆者求む。
終了行:
#contents
//**今はVisual 2010のベータ版がでてるぞ。 [#g1dcf1c2]
//**さっさとDLしろクズども [#w55754a9]
//↑初心者にベータ版勧めんな
*はじめに [#oebef9d9]
-最初はなんだたっけな
-HelloWorldだっけ?
-ある程度教える事はできるけどどうすれば見やすいのか分から...
-最初に書き方だけ書いてくれたらあとはその書き方で追加して...
-間違ってるところがあったら遠慮なく修正してくれるとありが...
-[[FAQも作ってみた>C言語 - よくありそうな質問]]
// いきなりハローワールドがあって、次に関数ポインタが来て...
// bccやgcc導入を読んでくれない人も多いかなと思って編集
// 記述古いから環境設定一旦コメントアウト
//*インストール(環境設定) [#rc229ddb]
//以下では例として3種類のコンパイラを挙げていますが''どれ...
//また、すでに他のコンパイラが入っている場合は無視しても...
//Windowsなら特に理由がないかぎり最初のもの(BCC)をお勧め...
//**Borland C/C++ Compiler [#ncc2ffc0]
//導入方法。
//
//まず、コンパイラを導入しよう。
////[[C++ Compiler 5.5/Turbo Debugger:http://www.codegear...
////FreeCommandLineTool2.exeなんて名前で落ちてくるはず。
////自己解凍形式のソレを実行し、インストールする。
//
////デフォルトの位置はC:\borland\bcc55のはずだ。~
////これでコマンドプロンプトからコンパイルできるようにな...
////ただ、これだけでは一々コマンドプロンプトを開いたり、...
//[[C++ Compiler 5.5/Turbo Debugger:http://www.codegear.c...
//住所などを聞かれるが、適当なものでおk。ただし、解凍パ...
//
//また、[[Visual Windows for BC++:http://www.vector.co.jp...
//[[Turbo Explorer:http://turboexplorer.com/jp]]からコン...
//Turbo Explorerの場合はコンパイラのバグがいくつか修正さ...
//ただし、いらないものを色々インスコさせられたり、IDEが糞...
//
////しかし、コマンドプロンプトの扱いは重要なので疎かにし...
//
//CPadというツールも導入しよう。(現在のCPadの在り処は[[公...
//具体的な場所は以下のようだよ!~
//http://6005.teacup.com/kitobbs/bbs?BD=16&CH=5&M=ORM&CID...
//
//CPad自体は解凍しただけで使えるC言語用のエディタだ。
//CPadアプリケーションを統合開発環境と呼ぶ。詳しくは[[プ...
//コマンドプロンプトを開かずともエディタから直接コンパイ...
//ただ、上述のとおり、プログラミングをする上でコマンドプ...
//面倒でも必ず統合開発環境を使ってコンパイルする前にコマ...
//ただし、別にコマンドプロンプトについてはスルーしてもC言...
//
//そして、エディタの設定の中にコンパイラのパスを指定する...
//デフォルトだとC:\borland\bcc55\bin\bcc32.exeなはずだ。...
//
//コマンドプロンプトからbcc32 hoge.cのようにコンパイルす...
//
// -----その他のツール-----
// setbcc(BCCセットアップお助けツール)
// http://www.cmagazine.jp/setbcc.html
// http://www.vector.co.jp/soft/win95/prog/se149182.html
//
// BCC Developer(無料BCCをIDEにしてしまう)
// http://www.hi-ho.ne.jp/jun_miura/bccdev.htm
//
// Visual Windows for BC++(Borland C++ Compiler 5.5付)
// http://www.vector.co.jp/soft/win95/prog/se326602.html
//
//Borland C++ Compiler 5.5の使い方については 『[[Borland ...
//
//**Visual Studio Express [#n52444a0]
//***VC 2008 Express Edition [#l7d7fb6d]
//[[Visual Studio 2008 Express Editions:http://www.micros...
//>
// Visual C++ はよりパワフルで柔軟な開発環境を提供し、
// Windows ネイティブなアプリケーションやおよび 3D の2Dゲ...
// Win32 API を完全活用したアプリケーションを作成できる
// Windows Platform SDK も同梱されています。
//
////**だけど今は2010のベータバージョンがある。どうせ無料...
//// ベータ版の位置づけを考えろ。機能の問題じゃないだろ。...
//// 見出し要素などWikiの編集も分らずに適当な事を書くんじ...
//// 煽り文句書き殴るんじゃなくてちゃんと情報載せろ。/項...
//
//:Web インストール版|
//[[Visual Studio 2008 Express Editions:http://www.micros...
//::[[はじめての方のための Visual C++ 2008 Express Editio...
//中盤の 『時計を作ってみましょう』 は飛ばしてページの終...
//
//:オフライン インストール版|
//[[Visual Studio 2008 Express Edition の DVD イメージか...
//
//Webインストール版、オフラインインストール版 どちらか一...
//
//
//***VC 2005 Express Edition [#ja8dc75c]
//[[Visual Studio 2008 Express Editions:http://www.micros...
//>
// Visual Studio 2005 Express Edition 提供終了のお知らせ
//
// Visual Studio 2005 Express Edition の提供を 2009 年 3 ...
// Visual Studio 2008 Express Edition は継続して提供いた...
// 今後は最新の開発環境をご活用ください。(2009 年 3 月 12...
//
//
//
//// CD(.iso)イメージをダウンロード
////http://www.microsoft.com/japan/msdn/vstudio/express/m...
//// Webからインストール
////http://www.microsoft.com/japan/msdn/vstudio/express/v...
//// CDイメージはdeamontoolを使用する、または、CDに一旦焼...
//// Webからインストールより厄介なんだけど、
//// Webからインストールする方法だと、"ちょっとした個人情...
//
//http://www.microsoft.com/japan/msdn/vstudio/express/200...
// これをやっておくと、Windowアプリケーションが作りやすく...
// というか、やんないと悩むこと請け合いだから、やっとけ。...
//
//''公式での提供は終了しているものの以下ブログで紹介され...
//http://winmac.blog33.fc2.com/blog-entry-64.html
//
//***[[Microsoft Visual Studio 2010:http://www.microsoft....
//%%現在のバージョンは Beta 2です。(2009年12月29日現在)...
//%%ベータ版はあくまで評価用であって初心者向けではありま...
//%%利用の際には十二分に注意して下さい((参考:[[Visual St...
//
//以下より正式版をダウンロード可~
//http://www.microsoft.com/japan/msdn/vstudio/express/def...
//ブラウザの日本語の言語設定を削除している、または優先順...
//http://search.microsoft.com/?mkt=en-USに飛ばされてダウ...
//
//-ブラウザの言語設定について
//--Internet Explorer7及び8(6と9も方法は同じ)~
//"Internet Explorer に言語を追加するには"を参照~
//http://windows.microsoft.com/ja-JP/windows-vista/Change...
//
//--Internet Explorer9~
//"Internet Explorer に言語を追加するには"を参照~
//http://windows.microsoft.com/ja-JP/windows-vista/Change...
//
//--Firefox4~
//ツール→オプション→コンテンツ→言語設定~
//
//--Opera~
//http://jp.opera.com/browser/tutorials/settings/#language
//
//--Google Chrome~
//"ウェブページの言語設定"を参照~
//http://www.google.com/support/chrome/bin/answer.py?hl=j...
//
//**Cygwinによる「gcc30秒HelloWorld!」 [#mef1e506]
//***GCC(Cygwin)の導入方法 [#kf705dc8]
//''※初心者非推奨!!''~
//[[詳しい導入法>GCCを使うためのCygwinのセットアップ]]~
//コレ入れればココで扱うコンソールベースのテストプログラ...
//***ソース生成から実行まで [#i06fc3b3]
//デスクトップ上に生成された「Cygwin(又は'Cygwin BASH She...
//(コンソールへのコピペはコンソールウインドウ上で右クリ...
// echo -e "#include <stdio.h>\nint main(int argc ,char *...
// echo -e "CC=gcc\n\nALL : test.exe\n\ntest.exe : test.c...
// make
// ./test.exe
//これだけでソースの生成から実行結果の確認まで可能。環境...
*HelloWorld [#odc80b47]
まずは"HelloWorld"と表示するプログラム。
#include <stdio.h>
int main(void){
printf("HelloWorld\n");
return 0;
}
メモ帳で保存してコンパイラに食わせるなり、なんなりして実...
HelloWorld
が表示される。「つまらんソフトだな」なんて思うことなかれ。...
ではひとつずつ見ていこう。
#include <stdio.h>
これは、コンパイラに対するもので、「stdio.hというファイル...
stdio.hとは「○○関数( { ~ } までの命令のこと)はこういうも...
stdio.hには基本的な関数がたくさん入っているので初心者から...
int main(void){
○○
△△
}
C言語のプログラムは、main関数に書かれた命令が真っ先に実行...
上記のコードでは○○や△△がmain関数の中身であり、○○や△△が真...
printf("HelloWorld\n");
これは「("")の中のものを表示する」という関数だ。~
だが、「HelloWorld\n」とではなく、"HelloWorld"と表示される。~
「\n」とは「エスケープシーケンス」と言う記号の一種で、「改行」...
「エスケープシーケンス」とは文字では表せない特殊なものを記...
それから、1つの命令の終わりには;(セミコロン)を必ずつける。
return 0;
この行は今のところプログラムの終わりに書くものと思ってお...
本来はちゃんとした意味があるのだが、それは今の段階では難...
関数の概念を理解すれば自然と分かるようになる。
*C言語におけるスペースと改行 [#wbce115d]
C言語ではスペース、改行は殆ど意味を持たない。~
しかし、書いた本人以外の人が見ても見やすい・修正しやすいコ...
前回の「Hello World」では
int main(void){
printf("HelloWorld\n");
return 0;
}
というコードを書いたと思うが、main関数を下記のように書い...
int main(void){printf("HelloWorld\n");return 0;}
しかし、これでは見づらい。~
よって、C言語にはスペース・改行に関する明確な書式はないが...
例として下記のコードを記述した。
int main(void)
{
printf("VIPWorld!\n");
○○
{
××;
□□
{
☆☆;
}
}
}
ご存知のとおり、全く問題はない。しかしmain関数の中に中括...
そこでスペースを利用して下記のように書くと、
int main(void){
printf("VIPWorld!\n");
○○{
××;
□□{
☆☆;
}
}
}
幾分かみやすくなった。どの中括弧に何が入っているのかが分...
スペース入れ放題、といっても以下の場合エラーが出る
p r i n t f ( " hello world " );
関数名、後に出てくる変数名などにスペースを入れてはいけな...
printf ( " hello world " ) ;
↑これならOKである~
他の言語では、改行、スペースに明確な決まりがあるものも多...
そんな場合でも有効だ。~
上述のとおり、明確な決まりというものはない。自分で見やす...
*変数と計算 [#o8d9f2b9]
**変数とは [#kd6a6673]
毎回同じ文字列を出力するだけなら、プログラムどころか判子...
今回は加減乗除( + - ÷ × の4つ)をするプログラムを作る。~
今回扱う「変数」はとても重要なのでしっかり覚えよう。
#include <stdio.h>
int main(void){
int wa;
int sa;
int seki;
int shou;
wa = 10 + 5;
sa = 10 - 5;
seki = 10 * 5;
shou = 10 / 5;
printf("和=%d ", wa);
printf("差=%d ", sa);
printf("積=%d ", seki);
printf("商=%d\n", shou);
return 0;
}
CPUは物覚えが悪いので、単純な足し算でも答えを書き留めて置...
この入れ物のことを変数と呼ぶ。~
ここでは、和、差、積、商それぞれの答えを置く4つの変数を作...
変数にはいろんな種類があるが、今回作るのは整数用の入れ物...
例として、下記のソースを見てほしい。~
int x;
intは整数用(正式には整数型)を表し、上記のソースはxという...
従って、4行目は「整数型の変数waを作る」という意味。
5~7行目も同様に整数型の変数sa、seki、shouを作っている。...
ついでに、4~7行目までは以下のように省略することも出来る。
int wa, sa, seki, shou;
ちなみに今は「変数を作る」と書いたが、正しくは「変数を宣言す...
9~12行目では実際に計算を行う部分。C言語で計算する場合、...
1行目は「変数waに10+5の答えを入れる」と言う意味になる。~
これも実は変数の宣言と同時に行うことが出来る。~
int wa = 10 + 5;
そして14~17行目で計算した結果を表示する。~
例として下記のコードを見てほしい。
printf("%d",x);
上記のコードは「%dにxの中身を表示する」という意味になる~
つまり、14~17行目では変数(wa, sa, seki, shouそれぞれ)を"...
従って、waの中身である("10 + 5"の計算結果)15が"和=%d"の"...
ついでに14~17行目は下記のように省略することが出来る。
printf("和=%d 差=%d 積=%d 商=%d\n", wa, sa, seki, sh...
よって実行結果は
和=15 差=5 積=50 商=2
となるはずだ。前述のとおり、変数は重要だからしっかりマス...
**変数の型 [#r244da95]
今やったプログラムで、 int というのが出てきました。~
これは簡単に言えば「変数の種類」を表し、これを''変数の型'...
変数はその型によって代入できるものが決まっています。'''(...
では、変数の型にはどんなものがあるのか一覧にまとめておき...
|型名|入れられるもの|使用例|サイズ|
|BGCOLOR(pink):int|BGCOLOR(pink):整数|BGCOLOR(pink): int ...
|BGCOLOR(pink):char|BGCOLOR(pink):文字または整数|BGCOLOR(...
|BGCOLOR(pink):float|BGCOLOR(pink):小数|BGCOLOR(pink): fl...
|BGCOLOR(pink):double|BGCOLOR(pink):小数|BGCOLOR(pink): d...
|short|整数| short sh = 10; | 2バイト |
|long|整数| long l = 10; | 4バイト |
|long long|整数| long long ll = 10; | 8バイト |
|long double|小数|long double ld = 3.14; | 12バイト |
ところで、表のなかに「サイズ」という項目がでてきました。...
サイズがnバイトの整数型には、-2^(n*8 -1) ~ 2^(n*8 - 1) -...
例えば、int型なら、n = 4 なので、-2^31 0 2^31 - 1 までで...
小数型については難しいのでここでは省きますが、通常double...
''(要は、初心者のうちは整数なら int、小数なら double を使...
注意
-ここで示した「サイズ」は一般的な値です。一般的ではない環...
-コンパイラによっては、(内部処理をすべてint型で行うため...
*繰り返し [#j8065196]
今回は繰り返し同じ処理を実行したいときに使うループ制御。~
コードを簡潔にすることが出来るが、下手に使うと無限ループ...
注意しよう。
**For文 [#afbaa9f2]
最も使われていると思われるFor文。~
下記のソースを見てほしい。
#include <stdio.h>
int main(void){
int i;
for ( i = 0 ; i < 5 ; i++ ) printf( "ただいまループ%d...
printf( "ループから抜けました。\n" );
return 0;
}
新しく出てきた「For」だが、これで同じ動作を繰り返すことが出...
for ( × = 0 ; × < ○ ; ×++ ) ☆☆;
上記のコードで繰り返すことが出来る。~
「 × = 0 ; 」というのは変数の初期化だ。変数に0を代入してい...
「 × < ○ ; 」というのは処理を続けるための条件である。×が○未...
そして「 ×++ 」だが、処理が終わったあとに行う文である。~
i++ は「iを1増やす」という意味なので、総合すると7行目は「i...
ということになる。~
ここで注目してもらいたいのは、printf関数の引数にiを使って...
iは繰り返しの度に動的・規則的に変化していくから、iを使うこ...
従ってこのコードの実行結果は、
ただいまループ1回目です。
ただいまループ2回目です。
ただいまループ3回目です。
ただいまループ4回目です。
ただいまループ5回目です。
ループから抜けました。
となる。~
注
-処理の途中で抜け出したい場合は break; と記述すればループ...
-i++ の他に、i-- もあり、これは「iを1減らす」という意味で...
***条件の書き方 [#n77d8a9a]
for文の条件には、次のようなものを入れられる。これは後に出...
|条件の例|意味|
| i < 10 | iが10未満 |
| i <= 10 | iが10以下 |
| i > 0 | iが0より大きい |
| i >= 0 | iが0以上 |
| i == 2 | iが2と等しい |
| i != 2 | iが2と等しくない |
| i>0 && i<10| iが0より大きく、かつ10より小さい |
| i>=20 || i<=-20 | iが20以上、またはマイナス20...
特に5番目のものは i = 2 と書いてしまいがちなので注意が必...
これ以外にも、実は条件には「式であればなんでも入れられる...
**While文 [#bbc83549]
whileを使うことでも繰り返し処理が出来る。~
(例)
#include <stdio.h>
int main(void)
{
int i = 0;
while( i < 5 )
{
printf( "ただいまループ%d回目です。\n", (i+1) );
i++;
}
printf( "ループから抜けました。" );
return 0;
}
whileの基本的な文法は以下のとおり。
while (条件) { 処理 }
条件というのはループを続けるかどうか判定するためのもので...
例ではint型の変数iの値が5未満の場合、処理を行うということ...
#iが5未満かどうか調べる(5未満なら処理を行い、5以上ならル...
#printf( "ただいまループ%d回目です。", i );を実行
#i++を実行
#1に戻る
従って実行結果は
ただいまループ1回目です。
ただいまループ2回目です。
ただいまループ3回目です。
ただいまループ4回目です。
ただいまループ5回目です。
ループから抜けました。
となる。~
While文もForと同様にbreakを使うことが出来る。
**ForとWhileの違い [#kc367617]
For文とWhile文は文法も違うのだが、For文は主に、回数が決ま...
While文の項目の例では5回と回数が決まっていたが、i++;を忘...
しかし、ゲーム制作などで半永久的に処理を続けたいという場...
while( 1 )
{
処理;
if ( 終わるための条件を書く ) break;
}
理由は難しいのでまだ書かないが1を条件にすると無限ループと...
While文ならこのような場合に便利である。
**do ~ while [#l93157c4]
forとwhile以外に、もう一つループ構文がある。~
これはマイナーだし while で簡単に置き換えらえるので特に覚...
do{
処理;
} while(条件);
この構文は、まずとりあえず 処理; を一回行う。次に条件をチ...
通常の while は初めから条件が成り立たなければ処理を一回も...
while(条件) の後の ; を忘れがちなので注意しよう。
ちなみにdo~while文にはこのような使い方もある。
#define swap(type, x, y) do { type t = x; x = y; y = t; ...
このマクロを以下のように用いて、値を交換することができる。
if (a > b)
swap(int, a, b);
else
swap(int, a, c);
これはプリプロセッサによって、次のように置換される。
if (a > b)
do { int t = a; a = b; b = t; } while(0);
else
do { int t = a; a = c; c = t; } while(0);
仮にこのマクロをこのように定義すると
#define swap(type, x, y) { type t = x; x = y; y = t; }
このように置換されることとなる。
if (a > b)
{ int t = a; a = b; b = t; };
else
{ int t = a; a = c; c = t; };
これは以下のような構造を持つ。なぜならばセミコロンを空文...
if (expr)
stmt
stmt
else
stmt
したがってブロックのないif文ではコンパイルエラーとなる。
*入力 [#k2dea5c7]
キーボードから文字、数字の入力を求め、処理します。~
これにより、プログラムの幅が飛躍的に広がります。~
以下のコードを見てください
#include <stdio.h>
int main(void) {
int x,y;
printf("Xを入力してください\n");
scanf("%d",&x);
printf("Yを入力してください\n");
scanf("%d",&y);
printf("XとYの和は%dです",x+y);
return 0;
}
今回新しく出てきた「scanf」ですが、scanf関数を使うことによ...
scanf("%d",&x);
上記の式は、「xという変数に整数型として入力された値を代入...
scanf関数を使う時に最も気をつけるべきことは、代入される変...
理由は難しいのでここでは説明しませんが、必ず付けてくださ...
従ってこのコードは7行目と10行目でキーボードから入力された...
その和をprintf関数で表示するということになります。
また、入力には getchar();やgetch();などが存在する。~
複数の文字入力ではなくて、文字を1つ入力することができる。~
ただし、getch();は#include<stdio.h>とは別に、#include<con...
具体的に説明すると~
getchar();は、1文字入力して、Enterを押すまで処理が止まる...
getch();は、1文字入力すると、すぐに反応して処理を行う。~
*条件分岐 [#s56a2a0f]
もしも○○ならば△△という処理を実行したいなんて時に使います。~
下記のコードを見てください。
#include <stdio.h>
int main(void){
int val;
printf("数を入力してください>");
scanf("%d", &val);
if( val > 0 ) printf("正の数です\n");
else if( val < 0 ) printf("負の数です\n");
else printf("0です\n");
return 0;
}
「if」というものが出てきました。ifは
if (○○) △△;
上記のコードは、「もし、○○ならば、△△を実行」という意味にな...
従って9行目は、「もしvalの値が0より大きければ、"正の数です...
次に「else」ですが、「if」の条件が満たされなかった場合にelse...
じゃあ、「○○が満たされた場合、△△と××の2つの処理を実行した...
if ○○ {
△△;
××;
}
また、8行目には「else if」という文がありますが、ただ「else」...
イメージとしては、
else {
if (○○) △△;
}
という文が、
else if (○○) △△;
という文に省略された、と考えてください。
**条件分岐(switch編) [#wafbb5d1]
さて、ifを覚えました。早速使ってみましょう。1~3の数字...
#include <stdio.h>
int main(void){
int val;
do{
printf("数を入力してください(1~3)\n");
scanf("%d", &val);
}while(val > 3 || val < 1); /* valの値が4以上か、...
if(val == 1){
(処理1)
}else if(val == 2){
(処理2)
}else{
(処理3)
}
return 0;
}
変数valの値によってifやelseを使って別の処理をしています。~
別にこのままでもいいのですが、値の範囲が広くなるにつれてi...
そこで今回のテーマ"switch"を使いましょう。switchの文法は
switch(変数){
case 値:
(処理)
(default:
(処理))
}
です。case 値: の部分はいくらでも増やせます。defaultの部...
これと先ほどのifを変えてみると
switch(val){
case 1:
(処理1)
break;
case 2:
(処理2)
break;
default:
(処理3)
break;
}
となります。今回defaultを使ったのは、このプログラムの場合...
という意味になるからです。
breakについて説明します。~
breakはこのプログラムの場合"switch文を抜ける"という処理を...
case 1:内のbreak; に到達すると、一番下の } に飛ぶといった...
もし、このbreakが無ければ次にbreakかswitch文の}が来るまで...
処理を実行してしまいます。つまり1を入力しても2や3の時の処...
なので、場合にもよりますが普通はbreakを書くようにしましょ...
*構造体 [#s56a2a0e]
そもそも構造体って何?~
たとえば君がプログラミングをしてるときに~
int man_age, man_height, man_weight;~
int woman_age, woman_height, woman_weight;~
って感じの変数を使って、男性や女性の情報を得るプログラム...
まあ男性と女性2人だけならあまり見にくいとは感じないけども...
int taroh_grade, taroh_height, taroh_weight;~
int jiroh_grade, jiroh_height, jiroh_weight;~
int saburoh_grade, saburoh_height, saburoh_height;~
見たいな感じにしなきゃそしたら面倒でしょ。~
でもこの中の成績、身長、体重って三人とも共通するデータだ...
だからこれをまとめちゃうんだよ。それが構造体。~
具体的には~
struct stat {
int grade;
int height;
int weight;
};
と言う感じで成績、身長、体重をstatという名前でまとめられ...
ちなみにこれを変数として使いたい時は~
struct stat taroh, jiroh, saburoh;
見たいな感じでできる。~
そしてそれぞれの成績、身長、体重(これをメンバと呼ぶ)にア...
taroh.gradeという形でアクセスできる。~
taroh.grade = 120;と言う形で代入もできる。~
え?これじゃただ宣言が短くなっただけで実際ほとんど変わら...
いえいえそんなことはありません。たとえばあなたが100人分の...
1_grade, 1_height, 1_weight;~
2_grade, 2_height, 2_weight;~
3_grade, 3_height, 3_weight;~
以下省略~
なんてことしてたら確かに無理ではないけど面倒すぎて死んで...
でもこれが構造体を使うと
struct stat students[100];
これだけになります。なんとこれは99行の省略になります。~
99行書いてる間にはいろいろなことができます。だからこれは...
他にも利点はあります。~
たとえば関数を呼び出すとき~
hyper_ultra_super_function(baka, aho, doji, manuke, usero...
と言う長い引数を渡したい場合があります~
これって見にくいですよね。~
でもこのbaka, aho, doji, manuke, usero, kiero, shine, kim...
hyper_ultra_super_function_ver2(batou);
と言う感じで済みます(構造体のメンバにいちいち代入しなきゃ...
どうですか?すごいと思いませんか?~
ちなみに構造体のポインタと言うものも作ることはできます~
struct stat taroh;
struct stat *students;
taroh.grade = 4;
taroh.height = 156;
taroh.weight = 50;
students = &taroh;
と言う感じでいつも通りの代入ができます。~
しかし、studentsからメンバにアクセスする場合、students.gr...
構造体のポインタからアクセスするにはstudents->gradeという...
これが構造体と言うものです。~
*自作関数 [#dcffc8f3]
今まではmain関数の中にいろんな処理を詰め込んできたが、関...
C言語の構造化プログラミングでは関数がサブルーチンとなる。~
**関数を作る [#u2530ec0]
例として以下のコードを参照。
void hoge(void)
{
printf("関数です\n");
}
int main(void)
{
hoge();
return 0;
}
1行目から4行目までがhoge関数である。~
まず、main関数が実行される。その中の「hoge();」でhoge関数が...
void hoge()のvoidとは返り値が無いことをあらわす。~
返り値については後ほど説明する。
**プロトタイプ宣言 [#r4b770d5]
コンパイラはソースを上から順に処理していくので、作成した...
そのため、main関数より後に記述してた関数をmain関数内で使...
これをプロトタイプ宣言と言う。
(例)
#include <stdio.h>
void hoge(void); // プロトタイプ宣言
int main(void)
{
hoge();
return 0;
}
void hoge(void)
{
printf("関数です\n");
}
上記のコードではmain関数内でmain関数より後に記述したhoge...
そのため、3行目で、プロトタイプ宣言をしている。
**返り値と引数 [#x7c7256e]
関数の呼び出しの際に値(引数)を渡し、その値を使って処理す...
また、関数の終了時に任意の値(返り値)を返すことが出来る。~
(例)
#include <stdio.h>
int addition(int x, int y); //プロトタイプ宣言
int main(void)
{
int a;
a = addition( 2, 9 ); //addition関数に2と9を渡して返り...
printf( "%d", a );
return 0;
}
int addition(int x, int y)
{
return x + y; //xとyの和を返す
}
まず3行目でaddition関数のプロトタイプ宣言。~
addition関数の返り値がint型で、引数にint型の変数x,yを取る...
8行目で、int型の変数aにaddition関数の返り値を代入。~
addition関数の引数には、2と9を渡している。
ここから重要であるが、addition関数では渡された2と9をそれ...
プロトタイプ宣言などで宣言した引数はそのまま関数内で使用...
分かりにくいかもしれないが、8行目で渡された2と9がxとyに入...
ここで必ず気をつけるべきことは、~
・関数の宣言の際に宣言した引数の型と、関数呼び出しの際に渡...
・関数の宣言の際に宣言した返り値の型と関数内でreturn文を使...
//・引数を取らない関数を作るときは必ず ( ) の中にvoidを記...
// ↑スレでもちょっと出てましたが、現在では(オーバーロード...
ということである。
従って上記のコードの実行結果は、
11
と表示される。
*ポインタの基礎 [#j6f90b12]
**ご案内 [#u7bb7ad2]
なんとページ一覧を見るとポインタについて超詳しく解説され...
ということで、[[こちら>プログラミング言語/C/ポインタ]]を...
でもせっかく書いたのでこっちの説明も残しておきます・・・
**はじめに [#c27bc58a]
ついにC最大の鬼門と言われるポインタの解説です。~
でも大丈夫。''たいして難しくありません。''~
注意)'''この項目は初心者にポインタを感覚的に理解して貰う...
**アドレス [#e451da5a]
ポインタを説明する上でアドレスというものは避けて通れませ...
ではアドレスとはなんでしょうか。~
アドレス。日本語にすると住所です。つまり、~
&size(20){''アドレスとは、変数の住所のことである''};~
3回復唱してみましょう。~
''アドレスとは、変数の住所のことである''~
''アドレスとは、変数の住所のことである''~
''アドレスとは、変数の住所のことである''~
もう覚えましたね。変数が分からない人は上のほうで解説して...
ではその住所とはどんなものか見てみましょう。変数のアドレ...
&変数名
とします。例えば、int型の変数aのアドレス(=住所)なら、
&a
が、変数のアドレスを表す数字になります。~
ためしに下のようなプログラムを実行してみましょう。
#include <stdio.h>
main(){
int a = 5;
printf("%d\n", &a); /** aのアドレスを、数字として表示。...
}
実行結果
-1081884848
えっ?実行結果が例と違う?~
それはなぜかというと、変数のアドレスを何番にするかは、PC...
実行したときのPCの気分(状態)によってころころ変わります。~
でも、一回の実行中でアドレスが変わってもらっては困ります...
#include <stdio.h>
main(){
int a = 5;
int b, c;
printf("%d\n", &a);
b = 10; // なんか適当な処理
c = b * a + 2; // なんか適当な処理
printf("いろいろ処理してるうちにaのアドレスが変わったり...
printf("%d\n", &a);
}
を実行すると、
-1079031288
いろいろ処理してるうちにaのアドレスが変わったりして・・・
-1079031288
となります。2回 &a を表示していますが、もちろん値は変わり...
なぜマイナスなのか気になるって?~
これには意外と深いようでものすごく浅い事情があるのですが...
**ポインタ[#oa1e7a6e]
ではいよいよポインタの説明です。ポインタとはなんでしょう...
ズバリ言うと、~
&size(20){''ポインタとは、アドレスを入れるための変数で...
これ以上のなにものでもありません。~
intなら整数、charなら文字、と入れるものによって変数の型を...
では復唱しましょう。~
''ポインタとは、アドレスを入れるための変数である''~
''ポインタとは、アドレスを入れるための変数である''~
''ポインタとは、アドレスを入れるための変数である''~
はい、覚えましたね。~
では具体的にポインタはどうやって使うのでしょうか。~
一例として、int型変数のアドレスを入れるためのポインタを作...
int型変数のアドレスを入れるためのポインタを作るには、
int* ポインタの名前;
とします。例えば、
int* ptr;
のように。~
それでは実際のプログラムにしてみましょう。
#include <stdio.h>
main(){
int a = 5;
int* ptr; /** int型変数のアドレスを入れるためのポインタ...
ptr = &a; /** aのアドレスを入れた **/
}
このように使います。まだ何の役にも立ちませんね。~
ここでちょっと注意があります。~
世の中の9割以上の本やソースコードには、 int* ptr; ではな...
int *ptr;
と書いてあります(スペースの位置が違う)。~
これは int* ptr; と同じ意味なので慣れればどっちを書いても...
&size(20){''int* ptr; と書くことを強くすすめます''};~
これには三つほど理由があるのですが、現時点で言える理由は、~
+int *ptr; と書くと、int型の変数 *ptr に見える
+''int* という型が、int型変数のアドレスを入れるための型だ...
ということです。~
intと同様に、char型変数のアドレスを入れるためのポインタは...
またその他の型用のポインタについても、
型の名前* ポインタの名前;
で宣言できます。
**ポインタの使い道 [#a2c2261e]
さて、ポインタの概念と作り方はわかりましたが、このままで...
そこで使い道を説明していきます。~
***演算子 * について [#m6916aa3]
まず、変数の頭に & を付けるとその変数のアドレスを表したよ...
ポインタの先頭に * を付けると「''そのポインタに書いてある...
''アドレスとは変数の住所のことである''でしたから、アドレ...
「え? * ってポインタを作るときに使うやつでしょ?」はい、...
ー は普通「引く」を表すけど、「数字の前についたらマイナス...
では早く具体例をみて把握してしまいましょう。
#include <stdio.h>
main(){
int a = 5;
int* ptr;
ptr = &a; /** aのアドレスを、ptrに代入した **/
printf("%d\n", *ptr); /** 「ptrに書いてあるアドレス」に...
}
実行結果
5
~
ここで int *ptr; と書いてほしくないもうひとつの理由が出て...
上のプログラムを int *ptr; と書くと、
#include <stdio.h>
main(){
int a = 5;
int *ptr;
ptr = &a;
printf("%d\n", *ptr);
}
となります。''(ポインタを宣言するための * と、中身を得る...
しかし数学的センスのあるあなたはこう考えます。~
「そうか! *ptr が int型の変数だ と思えばいいんだ!」~
確かに5行目( int *ptr; )と7行目( printf(...) )を見るとそ...
ptr = &a;
が意味不明になります。つい
*ptr = a;
としてしまいそうです。~
これがなぜ間違いか考えてみましょう。~
5行目(int *ptr;)までの状態では、ptrには「何が入っているか...
なので、この状態で *ptr = a; とすると、「ptrに書いてある...
これはいけませんよね。
***本題 [#ufc3017d]
さて、だいぶ * の説明が長くなってしまいましたが、いよいよ...
次のコードがどんな結果を生じるか考えてみてください。
#include <stdio.h>
void inc(int x){
x = x + 1;
}
main(){
int a = 5;
inc(a);
printf("%d\n", a);
}
さてどうでしょうか?一見6が表示されそうですが、残念ながら...
学歴が低い人がinc を呼び出すと、「 x に a の値がコピー」...
例で理解しましょう。~
いま、あなたがmain関数だと思いましょう。あなたは a とい...
あなたにはincという友達がいます。あなたは彼の持っている...
そして彼が x にかいてある 5 を 6 に書き換えて、その後あ...
さて、どうなるでしょうか?~
そうです。''この方法ではaの値変わらない''のです。~
ここでポインタの登場です。上のプログラムをポインタを使っ...
#include <stdio.h>
void inc(int* x){
*x = *x + 1;
}
main(){
int a = 5;
inc(&a);
printf("%d\n", a);
}
友達のinc君が持っている int* 型の変数x(int型変数のアドレ...
この状態でincは *x に、 *x + 1 を代入します。~
*x は「xに書いてあるアドレスにある変数の、中身」でし...
(aの中身) = (aの中身) + 1;
となり、めでたくmainの持つ a が 6 に書き換わります!~
このように、ポインタは呼び出された関数から呼出し元の持つ...
**まとめ [#lb0799a6]
重要ポイントのまとめです。~
''アドレスとは、変数の住所のことである''~
''ポインタとは、アドレスを入れるための変数である''~
''*ptr とは、ptrに書いてあるアドレスにある変数の、中身...
分からなくなったときはこれを思い出してください。
**最後にちょっと注意 [#wd753712]
int* ptr; と書け と強くすすめましたが、ちょっとだけ問題が...
それは次のようにポインタをいくつかまとめて宣言する場合で...
int* a, b, c;
これは
int *a, b, c;
と同じだとみなされて、b と c はただのint型になってしまい...
int *a, *b, *c;
と書いてください。~
(本当は (int*) a, b, c; と書きたいんだけど、こうかくとキ...
*ポインタのいろいろ [#fe8e394c]
**演算子 -> について [#k44715ff]
さて、今、ある構造体と、それを指すポインタ(その構造体の...
struct PC{
double CPU_Hz;
int Monitor_size_tate;
int Monitor_size_yoko;
int HDD_GB;
};
main(){
struct PC myPC = {1.66, 1024, 1240, 500};
struct PC* PC_ptr = &myPC;
}
このとき、PC_ptr経由でmyPCのメンバにアクセスするにはどう...
printf("%f\n", PC_ptr.CPU_Hz);
こうでしょうか?~
ポインタの基礎でやった通り、PC_ptr の中には myPC のアドレ...
では構造体の本体はどこにあるかというと、「ポインタに入っ...
その中身を取得するには、演算子 * を使うのでした。なので、...
printf("%f\n", (*PC_ptr).CPU_Hz);
これで「PC_ptrに入っているアドレスにある構造体(myPC)の、C...
さて、(*PC_ptr).CPU_Hz のカッコがいるのかという問題ですが...
なぜなら、 10*1.5 を正しく 10*(1.5) と解釈( (10*1).5では...
なので、*PC_ptr.CPU_Hz とすると、*(PC_ptr.CPU_Hz) だと解...
これがどういう問題を引きこすかというと、例えば構造体がさ...
(*(*ptr1).ptr2).member
のようになり、非常に煩雑でわかりにくくなってしまいます。~
そこで、救世主 -> の登場です。~
この演算子を使うと、先ほどの例が次のようにかけます。~
printf("%f\n", PC_ptr->CPU_Hz);
これで「PC_ptrに書いてあるアドレスにある構造体の、CPU_Hz...
この演算子が威力を発揮するのは、さきほどわかりにくくなる...
ptr1->ptr2->member
カッコがなくなってスッキリしました。ポインタが何個連なっ...
(*(*(*(*ptr1).ptr2).ptr3).ptr4).member /** -> を使わない...
ptr1->ptr2->ptr3->ptr4->member /** 分かりやすい...
構造体とポインタを使ったプログラムでは、積極的に -> を使...
// 入門用とそれ以外の区切り
#br
#hr
CENTER:&color(red){ここから下は初心者の入門用ではありませ...
#hr
#br
// 入門用とそれ以外の区切り
// 自作関数の項目から外してポインタの後に移動しました
*関数ポインタ [#d011c48b]
**関数ポインタ [#d171c1de]
''(注意!)これは初学者向けではありません。最低でも関数と...
関数のアドレスを保持するポインタです。
実行する関数を動的に変えられたり、関数の配列を作ったり、...
まずは関数の宣言から見ていきます。
int MyFunc(float);
これはint型の値を返し、引数にfloat型をとる関数の宣言です...
定義時に引数名を省略しても、関数内部で使えないだけで問題...
関数ポインタは、入る関数の引数と戻り値が分かっている必要...
宣言の形は、
関数の戻り値 (*関数ポインタ名)(関数のとる引数)
です。
上記のMyFunc関数が入る関数ポインタpFuncを宣言するには、
int (*pFunc)(float);
とします。
これは、
-int型の戻り値を返す
-ひとつのfloat型が仮引数の
-"pFunc"という名前の関数ポインタ
です。
今まで秘密にしてきましたが(?)、関数ポインタは通常のポ...
入れる値とは、関数のアドレスです。
以下は関数、関数ポインタ、それへの代入の一通りの例です。
int MyFunc_1(flaot a){ return (int)a + 1; }
int MyFunc_2(flaot a){ return (int)a + 99; }
int (*pFunc)(float);
/* .... */
pFunc=MyFunc_1;
printf("MyFunc_1 %d\n",pFunc(2.0f));
pFunc=MyFunc_2;
printf("MyFunc_2 %d\n",pFunc(1.0f));
実行結果は
MyFunc_1 3
MyFunc_2 100
となります。
関数ポインタですが、変数というからには型があります。型が...
では、関数ポインタの型とは何なのでしょうか。
下のpFuncの場合、
int (*pFunc)(float);
型は
int (*)(float);
です。どう見てもアナルです。爆発はしません。
typedefの使い方は、
typedef int INTEGER;
これでintの別名"INTEGER"の完成でしたね。
よく見てください。
int INTEGER;
後ろ部分は、『int型の変数の宣言』と形が同じです。
という事は、関数ポインタのtypedefも、
『int (*)(float)型の変数の宣言』に"typedef"をくっつけたも...
つまり、下です。
typedef int (*pFunc_t)(float);
これで『int (*)(float)の別名pFunc_t』のできあがりです。
次からは、
pFunc_t pFunc;
として関数ポインタを宣言することができます。
すっきりしましたね。
通常のポインタには、多重ポインタがあります。『ポインタの...
int v=0;
int* p = &v; //int型へのポインタ
int** pp = &p; //int*型へのポインタ
int*** ppp = &pp; //int**型へのポインタ
***ppp = 99; //v = 99
関数ポインタも例外でなく、『関数ポインタへのポインタ』な...
typedef int (*pfunc_t)(void);
pfunc_t* ppfunc; //int (**ppfunc)(void)と同等
pfunc_t** pppfunc; //int (***pppfunc)(void)と同等
pfunc_t*** ppppfunc; //int (****ppppfunc)(void)と同等
int (*****pppppfunc)(void); //pfunc_t**** pppppfuncと同等
こんなに多重ポインタを作ることはまずありえませんが、『関...
関数の引数に関数ポインタのポインタを渡して見る例です。
#include <stdio.h>
int add(int x,int y){ return x+y; } //足し算をする関数
int mlt(int x,int y){ return x*y; } //掛け算をする関数
typedef int (*pfunc_t)(int,int);
void set_1(pfunc_t*f){ *f=add; return; }
void set_2(pfunc_t*f){ *f=mlt; return; }
int main(void){
pfunc_t pf;
set_1(&pf);
printf("add %d\n",pf(99,1));
set_2(&pf);
printf("mlt %d\n",pf(33,3));
return 0;
}
pfunc_t pfの宣言外部で、pfの内容を操作しています。
実行結果は次のようになります。
add 100
mlt 99
**C++に対するアプローチ [#w0199a12]
''(注意)ここはCの範囲ではありません、Cではできないことを...
いやむしろなぜCの項に用意したんだよww(関数ポインタの有...
***関数オーバーロード時の動作 [#g698fbf5]
関数Functionをオーバーロードしています。
#include <stdio.h>
void Function(long int){
printf_s("long intはintよりも大きいから豊乳じゃと!...
}
void Function(short){
printf_s("shortはintよりも小さいからは貧乳じゃと!?...
}
void Function(void){
printf_s("ツルペタ始まったな\n");
}
int main(void){
{
void (*pfunc)(short);
pfunc=Function; //コンパイル時に型が自動推論される
pfunc(short());
}
{
void (*pfunc)(void);
pfunc=Function; //コンパイル時に型が自動推論される
pfunc();
}
return 0;
}
実行結果は
shortはintよりも小さいからは貧乳じゃと!?
ツルペタ始まったな
となります。
***メンバ関数に対する動作 [#vbe096d6]
メンバ関数のポインタをとってみましょう。
class CFoo{
public:
void func_v(){
printf_s("仮想関数だと!?\n");
}
static void func_s(){
printf_s("ぼくは静的関数ちゃん!\n");
}
};
/* .... */
void (*pfunc)();
pfunc=CFoo::func_v; //ここでコンパイルエラー
CFoo::func_vはCFooのインスタンスがないと実行できない関数...
staticがないので当たり前ですね。
では以下はどうでしょうか。
インスタンスを生成してメンバ関数をとってみます。
void (*pfunc)();
CFoo a;
pfunc=&a.func_v; //error C3867 , error C2440
これもエラーです。エラー内容を見てみましょう。~
:error C3867:"CFoo::func_v"のポインタを取得したかったら"...
どうやら、ポインタを取得するには"a.func_v"ではなく、"&CFo...
でもこれではせっかくインスタンスを作ったのに意味がありま...
:error C2440:"a.func_v"は"void(__thiscall CFoo::*)()"型...
という事は"pfunc"を"void(__thiscall CFoo::*pfunc)()"と宣...
結論から言えば、理論的にはこれで解決です。コンパイルでき...
ただし、重要な問題が発生します。~
それは、この場合のpfuncは『関数ポインタ』ではなく『メンバ...
メンバポインタについては『関数ポインタのC++に対するアプロ...
追記:~
gccで同様のコードをコンパイルしたところ、
error: ISO C++ forbids taking the address of a bound mem...
Say ‘&CFoo::func_v’
とのエラーが出ます。'''(訳:ISO C++では、インスタンスのメ...
要は仕様で禁止されている、ということです。~
理由は知りません。ごめんネ
*ソケット [#f4b77e15]
そもそもソケットて何?~
皆さんはインターネットをしたことがありますよね?え、無い...
今あなたはインターネットでこのページにたどり着いたんです...
ちなみにそのインターネットと言うのは1969年にアメリカ国防...
(以下省略)~
と言うものです。~
さてここで本題のソケットですが、ソケットと言うのは簡単に...
ここでは皆さんが使っているであろうWindowsを例に説明したい...
しかし基本的にWindowsのソケット通信もUNIX系のソケット通信...
移植するのは極めて簡単です。だからこの説明も一応有用だと...
まあと言うかこの話は逆でUNIX系のOSであるBSDのソケットをWi...
というわけで本題です。~
まずWindowsでソケットを使いたい場合は~
winsock2.hとWSock32.libをリンクする必要があります。~
そしてプログラムの先頭でWSAStartupと言う関数を実行する必...
これはWinsockをスタートアップする関数です。~
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
という引数を取ります。第一引数のwVersionRequestedはWinsoc...
もしwinsock2.hの2に疑問持った人が居られたらあなたは実にセ...
この2はバージョンをあらわしているんです。
では具体的にこの引数には何を渡せば良いのか。~
winsock2の2がバージョンのことだってあんたさっき言ったじゃ...
と思うかもしれません。でも実際には下位互換性というものが...
もちろんその逆はできません。~
ではとりあえず第一引数には何を指定すれば良いかと言うと、M...
ん?と思った方が居るかもしれません。どうしてバージョン指...
答えはwVersionRequestedにはWORD型の変数で上位バイトにマイ...
そしてこのMAKEWORDでは上位バイトと下位バイトをそれぞれ設...
#define MAKEWORD(a, b) ((WORD)(((BYTE)((DWORD_PTR)(a) & ...
という形で宣言されてます。というわけでこのように指定でき...
それでは次の引数のlpWSADataですがこれはソケットに関する情...
つまりWSAStartupを使うには
WSADATA wsadata;
WSAStartup(MAKEWORD(1, 1), &wsadata);
と言う感じです。~
ちなみに0なら失敗です。~
これでWinsockが使えるようになりました。~
続きはまた今度~
*How to talk 2ch [#f4b77e17]
やあやあ
というわけでパパ、調子に乗ってHow to talk 2chなんて項目作...
これ理解するのにはソケットプログラミングができないといけ...
とりあえず2chに書き込むには皆さんご存知bbs.cgiというのに...
まあ簡単に言うとここに書き込みたいデータをポストするだけ...
具体的に言うとこんな感じ
POST /test/bbs.cgi HTTP/1.1 //まあこれは言わずもがなで...
Host: //これはwwwww.2ch.netみたいなホスト指定すればおk
Content-Length: //これは書き込みデータのサイズだ
Cookie: //これにはクッキーを入れなきゃいけない
Referer: //これは、まあよくわからんがhttp://wwwww.2ch.ne...
User-Agent: //ここにはユーザーエージェントを入れるんだ。...
Connection: close //まあこれもよくわからんがとりあえずこ...
[改行]
//そしてここに書き込む内容を書けばおk
書き込む内容は
hana=mogera&bbs=%s&key=%s&FROM=%s&mail=%s&submit=書き込む...
みたいな感じだまあ大体見ればわかると思うbbsにはnews4vipと...
ちなみにこれら全部URLエンコーディングしなきゃならない
まあ別にしなくてもちゃんと書き込めたりするけど推奨しない
まあ基本これらの内容をポストすれば良いわけだ
だが実際一度ポストしてみればわかるようにクッキーを要求さ...
だからもう一度クッキー込みでポストしなきゃいけないわけで
一度上のような内容でポストしてみればSet-Cookie:とか言うの...
Set-Cookie:以降の部分をそのままコピーしてしまえば良いんだ
とりあえずサンプルまでに俺の作った書き込みプログラムがある~
まあ出来の方は期待するな~
あと悪用するな~
ライセンスは知らん~
自己責任だ。俺は一切責任を負わない~
これでアク禁になろうがブタ箱に入ろうが知ったこっちゃ無い~
%%http://www8.uploader.jp/dl/vipprog/vipprog_uljp00252.zi...
にソースを置いておいたので~
ちなみに流れても俺は知らん
* && と || の特性 [#l13d9672]
文字列処理の関数などで、次のようなコードを見かけることが...
char* proccessed_text(const char* raw_text){
if(raw_text!=NULL && raw_text[0]=='~'){ ... }
}
このような書き方に慣れていないと、「raw_textがNULLのとき...
char* proccessed_text(const char* raw_text){
if(raw_text!=NULL){
if(raw_text[0]=='~'){ ... }
}
}
じゃないのか、と思ってしまいます。~
ですが最初のコードで問題ありません。なぜならば、''「&&演...
例を見てましょう。
#include <stdio.h>
int false(){ puts("false"); return 0; }
int true(){ puts("true"); return 1;}
main(){
if( false() && true() ){
puts("Hello");
}
}
これを実行すると、次のようになります。
false
見ての通り、true は表示されません。つまり、&&で結ばれた第...
つまり、最初の例では、「raw_text!=NULL が偽となった時点で...
&& と同様に、|| も途中で評価をやめることがあります。~
|| の場合は「どこか一つでも真なら全体で真」ですから、左か...
例
#include <stdio.h>
int false(){ puts("false"); return 0; }
int true(){ puts("true"); return 1;}
main(){
if( true() || false() ){
puts("Hello");
}
}
実行結果
true
Hello
*FAQ [#d9d36efd]
よくありそうな質問は[[こちら>C言語 - よくありそうな質問]]
*規格 [#l1bfd8fb]
-[[ISO/IEC JTC1/SC22/WG14 - C:http://www.open-std.org/jtc...
-[[日本工業標準調査会:データベース-JIS詳細表示:http://ww...
-[[C99 - Wikipedia:http://ja.wikipedia.org/wiki/C99]] - ...
*オヌスメサイト [#f4b77e16]
**初心者向け [#n6202dfa]
適当に増やし過ぎだろこれ。
-[[苦しんで覚えるC言語>http://9cguide.appspot.com/]]~
僕も初心者なのですが、このサイトは一般的に売られている入...
既知かもしれませんが僕のおすすめです。
-[[猫でも分かるプログラミング>http://kumei.ne.jp/c_lang/]]~
C/C++向けのページです。(最近C#が出てきたけど、C/C++が多い...
管理者の粂井さんは実際に「猫でも分かるシリーズ」という本...
章ごと分けられていて長すぎず疲れたりすることも少ないかと...
説明自体はVC++を用いられていますが、BCCに流用可能なソース...
ただしDirectXやOpenGLと言ったものは使っていないので、ゲー...
個人的にNo1サイトです。~
2chではよく叩かれています。ちなみに粂井さんは糖尿病の専門...
-[[コンピュータ基礎とプログラミング>http://ipl.sfc.keio.a...
-[[やる夫ブログ やる夫で学ぶプログラミングC言語入門 その...
[[その2>http://yaruomatome.blog10.fc2.com/blog-entry-2034...
[[その3>http://yaruomatome.blog10.fc2.com/blog-entry-2035...
[[その4>http://yaruomatome.blog10.fc2.com/blog-entry-2045...
超初心者向け、配列・ポインタ・構造体は含まない
-[[C言語講座:初級から中級まで>http://www1.cts.ne.jp/~cl...
入門講座、アルゴリズム、標準関数のリファレンスその他
-[[Visual C++ の勉強部屋>http://homepage3.nifty.com/ishid...
画像処理、電気回路の計算、統計、簡単なGUIなど~
**脱初心者向け [#a561a946]
以下のWebサイトを読んだからといっていきなり中級者になれる...
-[[プログラミングの禁じ手Web版>http://web.archive.org/web...
C/C++のコードを書く上でやってはいけないことを列挙したサイ...
サイトが落ちてるのでWeb Archiveで。C MAGAZINEも休刊したし...
-[[Cプログラミング診断室>http://www.pro.or.jp/~fuji/mybo...
-[[C言語 FAQ 日本語訳>http://www.kouno.jp/home/c_faq/c_fa...
**その他 [#g7e2ced0]
ポインタ
http://kmaebashi.com/programmer/pointer.html
リファレンス
http://www.cppreference.com/
Windows API
http://wisdom.sakura.ne.jp/system/winapi/
-[[Visutal C++ 2005/2008 Express Edition(IDE無料化の背景...
無料開発ツール「Visual C++ Express Edition」の活用方法
MacOS X,Emacs,g++の環境でC/C++
-[[俺流逆引きCプログラミング - わだいのたけひこのにっき:h...
FAQ っぽい読み物。和大で教員をされているtakehikom氏のプロ...
-[[CERT C Secure Coding Standards 日本語版 Ver 1.0:https:...
-[[アフォBlog C言語勉強したけどゲーム作れないぞコラって人...
DXライブラリでかいわれ育成ゲームを製作する~
コンソールからGUIへの移行という視点で解説されている~
-[[C言語 - Wikibooks:http://ja.wikibooks.org/wiki/C%E8%A8...
執筆者求む。
ページ名: