スレを勃てるまでもないC/C++の質問はここで 2at TECH
スレを勃てるまでもないC/C++の質問はここで 2 - 暇つぶし2ch1:デフォルトの名無しさん
07/05/07 11:02:46
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

スレを勃てるまでもないC/C++の質問はここで
スレリンク(tech板)


2:デフォルトの名無しさん
07/05/07 18:25:57
dynamic_castってどんな時に有用なのですか?

3:デフォルトの名無しさん
07/05/08 10:13:05
forループをインテルコンパイラを使いSSEで並列計算させるようにしています。
floatはdoubleの倍並列度が上がるはずなのですが、floatにしてもループの計算速度が
1.2倍程度にしかなりません何故なのでしょう
ループの中身は主に画像処理で、ほとんどが三角関数です。

4:デフォルトの名無しさん
07/05/08 10:42:37
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。

5:デフォルトの名無しさん
07/05/08 10:56:12
>>2
dynamic_castにより、従来のキャストでは不可能であった クロス・キャスト、
そして抽象基底クラスからのダウン・キャストが可能になりました。


6:デフォルトの名無しさん
07/05/08 11:02:51
>>3
近年のプロセッサではdoubleの計算速度はfloatとあまり変わらないためです。

7:デフォルトの名無しさん
07/05/08 11:11:21
うそつき

8:デフォルトの名無しさん
07/05/09 01:10:40
>>3
一応マジレスしておくと、その情報だけでは一概に言えないとしか。
「演算速度」と一口に言っても実数計算だけしているわけではないから1.2倍なら御の字だろう。

処で、まさかとは思うがfloat版でもsin()を使っちゃいないよな?

9:デフォルトの名無しさん
07/05/09 12:34:09
>>3
45度分の三角関数表ぶち込んで置くのオヌヌメ

10:デフォルトの名無しさん
07/05/11 11:37:54
>>8
c99にはsinf()などのfloat専用関数があるのに意外に知られてないよね。

11:デフォルトの名無しさん
07/05/13 23:47:46
タスクを意識したプログラムを仕事で使うので勉強しています。
ディスパッチていう関数とアイドルタスクの実行関数ってのがあって
main関数で、初期設定(アイドルタスクのTCBの設定)をしてから、
ディスパッチの関数をコールすると、
そのディスパッチの関数がリターンされると
アイドルの関数を呼び出してもいないのに、
アイドルタスクが実行されました。
さっぱりわからないんですけど、こういうのって
普通のつくりなんでしょうか?


12:デフォルトの名無しさん
07/05/14 01:25:43
>>10
C++だとsinでfloat版も多重定義されていることも意外に知られていないよね
勿論3がCとC++のどっちを使っているのかはわからないけど

13:デフォルトの名無しさん
07/05/14 16:08:02
>>11
よーわからんが、「ディスパッチ」というからには
「何かが起きれば対応する処理を呼び出し、
 何もなければアイドル処理を呼び出す」のは
極々ふつーかと。

14:デフォルトの名無しさん
07/05/15 18:40:58
Borland C++をつかってピアノをシミュレートするプログラムを組もうと思ってます。
つまり、キーボードAでドの音、キーボードSでレの音、キーボードDでミの音をだすわけです。

初めはDXライブラリつかってAキーを押したらあらかじめ用意してあるドの音が記録された
wavファイルを再生しようと思ってました。

しかしながら、これだとキーを押している間のみ音を出す事ができないわけです。

そこで、wavファイルを再生するという方法を諦め別の方法を考えてるわけですが、
なにか良い方法はないでしょうか?


15:デフォルトの名無しさん
07/05/15 18:43:25
簡単なのはMIDI使うやつだなあ

16:デフォルトの名無しさん
07/05/15 18:47:20
>>14
単純な音でごく簡単にやるなら、Beep()を使うのはどうだろう。
それはさておき、なんでDXでwav再生だと「きーを押している間のみ音を出せない」のだろう……

17:デフォルトの名無しさん
07/05/15 18:53:31
なんで組み込み系の型は継承できないの?

18:デフォルトの名無しさん
07/05/15 18:57:49
>>15
ありがとうございまする
C++からつまりMIDI音を生成できるというわけですか。ちょっと調べてみます。
>>16
ありがとうございます
さすがに、Beepでは。せめてMIDIくらいはクオリティ欲しいです。
「きーを押している間のみ音を出せない」はたぶん誤解していらっしゃるみたいです。
つまり、ドの音がwavに6秒記録されていて、Aキーを1秒間しか押してなくても
6秒再生されてしまうわけです。

”押している間のみ音を出す”という事ができないわけです




19:デフォルトの名無しさん
07/05/15 19:03:15
「押している間のみ音を出すことができない」は、「離したら音を止めることができない」と言いたかったわけねw

短めのwavを用意して、キーリピートのたびに繰り返すなり、再生を途中で止めるなりすればいいのでは?

20:デフォルトの名無しさん
07/05/15 19:08:56
>>17
C++は効率も重視してるので、そのような設計になっている。
ってのが模範解答かな

21:デフォルトの名無しさん
07/05/15 22:49:44
C言語で
1 -0.5から0.5までの間のdouble型の乱数の発生のさせかた
2 0から1までの間のdouble型の乱数の発生のさせかた

を教えてください。rand()関数を使うなどの簡単なプログラムの方がありがたいです。
ググって見たら、整数の乱数の発生させかたは幾つか見つかったのですが
小数の乱数の発生させかたを見つけることができませんでした。
よろしくおねがいします。

22:21
07/05/15 22:58:43
書き忘れてました。

毎回同じ乱数で大丈夫です
よろしくお願いします。

23:デフォルトの名無しさん
07/05/15 23:46:25
>整数の乱数の発生させかたは幾つか見つかった
これが分かって、何で
>1 -0.5から0.5までの間のdouble型の乱数の発生のさせかた
>2 0から1までの間のdouble型の乱数の発生のさせかた
これがわかんないんだ?
ちょっと考えれば分かりそうなもんだが…

24:デフォルトの名無しさん
07/05/15 23:54:53
応用力のないゆとり

25:デフォルトの名無しさん
07/05/16 00:39:24
>>21

ゆとり教育の弊害か?

こういう調べ方もわからない香具師はなにかに躓くたびに
同レベルの質問するんだろうなw


26:デフォルトの名無しさん
07/05/16 00:53:20
まあきっとリア消なんだろうと思って免じよう

(double)rand() / ((double)RAND_MAX + 1)
これで0以上1未満の乱数になる。1を加えなければ、範囲が0以上1以下になる。
あとは0.5を引けばいいだけ。

27:デフォルトの名無しさん
07/05/16 01:00:42
>きっとリア消
そうかな? 文章の書き方はもう少し上の年齢を感じさせるが。
だからこそ応用できないのが残念というか不思議というか…

28:18
07/05/16 01:55:47
たぶん、基本的な型変換の知識が欠如してるかと思われます

29:21
07/05/16 06:31:24
みなさんすいません。つい最近C言語を始めたばかりで何もかもがチンプンカンプンな30歳です。
整数しかなくても乱数の中の最大値で割れば小数に変換できるってことですね(RAND_MAXっていうのは乱数の
中の期待される最大値ってことですよね・・?)。
こんな風にできるのか。勉強になりました。ありがとうございます

30:デフォルトの名無しさん
07/05/16 06:43:52
1、機能設計
2、関数(クラス)設計
3、実装
4、レビュー
5、1にもどる
これを繰り返しやってるんだが効率が悪い気がする
なんかいいプログラム方法ってないの


31:デフォルトの名無しさん
07/05/16 06:49:36
>>30
1. なんとなく実装
2. バグ取り

これなら効率よく見えるかい?w

32:デフォルトの名無しさん
07/05/16 10:22:27
作業の合間の2chをなくせば効率は少なくとも5割アップする。
間違いない。

33:デフォルトの名無しさん
07/05/16 10:29:14
今は、2chの合間の作業だからなあ

34:デフォルトの名無しさん
07/05/16 10:50:43
C初心者です。
ググッていたら
int PASCAL WinMain
なんていうmain関数見つけたのですが、なんでCなのにパスカルなんですか?

35:デフォルトの名無しさん
07/05/16 10:54:07
>>34
CDECL、PASCAL、STDCALLあたりで調べてみな

36:デフォルトの名無しさん
07/05/16 22:48:12
#include <stdio.h>
int main(void)
{
int data[ ] = { 7,4,12,71,3,85,69,47,11 };
int i, j=0;
  printf("prime =");
while(j<10){
for(i=3;i<data[j];i++){
if(data[j]/i!=0)
i++;
else(data[j]/i==0)
printf("%d\n",data[j]);
}
j++;}
  return 0 ;
}

数字の中から素数を出力するプログラムを作りたいのですけど
ステートメントにセミコロンがないとエラーが出てしまいます。
セミコロンは忘れずにつけているはずなのですが・・・
どなたか教えてください。よろしくお願いします。

37:デフォルトの名無しさん
07/05/16 22:51:41
else(data[j]/i==0)

38:デフォルトの名無しさん
07/05/16 22:54:41
>>37
理解できました。
/じゃなくて%使わないとだめだったのですね
ありがとうございます。

39:デフォルトの名無しさん
07/05/16 22:58:09
それでいいんなら構わないんだけど・・・

40:デフォルトの名無しさん
07/05/17 10:29:49
>>36
一応マジレスしておくと、慣れない内はif, for, whileなどには必ず{}をつけるようにした方がいいぞ。
それと、{}の位置は対応が見つかりやすい位置に揃えておくこともね。

41:デフォルトの名無しさん
07/05/19 04:38:09
以前、Visual Studioの6.0を使っていたのですが
CDが無くなって見つからなかったせいもあり、
せっかくだから新しいのを買おうとVisual Studio 2005を買ってきたんです。

ところが、簡単なプログラムを組んで知人に渡すと
「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。」
と出て、実行できないとのことなのです。
調べてみると、VCの新しいランタイムを入れなければいけないとのこと。

VC++6の頃は、こんなのが出た記憶がなかったのですが、
それは、VC6が古かったのでランタイムが既に入っていただけなのでしょうか?

大半の人がランタイムを入れないと動かないというのは、好ましくないのですが
2005を使う利点というのは、どの程度あるのでしょうか?
単にフリーソフトを作って配布するだけならば、VC++6でも十分なのでしょうか?

また、持ってないのでなんともいえないのですが、VS2003についてはどうなのでしょうか?

場合によっては、2005を誰かにでも売って、2003を買ってくるなり
VC6をもう一度探してみるなどの手段を講じようと思っております。

どなたかよろしくお願いいたします。

42:デフォルトの名無しさん
07/05/19 05:28:33
>単にフリーソフトを作って配布するだけならば、VC++6でも十分なのでしょうか?
Yes

つーか俺は VS2003proとか持ってるけど、
未だにC++は VS6.0でやってる
メインの開発マシンが pen3 1GHzのノートだってのも理由だけど

43:デフォルトの名無しさん
07/05/19 10:08:05
2005はランタイムにDLLを使うのが初期設定になっただけで、
プロジェクトオプションをいじれば、
従来どおりラんタイム (CRT)を静的リンクしてEXE内に含めることも可能。

.NET 2003のデフォルトは静的リンクだが、
動的リンクした場合は、やはり2005同様ランタイムを別途入れないといけない。

6では静的リンクがデフォルトだったと思うが、
動的リンクしても、ランタイムのmsvcrt.dllが殆どのWindowsで初めから入っているため問題になりにくい。

いずれにしても、ランタイムのDLLをEXEと同梱して同じフォルダにおいても使える。
2005はマニフェスト書かないといけないから若干面倒だけど。

44:デフォルトの名無しさん
07/05/19 13:53:17
静的リンクで、サイズがあまり大きくならなければ
EXE内に含んでしまうのも手ですね…
VC6のときは、そういった問題が起こらないのもそういう理由だったのですね。

それにしても…全然VC6でも未だにいけるんですな。
何のために2005買ってきたんだろう…
2005だとこれがいい!とか、これがあるから2005にしとけ!
っていうのはあります?

45:デフォルトの名無しさん
07/05/19 14:10:32
すばらしいC++/CLIが使用できます!

46:デフォルトの名無しさん
07/05/19 15:57:41
テンプレートやそれを使うライブラリ(Boostなど)がまともに使えるようになる。
(たしか2002と2003の間に越えられない壁)
あとは最適化の能力も着実に上がっている。

47:デフォルトの名無しさん
07/05/19 17:45:35
古いMFCって色々バグなかったっけ

48:デフォルトの名無しさん
07/05/20 19:33:33
>>44
VS6の場合、WinXPから実装されたような新しいAPIはヘッダにない
有名だけど、VS6のSTLはバグあり


49:44
07/05/20 22:14:08
>>45-47
単語を元に色々見てみました。
バグや最適化のことも考えて2005のライブラリ同梱でいこうと思います。
せっかく買ったことですしね。

C++/CLIについては、今やってるものが終わったら
一旦勉強してみたいと思います。
どうも昔ながらのBASICやらCが染み付いてしまってるので
なじめるか心配ですが・・・・

ありがとうございました!

50:デフォルトの名無しさん
07/05/25 01:03:52
UTF-16LEでかかれたファイルを1行ずつ読み込んで処理したんです。
std::wstringをつかってどうにかできませんか

51:デフォルトの名無しさん
07/05/25 01:17:46
>>50
×処理したんです
○処理したいんです。
orz

52:デフォルトの名無しさん
07/05/25 18:26:16
>>50
お前の使うCPUがリトルエンディアンで、
お前の使う処理系でのwchar_tがUTF-16なら、
std::wifstreamでバイナリモードにすれば大抵上手くいくと思う。

53:デフォルトの名無しさん
07/05/25 18:54:20
こんにちは。
大量の浮動小数データをCSV形式でファイルに出力する必要があるのですが、
文字列の生成に時間がかかってしまい困っています。
出力する必要のある浮動小数データ数は5憶個くらいです。
sprintfとstrlenで時間がかかるのはわかるのですが、
何か良い方法はないものでしょうか?
---
char buf[4096];
DWORD temp;
for (int i = 0; i < 100; i ++) {
// 行番号の出力
sprintf(buf, "%.3f,", 値);
// 各列の値出力
for (int j = 0; j < 100; j ++) {
sprintf(buf+strlen(buf), ",%.14f", 値);
}
// 改行コード
strcat(buf, "\n");
// ファイル出力
WriteFile(m_hFile, (LPVOID)buf, strlen(buf), &temp, NULL);
}
---
#bufサイズの件については考えていません。


54:デフォルトの名無しさん
07/05/25 19:02:02
ループ中のstrlenを止めるだけで結構変わる悪寒

55:デフォルトの名無しさん
07/05/25 19:16:10
>>53
出力サイズ(=buf内の文字列長)を常に保持するようにすればstrlen()は全く要らなくなる。
#それでどれだけ速くなるかは知らんが。

寧ろ、もそっとこまめにWriteFile()した方が速くないかい?

56:55
07/05/25 19:16:51
あー、最後の一行無視しておいて。

57:デフォルトの名無しさん
07/05/25 19:33:20
>>53
strlenやめたコードで16MBくらいのデータを出力してみたが、
ぶっちゃけHDDの速度に依存してる感じだ。w
あんまりかわらんね。

58:デフォルトの名無しさん
07/05/25 19:44:13
>>53
散々言われているがファイルの書き込みを考えたほうがいい
メモリマップドIOにするなり別スレッドで書き込むようにするなり

59:53
07/05/28 12:02:35
皆様有難う御座います。

文字列の長さを変数に保持して、新たに追加された文字列分だけ
strlenするようにしても対して効果はありませんでした。
#皆さんの答えで一つわからなかったのですが、
#sprintfで何文字で出力されるかわからないので完全にstrlenを
#除去出来ないですよね?

プロファイルを取って調べた処、7割の時間をsprintfで
消費している事がわかりました。

数値を文字列に高速に変換する方法などあれば解決しそうですけど
なかなか考えつきませんね。。

60:デフォルトの名無しさん
07/05/28 12:17:03
>>59
少しは調べる努力もしよう。
-- from MSDN
>戻り値
>書き込まれた文字数を返します。
-- from www.linux.or.jp
>返り値
>成功時には、上記の関数は書き込まれた文字数を返す (文字列の最後を示すために使用する `\0' は数に含まれない)。

61:デフォルトの名無しさん
07/05/28 12:28:24
>>53
今ちょっと実測してみたんだけど、数値の範囲にも拠るけど
桁数が増えるとパフォーマンスにかなり影響する。
%.14fを例えば%.13fや或いは%.14gに変えられないの?

62:デフォルトの名無しさん
07/05/29 10:08:31
まあsprintfの戻り値使えばstrlenはいらないけど、たいした節約にはならんような。
自前でftoa()でも作ってしまうとか。
10^n掛けていって整数部分を取るような。

63:デフォルトの名無しさん
07/05/30 02:14:35
Cの場合は
void 関数名(void);
じゃないと警告出ますよね
C++の場合
void 関数名();
で、警告出ないんですけどvoidは入れた方が良いんですか?

64:デフォルトの名無しさん
07/05/30 02:20:12
>>63
C++の場合はvoidを書かなくても書いた場合と同じとなってますが、
Cとの互換性を考えるなら書いた方がいいかもしれません。

65:デフォルトの名無しさん
07/05/30 07:46:02
>>64
分かりました。ありがとうございます。

66:53
07/05/30 13:56:24
sprintfの戻り値が出力数とは目から鱗でした。

最終的にstrlenの除去と、出力を%.7fにする事で
文字変換のコストを10%程度削減出来ました。
ファイルへの出力も逐次出力するのをやめた所
全体で30%程度処理時間を短縮する事が出来ました。

皆さんありがとう御座いましたm(__)m


67:デフォルトの名無しさん
07/05/30 21:54:37
誰か教えてくれ。
次のようなコードをたまに見るんだけど、なんか意味はあるのだろうか。

for (int i = 0; i < 3; i++) {
 swtich (i) {
  case 0:
   printf("%d\n", 2);
   break;
  case 1:
   printf("%d\n", 3);
   break;
  case 2:
   printf("%d\n", 5);
   break;
 }
}

単純に逐次処理で
   printf("%d\n", 2);
   printf("%d\n", 3);
   printf("%d\n", 5);
としたほうが分かりやすいと思うんだけど。


68:デフォルトの名無しさん
07/05/30 23:11:35
書いた本人は、処理の数が膨大な数になり且つ、もしcase以降の処理の順番を入れ替える事態が発生した時の
保守のし易さにでも重点を置いたんだろう。
あんたの見たその時の状況を知らないからなんとも言えないが、もし枝分かれが指折り数えるくらいなら意味ないね。

69:デフォルトの名無しさん
07/05/31 03:48:55
上の質問と被ってしまうような気もするけど・・・気にしない。。

switch(CHECK)
   {
      case 1:
            break;
      case 2:
            break;
   }

これを

switch(CHECK)
   {
      case MENU:
            break;
      case END:
            break;
   }

こういう風にしたいのですけどCHECKの型を何にしたら良いのでしょうか

70:デフォルトの名無しさん
07/05/31 06:41:09
int

71:デフォルトの名無しさん
07/05/31 07:27:36
すごいくだらない質問なんですが、
CをどこまでやったらC++に移っても問題ないのでしょうか?
入門書を一通り終えたらC++に行っちゃって大丈夫なんですか?

72:デフォルトの名無しさん
07/05/31 07:40:47
>>66
ていうかさ、なんでstdioを使わないでAPIを直接使ってるの?

初心者にありがちな間違いだけど
「FILE*を使うと直呼び出しに比べてオーバーヘッドがある」という点より
「FILE*を使うと内部でバッファリングしてくれるので呼び出し回数が減り、結果的に速くなる」
というのが正しいから。

ファイルマッピング使っても、本質は同じ。
もちろん、ディスクアクセスがunmap時のみに出来る(量)なら充分だけど
そうでなければ、結果的にシステムコールを減らせるほうが速いから。
setvbufを使ってもいいし。

sprintfの戻り値の件もそうだけど、知らないで思い込む(=調べない)と損だよ。

73:デフォルトの名無しさん
07/05/31 09:48:11
>>69
enum の出番だ
まあ>>70の通りだ

74:デフォルトの名無しさん
07/05/31 10:49:13
ちょっと疑問なのですが、
char *str = "ABCDE";
のような宣言のとき、 "ABCDE"という文字列がstrに入った☆
なーんて説明されたんだが、既に納得がいかない。

・str自体は、先頭の'A'のポインタが入ってるはず。
・char型を5個連続で確保できる保障なんてあるのか?
・無かった場合、どっかのデータ壊すんじゃないのか?
・何か俺勘違いしてるのかな・・・?

教えてくださいエラい人・・・。

75:デフォルトの名無しさん
07/05/31 10:53:25
>>74
まず、リテラルの"ABCDE"を格納している領域があって、そのアドレスがstrに入るだけ。

char str[] = "ABCDE";だと6個の領域がローカルに確保されてリテラルの"ABCDE"から
内容がコピーされる。

76:デフォルトの名無しさん
07/05/31 15:36:13
ローカルのは処理系依存だな
単にcharの配列の初期化になるだけとか

77:デフォルトの名無しさん
07/05/31 17:15:53
>>76
>ローカルのは処理系依存だな
意味不明。

78:デフォルトの名無しさん
07/05/31 21:48:06
>>75 >>76
ありがとうございました。


79:デフォルトの名無しさん
07/05/31 23:19:56
質問です。
"<列番>,<行番>,<顧客名>" という形式で入力されるデータを
行列ソートされた状態で変数に格納しようとしています。

map型でキーを2つ使う事は出来るのでしょうか?
より簡潔に書ける方法があれば、そちらもご教授願いたいです。

80:デフォルトの名無しさん
07/06/01 00:42:12
処理系くらい書けや

URLリンク(www.tt.rim.or.jp)

81:デフォルトの名無しさん
07/06/01 00:54:29
>>79
うーむ、mapが一番楽ではないかな。

82:デフォルトの名無しさん
07/06/01 12:03:48
>>79
std::map<列, std::map<行, 顧客名> > ではあかんの?

83:sage
07/06/01 15:50:28
Windowsのサービスプログラムを作成しています。

Shell_NotifyIconでログインしたときにシステムトレイに
アイコンの表示とポップアップメニューでコントロール
できるようにしたいのですが、サービスではアイコンが
表示できないようでホトホト困っております。

そもそもサービスからシステムトレイへアイコンを表示する場合は
別のプロセスで行わなければならないものなのでしょうか?

ご存知の方、どうぞ教えていただけないでしょうか。

84:デフォルトの名無しさん
07/06/01 15:56:11
>>83
普通そういう構造にはしないけど、だからってできないことはないと思うが。
もしもログイン時に動かないんであれば、実行時にはまだシェルが起動してなくて
Shell_NotifyIcon自体が失敗してんじゃないの?

85:デフォルトの名無しさん
07/06/01 16:00:16
>>83
>>79
これってどーやったらみんなみたいに青くなるんですか??

86:デフォルトの名無しさん
07/06/01 16:05:42
>>85
sageはメール欄な

87:デフォルトの名無しさん
07/06/01 16:06:23
って入ってるじゃねーかw

88:83
07/06/01 16:25:42
>>84
ATLで雛形を作成していますので、
手動とサービス起動の両方で実行が可能になっています。
それで両方で試してみましたが、手動のほうは問題なく
アイコンが表示されましたが、サービスのほうはコンパネより手動で
サービスを起動してもアイコンは表示されませんでした。
そこで考えたのがサービス起動のときだけShell_NotifyIconが
失敗しているのではと思ってやってみたら、
サービスのときは「重複した I/O 処理を実行しています。」
というエラーになりました。
エラーの意味が何のことかよくわからないですが
やはり、サービスでアイコンを表示するのは無理だったみたいです。

89:デフォルトの名無しさん
07/06/01 16:34:50
>>88
へんだな。
当然、
デスクトップとの対話をサービスに許可
にはチェック入れてるんだよな?

90:83
07/06/01 16:59:40
>>89
対話を許可というものがあること自体解からなかったのですが。
チェックを入れたら表示されました。
ありがとうございました。

危うくプロセスを分けてCOMで状態を受け渡す行動に出るところでした。


91:デフォルトの名無しさん
07/06/01 17:50:58
私と同じことにつまずいた方に
サービス登録時にデフォルトでチェックを入れて
かつ自動起動にするやり方をあげておきます。

inline BOOL CServiceModule::Install()
{
  ・
  ・
  ・
  SC_HANDLE hService = ::CreateService(
    hSCM, m_szServiceName, m_szServiceName,
    SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
    SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
    szFilePath, NULL, NULL, _T("RPCSS\0"), NULL, NULL);
  ・
  ・
}

VSが作成したCreateServiceの引数を変更するだけですが・・・
よかったら参考にしてください。

92:771
07/06/02 18:30:00
CからC++に移行したと思っています。

CとC++の関数が載っているオススメの書籍を教えて下さい。

93:79
07/06/02 22:30:32
>>82
上手くいきました。
良い案をありがとうございます。

94:デフォルトの名無しさん
07/06/03 19:01:38
class A : private B {
// 省略
} ;

というのは、どういう場合に使うのでしょうか。

AのメンバからしかBはアクセスできないので、
class A {
private:
B b ;
} ;
としてしまったほうが、スッキリするような気がするのですが。

95:デフォルトの名無しさん
07/06/03 20:09:03
cin, cout は何の略ですか.

96:デフォルトの名無しさん
07/06/03 20:51:04
>>94
A has BかA is Bかの違いでしょ。

97:デフォルトの名無しさん
07/06/03 20:54:12
>>94
とりあえず実際的な理由としては
virtual関数をオーバーライドしたいときとか。


98:デフォルトの名無しさん
07/06/03 21:34:02
>>95
cはconsoleの略
inとoutはそのまま

99:94
07/06/03 22:53:19
>>96
privateで継承した場合は、
A a ;
B& b=a ;
ということができないので、
A is B ではなく、A has B になると思うのですが・・・。
Aを外側から見るのではなく、Aの中からAの中を見れば、A is B なのかもしれないけど・・・。

>>97
なるほど、
Aが、Bからのコールバックを受け取りたい場合、
privateで継承してしまえば、
Bにコールバック先のポインタを教えてあげる手間が省けますね。

100:デフォルトの名無しさん
07/06/03 23:06:03
Bが純粋仮想関数を持っていれば、継承せざるを得ないわけで。
で、AがBの実装を云々したくなければprivate継承で充分だと。

101:デフォルトの名無しさん
07/06/03 23:12:51
でも実際問題private/protected継承なんて使っているところを見たことがない
そういうこともできるんだと頭の片隅に留めておけば十分だと思う

102:デフォルトの名無しさん
07/06/03 23:52:32
おまえらEffectiveC++くらい読めよ。

103:デフォルトの名無しさん
07/06/04 00:12:38
ググっても質問しか出てこなく、解答が見つからなかったのでここで質問させてもらいます。


1 名前: 名無し 投稿日: 2001/04/15(日) 21:22
下のプログラムは複素数演算のcomplex.hを使用しています。
コンパイルすると、『特化パラメータを指定しないと
テンプレート 'complex<T>' を使えない』エラーになります。

特化パラメータって何でしょうか?どうしたらコンパイル通る
ようになるのでしょうか。ソースはインタフェース(2001.5)誌の
ソースをBCC5.5でコンパイル使用よしたものです。

bcc32 sample.cpp

** sample.cpp **
#include <stdio.h>
#include <complex.h>

extern int Dka( double *c, complex *result, int n, double eps);

main()
{
}

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
3aa.cpp:
エラー E2102 3aa.cpp 5: 特化パラメータを指定しないとテンプレート 'complex<T>' を使えない
エラー E2293 3aa.cpp 5: ) が必要
*** 2 errors in Compile ***


104:デフォルトの名無しさん
07/06/04 00:15:17
>>103
当たり前だろデフォルトパラメータがないんだから。

complex<double>とか特化しろって事だよ。

105:デフォルトの名無しさん
07/06/04 00:34:12
>>104
#define Complex complex<double>

と書いてみたのですが、同じようなエラーが出ました。
”特化する”ということがよく分からないのですが、
もうすこし詳しく教えていただけないでしょうか……

106:デフォルトの名無しさん
07/06/04 00:41:42
それよりはtypedef Complex complex<double>;のほうがいい。
それはともかく、こうしてComplexを用意したものの、
Dkaの宣言がcomplexのままになっているのでは?

107:103
07/06/04 00:44:03
>Dkaの宣言がcomplexのままになっているのでは?
自分のソースを見たらその通りでした……。
まさか大文字小文字を間違える単純なミスだったなんてorz

何とか解決しました。ありがとうございました。

108:デフォルトの名無しさん
07/06/04 01:02:16
テンプレートの特化の意味がわからないなら、テンプレートの勉強を
すべきだと思う。特にSTLが出すエラーメッセージは常人では解読する
事が不可能な内容である事が多いため、ソースからコンパイルエラーの
原因を追わなければならない。

109:103
07/06/04 01:22:28
>>108
そうですね。今までもエラーメッセージを解読できなかったことが多かったので、
これを機にテンプレートの勉強をしてみようと思います。

110:デフォルトの名無しさん
07/06/04 10:03:37
>>100
Aが継承せざるを得ないわけではない。
選択肢は1つではない。
Bを継承したCをメンバに持っても構わない。

>>101
多重継承がgdgdしてくると、privateで継承する必要が出てくる。
そうなった場合、そもそものクラス設計が妥当なのか、
小一時間考えたほうがいいことは言うまでもないが。

111:デフォルトの名無しさん
07/06/04 10:07:18
>>107
人間はミスをする生き物なので、
1文字違いの識別子を使うのは、
やめたほうがいい。

文字数が多くなっても、
complex_double
などのようにしたほうが。

112:デフォルトの名無しさん
07/06/04 18:34:15
だったらcomplex<double>でいいよという結論

113:デフォルトの名無しさん
07/06/05 01:59:35
C言語でswitch文使うときに、
case ~~の~~の部分を範囲指定(例えば0 < a && a < 9みたいな)する方法ってありますか?
初めて1ヶ月も経ってなくてスキルはカスですがやらしく教えてください

114:デフォルトの名無しさん
07/06/05 02:13:39
ありません。

115:デフォルトの名無しさん
07/06/05 02:37:25
ありがとうございます。
なんか学校の課題でそういうのやったらポイント高いぜーとか教授が言い出してたんです。
ifとelse if使った関数勝手に作って強引に処理して解決?しました
それならswitch使う意味がどこにあるんだって話になるんでしょうけれど・・・

116:デフォルトの名無しさん
07/06/05 03:41:42
>>113
switch (a) {
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
処理;
break;
}
または、
switch (0 < a && a < 9) {
case 0:
範囲外の処理;
break;
default:
範囲内の処理;
break;
}

117:デフォルトの名無しさん
07/06/05 11:34:35
>>73
できました!ありがとうございます

118:デフォルトの名無しさん
07/06/05 15:47:31
>>112
typedefしたほうがいいと思うけどなぁ。

>>116
後者だったら、if文を使ったほうがいいと思うなぁ。


119:デフォルトの名無しさん
07/06/05 15:51:24
>>118
確かに。

>typedefしたほうがいいと思うけどなぁ。
complex<float>してもエラーメッセージが判りにくいからね。
それが嫌ならtypedefした方がいい。

>後者だったら、if文を使ったほうがいいと思うなぁ。
敢えてswitchを使う理由がなければそう思うよ。

120:デフォルトの名無しさん
07/06/05 17:23:07
switch文を使うとしたら、
何らかの分類関数を呼ぶことになるかと。

switch(_mbsbtype(pointerToSomeString, idx)) {
case _MBC_SINGLE :
// 何か
break ;
case _MBC_LEAD :
// 何か
break ;
case _MBC_TRAIL :
// 何か
break ;
case _MBC_ILLEGAL :
default :
// ひでぶ
break ;
}

if~else ifを直に書いてしまうのと、
分類関数を作って一段噛ませるのがいいのかは、
どうなんだろう。


そもそも、教授の発言の背景は何だろう。
switchのcaseに定数しか書けないのは不便だなぁ、条件文が書ける言語もあるのに
という愚痴で、何かいい解決法を見つけ出す人がいないかな? と儚い期待をしたのか、
>>116の前者が可能なことに気がつく人はいるかな? ニヤニヤ
ということだったのか。


121:デフォルトの名無しさん
07/06/05 17:55:58
VC++6でATLのスケルトンを作ってNTサービスアプリを開発しています。

とりあえず雛形に手を加えずビルドしただけのもので勉強している
段階なのですが、サービス停止時の動作で
コンパネのサービスから停止させた場合は
CServiceModule::Handler(DWORD dwOpcode)に
SERVICE_CONTROL_STOPイベントが発生するのですが
期待したOSシャットダウン時に発生しないのです。

さらに
m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN
としてみてもSERVICE_CONTROL_SHUTDOWNも発生しません。

イベントの発生の有無はCServiceModule::LogEvent()で吐き出した
イベントログで確認しています。

シャットダウン時にSERVICE_ACCEPT_STOPイベントが発生しない原因
について推測でもいいのでご存知ないでしょうか?


122:デフォルトの名無しさん
07/06/05 19:15:39
>>121
ATLもMFCも知らないので、適当ぶっこきます。

可能性1
イベントログのサービスが先に終了していて、イベントログに記録されていないだけで、
ちゃんとSERVICE_CONTROL_SHUTDOWNが送られてきている

可能性2
SERVICE_ACCEPT_SHUTDOWNをセットしたつもりが、
ラッパークラスのメンバ変数を書き換えただけで、
OSに対してWin32APIのSetServiceStatusを呼んでいない。

可能性3
シャットダウン時に他のプロセスやサービスが重くて、
サービスのプロセスにSERVICE_CONTROL_SHUTDOWNを送る
時間的な余裕がなく、問答無用で強制終了させられている

可能性4
何らかの原因でサービスのメッセージポンプが止まっていて、
送られてきたメッセージがキューに溜まったまま、消化されてない。

123:デフォルトの名無しさん
07/06/05 19:57:31
いくつか質問です

#include<stdio.h>
#include<float.h>

int main()

{
double what;
what=3.14159265358979;

printf("もう少し詳しい値は%20.18fです\n",what);

return 0;
}

/*結果は3.141592653589790007になるんだけど、最後の「7」は何か教えて下さい*/

後はborland社のコンパイラを使っているのですが、閉じるのが早くてエラーの文など読めません。
どうしたらよいのでしょうか?
後、初心者なのでDos形式でがんばってるのですが、これまた閉じるのが早くて自分で打った文字列などが読めません。
exeにしても一瞬で閉じてしまいます。制御するコード(HSPだとstop)みたいなのはないのでしょうか?
回答できる方よろしくお願いします。

124:デフォルトの名無しさん
07/06/05 20:06:13
"丸め誤差"でググれ

125:デフォルトの名無しさん
07/06/05 20:08:28
switch構文じゃなくて
strategyパターンを使った方が良い場合ってどういうときがありますか?

126:デフォルトの名無しさん
07/06/05 20:10:19
>>123
> borland社のコンパイラを使っているのですが、閉じるのが早くてエラーの文など読めません。

原因も対処方法も見当がついているけど、
自己解決するスキルを身につけて欲しいので、
あえて、詳しい話を聞かせてね。

「何が」閉じるのが早いの?
どうやって実行しているの?


127:デフォルトの名無しさん
07/06/05 20:10:41
丼じゃなくて、
酢飯を使った方が良い場合ってどういうときがありますか?

128:デフォルトの名無しさん
07/06/05 20:11:17
携帯ですみません
ifの条件文の中に&&や||は使えますか?
学校じゃないから確かめられない

129:デフォルトの名無しさん
07/06/05 20:18:22
家にPCはないのか?

130:デフォルトの名無しさん
07/06/05 20:22:12
ないです

131:デフォルトの名無しさん
07/06/05 20:24:29
だったらノートPCでもなんでもいいから買えよ
それともかく使えないようにする理由がないから使える

132:122
07/06/05 20:36:52
>>121
ちょっと試してみた。

CServiceModule::Init()で、
m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
に書き換えただけで、
CServiceModule::Handler()の、
case SERVICE_CONTROL_SHUTDOWN:
に来たよ。

ただ、イベントログに書き込むのは、最初から試さずに、
CloseHandle(CreateFile("適当なパス\\ServiceControlShutdownに到達したよ.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) ;
とやって、ファイルが作られたかどうかチェックした。

だから、可能性1っぽいよ。


可能性2については、ゴメン。
VC6が生成したコードが、SetServiceStatusを呼んでた。

今回の件には影響ないと思うけど、Handlerが呼ばれた場合には、
ステータスが変化しなくても、必ずSetServiceStatusを呼ぶことになってる。
ところが、VC6が生成したコードは、
case SERVICE_CONTROL_STOP:
でしか呼んでいない。

ついでに、もう一つ。CServiceModule::ServiceMain()の
SetServiceStatus(SERVICE_STOPPED);
LogEvent(_T("Service stopped"));
これは、逆の順序のほうがいいと思う。
というのも、SERVICE_STOPPEDにセットした時点でスレッドが終了して、次の行が実行されないことがあるから。

133:122
07/06/05 20:41:24
ちなみに・・・

Win32サービスの作り方を勉強するなら、
そのままの状態で適切に動作するか怪しいVC6のウィザードが生成した雛形よりも、
PlatformSDKとかのサンプルを見たほうが、いいと思う。

さらに、ちなみに・・・
自分も長々と書き込んでおいて言うのもなんだけど、
Win32APIの話は、C/C++の言語自体の話とは違うから、スレ違いだと思う。

134:デフォルトの名無しさん
07/06/05 20:47:20
>>128
> 学校じゃないから確かめられない

学校に通っていて、
いまは学校以外の場所にいるので確かめることができない
ということだと解釈する。

解決案1
次に学校に行ったときに確かめる

解決案2
学校の友人に電話して聞く

解決案3
自宅でも確かめられるようにする



だいたいさぁ、
> 学校じゃないから確かめられない
こんな下らない理由で、見ず知らずの他人を頼るなよ。

何が
> 携帯ですみません
だよ。

んな余計な文を打ち込む暇があったら、携帯で調べろよ。

135:デフォルトの名無しさん
07/06/05 20:50:22
スレを立てるまでもないレベルの低い質問のスレではあるが、

ちょっと書いてコンパイルしてみるだけで、
自分でわかるようなことは

レベルが低い質問ですらないから。


ネットの第三者の善意に頼って質問していいのは、
できるだけ努力はしたけど自分にはサッパリわからない
というような場合だ。


136:デフォルトの名無しさん
07/06/05 21:23:32
あんまり萎縮するようなことを書くのは、どうかと。

もっと気軽に行こうよ。
小言を言って雰囲気を悪くしたりせず、
だまってスルーすればいいんだよ。

137:デフォルトの名無しさん
07/06/05 22:13:42
ある数の逆数を求めるプログラムで循環小数部を除いて表示させたいのですが
どのような方法があるでしょうか?

138:デフォルトの名無しさん
07/06/05 22:39:47
C/C++言語の質問ではないような。

Cには分数を扱う組込み型がないので、
ちまちまと筆算をシミュレートするとして、
割り算の余りに既出のものが出たら、
その既出のものが最初に出たところが、
循環部のはじまり。

ということでどう?

139:デフォルトの名無しさん
07/06/05 22:49:01
配列などは使わないでできますか?

140:デフォルトの名無しさん
07/06/05 23:06:30
ランダムアクセスする必要ないから、リストでできるよ。
配列のほうが簡単だと思うけどなぁ。

141:デフォルトの名無しさん
07/06/05 23:13:53
わかりました
ありがとうございました

142:デフォルトの名無しさん
07/06/05 23:17:05
何桁で循環するかは計算で出せるはずだが。

143:デフォルトの名無しさん
07/06/05 23:47:49
10のN乗を分母で割った余りが1になる場合のNの最小値だったかな。

ちょっとググれば答えが見つかりそうじゃないか?

144:デフォルトの名無しさん
07/06/05 23:55:28
10のn乗とかオーバーフローが怖いな
MPFRとか使えってか

145:デフォルトの名無しさん
07/06/06 00:05:27
数学屋さんは、
1÷3×3が1になる
という前提で話をするからねぇ。

logとか使われちゃうと、
お手軽なdouble型では、
丸め誤差がアレだし。

だからさ、
ちまちまと筆算をシミュレート
したほうが手っ取り早いと。

146:デフォルトの名無しさん
07/06/06 00:38:39
>>142
どんな計算法ですか?

147:デフォルトの名無しさん
07/06/06 03:10:04
VC++ 2005 Expressを使っているのですが、

#include <stdio.h>

int main(void)
{
char input;

do
{
printf( "input A\n" );
scanf( "%c", &input );
}while( input != 'A' );

return 0;
}

をビルドして実行すると、出力が

Aを入力して下さい
(A以外を入力)
Aを入力して下さい
Aを入力して下さい



と以下のループで”Aを入力して下さい”が二回表示されるのですが、
色々試してみても何故なのか良く解りません。
どうかご教授賜りたく…。

148:デフォルトの名無しさん
07/06/06 03:47:37
例えばaを入力してエンターを押すと
バッファに’a'と改行コードが入力される
でscanfはinputに'a'を入力する、このときまだ標準入力バッファに改行コードは残っている
そして次のループではscanfはこのLFを拾ってinputに代入してしまうわけ

解決策としてはscanfの前でflush(stdin);でも使ってバッファをクリアするのが手っ取り早い

149:デフォルトの名無しさん
07/06/06 03:50:11
誤:flush
正:fflush

150:デフォルトの名無しさん
07/06/06 05:04:57
だから標準入力はフラッシュしちゃダメだってば。

151:デフォルトの名無しさん
07/06/06 05:20:19
>>148
なるほど!良く解ってスッキリしました。
ありがとうございます。


152:デフォルトの名無しさん
07/06/06 06:10:46
>>150
そうか、じゃあこういうの用意して
void flush(FILE* in) {
if (in->_cnt == 0)
return;
in->_ptr = in->_base;
*(in->_base) = '\0';
in->_cnt = 0;
}
入力ストリームを使う関数の前でflush(stdin);ってのはどう?
これでも環境依存でやばいかな?

153:デフォルトの名無しさん
07/06/06 06:54:35
>>147
思い通りの動きにならない場合は、
デバッガ上でステップ実行して、
何が起きているのか確認するのがいい。

VCのIDEに統合されたデバッガなら、
inputの中身を確認するのも簡単だしさ。


ただし、覚えておいてほしいことがある。
問題の原因を理解せずに、思い通りの動きになるまで、コードを弄り倒す
というのは、やってはいけない。
コード的には間違っているのに、偶然で思い通りの動きになってしまっている
というので良しとしてはいけないから。

たとえば、今回の場合、
あえて酷い例を挙げると、
do
{
char dummy ;
printf( "input A\n" );
scanf( "%c", &input );
scanf( "%c", &dummy );
}while( input != 'A' );
としても、一見、思い通りに動いているように見える。
でも、これは間違っている。

154:デフォルトの名無しさん
07/06/06 08:06:54
>>148
> 解決策としてはscanfの前でflush(stdin);でも使ってバッファをクリアするのが手っ取り早い

かならずユーザの入力があるまでブロックしたいのなら、それもいいかもしれないが、
先行入力を許したい場合や、ファイルからのリダイレクトを許したい場合に困るよ。

人間がAを押下した後にエンターを押させる
というのが意図した仕様であれば、
人間の入力の単位は1文字ではなく行である
ということなわけだよね。
ということは、それを受け取るプログラム側でも、
1文字ずつ読み取るのではなく、1行ずつ読み取る
ようにするのが自然だと思う。

自分なら、
char input_buf[10] ; /* この長さが適切なのか・・・ */
do {
printf( "input A\n" );
} while((fgets(input_buf, sizeof(input_buf), stdin) != NULL)&&(input_buf[0] != 'A')) ;
という感じにする。

エラーの場合も直進するのが、ちょっとアレだが。

155:デフォルトの名無しさん
07/06/06 08:40:15
>>143
たとえば142で割ったとして、各桁の余りは0~141だろ?(24か2.4か0.00024かの違いはあるが。)
ということは最長でも141桁目にはループが現れているはずだ。
よくわからなかったら筆算してみることをお勧めする。

156:デフォルトの名無しさん
07/06/06 09:07:49
>>154
ちゅーことは、結局こういう面倒くさい事しないと駄目なのかYp
char* buf = (char*)malloc(sizeof(char) * stdin->_bufsiz);
if (buf == NULL) {
fputs("メモリが確保できなかった", stderr);
exit(1);
}
do {
printf("'A'を入力 : ");
if (fgets(buf, stdin->_bufsiz, stdin) == NULL) {
fputs("終端か、エラー", stderr);
exit(1);
}
} while (buf[0] != 'A');
free(buf);

たかが文字を1文字読むだけなのに…

157:デフォルトの名無しさん
07/06/06 09:26:37
関数にしとけばおk

158:121
07/06/06 09:29:24
>>122

>>132の方法でSERVICE_CONTROL_SHUTDOWNイベント確認できました。
それとSTOPイベントはシャットダウン時には発生しないのですね。

HandlerでのSetServiceStatusの件は勉強になりました。

このスレを見渡したところ今回の件は確かにスレ違いでした。
NTサービススレで探して無かったのでNTサービススレを立てようかと
思ったのですが、スレ立てるまでもないかと思いここに来ました。
ご容赦してください。

ありがとうございました。


159:122
07/06/06 09:46:57
>>158
たぶんWin32APIスレあたりが、良かったと思う。


160:デフォルトの名無しさん
07/06/06 09:53:24
>>156
本来やりたい処理だけを書いているうちは明瞭でも、
エラー処理を入れると、途端に、ぐちゃぐちゃになるのは、
しかたないよ。


161:デフォルトの名無しさん
07/06/06 21:23:09
FILE *fpとfpb = NULL;
chars,[256]とn[26]
int aとbとc
for(a=0;a<26;a++);{
n[a] = 0 ;
}
if( (fp = fopen("CRed.txt","r")) == NULL );{
exit;}
fp = fopen("Count.txt","w");
while(fgets(s, 256, fp) != NULL);{
fgets(s,256,fp);
for( a=0 ; a<256 ; a++ ){
while( s[a] != '\0' ) {
for(b=0;b<26;b++) {
if( s[a] == b+65 )
{
n[b]++;
break;
}
}
}
}
}
fclose(fp);
fprintf(fpb,"+---+------+");
for(c=0;c<26;c++);
{
fprintf(fpb,"| %c | %4d |","c+65","n[c]");
fprintf(fpb,"+---+------+");
}
テキストの中の文字をカウントするものを組もうと思ったのですがうまくいきません。
素人のソースなのですが、どうかどこが悪いのかお教えください。

162:デフォルトの名無しさん
07/06/06 21:26:50
下から三行目の
fprintf(fpb,"| %c | %4d |","c+65","n[c]");

fprintf(fpb,"| %c | %4d |",c+65,n[c]);
でした。

Count内部では、for構文をつかっているのに枠が一つ分しかでなかったし、
しかも、n[c]内部の値が明らかに用意しておいたテキストの中身から考えておかしい数になっていました。
どうやら、表示させるほうもカウントさせるほうも問題があるように考えられますが、
for構文なんかの使い方に問題があるような気もしますが原因がはっきりとはわかりません・・・


163:デフォルトの名無しさん
07/06/06 22:04:33
>>161
まず、本物のソースコードを、そのままコピペすべし。

次に、デバッガでステップ実行すべし。

164:デフォルトの名無しさん
07/06/06 22:08:43
おい、>>123はどうした。

>>126で理解できたか?
返答くらいしる!

165:デフォルトの名無しさん
07/06/06 22:34:14
>>147です。
ポインタの受け渡し等実はまだ良く理解していないのですが、
入力やデバッガやエラー処理の事等色々と勉強になりました。
ありがとうございます。

166:デフォルトの名無しさん
07/06/06 22:46:33
>>163
forまでは変数の宣言なんで、本物ですけど・・・
もしかして、変なこといってますか?

167:デフォルトの名無しさん
07/06/06 22:47:35
>>166
for以降はです。

168:デフォルトの名無しさん
07/06/06 22:53:37
現在、我流でC言語の勉強してます
教材は 「プログラミング言語C 第二版 ANSI規格 B.W.カーハンニ D.M.リッチー著」 なんですが
なんだか難しくて理解するのに大変です
初心者にお勧めの教材の本ってありませんでしょうか?



169:デフォルトの名無しさん
07/06/06 22:57:36
>>166
もう一度確認。
ソースファイルからコピペしたのか?

もし手作業で書き写したのであれば、>>161を読む意味がないんだよ。
なぜかというと・・・それは後で説明してあげるから。

170:デフォルトの名無しさん
07/06/06 23:00:43
>>168
VC++ Express Editionとかあるんだから、
マイクロソフトプレスで、とっつき易そうなの探してみたら?

171:デフォルトの名無しさん
07/06/06 23:15:51
>>168
その本は俗に"K&R"と呼ばれる尊敬すべき歴史的な本で、今となっては古典です。

C++へのステップとしてCを勉強しようというのであれば、それは無駄が多いです。
Cを習得していない人向けのC++入門書を選ぶことをオススメします。
そういう本を見かけた覚えがあります。

言語の文法を理解しただけでは、プログラムはうまく書けないです。
いちばん実戦的な教材は、上手な人が書いたプログラムです。
プログラムを読んで、何をやっているのか把握したり、
デバッガ上で実際に動かして、ステップ実行で動きを追ったりすると、いいです。
1人のものだけでは駄目で、多くの人のプログラムを読むのが肝心です。

172:デフォルトの名無しさん
07/06/06 23:34:00
もう寝るから、>>161がコピペしたものだとして、間違いを指摘するぞ。

■間違い1  余計なところにセミコロンがある。(2箇所)
{ } は、複数の文をひとまとめにするものであって、
if文、for文、while文の構文の一部ではない。

たとえば、
for(a=0;a<26;a++);{
n[a] = 0 ;
}
というのは、
for(a=0; a<26; a++) {
/* 何もしない */
}
{
n[a] = 0 ;
}
という意味になる。

■間違い2  変数名が間違っている。
fp = fopen("Count.txt","w");
↑これはfpではなくfpbだろう。

■間違い3  whileの条件は実際に実行される
while(fgets(s, 256, fp) != NULL);{
fgets(s,256,fp);

条件文のfgetsはループの先頭で実行されるので、
このように書くと、fgetsを2回呼ぶことになってしまう。


173:デフォルトの名無しさん
07/06/06 23:42:16
■ループではないのにwhile文を使うな(if文を使うべき場所でwhile文を使うな)
while( s[a] != '\0' ) {
このwhileは無限ループするぞ。

■マジックナンバーを使うな

■ファイルに出力する文字列は改行を入れたほうがいいんじゃない?





それから、
学校の宿題なら、宿題スレに行ったほうがいいと思うぞっと。

174:デフォルトの名無しさん
07/06/06 23:48:12
忘れてた。

ソースファイルからコピペしろ! と言ったのは、
タイプミスが、プログラムが思い通りに動かない原因になりうるから。
1文字違うだけで、プログラムは違う内容になってしまうから。
タイプミスには重々気をつけて、よく見直すこと。


プログラムの実行結果が、
意図したものにならなかった場合は、
プログラムが思い通りに動いてない。

そういう場合は、まず、
デバッガでステップ実行して、
自分が思っていた通りに動いているのか、確認すること。

かなりの問題点は、デバッガでステップ実行することで、発見できる。

175:デフォルトの名無しさん
07/06/07 01:21:19
catch(...)しているのに例外をcatchできないんですが、
原因は何が考えられるのでしょうか?
スタック破壊でcatchできなくなることあったりするのでしょうか?



176:デフォルトの名無しさん
07/06/07 01:34:32
コンパイラおよびコンパイル時のオプション指定にもよる。

177:デフォルトの名無しさん
07/06/07 02:29:05
案外、try{}の外で例外が発生していたりして。

再現性があり、デバッガ上で再現できて、
デバッガに、
例外が発生したらcatchされていても構わずブレークする
という機能があれば、それで例外の発生箇所をチェックしてみたらどうでしょう。

案外、別のスレッドだったりして。

178:デフォルトの名無しさん
07/06/07 10:56:54
C、及びC++の拡張子はそれぞれ何が標準ですか?
cだとcでc++だとcppでよいのでしょうか?
cxxとかもたまに見かけるのですが。
あとhppってどのようなときに使うのでしょうか?

179:デフォルトの名無しさん
07/06/07 13:51:59
>>178
> cだとcでc++だとcppでよいのでしょうか?

ok。

> あとhppってどのようなときに使うのでしょうか?

C++でしか使えないことを暗に示すとか、
.cに対する.cppと対称のほうがカッコイイとか。


180:デフォルトの名無しさん
07/06/07 14:36:36
ifの中にifは使えますか?

181:デフォルトの名無しさん
07/06/07 14:42:13
>>180
{ } の中には使えますが
( ) の中には使えません。

182:デフォルトの名無しさん
07/06/07 17:42:52
とある理由でオンライン対戦カードゲーム(オリジナル)を作る事に決めました。
それで質問なんですが、C++はホスト型の対戦ゲームを作るのには使えるのでしょうか?
ホストの人ににもう一人がIP接続してプレイする感じです。
対応していなければいけねい様なので・・・。

183:デフォルトの名無しさん
07/06/07 17:43:52
そういう質問をする時点で前途多難だな・・・
まあキミが希望することは可能

184:デフォルトの名無しさん
07/06/07 18:52:00
.NET remotingのTCPChannel使ってTCP接続でできる
ホスト側にスレッドを持たせてここの接続をそいつらで管理するようにすれば
マルチプレイも可能

185:デフォルトの名無しさん
07/06/07 20:30:48
>>182
#include <stdio.h>

int main(void)
{
printf("%c %c %c %c %c %c\n",110,117,114,117,112,111);
return 0;
}


186:デフォルトの名無しさん
07/06/07 20:52:12
>>185
unsigned long m = 0x00afdeb6 ;
puts(&m) ;


187:デフォルトの名無しさん
07/06/07 22:35:08
>>172-174
遅くなりましたが、ありがとうございます。
小生まだ大学生でも高専生でもありませんので宿題ではないのですが、個人的な趣味にしようとおもってCを勉強しています。
大学に行けば勉強できるのですけど、早くなれて自分で簡単なゲームぐらいは作れるようにしたいので簡単なプログラムでも書いてコーディングの練習をしてみようかなと思ってやってます。
一応、フローチャートは書いておいたのですが、どうもコーディングの技術がないようで未だにポインタとか変数の型とかifやforの()内の構文なんかがまだ理解できてないみたいです。

これからも精進していきますが、また質問などするばあいもあるとおもいますのでその時はよろしくおねがいします。


188:デフォルトの名無しさん
07/06/07 22:40:06
>>187で書いておいていきなりなのですが、さきほどマジックナンバーの意味がわからずwikiで調べてみましたがよく意味がわかりませんでした。
マジックナンバーとは、私の書いたコードでいえば26や255にあたるものと考えてもいいのでしょうか?

また、その場合マジックナンバーを使わないとはどういうことでしょうか?
たとえば、26に初期化した整数型の変数をとってそれを利用しろということでしょうか?

189:デフォルトの名無しさん
07/06/07 23:06:08
>>188
一番悪い例は、65だな。

190:デフォルトの名無しさん
07/06/07 23:09:19
当方vistaユーザーなのですが、
C言語を使ったプログラムのコンパイルができず困っております。
.c→.obj→.exe という手順なのはわかるのですが・・・。コンパイルをするためのソフトウェアがあるようですが・・・
なくてもできる という書き込みも目にしました。
フリーソフトをDLして挑戦してみたもののどこかでミスが発生し失敗してしまいます。

大変無知な質問で申し訳ないのですが、どなたかご教授いただけないでしょうか。

191:デフォルトの名無しさん
07/06/07 23:14:16
そのフリーソフトは何?

> なくてもできる
それはエスパー解釈すると.cファイルを書くためのエディタなどのことだと思われる
コンパイルするソフトウェア(コンパイラ)は必須
使わないとすれば、それは人間が頭でそれに相当する作業を行うとき

どこかってどこ?なんかメッセージとか表示されないの?

192:デフォルトの名無しさん
07/06/07 23:23:46
>>190
よく分らないがCPadでも使っとけ、10分ではじめるBCCを読めば初心者でも
何とかなると思う。
URLリンク(hp.vector.co.jp)
Borland C++Compiler 5.5.1をダウンロードする場所が変わったから注意
URLリンク(www.codegear.com)

193:デフォルトの名無しさん
07/06/07 23:51:09
>>188
マジックナンバーってのはコード中に直接数字を書くことだね。
マクロや const int を使って文字にした方がいい。
値の意味がわかるようにするのと数字の値は変えたくなることが
多いのでいっぺんに変えられるようにってことで。

194:190
07/06/08 00:01:38
みなさんレス感謝。

>>192
インストールも異常なく終わりました。
有難うございます。

195:デフォルトの名無しさん
07/06/08 00:20:53
現在VC6.0でsubst相当のことをやろうとしているのですがDefineDosDeviceを
使えばできそうだというとこまではわかったのですがドライブの解除時に
そのドライブを使用していたら(エクスプローラで開いている等)
エラーメッセージを出すということをしたいのですが
探し方が悪いのかよい方法が見つかりません。

申し訳ありませんがどなたか教えていただけないでしょうか?お願いします。

196:デフォルトの名無しさん
07/06/08 00:51:51
大域変数の配列A[k]の2次元版
例えばA[i,j] = 2 みたいに値を入れていく表みたいなものってCではどう書けばいいのですか?

197:デフォルトの名無しさん
07/06/08 00:59:23
A[i][j] = 2;

198:デフォルトの名無しさん
07/06/08 01:28:42
>>197
ありがとうございます!

199:デフォルトの名無しさん
07/06/08 07:40:15
>>187
> 小生まだ大学生でも高専生でもありませんので宿題ではないのですが、個人的な趣味にしようとおもってCを勉強しています。

ごめんな。学校の宿題をネットで片付けようとする輩が多いもんで、つい。

> 大学に行けば勉強できるのですけど

進学先は慎重に選ぼう。
2chのプログラマ板の悲惨な住人達のようにならないように。

プログラムも書く○○の専門の職業
というのはいいけれども、
プログラムを書くのが専門の職業
というのは、地獄です。

> どうもコーディングの技術がないようで未だにポインタとか変数の型とかifやforの()内の構文なんかがまだ理解できてないみたいです。

たとえば英語の勉強では、
文法を理解しさえすればネイティブの人達のような文章が書けるというわけではなくて、
文法を学びつつ、例文をたくさん読んで、使い方を覚えるよね。

プログラム言語も同じで、他人の書いたプログラムを読んで、使い方を覚えたほうがいいです。
今なら、オープンソースのソフトがネットでたくさん公開されているので、それらを見るのがいいです。


200:デフォルトの名無しさん
07/06/08 08:01:35
>>188
マジックナンバーを使わないというのは、

たとえば、
for(a=0; a<26; a++) {
ならば、
for(a=0; a< ('Z'-'A'+1); a++) {
と書いたほうがいい。

AからZまでの文字数は変ることはないので、
for(a=0; a<26; a++) { /* AからZまでは26文字*/
これでも十分だけどね。

意味としては AからZまで(Zを含む)走査するということなので、
for(a='A'-'A' ; a<='Z'-'A'; a++) {
と書いたほうが、意味がわかりやすいけど、ごちゃごちゃしてしまうね。

このプログラムの場合、26ならば簡単に見当がついて誤解もないだろうれど、
65は、すぐにはわからない。
if( s[a] == b+65 )
は、
if( s[a] == b+'A' )
と書いたほうがいい。

数字を直に書くと、他の人にわからないだけではなく、
時間がたつと、書いた本人でさえもわからなくなってしまうから。

(続く)

201:200
07/06/08 08:18:24
(続き)
配列の大きさは、後から変更することもあるため、直接数字を使うのは避ける。
というのも、複数箇所を漏れ無く変更するのは面倒だしミスしやすい。

たとえば、
#define TEXT_IN_BUFFER 256
としておき、
char s[TEXT_IN_BUFFER] ;
fgets(s,TEXT_IN_BUFFER,fp);
for( a=0 ; a<TEXT_IN_BUFFER ; a++ ){
のようにする・・・というのは昔から本に書かれているけれども、
最近のCコンパイラならば、もっと良い方法がある。

配列宣言にはスコープがあるけれども、
マクロにはスコープがないので、
const int TEXT_IN_BUFFER 256 ;
char s[TEXT_IN_BUFFER] ;
のようにする。

しかしそれではやはり煩雑だし、
TEXT_IN_BUFFERとsが生き別れになる事故もあるので、
#define SIZE_OF_ARRAY(x) (sizeof(x)/sizeof(x[0]))
としておき、
const int TEXT_IN_BUFFER 256 ;
char s[TEXT_IN_BUFFER] ;
fgets(s,SIZE_OF_ARRAY(s),fp);
for( a=0 ; a<SIZE_OF_ARRAY(s) ; a++ ){
のようにする。

この場合は、TEXT_IN_BUFFERを、ローカルスコープにするのであれば、
char s[256] ;
と直に書いても、悪くない。

202:デフォルトの名無しさん
07/06/08 08:20:03
>>195
それは、
C言語限定の話ではなく、
また、
Windows限定の話なので、

C言語のスレではなく、
Win32APIのスレで質問したほうがいいよ。


203:195
07/06/08 08:32:37
>>202
ありがとうございます。
Win32APIのスレで改めて質問してみます。

204:デフォルトの名無しさん
07/06/08 09:36:54
可変長引数をパラメタに持つ関数をラップしたいのですが、
可変長の引数を伝播することができません。
なにか簡単な方法ありますか?

va_listをパラメタに持つ関数だったらかんたんだったんですが…。

void FunctionA(int, ...);
void FunctionAwrap(int,...);

205:デフォルトの名無しさん
07/06/08 11:01:42
>>204
移植性なくていいなら、↓みたいな感じ。

void FunctionAwrap(int,...) {
struct {
int mem[可変数引数の予想されうる最大値] ;
} arg ;

va_start(v, n) ;
int* pFirst = &va_arg(v, int) ;
for (int i=1; i<n; i++) {
&va_arg(v, int) ;
}
int* pNextOfLast = &va_arg(v, int) ;
va_end(v) ;

memcpy(&arg, &n+1, pNextOfLast-pFirst) ;

return aa(n, arg) ;
}

スタックの進む方向
引数をスタックに積む順序
が違うと、ヤバい。

206:205
07/06/08 11:05:41
ごめん、バグってた。

void FunctionAwrap(int,...) {
struct {
char mem[可変数引数の予想されうる最大値] ;
} arg ;

va_start(v, n) ;
char * pFirst = (char*)&va_arg(v, int) ;
for (int i=1; i<n; i++) {
&va_arg(v, int) ;
}
char * pNextOfLast = (char*)&va_arg(v, int) ;
va_end(v) ;

memcpy(&arg, &n+1, pNextOfLast-pFirst) ;

return aa(n, arg) ;
}

207:デフォルトの名無しさん
07/06/08 12:48:17
C++の統合開発環境でフリーソフトで使いやすいのって、何かありますか?
eclipseは重いので軽いのを教えてくださいm(__)m

208:デフォルトの名無しさん
07/06/08 13:07:33
統合開発環境は、どうしても重い。
軽快さを求めるなら、スタンドアローンのエディタやデバッガを使えばいい。

209:デフォルトの名無しさん
07/06/08 13:11:33
>>207
GCC & Code::Blocks
GCC & Cygwin/MinGW
GCC & Dev C++

210:デフォルトの名無しさん
07/06/08 14:02:13
>>207
フリーソフトというけど、どういう意味の?

無料というだけの意味なら、
マイクロソフトのVisual Studio 2005 Express Edition
あたりはどうよ。

211:205
07/06/08 16:25:37
場合によっては、こういうのでもいいかも。

int printf_w(const char* format, ...) {
struct {
char mem[100] ;
} arg ;
memcpy(arg.mem, &format+1, sizeof(arg)) ;

return printf(format, arg) ;
}

これは、スタックの中身がsizeof(arg)未満だと、ヤバい。

手抜きな対策としては、
main()内の最初のほうで、
char mem[100] ;
と書いて、そこでスタックを100バイト消費させてしまう。

212:デフォルトの名無しさん
07/06/08 16:40:34
>>206
同じ「移植性が無くてよい」の条件なら
void myprintf(const char *fmt, ...) {
 typedef struct {
  char mem[可変数引数の予想されうる最大値] ;
 } args ;
 va_list ap;
 va_start(ap, fmt);
 printf(fmt, *va_arg(ap, args));
 va_end(ap);
}
くらいで充分だろ。

213:デフォルトの名無しさん
07/06/08 18:23:34
>>208-210
レスありがとうございます。
フリーソフトというのは単に無料という程度のことです。

ノートパソコンを膝に抱えてプログラミングするのが好きなんですが
eclipseなんかだと簡単に固まるんですね。
紹介されたものも含めてもう少し考えてみます。

ありがとうございましたm(__)m

214:デフォルトの名無しさん
07/06/08 18:46:23
ノートPCなら尚のことテキスト環境で使ったほうが楽そうだが。
#マウスに頼らないで済む→膝の上でも安定。

215:デフォルトの名無しさん
07/06/08 18:56:33
VC使いだけど、あんまりマウス使わないよ。

キーボードだけでも、けっこう行けます。

216:デフォルトの名無しさん
07/06/08 19:24:53
>>212
無駄なコピーが1回減ってウマーだね。
×printf(fmt, *va_arg(ap, args));
○printf(fmt, va_arg(ap, args));


217:デフォルトの名無しさん
07/06/08 19:26:37
>>200-201
回答ありがとうございます。
>>200のほうはきっちり理解できました、間違ったコードを書かないように気をつけるより、どう間違えてもコードがおかしくならない様にするのと、
他人がもし自分のコードをみたときのためにマジックナンバーは使わないほうがいいということは理解できました。

ところでですが、>>201をみてわからなかった#difineやconstやsizeof()の構文を勉強してみましたが、「しかしそれでは煩雑だし」云々以降のコードは、

SIZE_OF_ARRAY(x)と書けば、配列xの最大の数から最低単位の数で割り配列の中にいくら要素が入っているかチェックしてその数を返す。
絶対に変更できないint型変数、TEXT_IN_BUFFERをつくり256を代入する。
要素をTEXT_IN_BUFFER個もつchar型配列sをつくる。
fpで指定されたポイントから一行分かsの要素の数だけ文字を読み取りs[0]から順番に代入していく。
aを0に初期化して、aがsの要素の数未満の間、aをインクリメントしながら{以下を繰り返す。

と読んでいいでしょうか?
なんだか、数学の問題集なんかで自分の思いもよらない解法で問題を解いているのを見るようで感動しました。
自分もこういうソースをかけるように精進します。

218:デフォルトの名無しさん
07/06/08 19:45:28
>>217

>>201のは、該当行だけ抜き出したものだと思う。

しかも間違ってる。
×const int TEXT_IN_BUFFER 256 ;
○const int TEXT_IN_BUFFER = 256 ;

プログラムには明確な正解はなく、人によって考え方も違う。
ある程度の失敗経験がないと理解しにくいこともあるので、
プロでなければ、あんまり気にしなくていいと思う。

219:デフォルトの名無しさん
07/06/09 00:02:08
#ifdef 0 ~ #endif
で囲まれたコードを消してくれる整形ツールの様な物はありますか?

220:デフォルトの名無しさん
07/06/09 00:12:31
配布されてるものでは知らないけど
それくらいのプログラムならすぐ作れるでそ

221:デフォルトの名無しさん
07/06/09 00:17:31
>>219,>>220
いま、俺、まさにそんな類のことができるツール書いてるとこなんだけど、マジメにやってたら結構面倒。

222:デフォルトの名無しさん
07/06/09 00:20:08
>>219
よかったな。
>>221が作ってくれてるってさ。

223:デフォルトの名無しさん
07/06/09 00:27:45
>>220
作るのはメンドイので既に有る物を使おうと思ってました。
ググったんですが中々見つからなくて・・
もうちょっと探してみます。

224:デフォルトの名無しさん
07/06/09 00:51:38
>>223
見つけたら是非、教えてくれ。そしたら俺も幸せになれるかもしれん。

225:デフォルトの名無しさん
07/06/09 00:58:00
そういえばプリプロセッサじゃだめなの?

226:デフォルトの名無しさん
07/06/09 01:06:28
>>225
インクルードされちゃうし、その他モロモロも全部展開されちゃう。
・・・って、Cプリプロセッサってモノによってはいろいろオプションが
あるし用途によってはそれで事足りるかもね。

俺が、いま作ってるのも実のところ拡張Cプリプロセッサだし。

227:219,223
07/06/09 03:38:15
>>224
幾つか見つけましたがコレでやりたいことはできました。
URLリンク(www.geocities.jp)

228:デフォルトの名無しさん
07/06/09 07:27:21
chraの四則演算はSSEを使えば16倍速くなるのですか?

229:デフォルトの名無しさん
07/06/09 08:08:26
>>227
㌧。でも、よりによってGUIかよ。俺の用途にはちとマッチしねぇ。

230:デフォルトの名無しさん
07/06/09 08:18:32
>>228
chraってなんですか?

231:デフォルトの名無しさん
07/06/09 09:41:08
>>229
GUIだからといって人間が毎回ちまちまと操作しなきゃいけないってことはない。

CUIでラップしてやりゃぁいいじゃないか。
いちいち画面にウィンドウが出るのが・・・とか言うのは、Windowsプログラマとしては無知すぎるぞ。

232:デフォルトの名無しさん
07/06/09 09:41:29
>>230
お前もしかしてチラ(chra)知らんのか?

233:デフォルトの名無しさん
07/06/09 12:09:30
ここでチラの話はやめようや…
また荒れそうだし

234:デフォルトの名無しさん
07/06/09 14:42:53
つ URLリンク(keyword.livedoor.com)

235:デフォルトの名無しさん
07/06/10 16:03:03
最近のチラシは両面印刷で書くとこないんだよな

236:デフォルトの名無しさん
07/06/10 18:42:34
basic_streamの拡張のうまい方法なんか説明したサイトか書籍しりませんか?
マルチスレッド対応とかにしたいんですけどいまいちあの3文字、4文字の
なんの意味か不明な記号列に苦しめられてます。

237:デフォルトの名無しさん
07/06/12 01:12:37
#define STR_SIZE 157

char str1[STR_SIZE];

scanf("%文字数s",str1); 

printf("%d\n",(strlen(str1))
        
OS:XP C言語の質問なんですが
scanfの文字数の部分に#defineで定義した記号定数名を入れると入力した文字数が1と表示されてしまいます
しかし直接、数値を指定してやるとちゃんとした文字数が表示されます
ここには記号定数名は使えないってことでしょうか?
そうだとちょっと不便ですね
何か良い方法ありませんか?

238:デフォルトの名無しさん
07/06/12 01:22:31
>#define STR_SIZE 157
>
>char str1[STR_SIZE];

なんだよ、その超中途半端なサイズはw

239:デフォルトの名無しさん
07/06/12 01:27:36
>>238
問題文(含コード&リンク):
長さ157以下の英数字,空白の並びからなる文字列を二つ入力し,
それぞれをa1, a2とする. a1が"abc",a2が"ab"の場合のように,
a2の先頭部分がa1の先頭部分に含まれるときは1を,そうでないときは0を値として
返す関数 int match(char *a1, char *a2);を作成しなさい.
配列宣言を除きすべてポインタを用いて処理すること.
文字列は157文字以下が入力されるものとし,文字列の長さに関するエラー処理を
する必要はない.
計算の手順としては,文字列の先頭から一文字ずつ一致するかどうかを比較する.
a2にあたる文字列中の比較対象となった文字が'\0'であれば,a2はa1に包含された
ものとして扱う.これ以外で比較時に,一文字でも一致しない場合があれば
包含されていないとして扱う.
この関数をもちいて,2つの文字列を与えたとき,一つ目の文字列の中に二つ目の
文字列が含まれている場合(この場合先頭が必ずしも一致していなくてもよいものとする)
には "一致"をさもなければ"不一致"を出力するプログラムを作成しなさい.


240:デフォルトの名無しさん
07/06/12 02:54:09
今、sizeofについて勉強しているんですが、
参考書通りに入力してもエラーになってしまいます。
皆様、どうかご助力願えないでしょうか?
開発環境はBorland C++ Compiler 5.5です。
#include <stdio.h>

int main(void)
{
int a=1,b=0;

printf("short int型のサイズは%dバイトです。\n",
sizeof(short int));
printf("int型のサイズは%dバイトです。\n",sizeof(int));
printf("long int型のサイズは%dバイトです。\n",sizeof(long int));
printf("float型のサイズは%dバイトです。\n",sizeof(float));
printf("double型のサイズは%dバイトです。\n",sizeof(double));
printf("long double型のサイズは%dバイトです。\n",
sizeof(long double));
printf("変数aのサイズは%dバイトです。\n",sizeof(a));
printf("式a+bのサイズは%dバイトです。\n",sizeof(a+b));
return 0;
}


241:デフォルトの名無しさん
07/06/12 03:00:02
>>240
エラー内容も書けよ。

242:デフォルトの名無しさん
07/06/12 03:09:35
>>241
エラー内容も書いてくださいませ と言うように

243:デフォルトの名無しさん
07/06/12 03:29:58
申し訳ありません。
エラー内容は、
警告 W8004 sample5.c 21: 'b' に代入した値は使われていない(関数 main )
警告 W8004 sample5.c 21: 'a' に代入した値は使われていない(関数 main )
です。以後気をつけます。すみませんでした。

244:デフォルトの名無しさん
07/06/12 03:38:00
>>243
それは警告であってエラーではない。
int型のa,bに値を入れてるけど、その値を参照してないからコンパイラが
警告だしてるだけ。動作に問題は無い。

245:デフォルトの名無しさん
07/06/12 03:44:53
>>244さん、ありがとうございます。
確かに実行してみたら正常に動作しました!
こんな時間に助けていただきありがとうございました!

246:デフォルトの名無しさん
07/06/12 18:39:49
>>126>164
すみません、遅くなりました。ネットカフェでしかネットに繋げなかったので申し訳ありません。
回答ありがとうございます。

「何が」閉じるのが早いの?
どうやって実行しているの?

コンパイラです。ソースファイルをドラックして実行しているのですが、エラーなどの文がスラスラ流れるように出て
すぐ閉じてしまうので、エラーなどの文が読めません。
仕方なく「pauseキー」を押して止めたりしてるのですが、これが至難の技で・・。
コンパイラをクリックして起動させても、同じくすぐに閉じてしまいます。できあがった実行ファイルも・・。
解決策があるようなので、少し安心したりしています。よろしければ教えて下さい。

上にも質問させて頂いたの事なんですが

#include<stdio.h>
#include<float.h>

int main()

{
double what;
what=3.14159265358979;

printf("もう少し詳しい値は%20.18fです\n",what);

return 0;
}
の結果は3.141592653589790007になるんだけど、最後の「7」はバグなんですか?

なにぞとよろしくお願いします。(泣)

247:デフォルトの名無しさん
07/06/12 18:54:28
丸め誤差

248:デフォルトの名無しさん
07/06/12 18:58:46
>>123の質問の次のレスは読んでないのか。

249:デフォルトの名無しさん
07/06/12 19:39:34
自分はJavaをやろうとしたのですが、教本がちんぷんかんぷんだったので、
プログラミング言語の雰囲気だけ知っておこうと思い、Cの本を読み漁りました。
おかげでつまづいていた部分は何とか理解できたのですが、
ポインタの部分でつまづき、Cの理解を半ばにJavaに移行しようか、迷っています。
他言語に移る前提ならポインタ等C特有の概念の理解を飛ばしてもOKでしょうか?

後学のためになるなら喜んで労力を払いたいのですが、
なにぶんCを先達の方々のように使いこなせる自信がありません…

250:デフォルトの名無しさん
07/06/12 19:45:56
> ポインタ等C特有の概念
( ゚д゚)ポカーン

251:デフォルトの名無しさん
07/06/12 19:54:16
>>250
そうだな。ポインタなんて Pascal、PL/M、C++ にもあるもんな。

>>249
ここで訊くことじゃないと思うんだが。
まあ Java に戻ればいいんじゃね?

252:デフォルトの名無しさん
07/06/12 20:01:05
いきなり無知を晒してしまって恐縮ですorz
いっそう自信を無くしたのでCは諦めます(-_-;)

253:デフォルトの名無しさん
07/06/12 20:06:17
ポインタ演算を除けばJavaの参照みたいなもんだろ

254:デフォルトの名無しさん
07/06/12 23:06:31
Visual C++2005 を使い始めました。
フォームにピクチャーボックス1つとボタンを2つ配置しました。
1つ目のボタン(開始)をクリックすると、
ピクチャーボックスにグラフのようなものを書くようなプログラム
をつくりました。
ここまでは上手く動作しています。
次に、2つめのボタン(停止)で、
グラフの描写(For文で繰り返しているため時間がかかります)
を途中で一時停止させたいのですが、
グラフをすべて書き終えるまで、ボタンが押せる状態になりません。
どのような方法を使えばいいのか教えてください。
よろしくお願いします。
分かりにくくてすみません。

255:デフォルトの名無しさん
07/06/12 23:17:07
C/C++の問題じゃない。
Win32ApiだかMFCだか.NETだか分からないがソッチのスレのが良いかと。

とりあえずWin32APIかMFCなら、デフォルトのWindowProcじゃなくて、
自分で回してるfor文中でイベントの取得と処理をやることになると思われ。


256:デフォルトの名無しさん
07/06/12 23:37:32
エスパーするとスッドレを使うべし

257:デフォルトの名無しさん
07/06/12 23:45:06
x68k環境用(ぶっちゃけいうとTI-89)でC++使うと
コンパイラがどんなに頑張ってもstd::cout << "Hello, World!" << std::endl;
だけで5kbytesになるって本当ですか?
ちなみにC(TIGCC)のprintf("Hello, World!\n")だと700bytes程でした

258:254
07/06/12 23:46:09
>>255
アドバイスありがとうございます。
ちなみに、プロジェクトの種類はCLR
テンプレートはWindowsフォームアプリケーション
を使っています。
スレを汚してしまい、すみませんでした。

>>256
ありがとうございます。
少し、スッドレの勉強をしてみます。



259:デフォルトの名無しさん
07/06/13 10:55:25
>>257
x68kて…w
誰も知らないだろ。
サイズがでかくなるのは最適化が弱いだけじゃね?

260:デフォルトの名無しさん
07/06/13 11:12:26
>>257
それは、全てスタティックリンクされているのか?
printf()の実装だけで、軽く数十キロバイトにはなるはずだぞ。

261:デフォルトの名無しさん
07/06/13 13:14:50
リアルタイムで動くゲーム作ってます
マルチスレッドについて教えてください
それ使うと全体の実行速度は速くなりますか?
もし速くなるならたくさん使えば使うほど速くなりますか?

262:デフォルトの名無しさん
07/06/13 14:36:54
>>261
すでにCPU100%使ってるなら、さほど変わらないだろう
別にマルチスレッドにしたからって、CPUの限界を超えられる訳じゃない

URLリンク(ja.wikipedia.org)

263:デフォルトの名無しさん
07/06/13 15:31:58
>>237
> scanfの文字数の部分に#defineで定義した記号定数名を入れ

具体的に、ソースコードの該当箇所をコピペして見せて。
(コピペだよ。打ち直したりしちゃダメだよ。)

> 文字列は157文字以下が入力されるものとし

それなら、
char str1[157] ;
というのは間違い。
char str1[157+1] ;
とすること。
文字列には、文字列の終わりを示すための特殊な文字'\0'が必要だから。

もしかしたら、一見正しく動いているように見えても、トンデモナイ大間違い。


264:デフォルトの名無しさん
07/06/13 15:33:26
>>243
エラーや警告のメッセージが出たら、ちゃんと読もうよ。

読まない人がほんとうに多い。
メッセージを読まないのは、パソコンのドシロウトだけにしてくれ。

265:デフォルトの名無しさん
07/06/13 15:36:39
え?
「メッセージを読まないのは、パソコンのドシロウトだけ」、だろ

266:126
07/06/13 15:55:26
>>246
どうやら察しの悪い人のようなので、諦めて、答えを書くよ。

単体のコンパイラやなどのCUIの実行ファイルを、
エクスプローラ上でダブルクリック(設定によってはクリックか)して実行すると、
プログラムが終了し次第、ウィンドウが閉じられてしまうのは、
Windowsの(エクスプローラの)仕様です。

コマンドプロンプトを開いて、
そこからコンパイラや、作ったプログラムを実行させればいい。

それでも、あっという間にスクロールして見えなくなるので、
コマンドプロンプトのウィンドウの左上のアイコンを右クリックして出てくるメニューから、
プロパティを開いて、タブのレイアウトで、画面バッファのサイズの高さを、数百くらいにするといい。

> 最後の「7」はバグなんですか?

コンピュータで小数がどのように扱われるのか勉強しよう。


267:デフォルトの名無しさん
07/06/13 16:03:41
>>249
C言語のポインタくらいで、つまずくようでは、先が思いやられる。

世の中には、C言語のポインタで つまずく人が大勢いるが、
決して、C言語のポインタが難解なのではない。

その本が前提としている知識を持ち合わせていないため、本に書かれていることが理解不能
とか、
その本の説明が悪くて、著者本人か、すでに理解している人にしか、理解不能

いずれにしても、本のチョイスの問題です。
前提知識がないのであれば、それを学ぶために別の本を予め読むのも含めてね。

それから、本に書いてあることを読んだだけでは、はっきりとは理解できないこともあるので、
実際にプログラムを書いて、デバッガ上でステップ実行して確かめるのも大切なことです。

268:デフォルトの名無しさん
07/06/13 16:05:39
>>254
スレ違い。

ちなみに、
ボタンの押下に対するハンドラは、速やかに制御を返すべき。
時間のかかる処理を、そのコンテキストでやってはいけない。

269:デフォルトの名無しさん
07/06/13 16:09:24
>>257
本当かどうか、自分で試してみればいいじゃないか。

まぁたぶん本当だろうね。
C++のストリームのライブラリがスタティックリンクされれば、
mainにたった1行でも、かなりのサイズになる。

>>261
スレッドの話はスレ違い。

C/C++は基本的にスレッドの面倒を見ません。
マルチスレッド対応といっても、複数のスレッドからライブラリ関数を呼ぶことができるようになっているだけです。

だから、OSのスレッドの機能の勉強をしてください。

270:デフォルトの名無しさん
07/06/13 16:31:45
>>262,>>269
申し訳ない
出直してくる

271:デフォルトの名無しさん
07/06/13 21:03:47
みんなガンバレ!

言葉はキツいが諸先輩方は応援してるぞ。

272:デフォルトの名無しさん
07/06/14 00:19:17
getchar();で入力された英字の他に改行コードも一緒にラインバッファに保存され
次の入力で改行コードが返されてしまう問題で、ラインバッファに保存されてる改行コードをクリアする方法
はありませんか?

for(i=0;i<10;i++){

ch = getchar();

printf("%c\n",ch);

ch = 改行コードをクリア

}

こんな感じで
とりあえず今は下のような感じで対処してるのですが、他に方法があったらお願いします
ちなみに入力関数はgetchar();のみしか使用できません

for(i=0;i<10;i++){

ch = getchar();

printf("%c\n",ch);

ch2 = getchar();

}

273:デフォルトの名無しさん
07/06/14 01:18:02
無理

274:デフォルトの名無しさん
07/06/14 01:37:04
>>272
いまどき、CUIでインタラクティブなプログラムを作るのに慣れたところで、大して役に立たないと思うが・・・

自分なら、とりあえず、こうする。

for(i=0;i<10;i++){

do {
ch = getchar();
} while ((ch == '\r')||(ch == '\n')) ;

printf("%c\n",ch);

}


275:デフォルトの名無しさん
07/06/14 11:01:35
>>272 >>274
言わないと気づかないだろうたからあえて言うが、無駄な改行はやめてくれ。
見づらい。

276:デフォルトの名無しさん
07/06/14 11:42:36
>>275
改行にも意味があるのだが。

277:デフォルトの名無しさん
07/06/14 11:44:38
レスの改行? \n のこと?

278:デフォルトの名無しさん
07/06/14 14:48:21
レスの空行に決まってるだろ。

279:デフォルトの名無しさん
07/06/14 14:51:50
だったら意味無い気が。ソースの空行だべ

280:デフォルトの名無しさん
07/06/14 14:56:09
>>276 のいう「意味」とやらを訊こうか。
いや引っ張る程の話じゃないから、やっぱりいいや。

281:274
07/06/14 16:35:11
え、改行が多すぎる?

1行毎に改行を入れているつもりではないけど、結果的に、そうなっちゃってるねぇ。


282:デフォルトの名無しさん
07/06/14 16:39:45
多すぎるよ。意味の区切れでもないのに空行なんか要らない。

283:デフォルトの名無しさん
07/06/14 17:35:12
こまけーw

284:デフォルトの名無しさん
07/06/14 22:29:39
>>274
個人的にはインデントが無い前提なら、このぐらいの空行のが見やすい。
まぁ人それぞれじゃね?

285:デフォルトの名無しさん
07/06/14 23:15:35
TSearchRec Sr;
int Attributes = faAnyFile;//検索対象とするファイルの属性
if (FindFirst(CDirectoryOutline1->Directory+"\\*.mp3", Attributes, Sr) == 0) {
do {
if ((Sr.Attr & Attributes) == Sr.Attr) {
ListBox1->Items->Add(Sr.Name);

//Sr.Sizeでファイルのサイズを取得できる
i=i+1;
max=i;
}
}while (FindNext(Sr) == 0);
FindClose(Sr);
}

環境
Windows XPsp2
C++Buileder6.0

CDirectoryOutlineで選択したフォルダ内にあるmp3ファイルのファイル名をListboxに表示させたいと思っているのですが、

ファイルを選択→右クリック→プロパティ→全般タブ→詳細設定
の、
「内容を圧縮してディスク領域を節約する」
にチェックの入っているファイルが表示されません。

分かる方いましたら解決方など教えてくださいm(__)m

286:デフォルトの名無しさん
07/06/14 23:17:23
VC++.NET2003を使っています。

CPointをint型に入れたいのですがどのようにすればよいのでしょうか。
どうか、教えてください。

287:デフォルトの名無しさん
07/06/14 23:21:06
CPoint pt(10, 20);
int n = pt.x << 16 | (0xFFFF)pt.y;

288:デフォルトの名無しさん
07/06/14 23:21:25
無理言うな

289:デフォルトの名無しさん
07/06/14 23:22:03
ちがった、こうやりたかった。
int n = pt.x << 16 | (0xFFFF & pt.y);


290:デフォルトの名無しさん
07/06/14 23:23:27
CPoint pt;

int x = pt.x;
int y = pt.y;

291:デフォルトの名無しさん
07/06/14 23:27:13
>>287
>>288
>>289
>>290
ご返答、ありがとうございます。

あの、int x=みたいな初期値を設定するようなやり方じゃなければ
入れることが出来ないのでしょうか?

292:デフォルトの名無しさん
07/06/14 23:34:31
そんなことは無い。
単に変数宣言せずに書くのが嫌で、
2行に分けるのが面倒だっただけだと思うが。

293:デフォルトの名無しさん
07/06/15 00:33:24
>>292
そうでしたか。
ここまでのお付き合い、本当にありがとうございました。

294:デフォルトの名無しさん
07/06/15 01:01:20
最近C++の勉強をはじめたのですが、どうもCのような設計になりがちで困ってます。
クラス内で作成する関数なんですけど、良く使うキー情報は関数にパラメータを増やして
渡すやり方はC++ではあまりしないんですかね?
クラスのメンバ変数にすると便利そうなんですが、知らないうちにメンバ変数が
どんどん増えていって、収拾がつかなくなることが多くついついパラメータ渡しに
なってしまいます。いまのやり方はまずいですかね?


295:デフォルトの名無しさん
07/06/15 02:06:08
・まずはどういう処理について述べているか、具体的に(例でもいいから)挙げてください
・クラス内で作成するって何を作成する関数なんですか?
・キー情報って何ですか?

296:デフォルトの名無しさん
07/06/15 03:17:47
>>285
まずは、デバッガ上でステップ実行しろ!

このスレで何度も言っているが、

書いたプログラムが思い通りの結果を出さない場合、
たいていは注意深くステップ実行する(変数の内容もチェックする)ことで間違いに気がつく。

ということで、原因はわかるが、あえて、教えない。
他の人も教えるなよ!

297:デフォルトの名無しさん
07/06/15 03:25:29
>>294
> 良く使うキー情報は関数にパラメータを増やして渡すやり方

そういうのはCでも、やらないなぁ。
構造体のポインタを渡すよ。

もし、複数の関数で、同じ引数群を渡すのなら、
どうせスタックに同じものを積むのだから、構造体で値渡しするよ。

構造体を使うにしても、1つの構造体にフラットにメンバを並べるのではなく、
データどうしの関係に合わせて、構造体をネストする。

そういうのはCとC++で違いはないよ。


298:デフォルトの名無しさん
07/06/15 06:11:00
入力された数値がマイナス数値だった場合それを自然数に変えるにはどうやるんですか?

299:デフォルトの名無しさん
07/06/15 06:32:40
入力した数値を2に変える。3でも良いけど。

300:デフォルトの名無しさん
07/06/15 09:41:16
オレだったら4かな、、、って
abs()の事を聞いてるのか?

301:デフォルトの名無しさん
07/06/15 11:13:42
>>298
何をしたいのが不明瞭。

このスレで質問する人は、C/C++が云々という以前に、日本語が不自由すぎる。

302:デフォルトの名無しさん
07/06/15 15:10:46
わかるように書いて質問すれば、
より早く適切な答えを貰えるのにね。

303:デフォルトの名無しさん
07/06/15 15:13:26
自分でも何をしたいのか分かってないんだろ。
この程度のレベルなら、人に説明できれば自ずから解決できる。

304:デフォルトの名無しさん
07/06/15 15:28:30
プログラミング云々という以前に、
問題を切り分ける気がないんだろう。

たとえば>>285みたいなのは、
問題を切り分けていけば、
おのずと原因がわかるのだが。

305:デフォルトの名無しさん
07/06/15 15:29:18
int a;

scanf("%d",&a);
if(a < 0)
a = 2;

もしくは

int a;

scanf("%d",&a);
while(a < 0)
a++;

ってこどだろ?

306:298
07/06/15 15:54:33
5が入力されたら5
マイナス5を入力されても5として扱う方法を聞こうと思ったんですが、、
自分にレスしてくれたんじゃないかもしれないけど305をヒントにできました。

307:デフォルトの名無しさん
07/06/15 16:01:25
そういうのを絶対値と呼ぶんだってことは中学生でも知ってそうなもんだがな

308:298
07/06/15 16:03:48
小学生ですが何か?
来年から中学ですけど


309:デフォルトの名無しさん
07/06/15 16:05:41
入力した負の数に-1かけりゃいい話だがや


310:298
07/06/15 16:10:17
だから、もうわかったって言ってるだろ
しつこい馬鹿

311:デフォルトの名無しさん
07/06/15 16:11:54
しつこい馬鹿

312:デフォルトの名無しさん
07/06/15 16:24:31
変数を宣言して初期化する場合、普通は

int a,b,c;
a=1;
b=2;
c=3;

ってやるけどさ
↓こうした方がコンパイラも高速なコード生成できるし入力数も少なく見やすくてよくね?

int a=1,
  b=2,
  c=3;



313:デフォルトの名無しさん
07/06/15 16:27:36
>>312
天才

314:デフォルトの名無しさん
07/06/15 16:42:21
>>305
intが32ビットや64ビットで、
負の最大値のような巨大な数字が入力されたら、
大変だぞ。

>>306
とりあえずC標準ランタイムライブラリのabs()を使ってみようよ。

>>308
高校生くらいまでは、
プログラミングよりも学校の勉強とかに時間を使ったほうがいいぞ。

プログラミングなんて大人になってからやっても遅くはないが、
子供のころに勉強することは、大人になってからでは遅いんだよ。

自分も小学生の頃からプログラム書いてたけど、
もっと数学や物理をよく勉強すれば良かったと後悔してるよ。

>>309
今は乗算のコストが加算と同じだけどさ、

普通は減算を使って
if (a < 0) a = 0 - a ;
とやるよね。

>>310
うわぁ。
プログラミングの勉強よりも、対人コミュニケーションの勉強しようよ。


315:デフォルトの名無しさん
07/06/15 16:49:25
>>312
コンパイラの最適化を有効にしていれば、
どっちでも同じコードが出力されると思うぞ。

ちなみに、
int a, b, c ;
というように複数をまとめて宣言するのは、
int* p, q, r ;
のようなトラブルを起す可能性があるので、良くない。

面倒でも、
int a = 1 ;
int b = 2 ;
int c = 3 ;
としたほうがいい。

316:デフォルトの名無しさん
07/06/15 19:17:02
>>126>>266
ありがとうございます。書くの遅くなりましたが解決できました。本の後ろの方に書いてありました。
回答ありがとうございました。

「7」についてなんですが、本には「0」って書いてあるんです。
でも実行ファイルにすると「7」と表示されるんでバグなのかな?って思って聞いてみました。


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