C言語初心者(に毛が生えた程度)です。
VBでしたら使えますし、コードが読めるので、
似たような(と言われた)Borland C++ Bulder4を
使用して、仕事でソフトを作ることになりました。
ところが、ヘルプを見ても良くわからないのですが、
VBでのShow&Unloadにあたる命令って何でしょう?
起動時にMainフォームを表示させておき、
各Clickイベントで別のフォームに切り替えるようにしたいのです。
(Main→Log
(他の機能は後日に完成ということです。)
本来なら独習すべきなのでしょうが、明日中に画面を完成させ、
お客にプレゼンすることになっているので、恥ずかしながら、
ここの知恵をお借りしたいのです。
どうかよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

こんにちは、honiyonです。



 私は前回の回答の前にサンプルを作成して実行出来る事を確認しています。
 サンプルは以下の手順で作成しました。
  1.C++ Builderを起動
  2.フォームを一枚追加(Form2)
  3.Form1に Button1を配置
  4.Button1のクリック時のイベントに Form2->Show(); を記述
  5.Unit1.cppに #include "unit2.h" を記述

 こちらで問題なく動作しました。
 念のため以下がソースです。(Unit1.cpp)
Form2(Unit2.cpp)は作成しただけで手をつけていません。

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2->Show();
}
//---------------------------------------------------------------------------

 今回の隣家エラーの意味は、「モジュール Project1.obj が参照する外部シンボル 'TForm1::' が未解決 です。
 詳しくは、そのエラーメッセージをクリックし、F1を押して下さい。詳しい開設が表示されます。(C++ Builder4で動作を確認)

 これについては、ソースコードを見てみないと原因が分かりません。
 色々原因を探ってみて分からない場合は、一服した後少し昔に戻ってみましょう。 今回のケースは根本的な部分なので最初まで戻ることになってしまいますが。
 まずは今のプロジェクトファイルはおいといて、新しいプロジェクトファイルで簡単な骨組みを作成して動作を確認してみてはいかがでしょうか? そしてそれに肉付けしていき、こまめにコンパイル、実行をします。 
 その過程でエラーの原因が分かるかもしれないし、分からないまま今のプロジェクトファイルと同じ物が出来てしまうかもしれません。

 かなり遠回りで時間のかかる作業ですが、急がば回れといいますようにどうしても原因が分からない場合は、これが有効な手段だと思います。

 参考になれば幸いです(..
    • good
    • 0
この回答へのお礼

別のプロジェクトに1つずつ追加してコンパイルさせてみました。
どうもセーブエラーを起こしていたようで、Form1とForm21が
正常に保存されていなかったようです。
作成しなおしたらうまくいきました。ありがとうございました。

お礼日時:2001/11/21 14:41

こんにちは。



>[リンカ エラー] Unresolved external 'TForm1::' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER4\PROJECTS\PROJECT1.OBJ.

ビルダーだと、Cソースと同名のヘッターファイルを勝手に作って、そこで、オブジェクトを宣言していますが、そちらに追加されていますか?
多分宣言がされていないのではないでしょうか。

そもそも、フォーム名は、Tform1ですか?
表示-オブジェクトインスペクタ(だと思う)
イベント タグ内に OnClick がありますので、そいつをダブルクリックしてみてください。(どこか、ウチ間違いかもしれません。)

なお、VBと違って、大文字・小文字が、厳しいですからねぇ・・・。(自動修正されません)
参考になれば。
でわ
    • good
    • 0
この回答へのお礼

下にも書きましたが、作りなおしで何とかなりましたが、
大文字小文字のミスが3箇所ほどありました。
ご注意頂いたので早期に発見できましたので、
関係ないかもしれませんが、お礼を一言。
ありがとうございました。

お礼日時:2001/11/21 14:47

こんにちは、honiyonです。



 すいません、私の回答ミスでした。

 Form21->Show;

 ではなく、

 Form21->Show();

 でした。
 C/C++は引数がなくても()が必要でしたね。

 すいませんでした(..

この回答への補足

さっそくやってみました。

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form21 -> Show();
}
//--------------------------------------------

今度はリンカエラーとかになりました。(TT)

[リンカ エラー] Unresolved external 'TForm1::' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER4\PROJECTS\PROJECT1.OBJ.
[リンカ エラー] Unresolved external 'TForm21::' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER4\PROJECTS\PROJECT1.OBJ.

困ったなぁ・・・

補足日時:2001/11/20 14:11
    • good
    • 0

こんにちは、honiyonです。



 Form4なんて知らないよって言われていますね。
 Main.cpp には、Form4を宣言してあるLog_err.cpp(Log_err.h)をインクルードする事を宣言しまたか?

 Main.cppの一番最初にいろいろ #includeの宣言があると思います。
 そこに #include "Log_err.h" を書き加えてください。

 Form21を使用しようとしているのに Form4なんて知らないって言われているのがよく分からないですが、とりあえずこれで解決出来ると思います。

 参考になれば幸いです(..

この回答への補足

Form4 は貼り間違いです。すいません。
今度はインクルードを入れました。

#include "Main00.h"
#include "Log_err.h"
//-------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Form21 -> Close;
}
//-------------------------------------------

でも、実行すると、

[C++ エラー] Main00.cpp(15): E2235 Member function must be called or its address taken.

と出ます。ヘルプを参照しても、メンバー関数を呼び出すかアドレスを指定してくださいって
クラスじゃなかったんでしょうか?それとも、まだ、凡ミスしてるのでしょうか?

補足日時:2001/11/20 10:08
    • good
    • 0

こんにちは、honiyonです。



 対象のフォームのクラス名が Form1の場合、

 Form1.Show → Form1->Show;
 Form1.Hide → Form1->Close;
 Form1.Unload → Form1->Free;

 となります。
 Form1->Freeをした場合、クラスを解放しているので再び表示するには、 Createしなければなりません。 例)Form1 = TForm1.Create(オーナーオブジェクト);
 C++ Builderの場合では、おほどメモリ不足で悩まない限りは Closeで十分だと思います。(私的意見です) 閉じるボタンが押された時も、C++ Builderでは Freeではなく Closeが実行されます。

 参考になれば幸いです(..

この回答への補足

Main.cppのForm1上のボタン2をクリックすることで、
Log_err.cppのForm21を表示させたいのですが、

void __fastcall TForm1::Button2Click(TObject *Sender)
{

}
//---------------------------------------------------------------------------

に、『 Form21 -> Show 』では

[C++ エラー] Main00.cpp(13): E2451 Undefined symbol 'Form4'.
[C++ エラー] Main00.cpp(14): E2379 Statement missing ;.
と出てしまいました。

クラス名『Log_err』でも同じでした。

補足日時:2001/11/19 20:07
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

QC言語 int main(void) main()

C言語のmain関数について、質問させていただきます。

私の手元に、林 晴比古さんが執筆された著書、
2007年度版の新C言語入門 スーパービギナー編 (C言語実用マスターシリーズ) [単行本]
http://www.amazon.co.jp/gp/product/4797325631/ref=oh_details_o04_s00_i00?ie=UTF8&psc=1
があります。

これと同一の2000年度版の著書、
http://www.amazon.co.jp/%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8-C%E8%A8%80%E8%AA%9E%E5%AE%9F%E7%94%A8%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9E%97-%E6%99%B4%E6%AF%94%E5%8F%A4/dp/4797306718/ref=sr_1_cc_1?s=aps&ie=UTF8&qid=1383091260&sr=1-1-catcorr&keywords=%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80+%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8
も、所持しています。

main関数の書き方が、2007年度版の新しい方では、
int main(void)
{
}
と記載されており、
2000年度版の古い方では
main()
{
}
と記載されています。

改訂版なので両者を同じページで内容や例題を照らし合わせても、この部分が変わっていることを確認できます。
つまり、2007年度版では、2000年度版では書かかなくてよかった「void」を、一新して記載するようになっています。

ここで質問ですが、両方のやり方で、コンパイルすると両方ともエラーなくきちんと表示されます。しかしこれはどのような理由で変更されたのでしょうか?

詳しい方がいましたら、ご回答よろしくお願い申し上げます。

C言語のmain関数について、質問させていただきます。

私の手元に、林 晴比古さんが執筆された著書、
2007年度版の新C言語入門 スーパービギナー編 (C言語実用マスターシリーズ) [単行本]
http://www.amazon.co.jp/gp/product/4797325631/ref=oh_details_o04_s00_i00?ie=UTF8&psc=1
があります。

これと同一の2000年度版の著書、
http://www.amazon.co.jp/%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9%96%80-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E7%B7%A8-C%E8%A8%80%E8%AA%...続きを読む

Aベストアンサー

本当に「詳しい人」に聞きたいなら, こんなところに質問するのではなく出版社に問い合わせるべきではないかな. 著者自身がここを見てるかどうかわからないし, よしんば見て回答していたとしてもそれが本当に「著者の回答」なのか, 判断のしようもないでしょ?

まず 1つ考えられるのが「お行儀」. 引数リストの void は「今の場合は」書かなくてもいい (書いてあるかどうかで意味の変わる場面は存在する) し, 返り値の型も「省略されていれば int」と推定するので書かなくてもいい. でも, いろいろ考えた結果「引数がないときには void と書く」とか「返り値の型は int であっても書く」とかしたんじゃないかな.... 手元にその本は (どっちの版も) ないので確認できないんだけど, 前の版で main の中に return 文はありますか?

もう 1つ, 返り値の型を書くようになった理由としては C++ の絡みも考えられます.

まあ今から勉強するならどちらも書かない理由はないわけですが.

QBorland C++ Free Compilerがダウンロードできないので

http://www.borland.com/jp/products/cbuilder/freecompiler.html

現在ftpサーバーが落ちてる?のかリンク切れ?なのか、上記ページからBCCがダウンロードできません。
二次配布してるとこはありませんか?

Aベストアンサー

下記URLから Compiler をクリックしてダウンロードできると思いますよ。

http://www.borland.com/downloads/download_cbuilder.html

一応、無料ですがユーザー登録が必要です。

Qvoid main(void){...}だとDosWindowが開くので

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=NULL;
wc.cbWndExtra=NULL;
wc.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
RegisterClass(&wc);
hW=CreateWindow
(
"goo",
"教えて!goo",
WS_OVERLAPPED,
0,
0,
640,
456,
NULL,
NULL,
hI,
NULL
);
ShowWindow(hW,nCS);
UpdateWindow(hW);
while(GetMessage(&ms,NULL,NULL,NULL))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
return (ms.wParam);
}

もっと簡単にDosWindowが開かないようにする方法はないのでしょうか?
もしないとすると上記記述でもっと簡単にできないでしょうか?

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc...続きを読む

Aベストアンサー

ウィンドウを開く必要がないなら、mainをWinMainに変更するだけで良いのでは? ウィンドウクラス登録、ウィンドウ作成、メッセージループ、ウィンドウプロシージャは全て不要な気がしますが。

WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
  //処理内容

  return 0;
}

Qmain()とint main(void)の違い

最初main()と習ったのですが、最近学校でmain()ではなくint main(void)を使うように
なりました。
どのように違うのでしょうか?
main関数のところに引数が入っている意味がわかりません。
(void)ってなんですか?
そもそも引数って何ですか?
あと、プログラムの最後にreturn(0)って書いてあるんですが、これはどういう意味ですか?
回答よろしくお願いします。

Aベストアンサー

C言語の歴史的な流れとして、だんだんと厳格になっています。最初は無かった規則が、後の規格で追加されています。
互換性のために古い書き方もある程度できますが、新しい記述方法が推奨されます。

話がmain関数だとちょっとわかりずらいところもあるので、いったん、自分で関数fooを定義するときのことを考えます
○引数
引数は関数を呼び出すときに()の中に指定するもので、呼び出し側と関数とのデータのやりとりに使用します。
例えば、 atofなら atof(s1)として文字列s1を関数に渡します。aotf関数では、渡されたs1から数値に変換して戻り値として返します。
これを、atof(s2)とかatof("3.14")とか引数を変えることで、戻ってくる値も変わります。

○ return
関数から戻り値として値を返すときにreturn を使います。
通常はretrun で値を返す必要があります。
戻り値が無いことを示す void型の関数の場合は逆にreturn X ;と値を返してはいけません。return;とだけ書きます。

○ foo()
これは、関数定義の際に
・戻り値の型が省略されたときはint型とみなす
・引数に何も記述が無いのは、「可変引数」だとみなす(要するに、いろんな型の引数を何個並べてもいい)
というルールが適用されます。これは、古いCがそのように動作していたからです。
現在ではこのような省略は推奨されていません。現行のルールで省略無しに書くと
int foo(...)
となります。

○ int foo(void)
可変引数だと、引数の型も数も任意になるので
foo(a), foo(0.5,8), foo("BAR",3),foo(3,"BAR")
いずれも「問題無い」としてコンパイルできてしまいます。普通に考えて、foo("BAR",3),foo(3,"BAR")が両方動作する状況は少なく、どちらかが間違いなはずです。
そこで、現在では、引数の型と数をちゃんと宣言するようにし、可変引数は、最小限の本当に必要なところだけにします。

何も引数が無い場合(foo()と使用する)、 foo()と宣言したら上の暗黙のルールが適用されてしまいます。そこで、「何も無い」ことを明示するために、 (void)と宣言します。

○ int main(void)
main関数も関数の一つなので、上のルールが適用されます。
ただ、特殊な扱いをされる関数なので、なんでもかんでも使えると、システムとして問題にあります。
そのため、戻り値と引数には一定の決まりがあります。
・戻り値はint
・引数は (void)または(int, **char)
・それ以外は環境依存。組込み用等の特殊用途では、上のルールを使わないで、専用の型と引数になることもある。

○main関数の引数
最初のころの演習問題だけだと、意識することは無いでしょうが
例えば、入力ファイル名を変えるとき、演習ではソースを変更→コンパイルとしていると思います。

しかし、実際の場面では、そんなことはしていません。
a.txtを表示するなら
cat a.txt (WINDOWS なら type a.txt)
b.txtを表示するなら
cat b.txt (WINDOWS なら type b.txt)
と、コンパイル無しでできます。
これらのa.txt,b.txtのような指定を「コマンドライン引数」あるいは、他と区別付くなら単に「引数」と呼びますが、これをプログラムから受け取るための仕組みがint main(int, char**)と宣言されたmain関数の引数になります。
詳しくは、参考書、入門サイト等を見てください。

○main関数の戻り値
これも演習問題では意識することは無いでしょうが

まず、int型として宣言した以上は、なにか値を返す必要があります。そのためにreturn 0;のように明示する必要がありす。

バッチファイルやシェルスクリプトを使っていると、コマンドが成功したかどうかで処理を分けたいことがあります。
このとき使用するのが、例えばWINDOWSだったらERRORLEVELなのですが、これに設定されるのが、main関数の戻り値です。

通常、正常終了では0,エラー等があった場合は0以外を返すようにします。

returnを省いても、main関数の最後まで来ればプログラムは終了しますが、そのときには何が返るかわかりません。0でないことが多いでしょう。となると、正常に終了したはずなのに「異常終了」とみなされてしまうことになります。

C言語の歴史的な流れとして、だんだんと厳格になっています。最初は無かった規則が、後の規格で追加されています。
互換性のために古い書き方もある程度できますが、新しい記述方法が推奨されます。

話がmain関数だとちょっとわかりずらいところもあるので、いったん、自分で関数fooを定義するときのことを考えます
○引数
引数は関数を呼び出すときに()の中に指定するもので、呼び出し側と関数とのデータのやりとりに使用します。
例えば、 atofなら atof(s1)として文字列s1を関数に渡します。aotf関数では、渡さ...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報