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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/05/28(木) 01:08:48
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.65【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1239326399/

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
01531462009/06/03(水) 20:45:12
>>152
ありがとうございました!できました。
エラーの意味が少し分かった気がしました(これから勉強します)。


>>147-148
即レス感謝しております。色々とキッカケになりました。
ありがとうございました。
0154デフォルトの名無しさん2009/06/03(水) 23:02:04
http://marupeke296.com/GameMain.html
0155デフォルトの名無しさん2009/06/04(木) 01:41:16
http://www.setsunan.ac.jp/~center/kyositu/freec/dl2008.html
このページを参考にコンパイラをインストールしました。
このページの最後にある、使い方を見るってやつのことで質問なのですが、
僕のbcc32は奥の方にあって(C:\Borland\...)、最終的にbcc32があるところにたどりつくのですが、
ここでしかコンパイラできないじゃないですか?
それが面倒なのでどうにか簡単にできないかってことと、
bcc32があるディレクトリの中には他にもいろんなプログラムがあるんですが、作成したCファイルも
同じところに保存しないとコンパイル&実行できないですよね?
つまりこのディレクトリの中がいろんな形式のファイルがあってめちゃくちゃ汚くなっちゃうわけです。。

これってなんとかキレイにまとめる方法ってあるでしょうか?
もしあるなら、申し訳ありませんが教えてください(>_<)
01561552009/06/04(木) 01:46:27
すみません補足です。。
一部コンパイラ→コンパイルですね

↑のは自分で見なおしてみるとちょっと日本語がアレなので簡潔に質問しますと、

1.cdの回数を最小限にする方法(bcc32を含むディレクトリをC:の直下に持ってきていいのでしょうか?)
2.CファイルはCファイルだけでどこかにまとめて、そのうえでコンパイル&実行はできるのか

ということです。
よろしくお願いします。。
0157デフォルトの名無しさん2009/06/04(木) 02:27:13
使い方を見るじゃなくて、先に

>インストール(WindowsVista)に進む
>インストール(WindowsXP,2000)に進む
>インストール(Windows98,95)に進む

のどれかを見ろ。
環境変数を設定する解説がある。

それを設定すれば、どこからでもbcc32が呼び出せるようになる。
あとは好きなところにディレクトリを作って、その中でコンパイルすればいい。
0158デフォルトの名無しさん2009/06/04(木) 02:29:08
そこの説明どおりにやればどこでもコンパイルできるはずだけど?
01591562009/06/04(木) 11:46:59
>>157,158

ありがとうございます。
OSはVistaで、ここに書いてある通り環境変数も設定したつもりなのですが
できないんです。。
;c:\borland\bcc55\bin
ですよね?
これだとここで指定したディレクトリじゃないとできないってことでしょうか?
ローカルディスク(C)の中ならどこでもコンパイルできるようにするには、設定を
c:\
にすればいいということでしょうか?
0160デフォルトの名無しさん2009/06/04(木) 11:52:18
>>159
コマンドラインで、path と打って出てくる文字列に c:\borland\bcc55\bin はあるか?
ちなみにシステム変数の設定をしたあとで開いたコマンドプロンプトじゃないと
有効じゃないぞ
0161デフォルトの名無しさん2009/06/04(木) 12:06:53
>>160
コマンドプロンプトでpathを打つとちゃんと出てきます。
それで、確認用ファイルを
c:\Emacs\C\test.c
という風に作ったディレクトリに保存して、Cディレクトリ内で
c:\Emacs\C\>bcc32 test.c
というようにコマンドしても操作可能なプログラムとして…
というメッセージが返ってきます。。。
0162デフォルトの名無しさん2009/06/04(木) 12:28:01
bcc32 test.c
これを、
c:\borland\bcc55\bin\bcc32 test.c
と打つとどうなるよ。
0163デフォルトの名無しさん2009/06/04(木) 12:29:09
あと環境変数の最後に書いてある?
最初と最後以外は ; で区切ってないと前後とくっつくぞ
0164デフォルトの名無しさん2009/06/04(木) 13:16:59
WindowsでWinSockのプログラムを書くとき、C++ではなくCを使うのでしょうか?
どうしてもC++で書きたかったら、
struct sockaddr_in
とかそういうのは、上手く自作のクラスにまとめてしまえばいいのでしょうか?
0165デフォルトの名無しさん2009/06/04(木) 13:25:45
別にC++でもstruct sockaddr_in とかそういうのは書けるだろ
0166デフォルトの名無しさん2009/06/04(木) 13:38:12
でもネットワーク関係の例題プログラムを見てると、参照は使わないし、クラスもなし、マクロ使いまくり、
とかそういう感じのプログラムばかりだったので、みんなそんな感じなのかなと。
0167デフォルトの名無しさん2009/06/04(木) 14:03:34
>>162
そうコマンドすればコンパイルできます。
ただし、"コマンド'ilink32.exe'を実行できない"とエラーが出ます。
やはりbinディレクトリの中でやりくりするしかないのでしょうか?

>>163
そこは大丈夫です。ちゃんと; ;で挟んであります。
0168デフォルトの名無しさん2009/06/04(木) 14:07:11
>>167
リンカがパス通ってないからな。
それでコンパイルできるなら、PATHがおかしいんだよ。
どこかタイプミスがあるはず。その部分コピペして貼り付けてみ。
コマンドプロンプトのコピーのしかたはわかるよな?
0169デフォルトの名無しさん2009/06/04(木) 14:30:41
>>168
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\usr\local\bin;D:\MinGW\bin;c\borland\bcc55\bin;C:\Program Files\QuickTime\QTSystem\
これがパスの設定です。これのことですか?

コマンドプロンプトのコピーの仕方はわかりませんが(笑)、
ちょっと打ってからTabで出してるのでタイプミスはないと思います。。
0170デフォルトの名無しさん2009/06/04(木) 14:33:55
>>169
>c\borland\bcc55\bin
コロンが抜けてる
c:\borland\bcc55\bin
で
0171デフォルトの名無しさん2009/06/04(木) 14:37:58
このすれ優しい人が多いね。
感動した!
01721692009/06/04(木) 15:36:42
>>170
おぉ!!できました!
親切にありがとうございます!!
171じゃないですが、本当に優しい人が多くて助かりました!

あと、ついでと言ってはなんですがコマンドプロンプトについて質問です。
コマンドプロンプトを開いたときの最初の位置が
C:\Users\kei
になってます。(keiは僕の名前です)
開いたとき一番最初は C:\ になってると一番都合がいいのですが、そのように設定できますか?
プロパティとかいろんなトコからやろうとしても見当たらないので…。
0173デフォルトの名無しさん2009/06/04(木) 15:39:15
\usr\local\bin
何に使うんだろう
0174デフォルトの名無しさん2009/06/04(木) 15:39:16
ショートカット作っとけばいいべ。
プログラムはcmdで、作業フォルダはC:|
01751742009/06/04(木) 15:40:16
C:\だった、、、シフト押しっぱなしだった
0176デフォルトの名無しさん2009/06/04(木) 16:21:59
作業フォルダの設定はどうするんですか?
どう開いても変なディレクトリから入っちゃいます。。
cd ../../
を毎回やるのは億劫なので。。。
0177デフォルトの名無しさん2009/06/04(木) 16:37:32
右クリックでプロパティ出せばいいだろう。
cd \ でいいじゃない
0178デフォルトの名無しさん2009/06/04(木) 16:40:04
そろそろスレ違いだな
0179デフォルトの名無しさん2009/06/05(金) 08:08:41
クラスをグローバルにしたいんだけど、
extern AClass a;
でいいの?
0180デフォルトの名無しさん2009/06/05(金) 08:22:59
バッチファイル書けば楽にならないか?

cd ..\...\
bcc32 %1

とか。
0181デフォルトの名無しさん2009/06/05(金) 09:58:57
ルートで作業するのは論外。
0182デフォルトの名無しさん2009/06/05(金) 11:16:18
ネットワークのプログラムを書いてると、「Windowsのファイヤーウォールがブロックしました」
みたいなメッセージが最初の動作時に一回だけ出るときがありますが、出ても最初の一回だけで
その後は出ません。これってプロパティのどこかにアンブロックしたという記録が残っている
のでしょうか?
0183デフォルトの名無しさん2009/06/05(金) 17:56:01
板違い
0184デフォルトの名無しさん2009/06/05(金) 19:23:36
>>182
レジストリのどこかは知らないが、設定の閲覧・変更は
コントロールパネルのWindowsファイアウォールのところを見ればいい。
0185デフォルトの名無しさん2009/06/05(金) 20:44:54
>>183-184
ありがとうございます。コントロールパネルに見つかりました。
あともう1つだけ。(板違いといわれそうなのですが…一応C++で書いているので)
TCPで複数のコネクションを同時に保持するサーバーを書きたいのですが、サーバ側から
みた通信先はどうやって区別すればよいですか?適当にIDとかを割り振ってそこをみるように
すればいいんでしょうか?
××のソースをみろとかでもいいです。どうかお願いします。
0186デフォルトの名無しさん2009/06/05(金) 20:48:43
>>185
ソケットなら接続してきたクライアントの情報を得られる。
ネットワークプログラミング相談室なんてスレがなかったかな?
0187デフォルトの名無しさん2009/06/05(金) 21:10:01
>>186
ありがとうございます。
ということは、accept()で得られたクライアント情報のIPアドレス+ポート番号
の組でクライアントを識別するということですか?

>ネットワークプログラミング相談室なんてスレがなかったかな?
次からはそっちで聞いてみます。
0188質問2009/06/05(金) 23:03:36
VC++2008です
textBox1に自由に入力させ、「眼鏡」という文字列が入力された瞬間に
メッセージボックスを表示するにはどうしたらいいでしょうか

TextChangedイベントの中でif(textBox1->Text=="眼鏡")としたんですが、
前後に文章があるときもメッセージボックスを表示させたいです

よろしくお願いします
0189デフォルトの名無しさん2009/06/05(金) 23:57:40
strstr
0190デフォルトの名無しさん2009/06/06(土) 01:25:52
VisualC++2008EEです

引数としてクラスのポインタを受け取り、そのポインタにnewでクラスのインスタンスを作る関数は作れますか?
また、どのように作るのでしょうか?
そうして作ったインスタンスを関数の外でdeleteしたいのです
よろしくお願いします
0191デフォルトの名無しさん2009/06/06(土) 01:33:14
>>190
void f(int*& rp)
{
rp = new int;
}

int main()
{
int *p;
f(p);
delete p;
}
0192デフォルトの名無しさん2009/06/06(土) 01:45:09
キモイ設計だな
0193デフォルトの名無しさん2009/06/06(土) 01:51:18
メリット皆無だし
0194デフォルトの名無しさん2009/06/06(土) 03:34:30
普通のメンバ変数を初期化するときって、
コンストラクタの後ろに付加、コンストラクタの中で代入、初期化用メンバ関数を用意してコンストラクタの中で呼び出し
……とかいろいろ考えられると思うけど、使い分けってある?

あと、特に理由がない限り、コピーコンストラクタに初期化処理ってしなくても大丈夫よね?
0195デフォルトの名無しさん2009/06/06(土) 03:48:26
なるべく初期化リストで全部済ませる
初期化で済む物を代入にするメリットは全くない
0196デフォルトの名無しさん2009/06/06(土) 03:50:05
使い分けというか、言語やプログラムの仕様から制約されるってかんじジャね?

const なメンバ変数
 => 初期化リストでしか初期化できない。
初期化のために手続きが必要
 => 初期化リストでは無理
初期化のタイミングがコンストラクション時以外にもある
 => じゃ、別関数にしておくか
0197デフォルトの名無しさん2009/06/06(土) 03:51:05
意地でも例外を送出したくない場合。
0198デフォルトの名無しさん2009/06/06(土) 04:17:00
const以外でも初期化リスト結構みんな使ってるのかー。

途中でリセットする場合以外でも、お婆ロードでコンストラクタが複数あるときは
別関数の方が楽そう……かな?
0199デフォルトの名無しさん2009/06/06(土) 04:53:35
Visual C++ eeのWin32APIでやってます。
ユニコードONの状態で

wchar_t type[255] = _T("うんこ");
MessageBox(NULL, (PCTSTR)typeid(type).name(), NULL, MB_OK);

とすると文字化けしてしまうのですが、なんでですか?
文字列リテラルにLをつけないといけないのと関係あります?
うまく表示する方法ってどうやるのですか?

まだ始めたばっかだしマルチバイトでやればいいのでしょうけど
気になるので、よかったら教えてください

お願いします
0200デフォルトの名無しさん2009/06/06(土) 06:47:24
>>198
Effective C++は読んだかい?
まだなら定額給付金を片手に今すぐ本屋に行くんだ。
0201デフォルトの名無しさん2009/06/06(土) 06:48:32
typeid(type).name()はLPCTSTRじゃないから

MessageBoxA(NULL, typeid(type).name(), NULL, MB_OK)
0202デフォルトの名無しさん2009/06/06(土) 06:57:13
>200
おや なぜか めのまえの ほんだなに おいてあるぞ!
02031992009/06/06(土) 15:31:21
>>201
MessageBoxAとMessageBoxWがあって
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE
こんなんなってるんですね

だからMessageBoxAを強制的に呼び出してやると
氷解しました。ありがとうございます。
0204デフォルトの名無しさん2009/06/06(土) 17:26:42
>>199
TCHAR type[255] = _T("ちんこ");
MessageBox(NULL, type, NULL, MB_OK);
0205デフォルトの名無しさん2009/06/07(日) 13:03:16
dummy
0206デフォルトの名無しさん2009/06/07(日) 14:01:55
int org_i = 1000;
void *p = &org_i;
int i = *reinterpret_cast<int*>(p);
voidへのポインタからINTの値を取り出そうとして上のようにしたのですが、
reinterpret_castの前に*があったりしてなんとなくいやです。
ほかに方法はないでしょうか?
0207デフォルトの名無しさん2009/06/07(日) 14:04:28
それが正しい方法だからそれでいい
0208デフォルトの名無しさん2009/06/07(日) 14:05:17
voidのポインタをやめる
0209デフォルトの名無しさん2009/06/07(日) 14:50:41
こんなテンプレートを用意して

template <class T>
T pointer_value(const void* p)
{
return *static_cast<const T*>(p);
}

こうする

int i = pointer_value<int>(p);
0210デフォルトの名無しさん2009/06/07(日) 14:56:13
テンプレートは分からないので禁止
0211デフォルトの名無しさん2009/06/07(日) 17:15:04
>>210
お前が勉強しろ
0212デフォルトの名無しさん2009/06/07(日) 18:35:31
テンプレートはわからないので禁止
0213デフォルトの名無しさん2009/06/07(日) 18:46:18
ポインタはわからないので禁止
0214デフォルトの名無しさん2009/06/07(日) 18:56:05
C++はわからないので禁止
0215デフォルトの名無しさん2009/06/07(日) 19:20:16
クラスAがクラスBに所持されてる関係になってるとして

インスタンスAがB1に参照されてる状態から
B2がインスタンスAを参照したらB1からAの参照が切れる

常にAが1個のBから参照されるような関係を作るにはどうしたら良いでしょうか?
0216デフォルトの名無しさん2009/06/07(日) 19:37:11
所有を譲渡するメソッドをBに作る
0217デフォルトの名無しさん2009/06/07(日) 20:04:47
逆にAがBを参照するように変更できないか検討する
0218デフォルトの名無しさん2009/06/07(日) 23:29:49
>>216
B同士で所有の移動をするメソッドを、ということでしょうか?

>>217
BがAに更新通知してAがBの値を読みに行くので
Aへの更新通知を別の方法で実現できればそれでもいいのですが・・
0219デフォルトの名無しさん2009/06/08(月) 00:37:33
Aを触れないし値も引き出せない状態になったB1・B2の挙動をどうするつもりかに因るな
0220デフォルトの名無しさん2009/06/08(月) 00:38:58
AからBにコールバックでも登録させればいいんでない。
0221デフォルトの名無しさん2009/06/08(月) 00:41:57
AがB1に参照されたり、B2に参照されたりってのを決めるのはだれだ?
0222デフォルトの名無しさん2009/06/08(月) 01:43:02
> BがAに更新通知してAがBの値を読みに行くので

Aに"今からお前の相手するBインスタンスはわしじゃ"通知メソッドを作れば?
その際に元彼Bに"もう私のことは放っておいて"通知メソッドをAから呼んでもらう
0223デフォルトの名無しさん2009/06/08(月) 11:43:40
C++では、戻り値だけが違う関数は同じものとされますが、
戻り値だけが違う関数を複数作りたい場合どうするべきでしょうか?
class C1;
class C2;
というのがあって、
C1 create();
C2 create();
という感じにやりたいときです。
お願いします。

0224デフォルトの名無しさん2009/06/08(月) 12:11:13
>>223
無理です。だいたい呼び出せません。
名前空間を使いましょう。
0225デフォルトの名無しさん2009/06/08(月) 12:17:56
ファイルの開け方、閉じ方はわかったのですが読み取って処理するところがよくわかりません
,で区切られて1行に並んでるファイル内の行列から数値を配列に入れる方法を教えてください!
0226デフォルトの名無しさん2009/06/08(月) 12:23:49
やりかたはいろいろありすぎて、、、
とりあえず手始めに、fgets()とsscanf()使ってみるのはどうか?
まあ配列に入れるならループで回してstrtokとatoi使う手もあるけど、
最後はstrtok+atoiみたいな関数を自分で作るのがいいかもね。
0227デフォルトの名無しさん2009/06/08(月) 12:24:30
今回初めてマルチスレッドな処理を行う必要があるのですが
注意点、スレッドセーフな処理にするための方法などを詳しく扱った書籍やサイトはないでしょうか?
0228デフォルトの名無しさん2009/06/08(月) 12:25:39
>>226
ありがとうございます
,の除き方を詳しく教えてください
0229デフォルトの名無しさん2009/06/08(月) 12:26:37
>>228
csvデータの読み込みでぐぐった方がいいかも
0230デフォルトの名無しさん2009/06/08(月) 12:27:37
>>228
sscanf()もstrtok()も , の処理はやってくれるだろ。
自前でやるならstrchr()で場所調べて切り出していけばいいと思うよ。
0231デフォルトの名無しさん2009/06/08(月) 12:32:12
そうなんですが
全然知りませんでした
ありがとうございました
0232デフォルトの名無しさん2009/06/08(月) 14:05:22
>>223
dmyC{};
class C1{C1 operator=(dmyC&){*this=createC1();return *this;}};
class C2{C2 operator=(dmyC&){*this=createC2();return *this;}};
dmyC create(){return dmyC();}
C1 C1create(){〜return c1;}
C2 C2create(){〜return c2;}

なんのメリットがあるか知らんが使用側で偽多態受けなら出来ん事はない
前参照やスコープは適当に修正要
0233デフォルトの名無しさん2009/06/08(月) 14:14:40
C99より前の規格では、nanやinfを検出することってできないのでしょうか?
0234デフォルトの名無しさん2009/06/08(月) 14:19:51
修正 dmyC で弄った方が潰しが利くね
dmyC{operator C1(){〜return c1;}operator C2(){〜return c2;}};
0235デフォルトの名無しさん2009/06/08(月) 14:50:49
floatで数字をいろいろ処理して,でつないでcharに直してfputsで書き出したいんですけど方法を教えてください!
0236デフォルトの名無しさん2009/06/08(月) 15:39:06
fscantfとかsscanfとかそういうことか
わかったぽ
0237デフォルトの名無しさん2009/06/08(月) 19:01:54
.netはC++では扱えないんですか
0238デフォルトの名無しさん2009/06/08(月) 19:06:26
はい
0239デフォルトの名無しさん2009/06/08(月) 19:10:15
C#でしかやれないということですか?
GUIアプリを楽につくりたいならC#ですかね?
0240デフォルトの名無しさん2009/06/08(月) 19:11:14
その通り!
0241デフォルトの名無しさん2009/06/08(月) 19:18:42
テンプレートの話は禁止だって言ってんだろ
0242デフォルトの名無しさん2009/06/09(火) 01:07:44
int array[x][y];
があるとき、
array[10] == &array[10][0]
でしょうか?
0243デフォルトの名無しさん2009/06/09(火) 01:14:00
よく考えたら分かると思うが頭痛が悪くなるようなコードは書くな
0244デフォルトの名無しさん2009/06/09(火) 01:14:19
配列は分からないので禁止
0245デフォルトの名無しさん2009/06/09(火) 01:17:52
>>242
気になるならポインタがさしてるアドレスを比べてみなよ
0246デフォルトの名無しさん2009/06/09(火) 01:20:47
>>245
型は配列なので注意が必要、多分等しいだとは思うんだが。(両方とも配列)
配列はポインタに自動変換だが、逆はそうではない、やっぱ頭痛い。
0247デフォルトの名無しさん2009/06/09(火) 01:23:22
ああ違う、右はポインタ、左は配列、そして左が自動変換だ
うぜぇぇ
0248デフォルトの名無しさん2009/06/09(火) 01:24:56
int a[10]; は、int10個の配列aで分かりやすいのに。
int a[10][20]; は、int10この配列が20個、ではないところがややこしい。
0249デフォルトの名無しさん2009/06/09(火) 01:26:48
>>248
Cの規則ですから
int func()[10]
{
return 配列;
}
おらよ、これでも喰らえってなもんだ
0250デフォルトの名無しさん2009/06/09(火) 01:26:53
ポインタ本を読むと出てくる(K&Rでもかかれてる)けど
配列や関数の型は、外側からはがしていく感じで解釈するんだよね。
0251デフォルトの名無しさん2009/06/09(火) 01:49:26
>>249
関数は配列を返せない
0252デフォルトの名無しさん2009/06/09(火) 01:53:52
>>251
ANSIでは使えない事になっているが、返せる処理系もっあってだな、
アホな開発者がそれを返している糞ライブラリがあるんだ
どこのかって?S○Eとか○CEとかSC○とか、まあそんなところ、死ねます。
■ このスレッドは過去ログ倉庫に格納されています