【初心者歓迎】C/C++室 Ver.67【環境依存OK】 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
09/07/19 02:25:58
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.66【環境依存OK】
スレリンク(tech板)

【アップローダー】(質問が長い時はココ使うと便利)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か   に置換しておくことをお勧めします。

2:デフォルトの名無しさん
09/07/19 02:37:28
janeの隠し機能

1.書き込みウィンドウを出し半角入力に切り替える
2.Wキーを押しっぱなしにする
3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック


3:デフォルトの名無しさん
09/07/19 09:24:23
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

4:デフォルトの名無しさん
09/07/19 09:30:12
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

5:デフォルトの名無しさん
09/07/19 09:31:19
ERROR!
ERROR:長すぎる行があります!

6:デフォルトの名無しさん
09/07/19 09:32:45
ERROR!
ERROR:>>1-5>>7-1000はゴミです!!

7:デフォルトの名無しさん
09/07/19 11:01:08
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

8:デフォルトの名無しさん
09/07/19 11:15:12
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

9:デフォルトの名無しさん
09/07/19 17:56:12
前スレの933ですがプログラムの問題ではなくscimの問題だったみたいで解決しました

10:デフォルトの名無しさん
09/07/19 21:51:16
std::mapとtr1::unordered_mapって
速さ:std < tr1
メモリ節約:tr1 < std
でおk?

11:デフォルトの名無しさん
09/07/19 22:08:40
>>10
あー、一般論としてはそんな感じになると思う

12:デフォルトの名無しさん
09/07/20 23:31:44
class CardSet {
public:
CardSet() {make();};
//CardSet() {};
void make() {};
};
class Player {
public:
Player(){};
~Player();
};
class SubPlayer : public Player {
public:
CardSet a;
SubPlayer() {};
};
main(){
Player * a = new SubPlayer();
}
このプログラムをg++ 3.4.3 32bit Linuxでコンパイルすると、
In function `SubPlayer::SubPlayer()':
undefined reference to `Player::~Player()'
というエラーになります。しかし、CardSetのコンストラクタを
コメントアウトしている方に切り替えると、エラーなくコンパイルできます。
~Player()を定義すれば済む話ですが、なぜこのような違いが起こるのでしょうか?

13:デフォルトの名無しさん
09/07/20 23:45:15
固定小数点同士の乗算がしたいのですが
掛けたらオーバーフローになってしまうのでどうしたらいいのかわかりません

今は片方を普通の小数にしてやっちゃってますが意味がない気がするし
整数と小数をわけて乗算するしかないのでしょうか
それだとあまり意味がないのでしょうか

14:デフォルトの名無しさん
09/07/21 00:18:46
>>13
32bit×32bitは64bitになる。これあたりまえの話ね。
だからアセンブリ言語では大抵、整数乗算命令は上半分と下半分を別々に取得することが出来るようになっている。

C言語の枠内では(__asmとかintrinisic関数とか使わない限り)効率的な方法は存在しない。
シフトしながら足し算していこうかな、とか
32bitを16bit+16bitに分割して4回掛け算をやろうかな、程度。

15:デフォルトの名無しさん
09/07/21 00:39:21
>>14
もう1つある。最適化を期待するんだ。
int32_t x, y;
int64_t z;
という状況で、VCは最適化ありにすればz = (int64_t)x * y;をimul(32 bit * 32 bitの結果を64 bitで返す)1つにしてくれる。
よそのコンパイラもこれくらいやってくれるだろう。

ところで、>>13は固定小数点数同士を掛けた後、右シフトしていないだけのような気がする。
小数部Nビットの固定小数点数同士を掛けると、小数部が2Nビットの固定小数点数になるから、
小数部Nビットで結果が欲しいなら、Nビット右シフトが必要だぞ。

16:デフォルトの名無しさん
09/07/21 01:04:17
>>14-15
そういえばアセンブラとかだと二つのレジスタに入ったりしましたね

シフトは忘れていなかったんですが
掛けた時点で内部では32bitのままなのかなって思ったりしました

vc使ってるんですが64bit整数の型名知らないですが
((int64)a * b)>>16 こんな感じに出来るのでしょうか

17:デフォルトの名無しさん
09/07/21 01:13:54
__int64かな。
long longも使えた気がする。

18:デフォルトの名無しさん
09/07/21 01:25:52
あ、型名入れてやったら出来ました
ありがとうございました!

19:デフォルトの名無しさん
09/07/21 02:42:29
>>12
SubPlayer の生成中に、まず基底クラスである Player の構築が完了する、その後
メンバ変数である CardSet の構築が行われるが、この中の make() から例外が発生した場合、
すでに構築が完了した基底クラスを解体するため Player のデストラクタが呼ばれる。

CardSet のコンストラクタが空であれば、この途中で例外が発生しないことがコンパイラに
わかるので、 SubPlayer のコンストラクタで Player のデストラクタが必要になるフローがなくなる。

20:デフォルトの名無しさん
09/07/21 20:03:05
>>19
ありがとうございます。
そのような理由があったのですね。すっきりしました。

21:デフォルトの名無しさん
09/07/21 21:12:24
質問があります
完全に今から始める初心者なんですが、USB機器の例えばゲームパッド等からの入力を
例えば1のボタンを押したらキーボードのAに対応させるみたいに外部機器をキーボードの代わりにする
みたいなことをしたいんですけどこういったのがこう言うのを作るのは難しいですか?
それとこう言う物を作れるようになるための勉強の方法って猫でも分かる〜や、ゲームの作り方関係の本でも大丈夫でしょうか

22:デフォルトの名無しさん
09/07/21 21:45:10
>>21
OS上の動作全般に渡ってキーボード代わりとして使いたいのなら、
デバイスドライバを作成する必要がある。
Windowsの場合は、WDKでググれ。ただしほぼ断言していいが、初心者には無理。

自分のアプリだけでそうしたいのなら、ゲームパッドの入力ができればあとは簡単でしょ。

23:デフォルトの名無しさん
09/07/21 21:54:44
>>22
自分のアプリだけでって言うのは例えば自分の作ったゲーム内でのみ対応できる 見たいな感じでしょうか?
普通のキーボードじゃなくて別のものをキーボードにしたいんですよ
となるとデバイスドライバ云々って言う難しいほうになるのかな
そう言うのを作るにはどういった勉強したらいいか何か教本的な物ってありますか?

24:デフォルトの名無しさん
09/07/21 22:03:05
DirectInputとか

25:デフォルトの名無しさん
09/07/21 22:36:52
>>23
> 自分のアプリだけでって言うのは例えば自分の作ったゲーム内でのみ対応できる 見たいな感じでしょうか?
そのとおり。それでいいのなら別に難しいことではない。
キーボードだろうがキーボードじゃないものだろうが、そこはあまり関係ない。

26:デフォルトの名無しさん
09/07/21 22:37:31
SendKeysとか

27:デフォルトの名無しさん
09/07/22 01:39:03
>>23
それはつまり
>九九が分からないんですけど大学入試数学のいい参考書はありますか?
みたいなことを言ってるってことをとりあえず理解してね。
その上で九九から始める覚悟があるなら、
とりあえず「C言語の入門書」でも探してみればいいんじゃないかな

28:デフォルトの名無しさん
09/07/22 14:20:26
catchされない例外が投げられるときはデストラクタが呼ばれない
なんてことありますか?

29:デフォルトの名無しさん
09/07/22 14:21:33
>>28 はい。

30:デフォルトの名無しさん
09/07/22 14:23:25
例外の細かい動作がいまだにわからない俺クリムゾンヴァイパー

31:デフォルトの名無しさん
09/07/22 14:23:43
そうか・・・
確実に呼ばせるにはmainでcatch(...)するしかない?


32:デフォルトの名無しさん
09/07/22 14:26:08
>>31 はい。

33:デフォルトの名無しさん
09/07/22 14:26:42
exitとかabortとかすると呼ばれないと思うから確実には無理じゃないか

34:デフォルトの名無しさん
09/07/22 14:34:36
>>33
さすがにそれは保証外で
>>29
なんかソースあったら教えて下さい
デストラクタは例外投げられたときも呼ばれるという話ばかり見てきた気がする

35:デフォルトの名無しさん
09/07/22 14:36:45
new Object;
throw -1;

36:デフォルトの名無しさん
09/07/22 14:41:45
URLリンク(ml.tietew.jp)

37:デフォルトの名無しさん
09/07/22 14:46:42
処理系依存かー

38:デフォルトの名無しさん
09/07/22 16:37:58
ある初期化されたリファレンスがあったとして、ほかのインスタンスの参照を代入することはできないんでしょうか?

int a(0), b(1);
int& r(a);

r=b; // aにbを代入ではなく、rにbの参照を渡したい

39:デフォルトの名無しさん
09/07/22 16:57:03
>>38
無理

40:デフォルトの名無しさん
09/07/22 17:00:14
次スレからはメール禁止をテンプレに入れとけよ

41:デフォルトの名無しさん
09/07/22 17:02:49
それこそ金払ってやってもらえよ
専属の教師じゃねーんだぞ

42:デフォルトの名無しさん
09/07/22 21:01:15
factory methodってtemplateクラスに使う意味ってある?

43:デフォルトの名無しさん
09/07/22 22:14:37
Factoryの利点の一つはインプリメントとインタフェースを分離することだから
templateでもその利点はあると思う。

44:デフォルトの名無しさん
09/07/23 15:47:36
cに限った話じゃないんだけどLinkedListってなんで線形リストって言うの?
連結リストでしょ?

45:デフォルトの名無しさん
09/07/23 15:54:57
Wikipediaによれば、線形リストは連結リストの分類のひとつらしいよ
両端を連結した循環リストは、線形リストでないっぽい

46:デフォルトの名無しさん
09/07/23 15:58:59
リストを管理してる先頭からしかたどれないのが線形リスト
これに一方向だけでなく戻りもOKにしたのが双方向リスト
ループするのが循環リスト

これらの総称が連結リストでいいんでないの?

47:デフォルトの名無しさん
09/07/23 18:44:55
visual studio を使っているのですが、
一定間隔で処理する方法で困っています。
無限ループを作ってtimeGetTime()を使って時間待ちをして行っていますが、
GUIからのボタン操作を受け付けることができなくなってしまいました。

GUIのボタンを押して無限ループから抜けるためにはどうすればよいでしょうか?
よろしくお願いします。

もしくは、もっとよい方法がありますか?




48:デフォルトの名無しさん
09/07/23 18:47:16
無限ループを作らず、タイマを使え

49:デフォルトの名無しさん
09/07/23 18:50:17
>>47
PeekMessage+GetMessage

50:47
09/07/23 19:24:04
アドバイスありがとうございます。
>>48
タイマを使ってみたのですけど、
たとえば50ms周期で処理しようとすると60ms近辺が周期になって
しかも、40msとか70msとかばらつきも大きくてこれは使えないなぁと。
タイマの精度は1msだとwebで見たことありますが実際どうなんでしょう?

>>49
GetMessageを使えないかと思って、WINAPI関数の中の
GetMessageのところでブレークポイント設定したのですけど
ブレークできなくて、なぜなのかよく分かりませんでした。
ブレークできないなんてことあるんでしょうか?

while (GetMessage(&msg, NULL, 0, 0)) {
→ TranslateMessage(&msg);
DispatchMessage(&msg);
}
上の→のところでブレークしようとしたのですが・・・。
47の内容とは直接関係ないですけど、なぜなのだろうと思いまして。









51:デフォルトの名無しさん
09/07/23 19:29:08
二分木プログラムの問題で、二分木の高さと大きさを求める以外で、出そうな問題ってありますか?

52:デフォルトの名無しさん
09/07/23 19:36:14
>>51
ソート、検索、削除方法

53:デフォルトの名無しさん
09/07/23 20:31:38
>>51
作成方法、木同士のマージ

54:デフォルトの名無しさん
09/07/23 20:35:50
>>51
平衡化

55:デフォルトの名無しさん
09/07/24 00:36:23
別スレッド作ればいいなじゃないの

56:デフォルトの名無しさん
09/07/24 00:43:55
>>51
平衡木なら回転は普通に出るだろ

57:47
09/07/24 11:50:59
無限ループの中でPeekMessageを使って
GUIのボタン処理を受け取ろうと思ってやってみましたが、
GUIが固まってしまってボタンを押すことができませんでした。
どうすればよいでしょうか?

58:デフォルトの名無しさん
09/07/24 11:52:28
具体的なコードを

59:デフォルトの名無しさん
09/07/24 11:56:12
というか具体的な目的を

60:デフォルトの名無しさん
09/07/24 12:00:07
・処理スレッドを作成して、そこでループをぶん回す
・メッセージループでPeekMessageを使って、メッセージがない時に処理を実行して、適度に眠らせる

のどちらか


61:47
09/07/24 12:05:37
>>58 ソースを載せてみます。
BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
switch( msg ){
case WM_COMMAND: // ダイアログボックス内の何かが選択されたとき
switch( LOWORD( wp ) ){
case IDOK: // 「OK」ボタンが選択された
g_hDlg2 = CreateDialog( g_hInst2, _T("IDD_DIALOG2"), hDlg, DlgProc2 );
ShowWindow( g_hDlg2, SW_SHOW );
loop_flg = 1;
while(loop_flg){
if (PeekMessage (&msg_roop,g_hDlg2,0,0,PM_NOREMOVE)) {
  ret =GetMessage (&msg_roop,g_hDlg2,0,0);
  if(msg_roop.message == WM_COMMAND ){
if(msg_roop.wParam ==IDCANCEL) {
TranslateMessage(&msg_roop);
DispatchMessage(&msg_roop);
}}}
counter++;
}
case IDCANCEL: // 「キャンセル」ボタンが選択された
EndDialog( hDlg, 0 );
break;
}}}


62:デフォルトの名無しさん
09/07/24 12:06:51
ボタン宛のメッセージも回してやらないとボタン自身がマウスクリックを処理できない

63:47
09/07/24 12:16:15
続き
BOOL CALLBACK DlgProc2(HWND hDlg2, UINT msg, WPARAM wp, LPARAM lp)
{
switch( msg ){
case WM_COMMAND: // ダイアログボックス内の何かが選択されたとき
switch( LOWORD( wp ) ){
case IDCANCEL: // 「キャンセル」ボタンが選択された
// ダイアログボックスを消す
loop_flg = 0;
EndDialog( hDlg2, 0 );
fclose(fp);
break;
}}}

64:47
09/07/24 12:23:55
>>62
ありがとうございます。
具体的にはどうすればよいのでしょう?

65:デフォルトの名無しさん
09/07/24 12:26:59
>>60
・メッセージループでPeekMessageを使って、メッセージがない時に処理を実行して、適度に眠らせる
の亜種

MegWaitForMultipleObjectsEx で シグナルにならないダミーのハンドルを引数に渡す
# array が NULL で 個数0 の場合意図した動き(timeout付き GetMessage もどき)になるんだっけ?

66:デフォルトの名無しさん
09/07/24 12:27:55
PeekMessageやGetMessageで取得するウィンドウをg_hDlg2だけにしたり、
TranslateMessageやDispatchMessageするメッセージをWM_COMMAND/IDCANCELだけにするのをやめればよい

67:デフォルトの名無しさん
09/07/24 12:28:03
× MegWaitForMultipleObjectsEx
○ MsgWaitForMultipleObjectsEx

68:47
09/07/24 18:23:51
>>66さんの言うようにやったら
きちんと動作するようになりました。ありがとうございます。
どうして条件を指定すると動かなくなるのでしょう?

69:デフォルトの名無しさん
09/07/24 18:33:36
>>62

70:デフォルトの名無しさん
09/07/24 18:59:22
>>68
ウィンドウズのメッセージキューはスレッドに結びついてるんだ。
ある1つのスレッドが作ったウィンドウのメッセージは皆同じメッセージキューに入るんだ。
だからそのスレッドがほんの一部だけのメッセージしか処理しない状態だと、
その処理するメッセージ以外のGUI動作をしなくなる。

てのはC/C++でのウィンドウズプログラミングの基本なんだ。
猫でも〜辺りを一通りやった方がいい。

71:hey
09/07/24 19:03:31
nigga!

72:47
09/07/24 21:17:11
>>70
キューの中にあるなら取り出さないとたまるばかりだということですか。
猫でものプログラムをvisual studio 2008 expressでコンパイルしようとしたら
よく分からないエラーが出て、挫折しました。
今は下のをやってますが、GUIを作るのに他のソフトを使いながらなので面倒です。
URLリンク(www.geocities.jp)

73:デフォルトの名無しさん
09/07/24 22:51:35
猫でもは内容がかなり古いしな

74:デフォルトの名無しさん
09/07/24 23:00:02
質問があります、C/C++ と C++/CLIって全く別物なんでしょうか?

75:デフォルトの名無しさん
09/07/24 23:41:06
>>74
CLI やマネージドメモリ周りは独特だけど、それ以外は普通の C++。
この記事を見ると感触が掴みやすいかも。

C++/CLIによるCライブラリの.NET化
URLリンク(codezine.jp)

C/C++ の学習用途としては、あまりお勧めできない。

76:デフォルトの名無しさん
09/07/24 23:44:34
>>75
学習用途としては向かないんですね
ありがとうございました

77:デフォルトの名無しさん
09/07/25 11:23:14
>>72 expressでGUIをするなら、GUIフレームワークのライブラリを使うのもひとつの方法かな。
この版に単独スレのあるGUIフレームワークは、Qt、wxWidgets、WideStudioかな。


78:デフォルトの名無しさん
09/07/25 11:33:55
RADじゃないGUIフレームワークってデザインしにくくない?

79:デフォルトの名無しさん
09/07/25 11:42:20
>>78 >>77のフレームワークにはRADツールは存在している。
フレームワークにはレイアウトを管理するクラスがあるからRADツール使わなくても慣れると簡単。
逆に画面デザイナを使うのが面倒になる。


80:デフォルトの名無しさん
09/07/25 12:24:03
初期化子つきの関数ポインタの定義の構文がわかりにくい
なんでこんな構文にしたんだろう。

81:デフォルトの名無しさん
09/07/25 12:25:21
>>80
たとえば?

82:デフォルトの名無しさん
09/07/25 12:44:09
foo(*(*bar)(baz, hoge))(fuga)(piyo);

とかぱっと見ようわからん
typedefなしでもきれいに書ける仕様にすればよかったのに

83:デフォルトの名無しさん
09/07/25 13:30:29
括弧の数からしておかしいじゃねーか

84:デフォルトの名無しさん
09/07/25 13:32:17
どゆこと

85:デフォルトの名無しさん
09/07/25 14:44:58
うろ覚えで適当に書いたんだと思われ
でもそんなに複雑かね

int foo(int x, int y, int z) {
return x + y + z;
}
int (*p)(int, int, int) = foo;

こんだけだが

86:デフォルトの名無しさん
09/07/25 14:48:21
もっと初心者にもわかりやすくしてください

87:デフォルトの名無しさん
09/07/25 14:49:22
int(*)(int, int, int) p = foo;

これなら型が前に全部来てるからわかりやすいな

この間もこっちで同じような感じのがあった

C言語なら俺に聞け(入門篇) Part 50
スレリンク(tech板)

最初の疑問はこれで
スレリンク(tech板:895番)

いろいろあったけど結論というかこうだとよかったねというので
スレリンク(tech板:903番)

88:デフォルトの名無しさん
09/07/25 14:52:14
結局のところ宣言のところでカンマで区切ればint型だろうがint型のポインタだろうが書いて行ける仕様ゆえ
型の一部が分離しちゃうんだよね


89:デフォルトの名無しさん
09/07/25 14:57:25
中側から解読していくのが定石だな

90:デフォルトの名無しさん
09/07/25 15:08:24
>>86
foo(*(*bar)(baz, hoge))(fuga)(piyo);
baz型、hoge型の2引数をとり、(fuga型を引数をとり、foo型を返す関数ポインタ型)を返す関数ポインタ型の変数barを定義して同じ型のpiyoで初期化する
わかりにくいな

foo(fuga)(baz, hoge) bar = piyo;
とか書ければ楽なんだけど・・・なんでこんな複雑な構文にしたのかわからん

91:デフォルトの名無しさん
09/07/25 15:27:45
個人的にいらない仕様というかなんでわざわざアセンブラとかからステップアップした
はずの言語でこんななの?と思ったのが? :の式

92:デフォルトの名無しさん
09/07/25 15:33:06
const double a = (b < 0) ? 0: b;
?:を使わずに書いてください。

93:デフォルトの名無しさん
09/07/25 15:37:21
>>90
boost::function を使うと簡単になるよ。
#include <boost/function.hpp>

using boost::function;

class foo{};
class baz{};
class hoge{};
class fuga{};

foo piyopiyo(fuga a)
{
return foo();
}

function<foo(fuga)> piyo(baz a,hoge b)
{
return &piyopiyo;
}


int _tmain(int argc, _TCHAR* argv[])
{
function<function<foo(fuga)>(baz,hoge)> bar=&piyo;

function<foo(fuga)> k=bar(baz(),hoge());
k(fuga());

return 0;
}


94:デフォルトの名無しさん
09/07/25 15:38:15
const double a = std::max(0,b);

95:デフォルトの名無しさん
09/07/25 15:39:23
うむw
C/C++が混在してるなw

96:デフォルトの名無しさん
09/07/25 15:42:07
C/C++は1だし。

97:デフォルトの名無しさん
09/07/25 19:17:37
NaNかもしれないぞ

98:デフォルトの名無しさん
09/07/25 19:41:55
名前空間に定義されているクラスを他のクラスで使用するときに
どうすればいいか教えてください。

(ヘッダファイル内)
class String;

class A {
  //...
private:
    String* m_Name;
}

Aというクラスがあり、メンバーとしてString*を持たせるときは、上記のように
class String;と書けばコンパイルが通ります。
もし、Stringが名前空間MyLibの中で定義されているときは、どのようにすればいいのでしょうか。
#include "String.h"
とヘッダをインクルードするしかないのでしょうか。

99:デフォルトの名無しさん
09/07/25 19:45:52
namespace MyLib {
class String;
}

100:デフォルトの名無しさん
09/07/25 19:47:12
class A {
  //...
private:
    MyLib::String* m_Name;
}

101:デフォルトの名無しさん
09/07/25 19:51:40
実装のほうでtypedef

102:98
09/07/25 20:51:57
>>99,100,101
ありがとうございます。
コンパイルが通りました。

103:デフォルトの名無しさん
09/07/25 21:57:53
【科学】道路に軍手が落ちているワケ、名城大研究チームが突き止める[09/07/24]

スレリンク(hidari板)


104:デフォルトの名無しさん
09/07/26 02:48:52
C++でpptを読み込みを行いたいです
スライドを画像にして読み込むにはVBAと連携させるしかないんでしょうか?

105:デフォルトの名無しさん
09/07/26 03:01:31
このへんから探せ
URLリンク(www.google.co.jp)

106:104
09/07/26 17:00:08
ありがとうございます
今検索結果と同じようにVBAと連携させています。
pptのスライド画像はpowerpoint起動時に組み立てているようなので
やはりVBAと連携が必須でしょうか?

後office2003,2007どちかが入っていれば動作するという動きにできるのでしょうか?

107:デフォルトの名無しさん
09/07/26 17:10:31
pptって仕様公開されてなかったっけ

108:デフォルトの名無しさん
09/07/26 17:48:42
#include <stdio.h>
#include <windows.h>

int main(void)
{
 FILE *fp;
 char str[128];

 fp = fopen("data.txt","r");
 if (fp == NULL)
 {
  printf("data.txtが読み込めませんでした");
  exit(1);
 }
 fclose(fp);

 fscanf(fp, "%s", str);
 printf("%s\n", str);

 return 0;
}

このように記述したのですがdata.txtの中身を正常に読み取れず、文字化けして出力されます。
data.txtの中身に何が書かれていようが、どうやら同じ意味不明な文字列が表示されるようです。
原因が掴めないのですが、どなたかご教示ください。

109:デフォルトの名無しさん
09/07/26 17:55:06
>>108
そのままだとファイルを正常にオープンできたとしてもすぐに閉じちゃってるよ


110:109
09/07/26 17:55:48

#include <stdio.h>
#include <windows.h>

int main(void)
{
 FILE *fp;
 char str[128];

 fp = fopen("data.txt","r");
 if (fp == NULL)
 {
  printf("data.txtが読み込めませんでした");
  exit(1);
 }

 fscanf(fp, "%s", str);
 fclose(fp);

 printf("%s\n", str);

 return 0;
}


111:デフォルトの名無しさん
09/07/26 18:13:58
なるほど…
fopenした直後にfclose書いた方が忘れずに済むと思ったのですが、それではまずかったようですね…
正常に動作させることができました。
どうもありがとうございました。

112:デフォルトの名無しさん
09/07/26 20:36:13
ちゃんとマニュアルを読めよ・・・

113:デフォルトの名無しさん
09/07/26 20:50:58
>fopenした直後にfclose書いた方が忘れずに済む

おもしろい。
最初から開かなければ、絶対に忘れずに済むんだけど
そこまでは行かなかったのね。

で、一応まともなアドバイスだけど
fscanf(に限らずscanf系全て)は、必ず戻り値を確認するようにすべきだぞ。
そうしないと、入力が正常じゃなかった時にゴミが入っている。>>108のように。

114:104
09/07/26 22:21:29
>>107
公開はされているようですがスライドを画像にすることはできないかと・・・


officeどちらかがインストールされていれば動くようにはできないのでしょうか?

115:デフォルトの名無しさん
09/07/26 22:28:22
公開されてるのなら、その仕様に沿って自分でスライドをビットマップ上に描画すればいいのでは・・・
まぁ手間だろうからあんまりやりたくないんだろうけど。

116:デフォルトの名無しさん
09/07/26 22:41:35
だから、VBAで出来ることは全てC++からのOLEオートメーションで出来るっての。
あなたに出来るかどうかは別として。

117:デフォルトの名無しさん
09/07/26 22:44:52
VBAでは画像としての取得ができているんだよな。
だったらそれをC++に書き換えるだけ。
#importなりなんなりすれば、VBAで使われるオブジェクトモデル
(メソッド・プロパティ・型名・定数など)はほぼそのままC++でも使用可能。

g++とかのタイプライブラリ読み込みの#importが使えない処理系なら話はもう少し面倒だけど。

118:104
09/07/26 22:58:30
ビットマップ描写はちょっと自分では難しそうです
C++から呼び出して出力できるようにはなっています

officeのバージョンが違っても同じように動作してほしかったんです
OLEオートメーションでもう少し調べてみます
ありがとうございました

119:デフォルトの名無しさん
09/07/26 23:09:11
ビットマップは簡単だよ
ヘッダ+2次元配列だから



120:デフォルトの名無しさん
09/07/26 23:16:58
>>118
画像にするのは簡単だよ。名前を付けて保存をすればいい。
PowerPointではBMPやEMF、あるいはJPEG、PNGなんかで保存できる。
それをVBAやC++で呼び出すだけ。

バージョンを問わず動くようにするには、オブジェクト作成時にバージョン指定せず、
その後も遅延バインドにする。
VBAではObject型、C++ではIDispatchPtr (IDispatch)を使う。2つは同じ。
IDispatchを直接叩くのはやや面倒だろうが、
これくらいなら適当にラップすればなんとかなるだろう。

121:デフォルトの名無しさん
09/07/27 05:20:22
&& と || はあるのに、 ^^ がないのはなんで?

122:デフォルトの名無しさん
09/07/27 05:31:16
何に使うの?

123:デフォルトの名無しさん
09/07/27 06:26:52
XOR条件にしたいのか
そいつは無理だ

知っての通り条件式は短絡評価をしているが
XOR条件を実現するには短絡評価を捨てなければならない

124:デフォルトの名無しさん
09/07/27 06:32:19
あ、ちなみにXOR条件は次のようにしてエミュレートできる

i = cond1;
j = cond2;

i ^ j;

この例を見てもわかるようにXOR条件は短絡評価ではなく
両者のブール値を必ず評価しなければならない

125:デフォルトの名無しさん
09/07/27 07:44:49
i != j;

126:デフォルトの名無しさん
09/07/27 09:47:52
(cond1 && !cond2) || (!cond1 && cond2)

127:デフォルトの名無しさん
09/07/27 13:44:55
>>126
それだとcond1が二回評価されてしまうから>124とは違ってしまう。

128:デフォルトの名無しさん
09/07/27 14:47:08
!i != !j


129:デフォルトの名無しさん
09/07/27 21:56:16
>>120
レスありがとうございます。
わからない単語だらけですがぐぐってがんばります

130:デフォルトの名無しさん
09/07/28 22:13:00
クラスでメンバ変数を定義した場合、どうやってアドレスを取るのでしょうか

131:デフォルトの名無しさん
09/07/28 22:20:28
&de

132:デフォルトの名無しさん
09/07/28 22:34:40
URLリンク(www.vvvvv.net)

ここのサンプリングのところに書いてあることは本当ですか?


シャノンの定理では20kHzを再現するのには倍の40kHzのサンプリングで
足りることになっています。 しかし、これが可能なのはごく限られた場合であって、
「20kHzを再現できる」場合もあると理解したほうが自然です。


という記述です

133:デフォルトの名無しさん
09/07/28 22:40:04
そうですね

134:デフォルトの名無しさん
09/07/28 22:48:45
>>132
最大で1/(40000*2)秒ずれうるから、元の音が再現できてるとは言えないって言ってるのかなぁ

135:デフォルトの名無しさん
09/07/28 22:50:41
>>134
単純に倍だとタイミングがあってればいいけど合わない場合は元の音にはならないね
倍より大目のサンプリングが無いと


136:デフォルトの名無しさん
09/07/28 23:51:52
>>132
振幅が一定の永遠に続く20KHzのサイン波なら40kHzのサンプリングで再現できる。
20KHzの信号でも、ひずんでいたり振幅が変わったり変動する場合は20KHz以上の
成分が含まれているから、40KHzのサンプリングでは再現できない。
例えば大まかにでも波形を再現するには3倍以上の周波数成分が欲しいかな。
すると120KHz以上でサンプリングする必要がある。
もっと正確に再現するにはもっと高いサンプリング周波数が必要になる。



137:デフォルトの名無しさん
09/07/29 00:49:33
シャノンは「20kHzを再現するには少なくとも40KHzのサンプル数が必要」
と言っているのであって、サンプリングできるなんて一言も言ってない。

138:デフォルトの名無しさん
09/07/29 00:53:56
必要条件だが、必要十分条件ではないということ?

139:デフォルトの名無しさん
09/07/29 00:58:11
その辺の話はダウンサンプリングとかでも解説されてるよ


140:デフォルトの名無しさん
09/07/29 01:00:30
URLリンク(questionbox.jp.msn.com)
この辺とか

141:デフォルトの名無しさん
09/07/29 02:06:04
サイン波の最大値と最小値のところでサンプリングできればいいが
0のところでサンプリングしたら無音になっちゃったりするの?

142:デフォルトの名無しさん
09/07/29 02:12:10
無音というか変な音が出る可能性もある
だからサンプリングする場合はオーバーサンプリング気味にして丁度いいくらい

143:デフォルトの名無しさん
09/07/29 02:13:01
どうあがいてもデジタル化した時点で劣化するってことか

144:デフォルトの名無しさん
09/07/29 02:16:37
>>143
そりゃ量子化の段階でカクカクになってるしねw
しかもサンプリングレート次第ではさらに飛び飛びだし

145:デフォルトの名無しさん
09/07/29 02:19:09
自分で方眼紙に適当な波形を書いてマスを数えてみればいい

146:デフォルトの名無しさん
09/07/29 02:20:21
かくかくもそうだけど一定の周波数の音でさえも、画像で言うところのモアレみたいなのが発生するってことだよね
大変すなぁ

147:デフォルトの名無しさん
09/07/29 04:51:47
>>146
大丈夫、大抵の人はそのモアレを聞き取れない。

148:デフォルトの名無しさん
09/07/29 10:05:53
>>147
聞き取れないはずの高調波がサンプリングによって
可聴範囲のノイズとして現れることはあるんじゃね?

非常に高い周波数だけど、サンプリング点を繋げるとゆ
るやかなサインカーブ、という嘘データは作れそうだし。

149:デフォルトの名無しさん
09/07/29 12:17:52
>>136
まてや。
20kHzの振幅が変動する波は20kHzより高い周波数成分を含んどるやんけ。
サンプリング定理は、その含んでいる最高の周波数成分の2倍でサンプリングしろということじゃ

150:デフォルトの名無しさん
09/07/29 13:47:18
>>147
それいっちゃったらカクカクについても聞き取れないから大丈夫ってことになっちゃうし

151:デフォルトの名無しさん
09/07/29 14:32:55
class hoge {
public
typedef bool Bool;

public:
Bool fuga();
};

Bool hoge::fuga() {return true;}

これって普通コンパイルできないと思うんですが
なんかできてしまうことがある・・・これはvc++が変だからでしょうかね?
バグなのかな・・・?

152:デフォルトの名無しさん
09/07/29 14:40:34
>>151
それでコンパイル通るんだったら根本的に壊れてるんだと思うが?

153:デフォルトの名無しさん
09/07/29 14:46:43
上のコードでは通らないんですが下のコードならvc++ee2008で通りました

#include <iostream>

namespace hoge {
    class hoge {
    public:
        typedef bool Bool;

    public:
        Bool foo();
        Bool bar();
    };
}

namespace hoge {
    hoge::Bool hoge::foo() try {return true;} catch(...) {}
    Bool hoge::bar() {return true;} // <- !
}

int main() {
    hoge::hoge h;

    if(h.foo()) std::cout << "foo" << std::endl;
    if(h.bar()) std::cout << "bar" << std::endl;

    return 0;
}

154:デフォルトの名無しさん
09/07/29 17:41:30
>>153
そりゃ通るんじゃね。

>>151がなぜ通らないか理解できてますか。


155:デフォルトの名無しさん
09/07/29 17:46:26
::hoge::Boolがなぜ見えるのかってこと?
::hoge::hoge::Boolではなくて

156:デフォルトの名無しさん
09/07/29 22:02:36
hoge::Bool hoge::foo() try {return true;} catch(...) {}
ちなみにこれをコメントアウトするとコンパイルできなくなります

>>154
Boolはhogeの中限定なのでhoge::Boolにしないと外からは見えないからですよね?

>>155
そうです
hoge::Boolは外からは見ると存在しないはずなのに・・・

157:デフォルトの名無しさん
09/07/29 22:41:22
WindowsのGUI関連の質問なんですが、コントロールの描画に手を加えたいときは、オーナドローとサブクラス化の
手段が考えられますが、どちらの方が一般的なのでしょうか。
あるいはどちらの方が負担の軽い処理となるのでしょうか。

158:デフォルトの名無しさん
09/07/29 22:45:02
>>157
サブクラス化してオーナードローすればいいんじゃね?

159:デフォルトの名無しさん
09/07/29 22:48:57
オーナードローが開かれた〜♪

160:デフォルトの名無しさん
09/07/29 23:13:43
>>151
hoge内の他にグローバルでtypedef bool Bool;されてたり

161:デフォルトの名無しさん
09/07/29 23:33:10
>>153
こちらでもVC++EE2008で試して、通ることを確認した。
function-try-blockの直後は、まだclass hogeのスコープが残ってしまっている雰囲気だね。
他にも、コンストラクタのfunction-try-blockのcatch内でreturnしてもコンパイルエラーにならないし…。
この辺、VCは何かおかしい。

>>160
それは無かった。

162:デフォルトの名無しさん
09/07/30 01:08:44
>>159
きらめく光俺〜を〜うつ♪
か。 ちょっと一瞬判らなかったよ。

163:デフォルトの名無しさん
09/07/30 02:21:49
パパラッパパラッパーラー

164:デフォルトの名無しさん
09/07/30 15:00:20
ワラタ
ダンバインか

165:デフォルトの名無しさん
09/07/30 20:55:09
変数の参照関係(?)で質問です。
waitを呼び出したとき、for文で無限ループになります。
現状自分で確認できたのは次の通りです。
 1.timer_procは1秒毎に呼び出されている(LEDの点灯/消灯コードをいれて確認)
 2.wait内のfor文の前でLED点灯のコードを入れ、LEDが点灯できた
 3.wait内のfor文の後でLED点灯のコードを入れ、LEDが点灯されない
変数の宣言と定義などで何か勘違いしていてtimer値がおかしい結果になってると
思うのですが、どう修正すればいいか教えてください。
ソースはこんな感じです。
----- a.c -----
#include "a.h"

int timer;

/* 1秒に1回割り込みで呼び出される */
void timer_proc(void)
{
 if (timer > 0) timer--;
}

----- a.h -----
extern int timer;

----- b.c -----
#include "a.h"

void wait(void)
{
 for (timer = 10; timer; ) ;
}

166:デフォルトの名無しさん
09/07/30 21:01:27
timerにvolatileを付けたらどうだろう。

167:デフォルトの名無しさん
09/07/30 21:01:32
>>165
処理系がわからんからエスパーするけど
forのなかのtimerが最適化されて定数に置き換えられてるんじゃないの?
volatileつけてみるとかいうのはどうだろう

168:デフォルトの名無しさん
09/07/30 21:59:20
君たちは結婚すればいい

169:165
09/07/30 22:27:56
>>166-167
ありがとう、volatileで解決しました。

170:デフォルトの名無しさん
09/07/31 14:46:34
継承ってのは大抵public継承にするのが一般的なんですかね

171:デフォルトの名無しさん
09/07/31 14:47:21
場合による

172:デフォルトの名無しさん
09/07/31 14:51:55
public→ベースにできることは派生で全部できる時に使う
private→実装がほしいだけの時に使う。でも実装がほしい場合は普通メンバ変数として持たせる

173:デフォルトの名無しさん
09/07/31 17:09:35
stateパターンの利点がいまいち分からないんですが。

switch(state){
  case STATE_1: state_1(); break;
  case STATE_2: state_2(); break;
}
これが、

switch(state){
  case STATE_1: obj = state_1; break;
  case STATE_2: obj = state_2; break;
}
obj.func();
になるだけでstateパターンを適用することでif~else()かswitchを使った
状態遷移処理は消えなくないですか

174:デフォルトの名無しさん
09/07/31 17:21:09
初期化が
obj = state_1;
とかで、後は
obj->func();
を回すだけ
遷移はstate_1の中で
obj = state_2;
とかやる
switchなど不要

175:デフォルトの名無しさん
09/07/31 17:24:18
obj->func() の戻りが obj になってりゃ良いんでないの?

obj = state_1; // 初期ステート
obj = obj.func(); // ステート変遷

176:デフォルトの名無しさん
09/07/31 17:30:42
各状態が全ての状態のオブジェクトへのポインタを持つってこと?deleteはいつやるの?わかんなくなってきたぞ。。

177:デフォルトの名無しさん
09/07/31 17:34:29
遷移するときに
obj = new state_2;
delete this;
とかでもいいし
何も考えず全部グローバルでもいいし
お好きにどうぞ

178:デフォルトの名無しさん
09/07/31 18:21:44
各状態を全てシングルトンにして、
初期化で
IState* state = STATE_1::getObj();
ループで
state = state->func();
にしてfunc()内で、
return thisとか
return STATE_2::getObj();
とかしてスッキリになりました状態遷移処理だけでなく状態管理変数も不要になるんですねありがとうございました。


179:デフォルトの名無しさん
09/07/31 18:24:47
>>178
あまりその辺を突っ込むとタスクシステム大好きおじさんが来るから気をつけてねw

180:デフォルトの名無しさん
09/08/01 15:19:16
明快入門 Visual C++ 2008 ビギナー編って本が分かりやすいけど
知識0の全く最初からVC++の機能をフルに使って勉強してると環境が変わったら何もできなくなりそうで怖い
分かりやすいけど・・・

181:デフォルトの名無しさん
09/08/01 15:39:36
windows以外でやらないなら問題ないw >180

182:デフォルトの名無しさん
09/08/01 15:44:16
オレ様基準で皆がコンパイルエラー出すようなコード書く前提で威張ってもらっちゃ心外だな

183:デフォルトの名無しさん
09/08/01 18:53:36
>>180
VSの機能をフルにつかえてるなら、makeやらをちょろっと書けるレベルよりはるかに上。

184:デフォルトの名無しさん
09/08/01 22:00:14
>>181
そりゃそうだけどw
趣味でやるならwindows環境だけでやれるけど、もしも仕事にするなら多分win以外の環境も多いんだろうなあと思ってさ
>>183
本当にフルに使えてるなら結構凄いのか

185:デフォルトの名無しさん
09/08/01 22:05:32
Cでアドイン書いて自分で拡張できるわけだから
そりゃ凄いことができると思うよ
やりにくい処理は他の処理系に投げることもできるしね

186:デフォルトの名無しさん
09/08/01 22:17:48
知識0の全く最初からフルに使える人なんているとは思わなかった

187:デフォルトの名無しさん
09/08/02 13:37:57
Cをすっ飛ばして最初からC++が学べる本ってありますか?

188:デフォルトの名無しさん
09/08/02 13:38:41
accelerated C++

189:デフォルトの名無しさん
09/08/02 18:07:37
>>188
私に対するレスです・・・よね?
その本はC++から学ぶ事を目的とした本なんですか?

190:デフォルトの名無しさん
09/08/02 18:25:22
本関係ないけどC++の成分の7割くらいはCだと思うんだ。
C++"だけ"を学ぶってのは無理じゃないの?
C++とCから一部省いたものを同時に学ぶだけで。

191:デフォルトの名無しさん
09/08/02 18:30:33
C++があればまず使わないようなやり方を学ぶ手間は省ける
でCの入門書の場合、その類の事に対する説明の割合が大きい
そういうのをすっとばしてC++流のやり方がてっとり早く学べる本の定番が>>188

192:デフォルトの名無しさん
09/08/02 19:03:59
入門書でスマートポインタまで教えてくれる本はなかなかないからね。
Accelerated C++は名著。超高密度。

193:デフォルトの名無しさん
09/08/02 19:28:21
メンバ変数の多次元配列をコンストラクタで初期化する場合はfor文で回すしかないですか

194:デフォルトの名無しさん
09/08/02 21:29:22
下記質問をboostすれで聞いたら、
---------------
boostのpoolを使いたいのですが。class内のメンバ変数に指定する方法がわかりません。
boost::pool<> p(sizeof(int));
この行を、グローバルやローカル変数にすると問題がないのですが。
class AA
{
boost::pool<> p(sizeof(int));
}
クラス内に入れるとコンパイルエラーになってしまいます。対処方法がないでしょうか
---------------
「C++の基礎からやり直せ 」の回答が来ました。どうも初心者の質問のようでした。
なので、初心者スレでお聞きいたします。よろしければ何かアドバイスをください。
注)代理で書き込みをお願いしているので、返事が遅くなる可能性があります。



195:デフォルトの名無しさん
09/08/02 21:35:28
boostの前に、C++のクラスを一つでも作成したことあるの?
クラス定義で初期化はできないよ

196:デフォルトの名無しさん
09/08/02 21:53:14
ただし、const staticな整数型は例外。

197:デフォルトの名無しさん
09/08/02 22:55:44
>>194
コンストラクタ初期化子でググれ。

198:デフォルトの名無しさん
09/08/03 00:06:52
>>196 最近それに気付いたんだけど、昔からそうだった?


199:デフォルトの名無しさん
09/08/03 00:22:30
>>198
VC6ではできなかった。

200:デフォルトの名無しさん
09/08/05 20:00:04
unicodeの文字列から漢字かどうかって判別できますか?

201:rational
09/08/05 22:14:55
>>200 漢字の領域が定義されているからそれで判断すれば

202:デフォルトの名無しさん
09/08/05 23:56:22
あ、 rational さん。

203:デフォルトの名無しさん
09/08/06 00:19:43
>>200
半角文字に変換する関数で変換できなければ漢字として扱えばいいだけ。
この程度を瞬時に思いつかないようなら仕事はない。

204:デフォルトの名無しさん
09/08/06 00:29:50
と、派遣を首になった無職がわめいております。GetStringTypeEX。

205:デフォルトの名無しさん
09/08/06 00:46:20
オレのマシンでは GetStringTypeEX なんて使えないぞ

206:デフォルトの名無しさん
09/08/06 00:58:20
>>203
半角に変換できない文字⊂漢字だが、
半角に変換できない文字=漢字ではない。

207:デフォルトの名無しさん
09/08/06 01:00:37
>>205
URLリンク(site.icu-project.org)

>>203みたいなのが地雷を埋め込んでくれるんだなー、と溜息が出た。

208:デフォルトの名無しさん
09/08/06 01:10:32
漢字⊂半角に変換できない文字だった

209:デフォルトの名無しさん
09/08/06 02:27:23
>>203
そっか。。だからうちの会社仕事減ってきてるんだな。。。
はやいやすいまずいは中国の専売特許だからやりたくないけど不況を乗り切るためには仕方ないのかなぁ

210:デフォルトの名無しさん
09/08/06 02:30:35
今のご時世、どこも一緒(´〜`)

211:デフォルトの名無しさん
09/08/06 02:38:41
プログラム作るよりパソコン教室とか開いて教えたほうが楽だよ

212:デフォルトの名無しさん
09/08/06 11:46:49
>>203
半角ハングルというのがあってだな・・・

213:212
09/08/06 11:47:47
ごめん、なんか勘違いしてた。
無視してくれ。

214:デフォルトの名無しさん
09/08/07 01:29:07
チョンコは(・∀・)カエレ!!

215:デフォルトの名無しさん
09/08/07 04:40:11
下のソースで
class CVec
{
std::vector<int> vInt ;
public:
void Get(int *pInt)
{
vInt.push_back(5) ;
pInt = &vInt[0] ;
}
}vec;

int _tmain(int argc, _TCHAR* argv[])
{
int* pInt = NULL ;
vec.Get( pInt ) ;
return 0;
}
mainのとこでpIntにアドレスを戻す事が出来ません
こういうことは出来ないんでしょうか?

216:デフォルトの名無しさん
09/08/07 04:42:24
void Get(int *pInt) → void Get(int *&pInt)

217:デフォルトの名無しさん
09/08/07 05:02:15
出来ました有難うございました

218:デフォルトの名無しさん
09/08/07 09:50:44
>>215
その戻したポインタはクラス内部でvectorに対して変更を掛けたら無効になるから要注意。
つーか、const_iteratorを返す方がよかないか?

219:デフォルトの名無しさん
09/08/07 23:21:54
flvのプレイヤー作るにはなに勉強すればいいですか??

220:デフォルトの名無しさん
09/08/07 23:26:36
FLEXだと手軽にできるかな
体験版でプレイヤー作ったけど期限切れでそのまま放置してるの思い出した


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4999日前に更新/156 KB
担当:undef