トップページ⇒tech
1001コメント336KB

【初心者歓迎】C/C++室 Ver.28【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/06/09(金) 10:08:51
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0052デフォルトの名無しさん2006/06/11(日) 01:51:41
ポインターの勉強を始めたんですが、分からないことがあるので教えてください。
環境は VC++2003/2005 でプロジェクトのプロパティでコンパイル言語をC言語にしています。

#include <stdio.h>

int main() {
    char exe[] = "test.exe";       /* �@ */
//  char *exe = "test.exe";        /* �A */
    char *p = strrchr( exe, '.' );
    if( p ) {
        strcpy( p, ".ini" );
    }
    printf("%s\n", exe);
    return 0;
}

�Aの方を有効にすると実行時にエラーになってしまいます。
�@も�Aもやっていることは同じだと思っていたのですが、何か違いがあるのでしょうか?
0053デフォルトの名無しさん2006/06/11(日) 01:53:00
どうやってOSで調整しているんだろう?>clock()
for文などで何回も空ループさせて、計測しているのか?
CPUの周波数があらかじめわかると計算できるけど
OSからみれば、どのCPUに搭載されるかわからないからね〜
0054デフォルトの名無しさん2006/06/11(日) 01:57:36
>>53
まぁあれだ。オープンソースのOSのソースみればわかるよ
0055デフォルトの名無しさん2006/06/11(日) 02:04:37
>>52
それらは全く別物。


char a[] = "abc";

は

char a[] = {'a','b','c','\0'};

と同義。

char *a = "abc";

は、メモリ上のどこかに確保された文字列定数「"abc"」へのポインタを、ポインタ変数「a」の初期値としている。



文字列定数は、あくまで定数だから変更しちゃいかん。
0056デフォルトの名無しさん2006/06/11(日) 02:09:51
>>52
この手の間違いはC初学者にはとても多いので、何か命名した方がいいと思った

「リテラルレイプ」とか

そうすれば回答者は「リテラルレイプでググれ」で済むし、
質問者も「リテラルレイプはCでよく陥るミスなんだな」と
理解が早まると思ったんだがどうか
0057472006/06/11(日) 02:53:42
>>51
ありがとうございます。
ヘッダをインターフェース確認ファイルとして使うときに分ける感じでしょうか?
VisualC++ですと1クラス1ヘッダが推奨されているようなんですが、
組み込みのSTL等見るとインラインに加えて複数クラスが
ヘッダで定義されているんですが、
どっちがよいのでしょうか?
0058522006/06/11(日) 03:04:49
>55
素早い回答ありがとうございます。

char a[] = "abc";
と
char *a = "abc";
では実際に確保されるメモリ領域が異なるということでしょうか?

char a[] = "abc"; はヒープ領域?に確保される。
char *a = "abc"; は静的領域?に確保される。
静的領域に確保されたメモリは変更できない。

という理解でいいんでしょうか?
0059デフォルトの名無しさん2006/06/11(日) 03:36:21
data/bss/stack/moat/heapで区別するなら文字列実態はdataセクション、
ポインタはstack(auto) or bss(static),
配列の名前はおそらく即値でアセンブラ命令に直接入るだろうな。
0060デフォルトの名無しさん2006/06/11(日) 03:43:41
>>59
ちょwwwww

どうみても初心者なのにその解説かよwwww
0061デフォルトの名無しさん2006/06/11(日) 08:09:30
>>58
# とおりすがりですが、、、、

実装される領域に注目しすぎると本質を見失うかも。
定数(const)かどうかに注目したほうが理解しやすいと思います。

char a[] = "abc";
これは、配列(メモリ上の領域)の定義。(const指定子をつけていないので書き換え可能)
char *a = "abc";
これは、ポインタの定義。
リテラル("abc")を指すように初期化される。
通常リテラルはconst属性を持つ定数配列なので、書き換えができない。
コンパイラにうるさくwarningさせれば、この初期化が問題を起こしうることは
コンパイラが指摘してくれるはずです。
また、コンパイラオプションによって、リテラルを定数として扱わないように
することができる処理系も存在します。このようなオプションを指定すれば、
�Aのソフトも実行することは可能です。
ただし、この場合、処理系がどのようにリテラルをメモリ上に格納しているのか、
実装方法に対して十分に注意しないと、さらに予期せぬ動作につながるため
お勧めはできません。
0062552006/06/11(日) 08:33:14
>>58
配列は理解してる前提で書いたら、配列は理解してなかったのか…。


前者(a[])である配列の方は、文字列「abc\0」を格納するのに必要な領域を確保し、
それ全体に「a」と言う名前を付ける、と言う配列の定義。

後者(*a)であるポインタ変数の方は、どこかの領域を指すための値を格納するのに必要な領域なを確保し、
その領域に「a」と言う名前を付け、文字列定数「abc\0」の先頭を指すポインタ値で初期化しているポインタ変数の定義。


# ちなみに、文字列定数は、一般的には文字列リテラルと呼ばれる。
# 「文字列定数」と書いた方が、「何故、変更するべきモノではないのか?」がわかりやすいかと思った。
0063デフォルトの名無しさん2006/06/11(日) 09:02:20
だから、細かいことを言えば、pはchar*よりもconst char *である方がよい。
そうすれば書き換えようとしても、コンパイル時にエラーになる。

特にC++では文字列リテラルを非constなchar*へ初期化・代入できるのは、互換性のためとなっていたはず。
0064デフォルトの名無しさん2006/06/11(日) 13:05:24
>>56
そのネーミングセンスに感動した
0065デフォルトの名無しさん2006/06/11(日) 16:09:12
すみません。
今日からプログラミングをはじめてみたんですが、
プログラムが動きません。
色々ネットであさってみたのですが、よく理解できないので
ヒントでもいいので教えてください。
0066デフォルトの名無しさん2006/06/11(日) 16:10:56
>>65 http://www.kouno.jp/home/c_faq/
0067デフォルトの名無しさん2006/06/11(日) 16:11:30
>>65
何をどうしてどのように動かないのか書かないと口の出しようもない。
0068デフォルトの名無しさん2006/06/11(日) 18:16:31
すいません。質問です。
今日からはじめようと思うんですが、CとC++どっち覚えればいいですか?
と質問したいところですが、わからないっていわれたんで、

C++でできることはCで全部できますか?教えてください。
0069デフォルトの名無しさん2006/06/11(日) 18:21:20
C++のリファレンスがネットで観れるところはありませんか?
MSDNとかじゃなくてもうちょっと綺麗にまとまった感じで
0070デフォルトの名無しさん2006/06/11(日) 18:21:26
できるよ
0071デフォルトの名無しさん2006/06/11(日) 18:21:46
あるよ
0072デフォルトの名無しさん2006/06/11(日) 18:29:09
URLを教えてください!
0073デフォルトの名無しさん2006/06/11(日) 18:34:36
>>72
俺はC++に関してならここの「標準 C++ ライブラリ」のところを見ている。
http://www.microsoft.com/japan/developer/library/vclang/stdlbhm.htm
0074デフォルトの名無しさん2006/06/11(日) 19:35:37
>>68
「できること」というのがプログラムを作成するという意味なら可能
言語の機能を指してるなら不可能
0075デフォルトの名無しさん2006/06/11(日) 19:54:25
>>67
すみませんでした。ちょっと頭痛かったのでそこらへん忘れていました。
borlandをsetbccを使って設定までしたのですが、
作ったのを動かす(?)ことができません。
たぶんborlandの使い方が理解できていないと思うのですが・・・

作ったやつをクリックすると1.exe 1.obj 1.tbsが作成されます。
プログラムの内容は文字の表示です。

その他書くことがあればお願いします。
0076デフォルトの名無しさん2006/06/11(日) 20:04:39
>>75 「何が動かないのか」が書かれていないが。
0077デフォルトの名無しさん2006/06/11(日) 20:04:44
>>75
ttp://www6.plala.or.jp/mnagaku/cmag/ac20005/
0078デフォルトの名無しさん2006/06/11(日) 20:51:50
>>70>>74
わかりました。ありがとうございます。
C言語から始めて、色々身に付けてC言語じゃ不便と感じるようになってからC++に手出したいと思います。
0079デフォルトの名無しさん2006/06/11(日) 21:45:41
初心者なんですがプログラムつくるまえに仕様書的なもの書くじゃないですか?
書き方とか参考になるサイトないですか?なにかけばいいやら…
0080デフォルトの名無しさん2006/06/11(日) 21:54:31
まず、マトモな日本語で概要説明が書けることが重要。
そこが欠落した人の図面はどこか破綻している事が多い。
0081デフォルトの名無しさん2006/06/11(日) 22:00:31
エラー処理がよくわからないのですが、
たとえばスタッククラスのpopメソッドで
空っぽなのに実行された場合など
どういうエラー処理をすればいいんでしょうか?
例外をthrowしたり、assert()を呼んだりの区別がよくわかりません。
0082デフォルトの名無しさん2006/06/11(日) 22:02:43
>>81
C++ ならとりあえず例外投げとけ。
0083デフォルトの名無しさん2006/06/11(日) 22:03:59
>>81
好きにしろ。ここはお前のプログラムの仕様を考えてやるスレじゃいないんだ。
0084デフォルトの名無しさん2006/06/11(日) 22:08:03
結構大事な話題だと思うけどね

表明とかEiffelの契約とか
0085デフォルトの名無しさん2006/06/11(日) 22:30:45
むしろ例外でpopした値を返せ
0086デフォルトの名無しさん2006/06/11(日) 22:33:23
>>75
その1.exeを動かせ。それがお前の作ったプログラムだ。
0087デフォルトの名無しさん2006/06/12(月) 00:00:04
システムフックに関して質問させてください。
いずれかのウィンドウがアクティブになるたびに処理をしたいので、
下記のようなシステムフッククラスを作成しました。
(長いので要点のみ)

// フックの登録
BOOL CHook::Set(HWND hWnd)
{
    m_hHook = ::SetWindowsHookEx( WH_CBT,
    (HOOKPROC)CHook::CBTProc,
    GetThisInstH(), // システムフックなのでNULLじゃなくインスタンスハンドル渡す
    GetWindowThreadProcessId(hWnd, &lpdwProcessId));
}
0088デフォルトの名無しさん2006/06/12(月) 00:00:35
// フックの処理
LRESULT CALLBACK CHook::CBTProc(int p_nCode, WPARAM p_wParam, LPARAM p_lParam)
{
    // 処理してはいけないメッセージなので、次へ渡す
    if( p_nCode < 0 || p_nCode == HC_NOREMOVE)
        return ::CallNextHookEx( m_hHook, p_nCode, p_wParam, p_lParam );

    if( p_nCode == HCBT_ACTIVATE ) // ここがアクティブウィンドウが発生したときの処理
        TRACE0(_T("アクティブ化\n"));

    return ::CallNextHookEx( m_hHook, p_nCode, p_wParam, p_lParam );// 次のフックへと繋げる
}

また、このフックハンドルや必要な変数はグローバルにし、他とかぶらないようにしてあります。

#pragma data_seg( ".CKHookData" )
HHOOKCHook::m_hHook = NULL;
#pragma data_seg()

この状態で使用すると、フックを呼び出したウィンドウがアクティブになったときにしか反応しません。
これではローカルフックと変わりません。
いろいろ試してはみたのですがどうにも・・・どなたかわかる方、ご教授願います。
MFCアプリで使用するので、DLLはMFC DLL の拡張モードで作成してあります。
0089デフォルトの名無しさん2006/06/12(月) 00:18:15
>>88
GetWindowThreadProcessId(hWnd, &lpdwProcessId));

フックを呼び出したウインドウと同じスレッドのみって自分で指定してるだろが。
システム全体にフックを有効にしたければ、ここをNULLにする。
0090k ◆WFGp1NZuiw 2006/06/12(月) 00:23:36
メモリを解放せずに,デストラクタのみを呼び出す auto_ptr のようなものを
作りたいのですが,うまくいきません.アドバイスいただけないでしょうか?
(placement new と組み合わせて使用することを想定)

書いてみたのは↓みたいなコードで,「pointer_->PointerClass();」のところで
文句言われてしまいます.

template<class PointerClass> class CleanPointer
{
public:
CleanPointer(PointerClass *pointer)
: pointer_(pointer)
{

};
~CleanPointer()
{
pointer_->PointerClass();
};

private:
PointerClass *pointer_;
};
0091デフォルトの名無しさん2006/06/12(月) 00:26:25
 >「pointer_->PointerClass();」のところで
はて……コピペミスではないようだが……高度な釣りかな。
0092デフォルトの名無しさん2006/06/12(月) 00:26:32
>>90
デストラクタの呼び出しは ~PointerClass() だよ。
しかしそのクラスが何の役に立つのかわからんな。
0093デフォルトの名無しさん2006/06/12(月) 00:26:42
>>90
デストラクタを呼ぶにはpointer_->~PointerClass();だぞ。
0094デフォルトの名無しさん2006/06/12(月) 00:26:55
>>89
できた・・・orz
即答ありがとうございます。
できた…かも。
今日一日潰れた問題でしたが、解決してよかったです。
ありがとうございました。さっそく必要な処理を加えていこうと思います。
0095k ◆WFGp1NZuiw 2006/06/12(月) 00:28:58
>>92, >>93
あ,ほんとだ.ありがとうございました.
0096京大生www2006/06/12(月) 01:18:09
Cです。
環境はどこまでいえばいいか分かりませんが、コンパイラはbcc32

テキストファイルのa.textが
abc
def
ghi
だとします。

char *hako[3];
で定義した配列ポインタを使って

*(hako+0) = abc
*(hako+1) = def
*(hako+2) = ghi

というかんじでファイルから配列にコピーしたいのですが、どうすればいいのでしょうか?
0097デフォルトの名無しさん2006/06/12(月) 01:23:03
>>96
宿題は宿題スレへ。
0098デフォルトの名無しさん2006/06/12(月) 01:23:57
これが今の京大生だったら泣けるw
0099京大生www2006/06/12(月) 01:24:16
宿題スレにも書いた。
早く答えて欲しい、製作意欲が失せてしまう
0100629 ◆zZtDbr6Gfc 2006/06/12(月) 01:25:24
答え聞いてるのに制作意欲も何もないよね
0101デフォルトの名無しさん2006/06/12(月) 01:25:59
いつかのトリップが残ってやがったorz
0102京大生www2006/06/12(月) 01:27:55
これが出来れば先がうまくいきそうなんだけど。
分からないなら分からないって言ってくれないか?
0103デフォルトの名無しさん2006/06/12(月) 01:29:01
>>102
わかるからわからないって言わないんだろうが。
マルチは失せろそして氏ね。
0104デフォルトの名無しさん2006/06/12(月) 01:31:10
>>102
我々には到底分からないので、どうか違う場所でお尋ねください
0105デフォルトの名無しさん2006/06/12(月) 01:39:48
>狂大生
お前には一生無理なんだからもう寝ろよ
0106デフォルトの名無しさん2006/06/12(月) 01:40:13
>>102
つまりお前のこの先はうまくいかないってことだ。
これは分かる。
0107デフォルトの名無しさん2006/06/12(月) 01:42:05
>>96
何がうまくいかないのかわからなけりゃ、答えようもないだろ?
まずは自分で書いて、わからないところを質問、相談しろ。
0108522006/06/12(月) 02:31:21
>61,62,63
回答ありがとうございます。

ポインタを使えば文字列定数でも書き換えられると誤解していました。
0109デフォルトの名無しさん2006/06/12(月) 10:47:13
>>96,99,102
BCC32で確認してある。ちなみにお前の配列はタダのポインタの配列
#include <stdio.h>
#define BUFSIZE 1000
FILE *fp;
char *fname = "testdata.txt";
unsigned char buf[BUFSIZE];
unsigned char *getnext(unsigned char *);
int main(void)
{
char *hako[3];
int i,g;
if((fp=fopen(fname,"rt"))==NULL){printf("cannot open file %s\n",fname);return 1;}
i=0;
while(1){
if(EOF==(g = fgetc(fp)))break;
buf[i++]= g;
}
//printf("%s",buf);
hako[0]=buf;
for(i=1;i<3;i++)hako[i] = getnext(hako[i-1]);
for(i=0;i<3;i++) printf("hako[%d] : %s\n",i,hako[i]);
return 0;
}
unsigned char *getnext(unsigned char *buffer){
while( *buffer != 0x0a) buffer++;
*buffer=0x00;
return ++buffer;
}
0110デフォルトの名無しさん2006/06/12(月) 18:02:04
リソースを使わずにエディットボックスを作りたいのですが
CREATEWINDOWの所を教えて下さい
0111デフォルトの名無しさん2006/06/12(月) 18:09:17
>>110
●どこまで調査したのか?
●どこまで理解したのか?
●何が理解できないのか?
●具体的に、どの様な事を試したのか?
0112デフォルトの名無しさん2006/06/12(月) 19:26:20
WISDOM SAKURAにあるソースでエディットボックスは作れましたが
リソースエディタなどで作れる物とは違い、線のみの枠なので
困っているのです
立体的な凹みのある物を作りたいのですが
0113デフォルトの名無しさん2006/06/12(月) 20:05:53
>>112
ttp://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/editcontrols/abouteditcontrols.asp
よく読むんだ
0114デフォルトの名無しさん2006/06/12(月) 20:10:58
携帯なので見れません
0115デフォルトの名無しさん2006/06/12(月) 20:19:42
>>96
各行は1023バイト以下とし、エラー処理等は割愛する。

char *hako[3];
char buffer[1024];
FILE* fp;
int i;
てな変数を用意して、

fp = fopen("a.text", "r");
for (i = 0; i < 3; i++) {
 buffer[sizeof(buffer)-1] = 0;
 fgets(buffer, sizeof(buffer)-1, fp);
 hako[0] = strdup( buffer );
}
fclose(fp);
0116デフォルトの名無しさん2006/06/12(月) 21:02:12
>>112
CreateWindowExで拡張スタイル指定すればいい
詳細はググレ
0117デフォルトの名無しさん2006/06/13(火) 17:35:50
質問です
コンパイラ C言語を始めよう! を使っているのですが実行してコマンドプロンプトに何も出ません
プログラム自体には間違いはないと思うのですが・・・
そもそもコンパイラとの受け渡しもよく理解できておりません ><

OS:windowsXP SP2
コンパイラに LSI C-86 Ver.3.30c 試食版 を使用
0118デフォルトの名無しさん2006/06/13(火) 17:46:39
開いた口蛾塞がらなくなった
0119デフォルトの名無しさん2006/06/13(火) 17:53:09
第三者だが老婆心で補足。

「C言語を始めよう!」ってのは、誰だかが作った簡易IDE機能を持つ
エディタのようなものの固有名詞のようです。

では淡々と続けてください:
0120デフォルトの名無しさん2006/06/13(火) 17:54:30
ちなみにこれです
http://homepage3.nifty.com/aokura/phoebe/phoebe.htm

プログラムは
#include <stdio.h>

main()
{
printf("ABC\n");
}
でも何もでません ><
0121デフォルトの名無しさん2006/06/13(火) 17:58:42
実行後にPAUSE にチェックを入れて、
コンパイルして実行してみたら?
0122デフォルトの名無しさん2006/06/13(火) 18:23:24
>>117
学習用としても、LSI-C86を使うことは激しくお勧めできません。
もっと近代的なコンパイラを使いましょう。
0123デフォルトの名無しさん2006/06/13(火) 18:28:14
>>122
おすすめの教えてください
0124デフォルトの名無しさん2006/06/13(火) 18:50:04
>>123
ttp://www.amazon.co.jp/gp/product/B000CSNTQ2/249-0740458-2933159?v=glance&n=637392
0125デフォルトの名無しさん2006/06/13(火) 19:00:13
>>123
これが良いかと思います。無料です。
 ↓
Visual C++ 2005 Express Edition 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1140806916/
0126デフォルトの名無しさん2006/06/13(火) 19:41:18
VCEEの登場で有象無象の学習用Cコンパイラとやらを使う理由がほとんどなくなったな。
0127京大生www2006/06/13(火) 19:43:27
釣りだろ
0128デフォルトの名無しさん2006/06/13(火) 19:48:15
>>127
自らの学歴を誇大するDQNキンモー☆
0129デフォルトの名無しさん2006/06/13(火) 21:43:36
109,115カワイソ
0130デフォルトの名無しさん2006/06/13(火) 23:11:16
最近C言語を始めた者です。
ヘッダファイルとCソースファイルに書くべきことは何ですか?
例えば、Cソースファイルで使う定数をヘッダファイルに書くなと聞いたことがあります。
どんなものがヘッダファイルに記述すべきで、どんなものがCソースファイルに記述すべきか教えてください。
0131デフォルトの名無しさん2006/06/13(火) 23:17:26
>>130
いろいろなソースファイルから参照される情報→ヘッダファイルへ
その他→ソースファイルへ
0132デフォルトの名無しさん2006/06/14(水) 00:44:33
APIを使ってウインドウのインスタンスハンドルを取得しようとしています。


HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE);

ここで警告がでてきます。
'型キャスト' : 'LONG' からより大きいサイズの 'HINSTANCE' へ変換します。
(VS.NET 2003 > VC++)

警告を出さないようにするにはどうすればいいんでしょうか?
0133デフォルトの名無しさん2006/06/14(水) 01:00:10
bcc55でプログラミングをしています。
平方根を求めるためにsqrt関数を使おうとしました。
#inclide<math.h>もちゃんと入れたのですが、
「エラー E2314 rego.c 27: 関数でないものを呼び出している(関数 main )」
と表示されうまくいきません。
どうすればいいのでしょうか?
0134デフォルトの名無しさん2006/06/14(水) 01:00:21
>>132
プロジェクトの設定の「C/C++」→「64bit移植への対応」を「いいえ」に
0135デフォルトの名無しさん2006/06/14(水) 01:12:51
sourceは?
0136デフォルトの名無しさん2006/06/14(水) 01:30:29
>>134
おお、見事に消えました。ありがとうございます!
0137デフォルトの名無しさん2006/06/14(水) 01:45:43
C言語をやろうと思い導入しました
ですがうまくいきません

------ ビルド開始: プロジェクト: C, 構成: Debug Win32 ------
コンパイルしています...
Cプラス.cpp
.\Cプラス.cpp(4) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
ビルドログは "file://d:\My document\Visual Studio 2005\Projects\C\C\Debug\BuildLog.htm" に保存されました。
C - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

となってエラーになります
0138デフォルトの名無しさん2006/06/14(水) 01:47:22
誤爆しました
さようなら
0139デフォルトの名無しさん2006/06/14(水) 07:28:13
>>132
<windowsx.h>のGetWindowInstanceの方が楽だよ。
中身はGetWindowLongPtrを呼んで結果をHINSTANCEへキャストするマクロ。
0140デフォルトの名無しさん2006/06/14(水) 09:48:48
>>137
まず、ソースも貼れ。
話はそれからだ。
01411332006/06/14(水) 10:34:01
#include<stdio.h>
#include<math.h>
#define n 5

int main(void)
{
int i;
double q[n],avq,qr,s;
double p=0,r=0;

printf("%d個のQのデータを入力してください\n",n);
for(i=0; i<n ; i++)
{
scanf("%lf", &q[i]);
}
for(i=0; i<n ; i++)
{
p=p+q[i];
}
avq=p/n;
for(i=0; i<n ; i++)
{
r=r+(q[i]-avq)*(q[i]-avq);
}
qr=sqrt(r/ (n(n-1)) );
s=qr/avq;
printf("Qの相対誤差は%20.15lfです。\n",s);
return 0;
}

ソース貼ってなかったですね。冗長なソースですがよろしくお願いします。
0142デフォルトの名無しさん2006/06/14(水) 10:37:44
>>141
× n(n-1)
○ n*(n-1)

これじゃnって名前の関数をn-1を引数に呼び出してると解釈される罠
01431332006/06/14(水) 12:03:47
>>142
ありがとうございます、解決しました。
こんな初歩のミスやってしまった・・・
01441372006/06/14(水) 13:26:03
>>140
ソースは単純なものです

#include <stdio.h>

main()
{
printf("ABC\n");
}

初歩の文字の表示すら受け付けないんでしょうか・・・
0145デフォルトの名無しさん2006/06/14(水) 13:32:05
>>144
C言語としてコンパイルすること。

C言語は、関数の戻り値の型の省略を認めている(暗黙にint型になる)
C++は、認めていない(main()関数は、かならずint型を返さなければならない)
01466232006/06/14(水) 14:32:17
Borland 5.5,bcpadを使用しています。
行列のプログラム計算をしようとしてて下のサイトのファイルを導入しようと思い、
ttp://www.ipc.akita-nct.ac.jp/~yamamoto/comp/cpp/class/class.html
で、matrix.hとmatrix.cppをダウンロードして、まずmatrix.hを
.hが入っているフォルダに入れてそのあとmatrix.cppをビルドしました。
しかし、Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
となってしまいました。それで解決する方法をそのあといろいろググって
保存ファイル名を「bcc32 -tW 保存ファイル名」にすればいいらしいということが
書いてあって早速やってみたのですが「エラー E2194: ファイル 'bcc32.cpp' が見つからない」
となってしまい、ビルドできません。さらに、ビルドを無視して
インクルードファイルを使ってプログラムを作って実行してみたのですがやはり、
「Error: 外部シンボル 'Matrix::~Matrix()' が未解決(Z:\○○\TORIAEZU.OBJ が参照)
Error: 外部シンボル 'Matrix::Matrix(int, int)' が未解決(Z:\○○\TORIAEZU.OBJ が参照)」
と出てきてしまいます。どうにかしてこれを使用したいのですがどうすればいいのでしょうか?
長文すみません。教えてください。よろしくお願いします。
01471372006/06/14(水) 14:42:14
>>145
拡張子をCにしていろいろ試したらできました
0148デフォルトの名無しさん2006/06/14(水) 14:47:25
>>146
そのmatrix.cppはクラスの実装だけだからそれだけじゃ実行できない。-cオプション付けてリンク、実行ファイル生成しなければobjファイルは吐けるけど。

でtoriaezu.cppでエラー出るのはクラスの実装がリンクされてない。上の手順でコンパイル済みのobjをリンクする必要がある。
bcc32 toriaezu.cpp matrix.objな感じで。
0149デフォルトの名無しさん2006/06/14(水) 15:05:21
補足すると、
bcc32 toriaezu.cpp matrix.cppでもいける。

でも元のソースの文字コードがEUCでそのままじゃエラー出るんで、
QKCかなんか適当な手段でShift-JISに直すと吉。
0150デフォルトの名無しさん2006/06/14(水) 15:11:36
あ、あと本格的に行列演算したかったらBoost::uBLAS使った方が幸せかもしれんが
俺は使ったことがないので手放しにお勧めしない。


適当にぐぐった
ttp://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.html
01511462006/06/14(水) 15:33:18
>>148-150さん。
小一時間考えても何をおっしゃってるのか理解出来ません( ノД`)
本当申し訳ないのですが、もう少し馬鹿にもわかるように
説明していただけませんか?本当すみません。
あと>>150のは見たんですけど、私はそれほど大規模な計算は
行わないと思いますのでこの山本さんのファイルを使用したいと思うのです。
■ このスレッドは過去ログ倉庫に格納されています