kansiho's memo

ruby, python, javascript. Rails, wordpress, OpenCV, heroku...

全然Windows開発したことのない人がVisual StudioでVisual C++でHello Worldやる時に読むといいまとめ(超基本)

https://isocpp.org/files/img/cpp_logo.png

Visual Studio とはmicrosoft統合開発環境である。今回はMacに入れたwindowsVisual StudioからC++でコードを書くという初めての試みの3乗をやるので、念のためブログに調べたことを書いておく。ちなみに私は今までターミナルのvimRailsアプリを作るという素朴な開発環境,Command+Rを高速で行う技術だけ磨いていた, IDEは使ったことなかった。今まで使ってきた言語はRuby, python, PHP … 総じて、コンパイルのいらない、いわゆるインタプリタ言語というやつで、恥ずかしながら、アドレスとかポインタとかそこまで意識してこなかった。。。

統合開発環境とは、なにか。改めて。

IDE(統合開発環境とは)

プログラムの作成には、テキストエディタコンパイラという 2種類の道具を使う必要があった。

分割コンパイル等によってプログラムのファイル構成が複雑になると、ソースから実行ファイルを得るためのビルド手順を自動化するツール(make や Ant、MSBuild など) が必要になる。

また、プログラム作成にはこれら以外に、動作時のプログラムの間違いを見つけて修正する手助けをするデバッガ、テストを自動化するテストツール、プログラムの各部分の性能を細かく測定することで性能向上の手助けをするプロファイラ、プログラムの修正過程を管理するバージョン管理システム、必要な機能追加やプログラムの誤りの修正状況を管理するバグ管理システム、デバッグ/リリースビルドや動作ターゲットや派生開発のターゲットなどによる設定の違いを管理する構成管理ツール、関係する画面設計などを手助けするGUI作成ツール、体系的なプログラムの修正を補助するリファクタリングツール、など、さまざまなツールを使う必要がある。

これらのツールを一つのツールから統一的扱うことが出来るようにしたのが、統合開発環境 (Integrated Development Environment, IDE) である。

Visual Studio 統合開発環境の使い方

Visual Studio 用語

Visual Studio でのプログラム作成には、以下の流れがある。 1. VS.NETの起動 2. プロジェクト(Windowsアプリケーション)の新規作成 3. プロジェクトのビルド(=プログラムの生成) 4. 生成されたプログラムの実行 5. VS.NETの終了(=プロジェクトの保存)

VS.NETで作ったプログラム(「.NETプログラム」と呼ばれる)は、「.NET Framework」という実行プラットフォーム上で動作する。

http://image.itmedia.co.jp/ait/articles/0405/19/dt-easyvs01.gif

プロジェクトとはなにか

VS.NETでは、1つの「(VS.NETの)プロジェクト」から1つの「プログラム」が生成できる。なお「プロジェクト」とは、プログラムの生成に必要な複数のファイル(「ソース・ファイル」と呼ばれる)をまとめたものである。つまりプロジェクトとは、VS.NET専用のフォルダのようなもので、複数のソース・ファイルを整理するための入れ物である。プログラムを作成するには、まず、このVS.NETのプロジェクトを1つ新規作成する必要がある。これには、IDEのメニュー・バーから[ファイル]―[新規作成]―[プロジェクト]を選択する。

連載簡単!Visual Studio .NET入門:第1回 初めての「Visual Studio .NET」 (3/4) - @IT

Hello World してみよう

C++の教科書の簡単なサンプルコードをVisual C++で動かす方法はふたつあります。一つは「空のプロジェクト」を作る方法、もう一つはVisual Studioが用意するコンソール・プリケーションのテンプレートを利用する方法です。まず、「空のプロジェクト」を作る方法を示します。メニューから「ファイル/新しいプロジェクト」を選びます。左側のテンプレートで「Visual C++」を選び、「Win32 コンソール アプリケーション」を選びます。下のところでプロジェクトの「名前」や「場所」を適当に決めます。

アプリケーションの設定で「コンソール アプリケーション」を選び、追加のオプションを「空のプロジェクト」として「完了」ボタンを押します。 メニューから「プロジェクト/既存項目の追加」を選びます。「C++ ファイル(.cpp)」を選び、名前を付けます。ここでは「Hello.cpp」とします。コードを打ち込んだら、打ち込んだら、メニューから「デバッグデバッグなしで開始」を選びます。

J.S.エコハのブログ: 初心者がVisual C++で"Hello World"を表示させる方法

C++ とは

なお、以下の例には

C++の超基本 - PukiWiki

を大いに参考させていただいた。

最初におまじないを入れる(後述)。

#include<iostream>
using namespace std; 

main(){} の中に処理をかいていく

int main(){ 

 処理1;
 処理2;
 ........ 

 return 0;
}

キーボードからの入力出力

変数xにキーボードから値を入力させるには、

  • cin: console input の省略形
  • cout: console output の省略形

を使う。 改行は、

  • endl: end line の省略形

で可能。 これらの変数は、

#include <iostream>

で読み込んでいる、C++標準ライブラリのI/Oストリームで提供されている。

cin >> x;
//プログラムを実行すると入力待ちになる、値をキーボードで打ってリターンを押せば入力される。

//変数xの値を画面に出力するには

cout << x;

// 改行して出すには endl

cout << "整数 a=" << a << endl; cout << "実数 x=" << x << endl;

ループ

for

for(int i=0; i<10; i++) cout << i << endl;

while

int i=0;
while( i<10 ){
 cout << i << endl;
 i++;
}

if, else if

elsif ではなくて else if とスペースはいることに注意

if(A) X;
else if(B) Y;
...
else Z;

配列

//型 配列[配列の数];

 
double v[3]; // doubleは実数の型を示す。v[0]   v[1]   v[2]ができた

// 初期値を一気に入れるなら{を使う。 double v[3]={1, 2, 3};

ファイルに書き込む

#include <fstream> // これでfout関数などが使えるようになる
int main(){

 .....

 ofstream fout("file.txt"); // ファイル名を命名

 .....
 
 fout << "Hello, World!" << endl; // 書き込み

 .....
 
 fout.close(); //  ファイルを保存して閉じる

 .....

 return0;
}

アドレスとアクセス

変数の前に「&」を付けると、その変数のメモリアドレスを表現できる。

cout << &a << endl; //0012FF50

アドレスが0012FF55 とかのとき、*(0012FF55) とすれば、そのアドレスにあるデータにアクセスできる。アスタリスク+アドレスで、そのアドレスのデータにアクセスできると覚えておく。

アドレスとポインタ

アドレスを保存するためだけの、変数を、データ型に*をつけることで表現できる。

たとえば、ある整数 int a=2; があったとき、 そのaのアドレスを保存する変数を、 int* pointer; と宣言することができて、実際にはaのアドレスは&aで示されるから、 pointer = &a;

// データの型* 変数;


int* p; //整数のデータのアドレス用のポインタ
int a = 100;
p = &a;

配列とポインタ

double v[3]={1,2,3};

としたとき、v[0]のアドレスは、vなのである。 連続する配列のアドレスは連続しているので、&(v[1]) == (v + 1), &(v[2]) == (v + 2) である。

足し算関数sum()を作ってみる

#include <iostream>
using namespace std;

// ポイント:main関数より先に、さらに、main関数の外に宣言しているのに注目

int sum(int a, int b); //関数sumの宣言
void output(int a); //関数outputの宣言
 
int main(){
    int a;
    a=sum(2,5); //関数sumの呼び出し
    output(a); //関数outputの呼び出し
    return 0;
}

//関数sumの定義


int sum(int a, int b){
    int c=a+b;
    return c;
}

//関数outputの定義
void output(int a){
    cout << "答えは" << a << "です。" << endl;
}

 

関数とポインタ

以下、引数が増えていく関数を作ろうとしているが、間違っている例。

#include <iostream>
using namespace std;
void plusone(int x); 
int main(){ 
    int a=1;
    plusone(a);
    cout << a << endl;
    return 0;
} 
void plusone(int x){
    x++;
}

main関数の変数aとplusoneの変数xは全く別物であって、plusone()がmain()のaに代入されていないことによる。 そこで、ポインタを使ってaのアドレスにアクセスしてaの値を書き換える。

int main(){ 
    int a=1;
    plusone(&a); // &でaのアドレスを取得。
    cout << a << endl;
    return 0;
} 
void plusone(int* p){ // aのアドレスを入れて
    (*p)++; // そのアドレスのデータ(*p)を1増やす。
}

ファイルを分割してsumプログラムを作る

C++では一般的に、ヘッダー部(.h)と実装部(.cpp)を分ける。そのほうがコンパイル時間が早くなる・ビルド済みの実装部と要件定義を示すヘッダー部だけ配布するというシチュエーションがありうるかららしい

main.cpp

#include <iostream>
#include "func.h" // ヘッダファイルである、func.h (後述)を読み込む。iostreamはもともと用意されているので、<>で囲むが、自分で作ったヘッダファイルは二重かっこ"で囲む。
using namespace std; 

int main(){
    int a;
    a=sum(2,5); //関数sumの呼び出し
    output(a); //関数outputの呼び出し
    return 0;
}

func.cpp

#incl ude <iostream>
using namespace std;
func sum(int a, int b){
   c = a + b;
   return c;
}
void output(int a){
    cout << "答えは" << a << "です。" << endl;
}

func.h

関数の宣言だけを集めたファイル。ヘッダファイルという。 コンパイルのいらない部分だけを書くようにする。 したがっておまじない(include…)はいらない

int sum(int a, int b); 
void output(int a);

dll ファイルとは

Windowsを使ったことのなかった自分は、DLL??は??という感じであったが・・・ なんのことはない、Windowsにおける実行ファイルの拡張子である。 Windows.NET Frameworkの実装においては、アセンブリにはプロセスアセンブリ (EXE) とライブラリアセンブリ (DLL) の2種類がある。DLLは、EXEファイルから呼び出されて、EXEファイルに機能を提供するためのファイル。DLLは、Dynamic Linking Library(ダイナミック・リンキング・ライブラリ)の略で、よく使う機能は互いに共同で使えるように独立させておき、必要に応じ てアプリケーションが共同して使えるようにしたソフトである。EXEを補佐する役割があるのがDLLと考えればよいようだ。