トップページ⇒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
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のは見たんですけど、私はそれほど大規模な計算は
行わないと思いますのでこの山本さんのファイルを使用したいと思うのです。
0152デフォルトの名無しさん2006/06/14(水) 15:45:55
>151
えーと。
分割コンパイルという言葉に聞き覚えは?
0153デフォルトの名無しさん2006/06/14(水) 16:45:58
>>152
返答遅くなってすみません!!どうしても外せない用事ができてしまって
外に出てしまいました。今出先のノートパソコンからやってるのですが、
分割コンパイルという言葉に聞き覚えはありません…
帰ってみてぐぐればわかるでしょうか?本当申し訳ありません。
0154デフォルトの名無しさん2006/06/14(水) 18:20:51
>>153
なんかとてつもなくわかりにくいような気もするが置いとく

・コンパイル時の動作
 とりあえずbcc32 toriaezu.cpp matrix.cppと打ち込んだ場合、
 コンパイラはまず最初にtoriaezu.cppとmatrix.cppをコンパイルしてtoriaezu.objとmatrix.objを作成する(この時点でエラーがあればコンパイルエラーと出る)
 次に、リンカ(ilink32.exe)を呼び出して、CUIアプリケーション用スタートアップモジュール(C0X32W.OBJ)や標準関数ライブラリ(CW32.LIB)と
 先にコンパイルしたtoriaezu.objとmatrix.objをリンクしてtoriaezu.exeを吐き出させる。

・ヘッダファイルとソースファイル(コンパイル単位)
 ヘッダファイルは通常、クラスや関数の宣言のみで単独でコンパイルや他のソースファイルにインクルードしても実体は含まれない。(テンプレートは通常ヘッダに実装書くけど置いとく)
 当然、宣言だけだと呼び出す関数がそのコンパイル単位に存在しないのでそのクラスの実装(matrix.obj)から関数を呼び出す必要がある。

ついでにBCC5.5.1のライブラリファイルとかの資料
http://support.borland.com/entry!default.jspa?categoryID=90&externalID=4323

混乱するかも知らん(;´Д`)
0155デフォルトの名無しさん2006/06/14(水) 19:54:30
先日、VisualC++EEをインストールしたんですが
環境変数設定で間違えて$(PATH)の値を消してしまって困っています
$(PATH)○○
となるはずですけど○○の部分がわかりません
変な話で申し訳ありませんが教えてください
どうかお願いします
0156デフォルトの名無しさん2006/06/14(水) 20:00:55
通りすがりですが、、

・複数のソースコードからなるソフトをひとつのexeファイルにまとめることができる。
 中規模以上のソフトは通常複数のソースファイルで構成されている。
 (もしこの機能がなかったら、たとえばLINUXカーネルのソースコードは、、、、、、)
 ひとつのソフトを分割してコンパイルすることになるので、コンパイル結果を結合する
 必要がある、リンカはこの結合を行い、結合されたソフトの実行開始アドレスなどを
 exeファイル内に設定する。
 (ちなみに、単一のCソースからなるソフトでも、リンカはスタートアップ時に初期化のために
  実行されるCRTなどを、コンパイル結果に結合して実行ファイルを作成している)

・C言語(コンソールプログラム)は、int main()から実行が開始される。
 (実際にはCRT(C0X32)の中のスタートアップルーチンからmainを読んでいるのですが、、、)
 よって、mainがないとリンカさんが困ってしまう。
 Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)

そしてふりだしへ、、、
0157デフォルトの名無しさん2006/06/14(水) 21:27:19
どうでもいいけどこのスレで_mainが未解決のエラーが出ると書かれたら、
十中八九WinMainから始まっているのに-Wを指定していなかったというオチ。
0158デフォルトの名無しさん2006/06/14(水) 21:40:38
>>157
不幸なことに今回はレアケースなのだよ
つまり10回のうち1、2回というか、それ以上
多分100万人に1人の…
0159デフォルトの名無しさん2006/06/14(水) 22:03:17
main.c hoge.c hoge.hをコンパイルする場合
bcc32 -etest *.h *.c
0160デフォルトの名無しさん 2006/06/14(水) 23:59:17
C言語での質問なんですが
関数定義、宣言の時
例えば
static void func(void){}と
void func(void){}とするのでは
何が違うんでしょうか
どなたか教えて頂きたいです
0161デフォルトの名無しさん2006/06/15(木) 00:03:59
>>160
別のソースファイルから呼び出すことができるかどうかが違う。
0162デフォルトの名無しさん2006/06/15(木) 00:09:21
>>160
前者は非公開、後者は他ソースに公開。
例えば同じ名前の関数が他ソースにあるときに問題になる。

最適化の観点からは、
gccなら前者ならインライン展開する可能性を期待できる。
iccなら事実上殆ど差がない。
0163デフォルトの名無しさん2006/06/15(木) 00:24:07
>>156
例えばコマンドラインから、bcc32 hoge.h hoge1.c hoge2.c  ...でできるはず

>>159
*.h *.c はディレクトリ内の拡張子 .h .c の全てのファイルをコンパイル対象にしてしまう。
これやるぐらいなら、makefile の作り方を覚えた方がいい。
初心者の内は自分がどのファイルをコンパイルしているのか、
意識的に考えながらやった方がいい。
0164デフォルトの名無しさん2006/06/15(木) 03:31:01
初歩的な事で申し訳ないのですが……次のソースをコンパイルして実行すると、「セグメンテーション違反」と言われて怒られます。何が悪いのでしょう?

#include <stdio.h>

int double_malloc(double *target, int number) {
if ((target = (double *)malloc(sizeof(double) * number)) == NULL ) {
puts("Memory Unallocatable in dounle_malloc()\n") ;
return (-1) ;
}
return (0) ;
}

int main(void) {

int number ;
double *test ;

number = 2 ;
double_malloc(test, number) ;
test[0] = 1.0 ;
test[1] = 2.0 ;
printf("%f\n", test[0]+test[1]) ;
free(*test) ;
return (0) ;

}

OSはVineLinux3.2、コンパイラはOSについてきたgccを使っています。CPUはPentium4 2.66GHz、総メモリは1Gでコンパイル後も650MB程度の空きがありました。
0165デフォルトの名無しさん2006/06/15(木) 03:36:27
Cはよく分からないから勘で言うけどfree()はポインタ渡すんでない?
0166デフォルトの名無しさん2006/06/15(木) 03:40:36
double_malloc の target が double * なのがそもそも問題外。
0167デフォルトの名無しさん2006/06/15(木) 07:05:12
パラメータをdouble**にするか戻り値をdouble*にすれ。
0168デフォルトの名無しさん2006/06/15(木) 12:43:36
>>164
1. 関数の中で引数(の変数)に代入しても、渡した側の変数の値は変更されない。
2. free には malloc が返してきた値と同じ値を渡す必要がある。
 (例) a = malloc(...); としたなら free(a)。 free(*a) や free(a+1) はダメ。

C なら double* double_malloc(int n) として、 test = double_malloc(number) とするか、
int double_malloc(double** ptr, int n) として、 double_malloc(&test, number) とする。
(後者の場合 *ptr = (double*) malloc(...); として値を返す)

加えて C++ なら int double_malloc(double* &ptr, int n) として、 double_malloc(test, number) とも書ける。
(この場合 ptr = (double*) malloc(...); でOK)
0169デフォルトの名無しさん2006/06/15(木) 12:45:49
いや、C++ならそもそもmalloc()なんか使うなよ、と。
0170デフォルトの名無しさん2006/06/15(木) 12:54:37
なんで?
0171デフォルトの名無しさん2006/06/15(木) 13:05:00
俺は
#define MBYTE (1024 * 1024)
char Var[MBYTE];
こうやったらエラーでたからしかたなくmalloc()使ってる…。
0172デフォルトの名無しさん2006/06/15(木) 13:05:35
>>170
単一オブジェクトの動的生成なら new 使ったほうがよくて、
動的配列なら vector 使ったほうがいいから。
0173デフォルトの名無しさん2006/06/15(木) 13:07:51
>>172馬鹿?
01741722006/06/15(木) 13:10:22
>>173
自分ではそんなつもりないけど、何か変なこと言ったか?
■ このスレッドは過去ログ倉庫に格納されています