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

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

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

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

【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
http://codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
0359デフォルトの名無しさん2010/04/07(水) 19:34:56
>>357
リソース解放を行って成功したかどうかを返すメンバ関数を追加する。

デストラクタにも解放処理は置くけど、こっちはエラーを通知しない。
かわりにログを吐くか、あるいはその場で死ぬか。
0360デフォルトの名無しさん2010/04/08(木) 16:29:19
clock()を使って計測する際、OpenMP等を使ったりした場合でも、CPU時間を求めることができるのでしょうか?
0361デフォルトの名無しさん2010/04/08(木) 16:44:57
はい。
0362デフォルトの名無しさん2010/04/08(木) 18:44:46
clockって実時間じゃなかったの??
0363デフォルトの名無しさん2010/04/08(木) 19:04:04
>>362
少なくとも、POSIXのclock()はプロセッサ時間だよ。
0364デフォルトの名無しさん2010/04/09(金) 11:16:13
ソリューションSの中にP1,P2という二つのプロジェクトを入れています。
プロジェクトP1の中にLobbyForm.hというヘッダーファイルがあり、プロジェクトP2内のmymain.cppの中でLobbyForm.hをインクルードしています。
当然mymain.cppの2行目に#include "LobbyForm.h"と記載しています。

これでVisualC++2008EEにてソリューションのビルドをかけると以下のエラーが出ます。
エラー 2 fatal error C1083: include ファイルを開けません。'LobbyForm.h': No such file or directory c:\users\********\documents\保存用\projects\lobbyformmain\lobbyformmain\mymain.cpp 2

LobbyForm.h(インクルードするヘッダーファイル)の場所
C:\Users\********\Documents\保存用\projects\LobbyFormLib

mymain.cpp(インクルードの宣言場所)の場所
C:\Users\********\Documents\保存用\projects\LobbyFormMain\LobbyFormMain

どの部分を直せばビルド可能になりますでしょうか?教えてください。
0365デフォルトの名無しさん2010/04/09(金) 11:17:30
パスとおせ
0366デフォルトの名無しさん2010/04/09(金) 11:26:15
>>365
できました、ありがとうございます!
0367デフォルトの名無しさん2010/04/09(金) 14:32:04
ポート番号のwell-known portというのはなぜ存在するのでしょうか?
65536種類もポート番号があるならば、最初からプログラムごとにバラバラの番号を指定しておけばよいような気がします。
HTTPは80などと標準を作ることによるメリットとはなんでしょうか?
0368デフォルトの名無しさん2010/04/09(金) 14:48:37
>>367
例えば
IE は 80
FireFox は 81
Netscape は 82
Lynx は 83
Opera は 84
みたいにしたほうがいいって思ってるの?
0369デフォルトの名無しさん2010/04/09(金) 14:52:29
ISPによってはwell-known port以外のパケットはポートアタックと
見なして通さない所があるからだよ
NNTPは119だっけ
0370デフォルトの名無しさん2010/04/09(金) 16:16:25
>>368
いいというか、大量に番号がある中でわざわざバッティングするようなことをしなくてもと思ってました。
>>369
そういった守り(?)の理由があるのですね、勉強になりました、ありがとうございます。
0371デフォルトの名無しさん2010/04/09(金) 17:46:09
ポート番号ってのは電波の周波数みたいなもんでな…
予めどれを使うのかわかってなければ通信を成り立たせる事も出来ないだろうが
0372デフォルトの名無しさん2010/04/09(金) 18:07:15
もしかしてサーバー側とクライアント側の区別が付いてないんじゃない
0373デフォルトの名無しさん2010/04/09(金) 20:11:37
double型の数値を0.0から1.0の範囲で安全性を確保した上でできるだけ小さい幅でインクリメントしたいと考えています。

double d = 0.0;
for (...);
{
 d += DBL_EPSILON;
}

みたいなコードはそれを保証してくれるのでしょうか?
演算の誤差判定にしか使えないのでしょうか?
0374デフォルトの名無しさん2010/04/09(金) 20:24:39
>>373
等間隔でインクリメントということだよね?
そのコードは規格上では多分何も保証してくれてないけど、
IEEE754準拠の環境上ならそれでOK。

まぁdoubleでそれやると4500京回以上ループ回るが。
0375デフォルトの名無しさん2010/04/09(金) 20:34:50
>>374
52bit程度だからそんなに精度はないはず
0376デフォルトの名無しさん2010/04/09(金) 20:44:07
時間測定してみりゃいいじゃん
今時のCPUなら速いだろ
0377デフォルトの名無しさん2010/04/09(金) 20:45:40
すぐに桁落ちして増えなくなるな
0378デフォルトの名無しさん2010/04/09(金) 20:53:35
でも今のOSは簡単にループを止めれていいわ

DOS時代はリセットしかなかったからなあ
03793752010/04/09(金) 20:56:59
>>375
おお、4500兆か。

億、兆、京と数えていたつもりだったんだが、万をすっかり忘れていた
0380デフォルトの名無しさん2010/04/09(金) 20:57:19
374ね。
0381デフォルトの名無しさん2010/04/09(金) 21:17:14
>>374

[0.0 - 1.0]
の間で常に
d + DBL_EPSILON > d
を満たせばいいということです。

できるみたいですね、ありがとうございます。
0382デフォルトの名無しさん2010/04/09(金) 21:26:27
> d + DBL_EPSILON > d
むりっしょ
0383デフォルトの名無しさん2010/04/09(金) 21:30:26
その精度は本当に必要なのかまず考える
必要ないなら整数最大値で整数を割った値を使う
0384デフォルトの名無しさん2010/04/09(金) 21:50:05
>>382
無理じゃねーだろ
0385デフォルトの名無しさん2010/04/09(金) 22:14:58
DBL_EPSILONの精度が0附近ではあっても1附近でもあるかどうかが問題だな。
0386デフォルトの名無しさん2010/04/09(金) 22:21:41
>>385
定義は
1.0+DBL_EPSILON > 1.0
が成り立つ最小の数値だから大丈夫
0387デフォルトの名無しさん2010/04/09(金) 22:38:03
この程度が限界だな 1.0にしたらいつ終わるかわからん
struct foo {
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;

foo() : hprocess(GetCurrentProcess()), oldclass(GetPriorityClass(hprocess)) {
Sleep(10);
// SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);
}
~foo() {
QueryPerformanceCounter((LARGE_INTEGER*)&end);
// SetPriorityClass(hprocess, oldclass);
std::cout << (int)(end - start) << std::endl;
}
};

int main()
{
{
std::cout << "test1 : ";
foo f;
double d = 0.0;
while (true) {
d += std::numeric_limits<double>::epsilon();
if (d > 1e-7)
break;
}
}
}
0388デフォルトの名無しさん2010/04/10(土) 00:40:59
C++使ったアプリ設計能力ってどこで身につけるんだ
0389デフォルトの名無しさん2010/04/10(土) 00:42:51
>>388 チーム開発の現場で。
0390デフォルトの名無しさん2010/04/10(土) 10:24:51
VC++なんですが、自動でインデントを設定させる方法はどこで設定すればよいのでしょうか
VBだとデフォルトでそうなっているので、同じようにしたいのです
0391デフォルトの名無しさん2010/04/10(土) 13:53:28
前提としてVC++2008Expressの話で、特に設定とかしてないけど、
普通に改行だけでちゃんと続きのインデントになってるぜ?

VB(6/.NET)がどうなのかは知らないが
0392デフォルトの名無しさん2010/04/10(土) 14:01:12
はい、VC++2008Expressです。自動的、といより強制的と言うべきでした
VBで↓を入力すると、強制的にこの形になるんです。二行目にタブを余分に入れても、タブを消してもこの形に戻ります
ある程度コードを書いてから、全体をifやforで括りたくなったときに威力絶大です
そういった機能は無いでしょうか?
Class tex
    Inherits TextBox
    Sub New()
        Text = 123
    End Sub
End Class
0393デフォルトの名無しさん2010/04/10(土) 14:21:27
無いと思う
範囲選択して Ctrl+K, Ctrl+F くらいしかできないな
0394デフォルトの名無しさん2010/04/10(土) 14:28:30
ありがとうございましたー
ショートカットキー使わせてもらいます
0395デフォルトの名無しさん2010/04/10(土) 14:30:37
>>393
一気に生理できました!すごく見やすいです。感激です。
0396デフォルトの名無しさん2010/04/10(土) 19:12:42
>>395
初潮迎えたのか
0397デフォルトの名無しさん2010/04/10(土) 21:57:01
>>396
俺が思っても言わなかったことを・・・
0398デフォルトの名無しさん2010/04/10(土) 22:47:07
一気にてwww

初潮の年齢は幅があるだろうが普通は10〜14歳だから、
その年齢でそれだけのプログラミングをする女って
すげぇ優秀だな
0399デフォルトの名無しさん2010/04/10(土) 22:54:05
天才ハッカー美少女と聞いて
0400デフォルトの名無しさん2010/04/10(土) 22:57:47
天才ハッカー少女って
ところまではあっているだろうが。。。
0401デフォルトの名無しさん2010/04/11(日) 10:25:37
以下のソースがclでは通るのですが、bcc32 (ver5.5.1)では通りません。
原因分かる人がいたら教えて下さい。

#include <cstdio>
#include <windows.h>

int main()
{
return 0;
}
0402デフォルトの名無しさん2010/04/11(日) 11:14:41
エラーメッセージも貼れないの?
04034012010/04/11(日) 11:20:36
>>402
エラーメッセージです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10567.txt
0404デフォルトの名無しさん2010/04/11(日) 11:46:47
>>401
#include <windows.h>
#include <cstdio>

int main()
{
return 0;
}
0405デフォルトの名無しさん2010/04/11(日) 11:50:17
>>403
ああそれBCC5.5.1が古すぎてインクルードの前後関係で
エラーが出てしまう奴だね

他にもRogueWaveのiostreamなどを使っていてバグはいくつか
知られているよ
04064012010/04/11(日) 11:57:12
>>404, 405
コンパイル通りました。ありがとうございます。
インクルードの前後関係でエラーになるんですね。
0407デフォルトの名無しさん2010/04/11(日) 13:07:33
>>405
これはひどいなBCC
0408デフォルトの名無しさん2010/04/11(日) 13:11:59
今BCCはEmbarcadero CC 6.2.1になってバグはほとんど取れ、
Boostにも部分的にではありますが対応してます

吐くコードの質もかなり向上してます

でもVC9には全然叶いませんが
それからコンパイル速度が遅くなりましたね
0409デフォルトの名無しさん2010/04/11(日) 13:46:00
>>408
> 今BCCはEmbarcadero CC 6.2.1になってバグはほとんど取れ、
> Boostにも部分的にではありますが対応してます
ECC6.2.1とか無償で使えないんだよね?
BCC大好きっ子でもない限り、ECCに金を払ってみる気にならんし・・・。

はやくBCC5.5.1に取って代わってくれ。
0410デフォルトの名無しさん2010/04/11(日) 13:47:22
VC9って無料版は最適化積んでなくね?
0411デフォルトの名無しさん2010/04/11(日) 14:12:26
>>410
そんなことはない。
プロファイル使った最適化は使えないが、/O1、/O2くらいは使える。
0412デフォルトの名無しさん2010/04/11(日) 14:29:16
>>410
一体なんでそう思ったんだ
0413デフォルトの名無しさん2010/04/11(日) 15:02:25
で、入力補完の充実したエディタはないんですか?
0414デフォルトの名無しさん2010/04/11(日) 15:37:37
emacsでabbrevでもしてればいいよ
0415デフォルトの名無しさん2010/04/11(日) 19:36:14
勝手に入力補完されるとうっとおしいんで、
いつも M-x fundamental-mode してる
0416デフォルトの名無しさん2010/04/12(月) 13:36:17
C++で3Dアクションゲームを作ろうと思うのですが、
Directx+ライブラリ
http://homepage2.nifty.com/natupaji/DxLib/index.html
を使うか、
ODE
http://www.koj-m.sakura.ne.jp/ode/
を使うかどちらの方が楽でしょうか
ジャンプ等の移動関係は後者が有利そうで、描画に関しては前者が優れてそうなかんじなのですが
0417デフォルトの名無しさん2010/04/12(月) 13:44:20
>>416
そのODEって知らないけど、サイトの説明見た限りで言えば、
多分初心者が手を抜いて簡単にゲーム作る為の物じゃないと思うぜ。 そのライブラリの方言をどっさり覚えないといけないと思う。
単にシミュレーションなどのデモ作るには良さそうだけどね。 リアルタイムゲーム的な物向けじゃない気がする。

あと、質問内容から察してなんとなくDirectX自体良くわかってなさそうなんだけど(失礼)、
多分3Dアクションってあたりから、最終的にやらねばならないコーディング内容は、
DxLib でも DirectX直接でもあまり変わらないと思うので、どちらかと言えば DirectX 直接の方が
いろんな意味で楽で作業も早いかもしれない。

よく、初期化処理とか面倒で、みたいな事言う人もいるけど、あんなの定型処理なので意味さえわかってれば簡単だし、
メッシュモデルを移動や回転などさせる処理も単に行列用意してかけるだけ、みたいな簡易な関数も用意されてるので、
やってみれば意外にすんなりいけると思う。 そんな感じ
0418デフォルトの名無しさん2010/04/12(月) 13:57:01
>>417
ありがとうございます
実際よくdirectxは分かってないです・・
directxを直で書いてみます
0419デフォルトの名無しさん2010/04/12(月) 14:10:55
つーか、3Dゲームに必要な数学の素養はあるのかと。
0420デフォルトの名無しさん2010/04/12(月) 15:14:53
全くないです!作りながらおぼえます
0421デフォルトの名無しさん2010/04/12(月) 15:47:42
ある関数が定義されているかどうかを知る方法を教えて
0422デフォルトの名無しさん2010/04/12(月) 15:53:36
リンカでリンクしてエラーが出るかどうか

Windows環境で winver により 使える/使えない API を分岐して使いたい
→ (LoadLibrary) 〜 GetProcAddress の戻りで分岐
0423デフォルトの名無しさん2010/04/12(月) 17:12:21
>>422
そこまでいかないとわからないか・・・そりゃそうか

ある関数が定義されてなければ俺が定義する というコードを
書きたかったんだけど
0424デフォルトの名無しさん2010/04/12(月) 17:16:35
リンク時に 同一シンボル が存在した時、エラー以外で対処できる環境もあるよ
(.lib 中 と .obj中 に同じシンボル → .obj側優先でリンク: MSのリンカ)
0425デフォルトの名無しさん2010/04/12(月) 17:23:23
あー ゴメン 無ければ俺実装 有ればオリジナルを優先 ってのは
ちょっと難しいかも?
0426デフォルトの名無しさん2010/04/12(月) 21:22:32
その逆で、自分でも書くけど他のコードで上書き可能、ならweak属性という手もあるけどな
0427デフォルトの名無しさん2010/04/13(火) 00:58:26
iostreamのcin, coutをバイナリモードにする処理系非依存な方法はありますか?
0428デフォルトの名無しさん2010/04/13(火) 06:51:05
ios::binary
と
noskipws
じゃダメなん?
0429デフォルトの名無しさん2010/04/13(火) 11:13:13
>>428
ios::binaryはどうやって設定するんでしょうか?
noskipwsなどはsetf()で設定できるけど、ios::binaryは書式フラグではないですよね。
0430デフォルトの名無しさん2010/04/13(火) 15:25:31
>>426
weakか。使えそうかも。
0431デフォルトの名無しさん2010/04/13(火) 22:05:51

環境はwindowsXPSP3 VC++2008です
const_castをうまく扱えません、助けてください

まずMeCabという形態素解析エンジンのライブラリを使おうと思いました。
ttp://mecab.sourceforge.net/libmecab.html
のC++ サンプルと言うものを使おうと思ったのですが、エラーが出ます
ライブラリ自体は
ttp://jaist.dl.sourceforge.net/project/mecab/mecab-win32/0.98/mecab-0.98.exe
で解凍したMeCab\sdkの中にあります

とりあえず
#include <mecab.h> を
#include "mecab.h" に直しました
すると別のエラーがでまして

1>d:\mecab\main.cpp(30) : error C2440: '初期化中' : 'const MeCab::Node *' から 'MeCab::Node *' に変換できません。
1> 変換で修飾子が失われます。
1>d:\mecab\main.cpp(36) : error C2440: '=' : 'const MeCab::Node *' から 'MeCab::Node *' に変換できません。
とでまして、const_castと言うものを使えば解決出来そうな感じなのですが、使い方がよくわかりません
どうすればいいんでしょうか
30行目は以下のようになっています。よろしくお願いします
MeCab::Node* node = tagger->parseToNode(input);
0432デフォルトの名無しさん2010/04/13(火) 23:07:53
>>429
open時
0433デフォルトの名無しさん2010/04/13(火) 23:18:46
>>431
そのドキュメントを信じるならMeCab::parseToNode()はMeCab::Node*を返すのでそんなエラーは出ない

場当たり的1
MeCab::Node const * node = tagger->parseToNode(input);
場当たり的2
MeCab::Node* node = const_cast<MeCab::Node*>(tagger->parseToNode(input));

もしかして:
MeCab::Tagger *tagger = MeCab::createTagger (argc, argv);
の行にconstをつけてしまっている
または
サンプルがそもそも間違っている
0434デフォルトの名無しさん2010/04/14(水) 01:37:17
>>432
cin, coutは既にオープンされてると思うんですが
オープンし直す方法があるんですか?
0435デフォルトの名無しさん2010/04/14(水) 01:43:22
>>427 http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.13
0436デフォルトの名無しさん2010/04/14(水) 01:47:37
C++にfreopen()に相当する関数あったっけ?
0437デフォルトの名無しさん2010/04/14(水) 02:31:33
>>435
ありがとうございます。処理系依存になっちゃうんですね。
Windowsだと_setmode()を使えばバイナリモードにできるみたいでした。
0438デフォルトの名無しさん2010/04/14(水) 07:54:09
>>433
やっぱりエラーでてしまいます><
もう作者に聞いてみます。ありがとうございました!
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) char const * __cdecl MeCab::getTaggerError(void)" (__imp_?getTaggerError@MeCab@@YAPBDXZ) が関数 _main で参照されました。
1>main.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) class MeCab::Tagger * __cdecl MeCab::createTagger(int,char * *)" (__imp_?createTagger@MeCab@@YAPAVTagger@1@HPAPAD@Z) が関数 _main で参照されました。
1>D:\mecab\Debug\mecab.exe : fatal error LNK1120: 外部参照 2 が未解決です。
0439デフォルトの名無しさん2010/04/14(水) 08:26:25
コンパイルエラーならともかく
リンクエラーで聞かれても困っちゃうな
0440デフォルトの名無しさん2010/04/14(水) 21:46:39
>>436
freopen
04414312010/04/14(水) 22:24:36
挫折しますた・・またいつか会う日が来るかもしれません・・
なければ、さようなら
0442デフォルトの名無しさん2010/04/14(水) 22:33:26
こうしてC/C++の奇怪仕様によって
一人の命が失われたのであった。
0443デフォルトの名無しさん2010/04/14(水) 22:58:56
>>431
付属のexample.cppだとそのようなエラーは出なかった

>>438
ライブラリを使うのは初めてか?力抜けよ
0444デフォルトの名無しさん2010/04/14(水) 23:13:25
ワロタ
まぁ色々な言語を使って勉強してみ
後年思い出したときに使うと、あっけなく使えるもんさ
今必要なものだったら、その、なんだ。スマン。
0445デフォルトの名無しさん2010/04/15(木) 12:10:08
頭を変更・追加
#include "mecab.h"
#pragma comment(lib, "libmecab.lib")
でいけたぞ。もう死んだかな
0446デフォルトの名無しさん2010/04/15(木) 21:51:07
IPhoneとかAndroidで使える無料のC++コンパイラってありますか?
0447デフォルトの名無しさん2010/04/15(木) 22:22:33
Win7使ってるんですが
VisualStudio2005って対応してますか?

学校でインストールできるんですが、2008より2005のほうが軽いよ!って言われて困ってます
0448デフォルトの名無しさん2010/04/15(木) 22:42:31
>>447
どっちでもいいけど
教えてくれる人の環境に合わせるのが楽
0449デフォルトの名無しさん2010/04/15(木) 22:57:54
>>447
2008作る時に2005に残ってた大量のバグ潰したらしいよ!と言い返してみよう
0450デフォルトの名無しさん2010/04/15(木) 22:59:39
http://www.microsoft.com/downloads/details.aspx?FamilyId=90E2942D-3AD1-4873-A2EE-4ACC0AACE5B6&displaylang=ja

でも2010に移行しようってときにあえて2005ってどうなの・・・
0451デフォルトの名無しさん2010/04/15(木) 23:00:18
2005はUACがうざい
0452デフォルトの名無しさん2010/04/15(木) 23:33:11
2008 ってひょっとして管理者権限なしでも大丈夫なの?
デバッグ中にD&Dができなくて困ってた
0453デフォルトの名無しさん2010/04/15(木) 23:53:23
それは必要よ
0454デフォルトの名無しさん2010/04/15(木) 23:54:38
ってか、開発マシンに対する管理者権限もらえてないの?
04554472010/04/15(木) 23:57:05
どっちでも大丈夫なんですね
ありがとうございます


教えてくれる人?は特にいないです
みんなでゲーム作ろう!ってなって、学校で配ってるのが2008と2005でした
斡旋機なので、全員同じスペックのWin7のノートPCをもってます

こういう場合はどっちがおすすめですか?
新しいほうがいいのかな?
一応、どっちかに統一しないとコンパイルが通らなくなるといわれたので
0456デフォルトの名無しさん2010/04/16(金) 00:06:50
何の理由もなければ新しい方
tr1使えるしなー
0457デフォルトの名無しさん2010/04/16(金) 00:11:43
MSDN AA なんだろうけどそれはライセンス違反になるんじゃないの
0458デフォルトの名無しさん2010/04/16(金) 00:21:19
学生に優しいと定評のあるマイクロソフト
■ このスレッドは過去ログ倉庫に格納されています