プログラミング II・Tips & FAQ


このページではプログラミング IIの実習で間違いやすいポイント・ プリントで充分に説明し切れなかったポイント・ 必要な説明が分散していてわかりにくいポイントなどについて説明します。

目次

C++Builder編 Word編 その他編 必要な解答が見つからなかったとき

C++Builder編

プリント中の例題プログラムをコンパイルする方法がわからない。

C++Builderでプログラムを作成するときは、
   int main(int argc, char **argv) 
   {
      ...
   }
とか、
   void __fastcall TForm1::Button1Click(TObject *Sender)
   {
      ...
   }
などの形が良く出てきます。 たとえば char **はポインタ型の宣言、 TForm1::はメンバ関数の宣言、 __fastcallは(C++Builder独自の拡張で) 引数のレジスタ渡しを宣言していますが、 はっきりいって、これらの意味をすべて理解する必要はありません。

プリント中の例題プログラムをコンパイルする場合、 次のような点だけを覚えておいてください。

  1. mainを含むプログラムは「ファイル」─「新規作成」─ 「コンソールウィザード」で作成します。 この時は、 C++Builderが自動的に生成したコード:
       #pragma hdrstop
       #include <condefs.h>
       
       
       //---------------------------------------------------------------------------
       #pragma argsused
       int main(int argc, char **argv)
       {
               return 0;
       }
    は一旦すべて消去しても構いません。
  2. Button?Click, FormPaint, FormCreateなどを含むプログラムは、 必ず Formに Buttonなどの必要なコンポーネントを置き、 このコンポーネントを選択した状態で、 「オブジェクトインスペクタ」 の「イベント」の対応するイベントの右側の部分をダブルクリックして、 C++Builderにコードを生成させます。 この場合、C++Builderが生成したコードは絶対に消去してはいけません。

    ちなみに Button?Click, FormPaintなどの関数名(プリントで使われているもののみ)とコンポーネントの対応は、 次のようになります。
    関数名 対応するコンポーネント 対応するイベント 説明
    Button?Click Button OnClick Buttonが押されたとき
    FormPaint Form OnPaint Formが画面に表示されたとき
    FormCreate Form OnCreate Formが作成されたとき
    FormKeyDown Form OnKeyDown キーが押されたとき
    FormMouseDown Form OnMouseDown マウスボタンが押されたとき
    Edit?Change Edit OnChange Editの内容が変わったとき
    Timer?Timer Timer OnTimer 指定した時間間隔毎
    Formは最初から用意されているウインドウのことです。

    例えば例題に

       void __fastcall TForm1::Button1Click(TObject *Sender)
       {
       }
    
    という部分があれば、Formの上に Buttonを一つ置いて、 「オブジェクトインスペクタ」の「イベント」の OnClickの右側をダブルクリックします。 すると上のようなコードは C++Builderが生成してくれます。 もちろん 「{」と「}」の間は自分でタイプするか、 どこかからコピーする必要があります。
コンソールアプリケーション・ウインドウアプリケーションのいずれの場合も、 このような手順を踏んだあと、 例題のプログラムのとおりに残りの必要な部分をタイプしたら、 今度はプログラムをファイルに保存しておきます。

メニューの「ファイル」---「すべて保存」を選ぶか、 スピードメニューの中の「すべて保存」(上の列の左から 2番目)を選びます。

このとき、混乱を防ぐため、プログラム毎に必ず新しいフォルダを作り、 新しいフォルダにファイルを保存します。 ウインドウアプリケーションの場合は 2回、 コンソールアプリケーションの場合は 1回、 保存するファイルの名前を聞かれますが、 とりあえず C++Builderが選んだ名前 ( Unit1.cpp Project1.bprか何かになるはず) にしておきます。

プログラムを実行するには、「実行」---「実行」か、スピードメニューの 「実行」(上列右から 2番目)を選びます。 実行中のプログラムを終了するには、ウインドウの右上の×印を押します。


#include ...の意味・使い方がよくわからない。

例えば sin, cosなどの数学関数を使ったときは
   #include <math.h>
という行がどこかで必要になります。 これはsin, cosなどが、 どういう型の関数かをコンパイラに教える命令です。 <と>の間に書く名前(例えば math.h)は、 関数(例えば sin)によって決まっています。

#include命令を挿入します。

ちなみに、プリント中の例題で使っているインクルードファイルは次の通りです。
関数 インクルードファイル
sin, cos, sqrtなど数学関数 math.h
printf, getchar, putcharなど Cの入出力関数 stdio.h
cin, cout, <<, >>, getなど C++の入出力関数 iostream.h
_argc, _argv dos.h
atoi, malloc, free, randなど stdlib.h
randomize time.h


コンソールウィザードでコンソールアプリケーションを作成したら、 結果を表示したあとすぐにウインドウが消えてしまう。

プログラムの最後に が必要です。 なぜか cin.get();または getchar()が 2回必要になる場合があります。

入出力の関数が多くあって、どれを使えば良いのかわからない。

ウインドウアプリケーションとコンソールアプリケーションでは、 入出力の方法が異なり、同じコンソールアプリケーションでも、 Cの関数を使う場合と C++の関数や演算子を使う場合があり、 混乱している人も多いと思います。

まず、出力には、 ウインドウアプリケーションは ShowMessageという関数、 C++のコンソールアプリケーションは、<<という演算子、 Cのコンソールアプリケーションは、printfという関数を使います。
int var1;(整数) double var2;(実数) char var3[];(文字列) char var4;(文字)
ウインドウ ShowMessage(var1); ShowMessage(var2); ShowMessage(var3); ShowMessage(var4);
コンソール(C++) cout << var1; cout << var2; cout << var3; cout << var4;
コンソール(C) printf("%d", var1); printf("%f", var2); printf("%s", var3); printf("%c", var4);
putchar(var4);
printfでは %d, %f, %sなどの、 いわゆる「変換文字」を型毎に覚える必要があります。

また、

  int a = 2;
  char str[] = "sqrt";
  double b = 1.414 ;
のとき、"2の sqrtは 1.414です。"という文字列を出力するには
ウインドウ ShowMessage(AnsiString()+a+"の "+str+"は "+b+"です。");
コンソール(C++) cout << a << "の " << str << "は " << b <<"です。";
コンソール(C) printf("%dの %sは %fです。", a, str, b);
のようにします。

ウインドウアプリケーションでは AnsiString型に対する +演算子を用いて、 文字列をつなげることができます。ただし、コンパイラが整数型に対する +演算子と勘違いしないように、最初に AnsiString()+という式を入れておきます。

コンソールアプリケーション(C++)では <<演算子を用います。

コンソールアプリケーション(C)では printfの第 1引数中の %から始まる「変換文字」が、2番目以降の引数と順に置き換わっていきます。

次に入力ですが、つぎの表の通りになります。
int var1; double var2; char *var3; char var4;
ウインドウ var1=StrToInt(★); var2=StrToFloat(★); var3=★; (該当なし)
コンソール(C++) cin >> var1; cin >> var2; cin >> var3; cin >> var4;
コンソール(C) scanf("%d", &var1); scanf("%lf", &var2); scanf("%s", var3); scanf("%c", &var4);
var4 = getchar();
ここで、★は InputBox(..., ..., ...)という形です。 (プリント p.17参照)


エラーメッセージの意味が良くわからない。

エラーの原因にはいろいろなものが考えられますが、 頻繁に起こるものはそれほど種類が多いわけではありません。

また 2番目以降のエラーメッセージは、 最初のエラーに影響されて起こるエラーの場合が多いので、 あまり気にする必要はありません。

Statement missing;.
行末の「;」がどこかで抜けています。
 
Unterminated string or character constant.
文字列を括る「"」か、 文字定数を括る「'」が対になっていません。
 
Undefined symbol '...'.
「変数 ...が宣言されていません。」 おそらく単なる入力ミス(スペルミス)でしょう。 あるいは必要な #include <...>を忘れているのかもしれません。
 
Declaration syntax error.
「宣言の構文的誤り。」 いろいろな原因が考えられますが、例えば関数の中で関数を定義していませんか? Cでは関数の中で関数を定義することはできません。 Button?ClickFormCreateなどのイベントハンドラも関数ですから、 この中に他の関数を定義することはできません。
 
'_fastcall TForm1::...(...)' is not a member of 'TForm1'.
断言はできませんが、Button?Click, FormPaintなどのイベントハンドラのひな型(次のような部分)
   void __fastcall TForm1::Button1Click(TObject *Sender)
   {
   }
を C++Builderに生成させずに、 自分でタイプして定義しようとした場合に、 このようなエラーが起こりがちです。

該当のイベントハンドラの定義を一度完全に消して、もう一度手順を踏んで C++Builderにイベントハンドラのひな型を生成させます。上記の 「プリント中の例題プログラムをコンパイルする方法がわからない」 をもう一度よく読んでください。 あるいは完全に最初からやりなおした方が早い場合もあります。
 

Lvalue required.
「左辺値が必要です。」 代入演算子 「=」の左辺には、変数が必要です。 おそらく 「==」と書くべきところを 「=」と書き間違えたのではないでしょうか?
 
Illegal character ....
「不正な文字 ... の使用」 おそらく全角文字をどこかで使用しているのでしょう。 (C言語では全角文字は文字列・コメント以外の場所では使えません。) 特に全角空白は見えないので注意が必要です。 「Illegal character ' '(0x8140)」というメッセージは、 全角空白を使用しているときに出ます。

ウインドウアプリケーションでボタンを押したときなどに、 画面に描いた絵を一度消したい。

次のような 2行でウインドウを背景色で塗り潰します。 つまり、これまで描いた絵は消去されます。
   Canvas->Brush->Color=Color;
   Canvas->FillRect(Rect(0, 0, ClientWidth, ClientHeight));

エディトなどで数値を入力するときに、 文字列が空になっても StrToIntStrToFloatがエラーにならないようにしたい。

例えば、次のようにすると、
   int i = StrToInt("0"+Edit1->Text);
先頭に害のない "0"が入りますから、 Edit1->Textが空になっても、 StrToIntはエラーになりません。

画面に描画するときの色を変えたい。

C++Builderでは、色は r*0x1 + g*0x100 + b*0x10000 という形の整数で指定します。ここで r, g, bはそれぞれ光の 3原色のの強さで 0〜255の範囲の整数で表します。

Canvas->Pen->Colorを変えると線を引くときの色が、 Canvas->Brush->Colorを変えると図形を塗り潰すときの色が、 それぞれ変わります。


Word編

レポートにプログラムの実行中のイメージを貼り付けたい。

プログラムのウインドウを選択している(タイトルバーが青くなっている)状態で、 を同時に押します。 これでクリップボードというところにウインドウのイメージがコピーされます。

今度は Wordを開いて、 Ctrl-v(コントロールキーを押しながら vを押す)か、 あるいはメニューの「編集」─「貼り付け」を選びます。


自分の顔写真をレポートに貼り付けたい。

プログラミング IIの受講生の顔写真は、 ここにあります。

まず、自分の顔写真をファイルにセーブします。

  1. 自分の顔写真の上で右クリック
  2. 適当なフォルダ(例えば C:\My Documents\)を選んで、 「保存」を選びます。
つぎに Wordからメニューの「挿入」─「図」─「ファイルから...」を選び、 先ほど保存したファイルを指定します。

ワード文書の行間を変更したい。

プログラムのソースコードを Word文書に挿入すると、 行間が空きすぎて間が抜けた感じになってしまうことがあります。 これを避けるためには、次のようにします。

行間を変えたい部分を選択している状態で、 メニューの「書式」─「段落」を選び、「インデントと行間隔」─「間隔」の 「行間」を「固定値」にします。 「間隔」も好みで「12pt」か「11pt」程度 (使っているフォントの大きさにより異なる。)にします。


その他編

DOSプロンプトで実行したプログラムの実行結果を、 (文字情報として)どこかにコピーしたい。

DOSプロンプトで実行するプログラムの実行結果をレポートに貼り付けるときに、 DOSプロンプトのイメージを直接貼り付けると、 印刷するときに大量の黒インクを消費するはめになります。

そういう場合はイメージではなく、文字情報だけをコピーしましょう。

DOSプロンプトの中の文字をクリップボードにコピーするには、 まず、範囲指定ボタン を押してから、 マウスで範囲を指定し、コピーボタン を押します。

逆に、クリップボード内のデータを DOSボックス内にペーストするには、 ペーストボタン を使います。


メールで質問

このページの中で必要な情報が見つからなかったときは kagawa@eng.????? 宛にメールで質問してください。

あるいは下のフォームを使っても構いません。

名前:

学籍番号:

E-mailアドレス:

上の 3つは匿名希望の時はなくても可。 (返信が必要なときは記入してください。)
 
質問・問い合わせ内容:

(自分で解決できたときは)解決法:


ページの先頭へ
もどる
Koji Kagawa (kagawa@eng.?????)