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

スレを勃てるまでもないC/C++の質問はここで 2

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2007/05/07(月) 11:02:46
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
0002デフォルトの名無しさん2007/05/07(月) 18:25:57
dynamic_castってどんな時に有用なのですか?
0003デフォルトの名無しさん2007/05/08(火) 10:13:05
forループをインテルコンパイラを使いSSEで並列計算させるようにしています。
floatはdoubleの倍並列度が上がるはずなのですが、floatにしてもループの計算速度が
1.2倍程度にしかなりません何故なのでしょう
ループの中身は主に画像処理で、ほとんどが三角関数です。
0004デフォルトの名無しさん2007/05/08(火) 10:42:37
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
0005デフォルトの名無しさん2007/05/08(火) 10:56:12
>>2
dynamic_castにより、従来のキャストでは不可能であった クロス・キャスト、
そして抽象基底クラスからのダウン・キャストが可能になりました。
0006デフォルトの名無しさん2007/05/08(火) 11:02:51
>>3
近年のプロセッサではdoubleの計算速度はfloatとあまり変わらないためです。
0007デフォルトの名無しさん2007/05/08(火) 11:11:21
うそつき
0008デフォルトの名無しさん2007/05/09(水) 01:10:40
>>3
一応マジレスしておくと、その情報だけでは一概に言えないとしか。
「演算速度」と一口に言っても実数計算だけしているわけではないから1.2倍なら御の字だろう。

処で、まさかとは思うがfloat版でもsin()を使っちゃいないよな?
0009デフォルトの名無しさん2007/05/09(水) 12:34:09
>>3
45度分の三角関数表ぶち込んで置くのオヌヌメ
0010デフォルトの名無しさん2007/05/11(金) 11:37:54
>>8
c99にはsinf()などのfloat専用関数があるのに意外に知られてないよね。
0011デフォルトの名無しさん2007/05/13(日) 23:47:46
タスクを意識したプログラムを仕事で使うので勉強しています。
ディスパッチていう関数とアイドルタスクの実行関数ってのがあって
main関数で、初期設定(アイドルタスクのTCBの設定)をしてから、
ディスパッチの関数をコールすると、
そのディスパッチの関数がリターンされると
アイドルの関数を呼び出してもいないのに、
アイドルタスクが実行されました。
さっぱりわからないんですけど、こういうのって
普通のつくりなんでしょうか?
0012デフォルトの名無しさん2007/05/14(月) 01:25:43
>>10
C++だとsinでfloat版も多重定義されていることも意外に知られていないよね
勿論3がCとC++のどっちを使っているのかはわからないけど
0013デフォルトの名無しさん2007/05/14(月) 16:08:02
>>11
よーわからんが、「ディスパッチ」というからには
「何かが起きれば対応する処理を呼び出し、
 何もなければアイドル処理を呼び出す」のは
極々ふつーかと。
0014デフォルトの名無しさん2007/05/15(火) 18:40:58
Borland C++をつかってピアノをシミュレートするプログラムを組もうと思ってます。
つまり、キーボードAでドの音、キーボードSでレの音、キーボードDでミの音をだすわけです。

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

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

そこで、wavファイルを再生するという方法を諦め別の方法を考えてるわけですが、
なにか良い方法はないでしょうか?
0015デフォルトの名無しさん2007/05/15(火) 18:43:25
簡単なのはMIDI使うやつだなあ
0016デフォルトの名無しさん2007/05/15(火) 18:47:20
>>14
単純な音でごく簡単にやるなら、Beep()を使うのはどうだろう。
それはさておき、なんでDXでwav再生だと「きーを押している間のみ音を出せない」のだろう……
0017デフォルトの名無しさん2007/05/15(火) 18:53:31
なんで組み込み系の型は継承できないの?
0018デフォルトの名無しさん2007/05/15(火) 18:57:49
>>15
ありがとうございまする
C++からつまりMIDI音を生成できるというわけですか。ちょっと調べてみます。
>>16
ありがとうございます
さすがに、Beepでは。せめてMIDIくらいはクオリティ欲しいです。
「きーを押している間のみ音を出せない」はたぶん誤解していらっしゃるみたいです。
つまり、ドの音がwavに6秒記録されていて、Aキーを1秒間しか押してなくても
6秒再生されてしまうわけです。

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


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

短めのwavを用意して、キーリピートのたびに繰り返すなり、再生を途中で止めるなりすればいいのでは?
0020デフォルトの名無しさん2007/05/15(火) 19:08:56
>>17
C++は効率も重視してるので、そのような設計になっている。
ってのが模範解答かな
0021デフォルトの名無しさん2007/05/15(火) 22:49:44
C言語で
1 -0.5から0.5までの間のdouble型の乱数の発生のさせかた
2 0から1までの間のdouble型の乱数の発生のさせかた

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

毎回同じ乱数で大丈夫です
よろしくお願いします。
0023デフォルトの名無しさん2007/05/15(火) 23:46:25
>整数の乱数の発生させかたは幾つか見つかった
これが分かって、何で
>1 -0.5から0.5までの間のdouble型の乱数の発生のさせかた
>2 0から1までの間のdouble型の乱数の発生のさせかた
これがわかんないんだ?
ちょっと考えれば分かりそうなもんだが…
0024デフォルトの名無しさん2007/05/15(火) 23:54:53
応用力のないゆとり
0025デフォルトの名無しさん2007/05/16(水) 00:39:24
>>21

ゆとり教育の弊害か?

こういう調べ方もわからない香具師はなにかに躓くたびに
同レベルの質問するんだろうなw
0026デフォルトの名無しさん2007/05/16(水) 00:53:20
まあきっとリア消なんだろうと思って免じよう

(double)rand() / ((double)RAND_MAX + 1)
これで0以上1未満の乱数になる。1を加えなければ、範囲が0以上1以下になる。
あとは0.5を引けばいいだけ。
0027デフォルトの名無しさん2007/05/16(水) 01:00:42
>きっとリア消
そうかな? 文章の書き方はもう少し上の年齢を感じさせるが。
だからこそ応用できないのが残念というか不思議というか…
0028182007/05/16(水) 01:55:47
たぶん、基本的な型変換の知識が欠如してるかと思われます
0029212007/05/16(水) 06:31:24
みなさんすいません。つい最近C言語を始めたばかりで何もかもがチンプンカンプンな30歳です。
整数しかなくても乱数の中の最大値で割れば小数に変換できるってことですね(RAND_MAXっていうのは乱数の
中の期待される最大値ってことですよね・・?)。
こんな風にできるのか。勉強になりました。ありがとうございます
0030デフォルトの名無しさん2007/05/16(水) 06:43:52
1、機能設計
2、関数(クラス)設計
3、実装
4、レビュー
5、1にもどる
これを繰り返しやってるんだが効率が悪い気がする
なんかいいプログラム方法ってないの
0031デフォルトの名無しさん2007/05/16(水) 06:49:36
>>30
1. なんとなく実装
2. バグ取り

これなら効率よく見えるかい?w
0032デフォルトの名無しさん2007/05/16(水) 10:22:27
作業の合間の2chをなくせば効率は少なくとも5割アップする。
間違いない。
0033デフォルトの名無しさん2007/05/16(水) 10:29:14
今は、2chの合間の作業だからなあ
0034デフォルトの名無しさん2007/05/16(水) 10:50:43
C初心者です。
ググッていたら
int PASCAL WinMain
なんていうmain関数見つけたのですが、なんでCなのにパスカルなんですか?
0035デフォルトの名無しさん2007/05/16(水) 10:54:07
>>34
CDECL、PASCAL、STDCALLあたりで調べてみな
0036デフォルトの名無しさん2007/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 ;
}

数字の中から素数を出力するプログラムを作りたいのですけど
ステートメントにセミコロンがないとエラーが出てしまいます。
セミコロンは忘れずにつけているはずなのですが・・・
どなたか教えてください。よろしくお願いします。
0037デフォルトの名無しさん2007/05/16(水) 22:51:41
else(data[j]/i==0)
0038デフォルトの名無しさん2007/05/16(水) 22:54:41
>>37
理解できました。
/じゃなくて%使わないとだめだったのですね
ありがとうございます。
0039デフォルトの名無しさん2007/05/16(水) 22:58:09
それでいいんなら構わないんだけど・・・
0040デフォルトの名無しさん2007/05/17(木) 10:29:49
>>36
一応マジレスしておくと、慣れない内はif, for, whileなどには必ず{}をつけるようにした方がいいぞ。
それと、{}の位置は対応が見つかりやすい位置に揃えておくこともね。
0041デフォルトの名無しさん2007/05/19(土) 04:38:09
以前、Visual Studioの6.0を使っていたのですが
CDが無くなって見つからなかったせいもあり、
せっかくだから新しいのを買おうとVisual Studio 2005を買ってきたんです。

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

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

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

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

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

どなたかよろしくお願いいたします。
0042デフォルトの名無しさん2007/05/19(土) 05:28:33
>単にフリーソフトを作って配布するだけならば、VC++6でも十分なのでしょうか?
Yes

つーか俺は VS2003proとか持ってるけど、
未だにC++は VS6.0でやってる
メインの開発マシンが pen3 1GHzのノートだってのも理由だけど
0043デフォルトの名無しさん2007/05/19(土) 10:08:05
2005はランタイムにDLLを使うのが初期設定になっただけで、
プロジェクトオプションをいじれば、
従来どおりラんタイム (CRT)を静的リンクしてEXE内に含めることも可能。

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

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

いずれにしても、ランタイムのDLLをEXEと同梱して同じフォルダにおいても使える。
2005はマニフェスト書かないといけないから若干面倒だけど。
0044デフォルトの名無しさん2007/05/19(土) 13:53:17
静的リンクで、サイズがあまり大きくならなければ
EXE内に含んでしまうのも手ですね…
VC6のときは、そういった問題が起こらないのもそういう理由だったのですね。

それにしても…全然VC6でも未だにいけるんですな。
何のために2005買ってきたんだろう…
2005だとこれがいい!とか、これがあるから2005にしとけ!
っていうのはあります?
0045デフォルトの名無しさん2007/05/19(土) 14:10:32
すばらしいC++/CLIが使用できます!
0046デフォルトの名無しさん2007/05/19(土) 15:57:41
テンプレートやそれを使うライブラリ(Boostなど)がまともに使えるようになる。
(たしか2002と2003の間に越えられない壁)
あとは最適化の能力も着実に上がっている。
0047デフォルトの名無しさん2007/05/19(土) 17:45:35
古いMFCって色々バグなかったっけ
0048デフォルトの名無しさん2007/05/20(日) 19:33:33
>>44
VS6の場合、WinXPから実装されたような新しいAPIはヘッダにない
有名だけど、VS6のSTLはバグあり
0049442007/05/20(日) 22:14:08
>>45-47
単語を元に色々見てみました。
バグや最適化のことも考えて2005のライブラリ同梱でいこうと思います。
せっかく買ったことですしね。

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

ありがとうございました!
0050デフォルトの名無しさん2007/05/25(金) 01:03:52
UTF-16LEでかかれたファイルを1行ずつ読み込んで処理したんです。
std::wstringをつかってどうにかできませんか
0051デフォルトの名無しさん2007/05/25(金) 01:17:46
>>50
×処理したんです
○処理したいんです。
orz
0052デフォルトの名無しさん2007/05/25(金) 18:26:16
>>50
お前の使うCPUがリトルエンディアンで、
お前の使う処理系でのwchar_tがUTF-16なら、
std::wifstreamでバイナリモードにすれば大抵上手くいくと思う。
0053デフォルトの名無しさん2007/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サイズの件については考えていません。
0054デフォルトの名無しさん2007/05/25(金) 19:02:02
ループ中のstrlenを止めるだけで結構変わる悪寒
0055デフォルトの名無しさん2007/05/25(金) 19:16:10
>>53
出力サイズ(=buf内の文字列長)を常に保持するようにすればstrlen()は全く要らなくなる。
#それでどれだけ速くなるかは知らんが。

寧ろ、もそっとこまめにWriteFile()した方が速くないかい?
0056552007/05/25(金) 19:16:51
あー、最後の一行無視しておいて。
0057デフォルトの名無しさん2007/05/25(金) 19:33:20
>>53
strlenやめたコードで16MBくらいのデータを出力してみたが、
ぶっちゃけHDDの速度に依存してる感じだ。w
あんまりかわらんね。
0058デフォルトの名無しさん2007/05/25(金) 19:44:13
>>53
散々言われているがファイルの書き込みを考えたほうがいい
メモリマップドIOにするなり別スレッドで書き込むようにするなり
0059532007/05/28(月) 12:02:35
皆様有難う御座います。

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

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

数値を文字列に高速に変換する方法などあれば解決しそうですけど
なかなか考えつきませんね。。
0060デフォルトの名無しさん2007/05/28(月) 12:17:03
>>59
少しは調べる努力もしよう。
-- from MSDN
>戻り値
>書き込まれた文字数を返します。
-- from www.linux.or.jp
>返り値
>成功時には、上記の関数は書き込まれた文字数を返す (文字列の最後を示すために使用する `\0' は数に含まれない)。
0061デフォルトの名無しさん2007/05/28(月) 12:28:24
>>53
今ちょっと実測してみたんだけど、数値の範囲にも拠るけど
桁数が増えるとパフォーマンスにかなり影響する。
%.14fを例えば%.13fや或いは%.14gに変えられないの?
0062デフォルトの名無しさん2007/05/29(火) 10:08:31
まあsprintfの戻り値使えばstrlenはいらないけど、たいした節約にはならんような。
自前でftoa()でも作ってしまうとか。
10^n掛けていって整数部分を取るような。
0063デフォルトの名無しさん2007/05/30(水) 02:14:35
Cの場合は
void 関数名(void);
じゃないと警告出ますよね
C++の場合
void 関数名();
で、警告出ないんですけどvoidは入れた方が良いんですか?
0064デフォルトの名無しさん2007/05/30(水) 02:20:12
>>63
C++の場合はvoidを書かなくても書いた場合と同じとなってますが、
Cとの互換性を考えるなら書いた方がいいかもしれません。
0065デフォルトの名無しさん2007/05/30(水) 07:46:02
>>64
分かりました。ありがとうございます。
0066532007/05/30(水) 13:56:24
sprintfの戻り値が出力数とは目から鱗でした。

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

皆さんありがとう御座いましたm(__)m
0067デフォルトの名無しさん2007/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);
としたほうが分かりやすいと思うんだけど。
0068デフォルトの名無しさん2007/05/30(水) 23:11:35
書いた本人は、処理の数が膨大な数になり且つ、もしcase以降の処理の順番を入れ替える事態が発生した時の
保守のし易さにでも重点を置いたんだろう。
あんたの見たその時の状況を知らないからなんとも言えないが、もし枝分かれが指折り数えるくらいなら意味ないね。
0069デフォルトの名無しさん2007/05/31(木) 03:48:55
上の質問と被ってしまうような気もするけど・・・気にしない。。

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

これを

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

こういう風にしたいのですけどCHECKの型を何にしたら良いのでしょうか
0070デフォルトの名無しさん2007/05/31(木) 06:41:09
int
0071デフォルトの名無しさん2007/05/31(木) 07:27:36
すごいくだらない質問なんですが、
CをどこまでやったらC++に移っても問題ないのでしょうか?
入門書を一通り終えたらC++に行っちゃって大丈夫なんですか?
0072デフォルトの名無しさん2007/05/31(木) 07:40:47
>>66
ていうかさ、なんでstdioを使わないでAPIを直接使ってるの?

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

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

sprintfの戻り値の件もそうだけど、知らないで思い込む(=調べない)と損だよ。
0073デフォルトの名無しさん2007/05/31(木) 09:48:11
>>69
enum の出番だ
まあ>>70の通りだ
0074デフォルトの名無しさん2007/05/31(木) 10:49:13
ちょっと疑問なのですが、
char *str = "ABCDE";
のような宣言のとき、 "ABCDE"という文字列がstrに入った☆
なーんて説明されたんだが、既に納得がいかない。

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

教えてくださいエラい人・・・。
0075デフォルトの名無しさん2007/05/31(木) 10:53:25
>>74
まず、リテラルの"ABCDE"を格納している領域があって、そのアドレスがstrに入るだけ。

char str[] = "ABCDE";だと6個の領域がローカルに確保されてリテラルの"ABCDE"から
内容がコピーされる。
0076デフォルトの名無しさん2007/05/31(木) 15:36:13
ローカルのは処理系依存だな
単にcharの配列の初期化になるだけとか
0077デフォルトの名無しさん2007/05/31(木) 17:15:53
>>76
>ローカルのは処理系依存だな
意味不明。
0078デフォルトの名無しさん2007/05/31(木) 21:48:06
>>75 >>76
ありがとうございました。
0079デフォルトの名無しさん2007/05/31(木) 23:19:56
質問です。
"<列番>,<行番>,<顧客名>" という形式で入力されるデータを
行列ソートされた状態で変数に格納しようとしています。

map型でキーを2つ使う事は出来るのでしょうか?
より簡潔に書ける方法があれば、そちらもご教授願いたいです。
0080デフォルトの名無しさん2007/06/01(金) 00:42:12
処理系くらい書けや

http://www.tt.rim.or.jp/~rudyard/torii009.html
0081デフォルトの名無しさん2007/06/01(金) 00:54:29
>>79
うーむ、mapが一番楽ではないかな。
0082デフォルトの名無しさん2007/06/01(金) 12:03:48
>>79
std::map<列, std::map<行, 顧客名> > ではあかんの?
0083sage2007/06/01(金) 15:50:28
Windowsのサービスプログラムを作成しています。

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

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

ご存知の方、どうぞ教えていただけないでしょうか。
0084デフォルトの名無しさん2007/06/01(金) 15:56:11
>>83
普通そういう構造にはしないけど、だからってできないことはないと思うが。
もしもログイン時に動かないんであれば、実行時にはまだシェルが起動してなくて
Shell_NotifyIcon自体が失敗してんじゃないの?
0085デフォルトの名無しさん2007/06/01(金) 16:00:16
>>83
>>79
これってどーやったらみんなみたいに青くなるんですか??
0086デフォルトの名無しさん2007/06/01(金) 16:05:42
>>85
sageはメール欄な
0087デフォルトの名無しさん2007/06/01(金) 16:06:23
って入ってるじゃねーかw
0088832007/06/01(金) 16:25:42
>>84
ATLで雛形を作成していますので、
手動とサービス起動の両方で実行が可能になっています。
それで両方で試してみましたが、手動のほうは問題なく
アイコンが表示されましたが、サービスのほうはコンパネより手動で
サービスを起動してもアイコンは表示されませんでした。
そこで考えたのがサービス起動のときだけShell_NotifyIconが
失敗しているのではと思ってやってみたら、
サービスのときは「重複した I/O 処理を実行しています。」
というエラーになりました。
エラーの意味が何のことかよくわからないですが
やはり、サービスでアイコンを表示するのは無理だったみたいです。
0089デフォルトの名無しさん2007/06/01(金) 16:34:50
>>88
へんだな。
当然、
デスクトップとの対話をサービスに許可
にはチェック入れてるんだよな?
0090832007/06/01(金) 16:59:40
>>89
対話を許可というものがあること自体解からなかったのですが。
チェックを入れたら表示されました。
ありがとうございました。

危うくプロセスを分けてCOMで状態を受け渡す行動に出るところでした。
0091デフォルトの名無しさん2007/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の引数を変更するだけですが・・・
よかったら参考にしてください。
00927712007/06/02(土) 18:30:00
CからC++に移行したと思っています。

CとC++の関数が載っているオススメの書籍を教えて下さい。
0093792007/06/02(土) 22:30:32
>>82
上手くいきました。
良い案をありがとうございます。
0094デフォルトの名無しさん2007/06/03(日) 19:01:38
class A : private B {
// 省略
} ;

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

AのメンバからしかBはアクセスできないので、
class A {
private:
B b ;
} ;
としてしまったほうが、スッキリするような気がするのですが。
0095デフォルトの名無しさん2007/06/03(日) 20:09:03
cin, cout は何の略ですか.
0096デフォルトの名無しさん2007/06/03(日) 20:51:04
>>94
A has BかA is Bかの違いでしょ。
0097デフォルトの名無しさん2007/06/03(日) 20:54:12
>>94
とりあえず実際的な理由としては
virtual関数をオーバーライドしたいときとか。
0098デフォルトの名無しさん2007/06/03(日) 21:34:02
>>95
cはconsoleの略
inとoutはそのまま
0099942007/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にコールバック先のポインタを教えてあげる手間が省けますね。
0100デフォルトの名無しさん2007/06/03(日) 23:06:03
Bが純粋仮想関数を持っていれば、継承せざるを得ないわけで。
で、AがBの実装を云々したくなければprivate継承で充分だと。
0101デフォルトの名無しさん2007/06/03(日) 23:12:51
でも実際問題private/protected継承なんて使っているところを見たことがない
そういうこともできるんだと頭の片隅に留めておけば十分だと思う
0102デフォルトの名無しさん2007/06/03(日) 23:52:32
おまえらEffectiveC++くらい読めよ。
0103デフォルトの名無しさん2007/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 ***
0104デフォルトの名無しさん2007/06/04(月) 00:15:17
>>103
当たり前だろデフォルトパラメータがないんだから。

complex<double>とか特化しろって事だよ。
0105デフォルトの名無しさん2007/06/04(月) 00:34:12
>>104
#define Complex complex<double>

と書いてみたのですが、同じようなエラーが出ました。
”特化する”ということがよく分からないのですが、
もうすこし詳しく教えていただけないでしょうか……
0106デフォルトの名無しさん2007/06/04(月) 00:41:42
それよりはtypedef Complex complex<double>;のほうがいい。
それはともかく、こうしてComplexを用意したものの、
Dkaの宣言がcomplexのままになっているのでは?
01071032007/06/04(月) 00:44:03
>Dkaの宣言がcomplexのままになっているのでは?
自分のソースを見たらその通りでした……。
まさか大文字小文字を間違える単純なミスだったなんてorz

何とか解決しました。ありがとうございました。
0108デフォルトの名無しさん2007/06/04(月) 01:02:16
テンプレートの特化の意味がわからないなら、テンプレートの勉強を
すべきだと思う。特にSTLが出すエラーメッセージは常人では解読する
事が不可能な内容である事が多いため、ソースからコンパイルエラーの
原因を追わなければならない。
01091032007/06/04(月) 01:22:28
>>108
そうですね。今までもエラーメッセージを解読できなかったことが多かったので、
これを機にテンプレートの勉強をしてみようと思います。
0110デフォルトの名無しさん2007/06/04(月) 10:03:37
>>100
Aが継承せざるを得ないわけではない。
選択肢は1つではない。
Bを継承したCをメンバに持っても構わない。

>>101
多重継承がgdgdしてくると、privateで継承する必要が出てくる。
そうなった場合、そもそものクラス設計が妥当なのか、
小一時間考えたほうがいいことは言うまでもないが。
0111デフォルトの名無しさん2007/06/04(月) 10:07:18
>>107
人間はミスをする生き物なので、
1文字違いの識別子を使うのは、
やめたほうがいい。

文字数が多くなっても、
complex_double
などのようにしたほうが。
0112デフォルトの名無しさん2007/06/04(月) 18:34:15
だったらcomplex<double>でいいよという結論
0113デフォルトの名無しさん2007/06/05(火) 01:59:35
C言語でswitch文使うときに、
case 〜〜の〜〜の部分を範囲指定(例えば0 < a && a < 9みたいな)する方法ってありますか?
初めて1ヶ月も経ってなくてスキルはカスですがやらしく教えてください
0114デフォルトの名無しさん2007/06/05(火) 02:13:39
ありません。
0115デフォルトの名無しさん2007/06/05(火) 02:37:25
ありがとうございます。
なんか学校の課題でそういうのやったらポイント高いぜーとか教授が言い出してたんです。
ifとelse if使った関数勝手に作って強引に処理して解決?しました
それならswitch使う意味がどこにあるんだって話になるんでしょうけれど・・・
0116デフォルトの名無しさん2007/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;
}
0117デフォルトの名無しさん2007/06/05(火) 11:34:35
>>73
できました!ありがとうございます
0118デフォルトの名無しさん2007/06/05(火) 15:47:31
>>112
typedefしたほうがいいと思うけどなぁ。

>>116
後者だったら、if文を使ったほうがいいと思うなぁ。
0119デフォルトの名無しさん2007/06/05(火) 15:51:24
>>118
確かに。

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

>後者だったら、if文を使ったほうがいいと思うなぁ。
敢えてswitchを使う理由がなければそう思うよ。
0120デフォルトの名無しさん2007/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の前者が可能なことに気がつく人はいるかな? ニヤニヤ
ということだったのか。
0121デフォルトの名無しさん2007/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イベントが発生しない原因
について推測でもいいのでご存知ないでしょうか?
0122デフォルトの名無しさん2007/06/05(火) 19:15:39
>>121
ATLもMFCも知らないので、適当ぶっこきます。

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

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

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

可能性4
何らかの原因でサービスのメッセージポンプが止まっていて、
送られてきたメッセージがキューに溜まったまま、消化されてない。
0123デフォルトの名無しさん2007/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)みたいなのはないのでしょうか?
回答できる方よろしくお願いします。
0124デフォルトの名無しさん2007/06/05(火) 20:06:13
"丸め誤差"でググれ
0125デフォルトの名無しさん2007/06/05(火) 20:08:28
switch構文じゃなくて
strategyパターンを使った方が良い場合ってどういうときがありますか?
0126デフォルトの名無しさん2007/06/05(火) 20:10:19
>>123
> borland社のコンパイラを使っているのですが、閉じるのが早くてエラーの文など読めません。

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

「何が」閉じるのが早いの?
どうやって実行しているの?
0127デフォルトの名無しさん2007/06/05(火) 20:10:41
丼じゃなくて、
酢飯を使った方が良い場合ってどういうときがありますか?
0128デフォルトの名無しさん2007/06/05(火) 20:11:17
携帯ですみません
ifの条件文の中に&&や||は使えますか?
学校じゃないから確かめられない
0129デフォルトの名無しさん2007/06/05(火) 20:18:22
家にPCはないのか?
0130デフォルトの名無しさん2007/06/05(火) 20:22:12
ないです
0131デフォルトの名無しさん2007/06/05(火) 20:24:29
だったらノートPCでもなんでもいいから買えよ
それともかく使えないようにする理由がないから使える
01321222007/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にセットした時点でスレッドが終了して、次の行が実行されないことがあるから。
01331222007/06/05(火) 20:41:24
ちなみに・・・

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

さらに、ちなみに・・・
自分も長々と書き込んでおいて言うのもなんだけど、
Win32APIの話は、C/C++の言語自体の話とは違うから、スレ違いだと思う。
0134デフォルトの名無しさん2007/06/05(火) 20:47:20
>>128
> 学校じゃないから確かめられない

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

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

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

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



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

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

んな余計な文を打ち込む暇があったら、携帯で調べろよ。
0135デフォルトの名無しさん2007/06/05(火) 20:50:22
スレを立てるまでもないレベルの低い質問のスレではあるが、

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

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


ネットの第三者の善意に頼って質問していいのは、
できるだけ努力はしたけど自分にはサッパリわからない
というような場合だ。
0136デフォルトの名無しさん2007/06/05(火) 21:23:32
あんまり萎縮するようなことを書くのは、どうかと。

もっと気軽に行こうよ。
小言を言って雰囲気を悪くしたりせず、
だまってスルーすればいいんだよ。
0137デフォルトの名無しさん2007/06/05(火) 22:13:42
ある数の逆数を求めるプログラムで循環小数部を除いて表示させたいのですが
どのような方法があるでしょうか?
0138デフォルトの名無しさん2007/06/05(火) 22:39:47
C/C++言語の質問ではないような。

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

ということでどう?
0139デフォルトの名無しさん2007/06/05(火) 22:49:01
配列などは使わないでできますか?
0140デフォルトの名無しさん2007/06/05(火) 23:06:30
ランダムアクセスする必要ないから、リストでできるよ。
配列のほうが簡単だと思うけどなぁ。
0141デフォルトの名無しさん2007/06/05(火) 23:13:53
わかりました
ありがとうございました
0142デフォルトの名無しさん2007/06/05(火) 23:17:05
何桁で循環するかは計算で出せるはずだが。
0143デフォルトの名無しさん2007/06/05(火) 23:47:49
10のN乗を分母で割った余りが1になる場合のNの最小値だったかな。

ちょっとググれば答えが見つかりそうじゃないか?
0144デフォルトの名無しさん2007/06/05(火) 23:55:28
10のn乗とかオーバーフローが怖いな
MPFRとか使えってか
0145デフォルトの名無しさん2007/06/06(水) 00:05:27
数学屋さんは、
1÷3×3が1になる
という前提で話をするからねぇ。

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

だからさ、
ちまちまと筆算をシミュレート
したほうが手っ取り早いと。
0146デフォルトの名無しさん2007/06/06(水) 00:38:39
>>142
どんな計算法ですか?
0147デフォルトの名無しさん2007/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を入力して下さい”が二回表示されるのですが、
色々試してみても何故なのか良く解りません。
どうかご教授賜りたく…。
0148デフォルトの名無しさん2007/06/06(水) 03:47:37
例えばaを入力してエンターを押すと
バッファに’a'と改行コードが入力される
でscanfはinputに'a'を入力する、このときまだ標準入力バッファに改行コードは残っている
そして次のループではscanfはこのLFを拾ってinputに代入してしまうわけ

解決策としてはscanfの前でflush(stdin);でも使ってバッファをクリアするのが手っ取り早い
0149デフォルトの名無しさん2007/06/06(水) 03:50:11
誤:flush
正:fflush
0150デフォルトの名無しさん2007/06/06(水) 05:04:57
だから標準入力はフラッシュしちゃダメだってば。
0151デフォルトの名無しさん2007/06/06(水) 05:20:19
>>148
なるほど!良く解ってスッキリしました。
ありがとうございます。
0152デフォルトの名無しさん2007/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);ってのはどう?
これでも環境依存でやばいかな?
0153デフォルトの名無しさん2007/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' );
としても、一見、思い通りに動いているように見える。
でも、これは間違っている。
0154デフォルトの名無しさん2007/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')) ;
という感じにする。

エラーの場合も直進するのが、ちょっとアレだが。
0155デフォルトの名無しさん2007/06/06(水) 08:40:15
>>143
たとえば142で割ったとして、各桁の余りは0~141だろ?(24か2.4か0.00024かの違いはあるが。)
ということは最長でも141桁目にはループが現れているはずだ。
よくわからなかったら筆算してみることをお勧めする。
0156デフォルトの名無しさん2007/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文字読むだけなのに…
0157デフォルトの名無しさん2007/06/06(水) 09:26:37
関数にしとけばおk
01581212007/06/06(水) 09:29:24
>>122

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

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

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

ありがとうございました。
01591222007/06/06(水) 09:46:57
>>158
たぶんWin32APIスレあたりが、良かったと思う。
0160デフォルトの名無しさん2007/06/06(水) 09:53:24
>>156
本来やりたい処理だけを書いているうちは明瞭でも、
エラー処理を入れると、途端に、ぐちゃぐちゃになるのは、
しかたないよ。
0161デフォルトの名無しさん2007/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,"+---+------+");
}
テキストの中の文字をカウントするものを組もうと思ったのですがうまくいきません。
素人のソースなのですが、どうかどこが悪いのかお教えください。
0162デフォルトの名無しさん2007/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構文なんかの使い方に問題があるような気もしますが原因がはっきりとはわかりません・・・
0163デフォルトの名無しさん2007/06/06(水) 22:04:33
>>161
まず、本物のソースコードを、そのままコピペすべし。

次に、デバッガでステップ実行すべし。
0164デフォルトの名無しさん2007/06/06(水) 22:08:43
おい、>>123はどうした。

>>126で理解できたか?
返答くらいしる!
0165デフォルトの名無しさん2007/06/06(水) 22:34:14
>>147です。
ポインタの受け渡し等実はまだ良く理解していないのですが、
入力やデバッガやエラー処理の事等色々と勉強になりました。
ありがとうございます。
0166デフォルトの名無しさん2007/06/06(水) 22:46:33
>>163
forまでは変数の宣言なんで、本物ですけど・・・
もしかして、変なこといってますか?
0167デフォルトの名無しさん2007/06/06(水) 22:47:35
>>166
for以降はです。
0168デフォルトの名無しさん2007/06/06(水) 22:53:37
現在、我流でC言語の勉強してます
教材は 「プログラミング言語C 第二版 ANSI規格 B.W.カーハンニ D.M.リッチー著」 なんですが
なんだか難しくて理解するのに大変です
初心者にお勧めの教材の本ってありませんでしょうか?

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

もし手作業で書き写したのであれば、>>161を読む意味がないんだよ。
なぜかというと・・・それは後で説明してあげるから。
0170デフォルトの名無しさん2007/06/06(水) 23:00:43
>>168
VC++ Express Editionとかあるんだから、
マイクロソフトプレスで、とっつき易そうなの探してみたら?
0171デフォルトの名無しさん2007/06/06(水) 23:15:51
>>168
その本は俗に"K&R"と呼ばれる尊敬すべき歴史的な本で、今となっては古典です。

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

言語の文法を理解しただけでは、プログラムはうまく書けないです。
いちばん実戦的な教材は、上手な人が書いたプログラムです。
プログラムを読んで、何をやっているのか把握したり、
デバッガ上で実際に動かして、ステップ実行で動きを追ったりすると、いいです。
1人のものだけでは駄目で、多くの人のプログラムを読むのが肝心です。
0172デフォルトの名無しさん2007/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回呼ぶことになってしまう。
0173デフォルトの名無しさん2007/06/06(水) 23:42:16
■ループではないのにwhile文を使うな(if文を使うべき場所でwhile文を使うな)
while( s[a] != '\0' ) {
このwhileは無限ループするぞ。

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

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





それから、
学校の宿題なら、宿題スレに行ったほうがいいと思うぞっと。
0174デフォルトの名無しさん2007/06/06(水) 23:48:12
忘れてた。

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


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

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

かなりの問題点は、デバッガでステップ実行することで、発見できる。
0175デフォルトの名無しさん2007/06/07(木) 01:21:19
catch(...)しているのに例外をcatchできないんですが、
原因は何が考えられるのでしょうか?
スタック破壊でcatchできなくなることあったりするのでしょうか?

0176デフォルトの名無しさん2007/06/07(木) 01:34:32
コンパイラおよびコンパイル時のオプション指定にもよる。
0177デフォルトの名無しさん2007/06/07(木) 02:29:05
案外、try{}の外で例外が発生していたりして。

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

案外、別のスレッドだったりして。
0178デフォルトの名無しさん2007/06/07(木) 10:56:54
C、及びC++の拡張子はそれぞれ何が標準ですか?
cだとcでc++だとcppでよいのでしょうか?
cxxとかもたまに見かけるのですが。
あとhppってどのようなときに使うのでしょうか?
0179デフォルトの名無しさん2007/06/07(木) 13:51:59
>>178
> cだとcでc++だとcppでよいのでしょうか?

ok。

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

C++でしか使えないことを暗に示すとか、
.cに対する.cppと対称のほうがカッコイイとか。
0180デフォルトの名無しさん2007/06/07(木) 14:36:36
ifの中にifは使えますか?
0181デフォルトの名無しさん2007/06/07(木) 14:42:13
>>180
{ } の中には使えますが
( ) の中には使えません。
0182デフォルトの名無しさん2007/06/07(木) 17:42:52
とある理由でオンライン対戦カードゲーム(オリジナル)を作る事に決めました。
それで質問なんですが、C++はホスト型の対戦ゲームを作るのには使えるのでしょうか?
ホストの人ににもう一人がIP接続してプレイする感じです。
対応していなければいけねい様なので・・・。
0183デフォルトの名無しさん2007/06/07(木) 17:43:52
そういう質問をする時点で前途多難だな・・・
まあキミが希望することは可能
0184デフォルトの名無しさん2007/06/07(木) 18:52:00
.NET remotingのTCPChannel使ってTCP接続でできる
ホスト側にスレッドを持たせてここの接続をそいつらで管理するようにすれば
マルチプレイも可能
0185デフォルトの名無しさん2007/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;
}
0186デフォルトの名無しさん2007/06/07(木) 20:52:12
>>185
unsigned long m = 0x00afdeb6 ;
puts(&m) ;
0187デフォルトの名無しさん2007/06/07(木) 22:35:08
>>172-174
遅くなりましたが、ありがとうございます。
小生まだ大学生でも高専生でもありませんので宿題ではないのですが、個人的な趣味にしようとおもってCを勉強しています。
大学に行けば勉強できるのですけど、早くなれて自分で簡単なゲームぐらいは作れるようにしたいので簡単なプログラムでも書いてコーディングの練習をしてみようかなと思ってやってます。
一応、フローチャートは書いておいたのですが、どうもコーディングの技術がないようで未だにポインタとか変数の型とかifやforの()内の構文なんかがまだ理解できてないみたいです。

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

また、その場合マジックナンバーを使わないとはどういうことでしょうか?
たとえば、26に初期化した整数型の変数をとってそれを利用しろということでしょうか?
0189デフォルトの名無しさん2007/06/07(木) 23:06:08
>>188
一番悪い例は、65だな。
0190デフォルトの名無しさん2007/06/07(木) 23:09:19
当方vistaユーザーなのですが、
C言語を使ったプログラムのコンパイルができず困っております。
.c→.obj→.exe という手順なのはわかるのですが・・・。コンパイルをするためのソフトウェアがあるようですが・・・
なくてもできる という書き込みも目にしました。
フリーソフトをDLして挑戦してみたもののどこかでミスが発生し失敗してしまいます。

大変無知な質問で申し訳ないのですが、どなたかご教授いただけないでしょうか。
0191デフォルトの名無しさん2007/06/07(木) 23:14:16
そのフリーソフトは何?

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

どこかってどこ?なんかメッセージとか表示されないの?
0192デフォルトの名無しさん2007/06/07(木) 23:23:46
>>190
よく分らないがCPadでも使っとけ、10分ではじめるBCCを読めば初心者でも
何とかなると思う。
ttp://hp.vector.co.jp/authors/VA017148/pages/cpad.html
Borland C++Compiler 5.5.1をダウンロードする場所が変わったから注意
ttp://www.codegear.com/jp/downloads/free/cppbuilder
0193デフォルトの名無しさん2007/06/07(木) 23:51:09
>>188
マジックナンバーってのはコード中に直接数字を書くことだね。
マクロや const int を使って文字にした方がいい。
値の意味がわかるようにするのと数字の値は変えたくなることが
多いのでいっぺんに変えられるようにってことで。
01941902007/06/08(金) 00:01:38
みなさんレス感謝。

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

申し訳ありませんがどなたか教えていただけないでしょうか?お願いします。
0196デフォルトの名無しさん2007/06/08(金) 00:51:51
大域変数の配列A[k]の2次元版
例えばA[i,j] = 2 みたいに値を入れていく表みたいなものってCではどう書けばいいのですか?
0197デフォルトの名無しさん2007/06/08(金) 00:59:23
A[i][j] = 2;
0198デフォルトの名無しさん2007/06/08(金) 01:28:42
>>197
ありがとうございます!
0199デフォルトの名無しさん2007/06/08(金) 07:40:15
>>187
> 小生まだ大学生でも高専生でもありませんので宿題ではないのですが、個人的な趣味にしようとおもってCを勉強しています。

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

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

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

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

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

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

プログラム言語も同じで、他人の書いたプログラムを読んで、使い方を覚えたほうがいいです。
今なら、オープンソースのソフトがネットでたくさん公開されているので、それらを見るのがいいです。
0200デフォルトの名無しさん2007/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' )
と書いたほうがいい。

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

(続く)
02012002007/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] ;
と直に書いても、悪くない。
0202デフォルトの名無しさん2007/06/08(金) 08:20:03
>>195
それは、
C言語限定の話ではなく、
また、
Windows限定の話なので、

C言語のスレではなく、
Win32APIのスレで質問したほうがいいよ。
02031952007/06/08(金) 08:32:37
>>202
ありがとうございます。
Win32APIのスレで改めて質問してみます。
0204デフォルトの名無しさん2007/06/08(金) 09:36:54
可変長引数をパラメタに持つ関数をラップしたいのですが、
可変長の引数を伝播することができません。
なにか簡単な方法ありますか?

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

void FunctionA(int, ...);
void FunctionAwrap(int,...);
0205デフォルトの名無しさん2007/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) ;
}

スタックの進む方向
引数をスタックに積む順序
が違うと、ヤバい。
02062052007/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) ;
}
0207デフォルトの名無しさん2007/06/08(金) 12:48:17
C++の統合開発環境でフリーソフトで使いやすいのって、何かありますか?
eclipseは重いので軽いのを教えてくださいm(__)m
0208デフォルトの名無しさん2007/06/08(金) 13:07:33
統合開発環境は、どうしても重い。
軽快さを求めるなら、スタンドアローンのエディタやデバッガを使えばいい。
0209デフォルトの名無しさん2007/06/08(金) 13:11:33
>>207
GCC & Code::Blocks
GCC & Cygwin/MinGW
GCC & Dev C++
0210デフォルトの名無しさん2007/06/08(金) 14:02:13
>>207
フリーソフトというけど、どういう意味の?

無料というだけの意味なら、
マイクロソフトのVisual Studio 2005 Express Edition
あたりはどうよ。
02112052007/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バイト消費させてしまう。
0212デフォルトの名無しさん2007/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);
}
くらいで充分だろ。
0213デフォルトの名無しさん2007/06/08(金) 18:23:34
>>208-210
レスありがとうございます。
フリーソフトというのは単に無料という程度のことです。

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

ありがとうございましたm(__)m
0214デフォルトの名無しさん2007/06/08(金) 18:46:23
ノートPCなら尚のことテキスト環境で使ったほうが楽そうだが。
#マウスに頼らないで済む→膝の上でも安定。
0215デフォルトの名無しさん2007/06/08(金) 18:56:33
VC使いだけど、あんまりマウス使わないよ。

キーボードだけでも、けっこう行けます。
0216デフォルトの名無しさん2007/06/08(金) 19:24:53
>>212
無駄なコピーが1回減ってウマーだね。
×printf(fmt, *va_arg(ap, args));
○printf(fmt, va_arg(ap, args));
0217デフォルトの名無しさん2007/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をインクリメントしながら{以下を繰り返す。

と読んでいいでしょうか?
なんだか、数学の問題集なんかで自分の思いもよらない解法で問題を解いているのを見るようで感動しました。
自分もこういうソースをかけるように精進します。
0218デフォルトの名無しさん2007/06/08(金) 19:45:28
>>217

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

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

プログラムには明確な正解はなく、人によって考え方も違う。
ある程度の失敗経験がないと理解しにくいこともあるので、
プロでなければ、あんまり気にしなくていいと思う。
0219デフォルトの名無しさん2007/06/09(土) 00:02:08
#ifdef 0 〜 #endif
で囲まれたコードを消してくれる整形ツールの様な物はありますか?
0220デフォルトの名無しさん2007/06/09(土) 00:12:31
配布されてるものでは知らないけど
それくらいのプログラムならすぐ作れるでそ
0221デフォルトの名無しさん2007/06/09(土) 00:17:31
>>219,>>220
いま、俺、まさにそんな類のことができるツール書いてるとこなんだけど、マジメにやってたら結構面倒。
0222デフォルトの名無しさん2007/06/09(土) 00:20:08
>>219
よかったな。
>>221が作ってくれてるってさ。
0223デフォルトの名無しさん2007/06/09(土) 00:27:45
>>220
作るのはメンドイので既に有る物を使おうと思ってました。
ググったんですが中々見つからなくて・・
もうちょっと探してみます。
0224デフォルトの名無しさん2007/06/09(土) 00:51:38
>>223
見つけたら是非、教えてくれ。そしたら俺も幸せになれるかもしれん。
0225デフォルトの名無しさん2007/06/09(土) 00:58:00
そういえばプリプロセッサじゃだめなの?
0226デフォルトの名無しさん2007/06/09(土) 01:06:28
>>225
インクルードされちゃうし、その他モロモロも全部展開されちゃう。
・・・って、Cプリプロセッサってモノによってはいろいろオプションが
あるし用途によってはそれで事足りるかもね。

俺が、いま作ってるのも実のところ拡張Cプリプロセッサだし。
0227219,2232007/06/09(土) 03:38:15
>>224
幾つか見つけましたがコレでやりたいことはできました。
ttp://www.geocities.jp/makikoh76425/TransferCLang.htm
0228デフォルトの名無しさん2007/06/09(土) 07:27:21
chraの四則演算はSSEを使えば16倍速くなるのですか?
0229デフォルトの名無しさん2007/06/09(土) 08:08:26
>>227
�d。でも、よりによってGUIかよ。俺の用途にはちとマッチしねぇ。
0230デフォルトの名無しさん2007/06/09(土) 08:18:32
>>228
chraってなんですか?
0231デフォルトの名無しさん2007/06/09(土) 09:41:08
>>229
GUIだからといって人間が毎回ちまちまと操作しなきゃいけないってことはない。

CUIでラップしてやりゃぁいいじゃないか。
いちいち画面にウィンドウが出るのが・・・とか言うのは、Windowsプログラマとしては無知すぎるぞ。
0232デフォルトの名無しさん2007/06/09(土) 09:41:29
>>230
お前もしかしてチラ(chra)知らんのか?
0233デフォルトの名無しさん2007/06/09(土) 12:09:30
ここでチラの話はやめようや…
また荒れそうだし
0234デフォルトの名無しさん2007/06/09(土) 14:42:53
つ http://keyword.livedoor.com/w/Chra
0235デフォルトの名無しさん2007/06/10(日) 16:03:03
最近のチラシは両面印刷で書くとこないんだよな
0236デフォルトの名無しさん2007/06/10(日) 18:42:34
basic_streamの拡張のうまい方法なんか説明したサイトか書籍しりませんか?
マルチスレッド対応とかにしたいんですけどいまいちあの3文字、4文字の
なんの意味か不明な記号列に苦しめられてます。
0237デフォルトの名無しさん2007/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と表示されてしまいます
しかし直接、数値を指定してやるとちゃんとした文字数が表示されます
ここには記号定数名は使えないってことでしょうか?
そうだとちょっと不便ですね
何か良い方法ありませんか?
0238デフォルトの名無しさん2007/06/12(火) 01:22:31
>#define STR_SIZE 157
>
>char str1[STR_SIZE];

なんだよ、その超中途半端なサイズはw
0239デフォルトの名無しさん2007/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つの文字列を与えたとき,一つ目の文字列の中に二つ目の
文字列が含まれている場合(この場合先頭が必ずしも一致していなくてもよいものとする)
には "一致"をさもなければ"不一致"を出力するプログラムを作成しなさい.
0240デフォルトの名無しさん2007/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;
}
0241デフォルトの名無しさん2007/06/12(火) 03:00:02
>>240
エラー内容も書けよ。
0242デフォルトの名無しさん2007/06/12(火) 03:09:35
>>241
エラー内容も書いてくださいませ と言うように
0243デフォルトの名無しさん2007/06/12(火) 03:29:58
申し訳ありません。
エラー内容は、
警告 W8004 sample5.c 21: 'b' に代入した値は使われていない(関数 main )
警告 W8004 sample5.c 21: 'a' に代入した値は使われていない(関数 main )
です。以後気をつけます。すみませんでした。
0244デフォルトの名無しさん2007/06/12(火) 03:38:00
>>243
それは警告であってエラーではない。
int型のa,bに値を入れてるけど、その値を参照してないからコンパイラが
警告だしてるだけ。動作に問題は無い。
0245デフォルトの名無しさん2007/06/12(火) 03:44:53
>>244さん、ありがとうございます。
確かに実行してみたら正常に動作しました!
こんな時間に助けていただきありがとうございました!
0246デフォルトの名無しさん2007/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」はバグなんですか?

なにぞとよろしくお願いします。(泣)
0247デフォルトの名無しさん2007/06/12(火) 18:54:28
丸め誤差
0248デフォルトの名無しさん2007/06/12(火) 18:58:46
>>123の質問の次のレスは読んでないのか。
0249デフォルトの名無しさん2007/06/12(火) 19:39:34
自分はJavaをやろうとしたのですが、教本がちんぷんかんぷんだったので、
プログラミング言語の雰囲気だけ知っておこうと思い、Cの本を読み漁りました。
おかげでつまづいていた部分は何とか理解できたのですが、
ポインタの部分でつまづき、Cの理解を半ばにJavaに移行しようか、迷っています。
他言語に移る前提ならポインタ等C特有の概念の理解を飛ばしてもOKでしょうか?

後学のためになるなら喜んで労力を払いたいのですが、
なにぶんCを先達の方々のように使いこなせる自信がありません…
0250デフォルトの名無しさん2007/06/12(火) 19:45:56
> ポインタ等C特有の概念
( ゚д゚)ポカーン
0251デフォルトの名無しさん2007/06/12(火) 19:54:16
>>250
そうだな。ポインタなんて Pascal、PL/M、C++ にもあるもんな。

>>249
ここで訊くことじゃないと思うんだが。
まあ Java に戻ればいいんじゃね?
0252デフォルトの名無しさん2007/06/12(火) 20:01:05
いきなり無知を晒してしまって恐縮ですorz
いっそう自信を無くしたのでCは諦めます(-_-;)
0253デフォルトの名無しさん2007/06/12(火) 20:06:17
ポインタ演算を除けばJavaの参照みたいなもんだろ
0254デフォルトの名無しさん2007/06/12(火) 23:06:31
Visual C++2005 を使い始めました。
フォームにピクチャーボックス1つとボタンを2つ配置しました。
1つ目のボタン(開始)をクリックすると、
ピクチャーボックスにグラフのようなものを書くようなプログラム
をつくりました。
ここまでは上手く動作しています。
次に、2つめのボタン(停止)で、
グラフの描写(For文で繰り返しているため時間がかかります)
を途中で一時停止させたいのですが、
グラフをすべて書き終えるまで、ボタンが押せる状態になりません。
どのような方法を使えばいいのか教えてください。
よろしくお願いします。
分かりにくくてすみません。
0255デフォルトの名無しさん2007/06/12(火) 23:17:07
C/C++の問題じゃない。
Win32ApiだかMFCだか.NETだか分からないがソッチのスレのが良いかと。

とりあえずWin32APIかMFCなら、デフォルトのWindowProcじゃなくて、
自分で回してるfor文中でイベントの取得と処理をやることになると思われ。
0256デフォルトの名無しさん2007/06/12(火) 23:37:32
エスパーするとスッドレを使うべし
0257デフォルトの名無しさん2007/06/12(火) 23:45:06
x68k環境用(ぶっちゃけいうとTI-89)でC++使うと
コンパイラがどんなに頑張ってもstd::cout << "Hello, World!" << std::endl;
だけで5kbytesになるって本当ですか?
ちなみにC(TIGCC)のprintf("Hello, World!\n")だと700bytes程でした
02582542007/06/12(火) 23:46:09
>>255
アドバイスありがとうございます。
ちなみに、プロジェクトの種類はCLR
テンプレートはWindowsフォームアプリケーション
を使っています。
スレを汚してしまい、すみませんでした。

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

0259デフォルトの名無しさん2007/06/13(水) 10:55:25
>>257
x68kて…w
誰も知らないだろ。
サイズがでかくなるのは最適化が弱いだけじゃね?
0260デフォルトの名無しさん2007/06/13(水) 11:12:26
>>257
それは、全てスタティックリンクされているのか?
printf()の実装だけで、軽く数十キロバイトにはなるはずだぞ。
0261デフォルトの名無しさん2007/06/13(水) 13:14:50
リアルタイムで動くゲーム作ってます
マルチスレッドについて教えてください
それ使うと全体の実行速度は速くなりますか?
もし速くなるならたくさん使えば使うほど速くなりますか?
0262デフォルトの名無しさん2007/06/13(水) 14:36:54
>>261
すでにCPU100%使ってるなら、さほど変わらないだろう
別にマルチスレッドにしたからって、CPUの限界を超えられる訳じゃない

http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89
0263デフォルトの名無しさん2007/06/13(水) 15:31:58
>>237
> scanfの文字数の部分に#defineで定義した記号定数名を入れ

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

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

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

もしかしたら、一見正しく動いているように見えても、トンデモナイ大間違い。
0264デフォルトの名無しさん2007/06/13(水) 15:33:26
>>243
エラーや警告のメッセージが出たら、ちゃんと読もうよ。

読まない人がほんとうに多い。
メッセージを読まないのは、パソコンのドシロウトだけにしてくれ。
0265デフォルトの名無しさん2007/06/13(水) 15:36:39
え?
「メッセージを読まないのは、パソコンのドシロウトだけ」、だろ
02661262007/06/13(水) 15:55:26
>>246
どうやら察しの悪い人のようなので、諦めて、答えを書くよ。

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

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

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

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

コンピュータで小数がどのように扱われるのか勉強しよう。
0267デフォルトの名無しさん2007/06/13(水) 16:03:41
>>249
C言語のポインタくらいで、つまずくようでは、先が思いやられる。

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

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

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

それから、本に書いてあることを読んだだけでは、はっきりとは理解できないこともあるので、
実際にプログラムを書いて、デバッガ上でステップ実行して確かめるのも大切なことです。
0268デフォルトの名無しさん2007/06/13(水) 16:05:39
>>254
スレ違い。

ちなみに、
ボタンの押下に対するハンドラは、速やかに制御を返すべき。
時間のかかる処理を、そのコンテキストでやってはいけない。
0269デフォルトの名無しさん2007/06/13(水) 16:09:24
>>257
本当かどうか、自分で試してみればいいじゃないか。

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

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

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

だから、OSのスレッドの機能の勉強をしてください。
0270デフォルトの名無しさん2007/06/13(水) 16:31:45
>>262,>>269
申し訳ない
出直してくる
0271デフォルトの名無しさん2007/06/13(水) 21:03:47
みんなガンバレ!

言葉はキツいが諸先輩方は応援してるぞ。
0272デフォルトの名無しさん2007/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();

}
0273デフォルトの名無しさん2007/06/14(木) 01:18:02
無理
0274デフォルトの名無しさん2007/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);

}
0275デフォルトの名無しさん2007/06/14(木) 11:01:35
>>272 >>274
言わないと気づかないだろうたからあえて言うが、無駄な改行はやめてくれ。
見づらい。
0276デフォルトの名無しさん2007/06/14(木) 11:42:36
>>275
改行にも意味があるのだが。
0277デフォルトの名無しさん2007/06/14(木) 11:44:38
レスの改行? \n のこと?
0278デフォルトの名無しさん2007/06/14(木) 14:48:21
レスの空行に決まってるだろ。
0279デフォルトの名無しさん2007/06/14(木) 14:51:50
だったら意味無い気が。ソースの空行だべ
0280デフォルトの名無しさん2007/06/14(木) 14:56:09
>>276 のいう「意味」とやらを訊こうか。
いや引っ張る程の話じゃないから、やっぱりいいや。
02812742007/06/14(木) 16:35:11
え、改行が多すぎる?

1行毎に改行を入れているつもりではないけど、結果的に、そうなっちゃってるねぇ。
0282デフォルトの名無しさん2007/06/14(木) 16:39:45
多すぎるよ。意味の区切れでもないのに空行なんか要らない。
0283デフォルトの名無しさん2007/06/14(木) 17:35:12
こまけーw
0284デフォルトの名無しさん2007/06/14(木) 22:29:39
>>274
個人的にはインデントが無い前提なら、このぐらいの空行のが見やすい。
まぁ人それぞれじゃね?
0285デフォルトの名無しさん2007/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
0286デフォルトの名無しさん2007/06/14(木) 23:17:23
VC++.NET2003を使っています。

CPointをint型に入れたいのですがどのようにすればよいのでしょうか。
どうか、教えてください。
0287デフォルトの名無しさん2007/06/14(木) 23:21:06
CPoint pt(10, 20);
int n = pt.x << 16 | (0xFFFF)pt.y;
0288デフォルトの名無しさん2007/06/14(木) 23:21:25
無理言うな
0289デフォルトの名無しさん2007/06/14(木) 23:22:03
ちがった、こうやりたかった。
int n = pt.x << 16 | (0xFFFF & pt.y);
0290デフォルトの名無しさん2007/06/14(木) 23:23:27
CPoint pt;

int x = pt.x;
int y = pt.y;
0291デフォルトの名無しさん2007/06/14(木) 23:27:13
>>287
>>288
>>289
>>290
ご返答、ありがとうございます。

あの、int x=みたいな初期値を設定するようなやり方じゃなければ
入れることが出来ないのでしょうか?
0292デフォルトの名無しさん2007/06/14(木) 23:34:31
そんなことは無い。
単に変数宣言せずに書くのが嫌で、
2行に分けるのが面倒だっただけだと思うが。
0293デフォルトの名無しさん2007/06/15(金) 00:33:24
>>292
そうでしたか。
ここまでのお付き合い、本当にありがとうございました。
0294デフォルトの名無しさん2007/06/15(金) 01:01:20
最近C++の勉強をはじめたのですが、どうもCのような設計になりがちで困ってます。
クラス内で作成する関数なんですけど、良く使うキー情報は関数にパラメータを増やして
渡すやり方はC++ではあまりしないんですかね?
クラスのメンバ変数にすると便利そうなんですが、知らないうちにメンバ変数が
どんどん増えていって、収拾がつかなくなることが多くついついパラメータ渡しに
なってしまいます。いまのやり方はまずいですかね?
0295デフォルトの名無しさん2007/06/15(金) 02:06:08
・まずはどういう処理について述べているか、具体的に(例でもいいから)挙げてください
・クラス内で作成するって何を作成する関数なんですか?
・キー情報って何ですか?
0296デフォルトの名無しさん2007/06/15(金) 03:17:47
>>285
まずは、デバッガ上でステップ実行しろ!

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

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

ということで、原因はわかるが、あえて、教えない。
他の人も教えるなよ!
0297デフォルトの名無しさん2007/06/15(金) 03:25:29
>>294
> 良く使うキー情報は関数にパラメータを増やして渡すやり方

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

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

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

そういうのはCとC++で違いはないよ。
0298デフォルトの名無しさん2007/06/15(金) 06:11:00
入力された数値がマイナス数値だった場合それを自然数に変えるにはどうやるんですか?
0299デフォルトの名無しさん2007/06/15(金) 06:32:40
入力した数値を2に変える。3でも良いけど。
0300デフォルトの名無しさん2007/06/15(金) 09:41:16
オレだったら4かな、、、って
abs()の事を聞いてるのか?
0301デフォルトの名無しさん2007/06/15(金) 11:13:42
>>298
何をしたいのが不明瞭。

このスレで質問する人は、C/C++が云々という以前に、日本語が不自由すぎる。
0302デフォルトの名無しさん2007/06/15(金) 15:10:46
わかるように書いて質問すれば、
より早く適切な答えを貰えるのにね。
0303デフォルトの名無しさん2007/06/15(金) 15:13:26
自分でも何をしたいのか分かってないんだろ。
この程度のレベルなら、人に説明できれば自ずから解決できる。
0304デフォルトの名無しさん2007/06/15(金) 15:28:30
プログラミング云々という以前に、
問題を切り分ける気がないんだろう。

たとえば>>285みたいなのは、
問題を切り分けていけば、
おのずと原因がわかるのだが。
0305デフォルトの名無しさん2007/06/15(金) 15:29:18
int a;

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

もしくは

int a;

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

ってこどだろ?
03062982007/06/15(金) 15:54:33
5が入力されたら5
マイナス5を入力されても5として扱う方法を聞こうと思ったんですが、、
自分にレスしてくれたんじゃないかもしれないけど305をヒントにできました。
0307デフォルトの名無しさん2007/06/15(金) 16:01:25
そういうのを絶対値と呼ぶんだってことは中学生でも知ってそうなもんだがな
03082982007/06/15(金) 16:03:48
小学生ですが何か?
来年から中学ですけど
0309デフォルトの名無しさん2007/06/15(金) 16:05:41
入力した負の数に-1かけりゃいい話だがや
03102982007/06/15(金) 16:10:17
だから、もうわかったって言ってるだろ
しつこい馬鹿
0311デフォルトの名無しさん2007/06/15(金) 16:11:54
しつこい馬鹿
0312デフォルトの名無しさん2007/06/15(金) 16:24:31
変数を宣言して初期化する場合、普通は

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

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

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

0313デフォルトの名無しさん2007/06/15(金) 16:27:36
>>312
天才
0314デフォルトの名無しさん2007/06/15(金) 16:42:21
>>305
intが32ビットや64ビットで、
負の最大値のような巨大な数字が入力されたら、
大変だぞ。

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

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

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

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

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

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

>>310
うわぁ。
プログラミングの勉強よりも、対人コミュニケーションの勉強しようよ。
0315デフォルトの名無しさん2007/06/15(金) 16:49:25
>>312
コンパイラの最適化を有効にしていれば、
どっちでも同じコードが出力されると思うぞ。

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

面倒でも、
int a = 1 ;
int b = 2 ;
int c = 3 ;
としたほうがいい。
0316デフォルトの名無しさん2007/06/15(金) 19:17:02
>>126>>266
ありがとうございます。書くの遅くなりましたが解決できました。本の後ろの方に書いてありました。
回答ありがとうございました。

「7」についてなんですが、本には「0」って書いてあるんです。
でも実行ファイルにすると「7」と表示されるんでバグなのかな?って思って聞いてみました。
0317デフォルトの名無しさん2007/06/15(金) 19:59:47
>>316
ライブラリの実装の違いかもしれない。

いずれにしても、
floatやdoubleは内部では二進数なので、
10進数との相互変換は100%完璧にはできない。
0318デフォルトの名無しさん2007/06/16(土) 01:08:58
>if (a < 0) a = 0 - a ;
if (a < 0) a = -a;
0319デフォルトの名無しさん2007/06/16(土) 01:19:18
マイナスを前に付ければ符号反転なんだけどさ、
算数的には、0から引いたほうが、わかりやすいっしょ。

いまどきのコンパイラは、両者で出力するコードが変りはしないし。
0320デフォルトの名無しさん2007/06/16(土) 01:27:49
>算数的には、0から引いたほうが、わかりやすいっしょ。
  ??????
0321デフォルトの名無しさん2007/06/16(土) 01:28:13
どっちでもいい
0322デフォルトの名無しさん2007/06/16(土) 01:29:38
算数的ではなく314的だろ
0323デフォルトの名無しさん2007/06/16(土) 06:36:33
314のマスターベーションだろ?
0324デフォルトの名無しさん2007/06/16(土) 17:13:26
じゃ結論はこうってことで、 a * -1
03252852007/06/16(土) 17:18:08
do while 内のifを外したところ解決しました。
お騒がせしましたm(__)m
0326デフォルトの名無しさん2007/06/16(土) 17:20:55
>>325
>>296の言うとおり、デバッガ使った?
0327デフォルトの名無しさん2007/06/16(土) 17:23:13
>>325
一応聞いておくけど、なんでifを外せばいいのかは理解してるんだよね?
というか、ifを外して良いのか?
バグを修正すべきなんじゃないのか?w

>if ((Sr.Attr & Attributes) == Sr.Attr) {
この式、変じゃない?
Attributesと&取ってて、その結果が Sr.Attrであるためには、
Sr.Attr == Attributesでなくてはならないのでは?
0328デフォルトの名無しさん2007/06/16(土) 17:27:51
while(gets(str);strcmp(str,"quit"); )

って書き方はありですか?
0329デフォルトの名無しさん2007/06/16(土) 17:29:36
間違えました

for(gets(str);strcmp(str,"quit"); )

でした
for文しか使えなかった場合の話で
0330デフォルトの名無しさん2007/06/16(土) 17:29:41
なしです。
こうしてください。

while(fgets(str, sizeof(str),stdin) && strcmp(str,"quit") )
0331デフォルトの名無しさん2007/06/16(土) 17:31:29
for(fgets(str, sizeof(str), stdin); str&&strcmp(str,"quit");fgets(str, sizeof(str), stdin) )
0332デフォルトの名無しさん2007/06/16(土) 17:32:55
ちがった、こうかな。
for(fgets(str, sizeof(str), stdin);EOF!=*str&&strcmp(str,"quit");fgets(str, sizeof(str), stdin) )
0333デフォルトの名無しさん2007/06/16(土) 17:34:49
>>330
出来るだろうけど、fgetsは改行コードまで取るから、
"quit"に改行コード入れるか、strncmp使うか、
何かしないと狙い通りに動かんと思うよ
03342962007/06/16(土) 18:45:16
>>325
解決してよかったね。

ちなみに今回の質問の件とは違うが、まだバグが残ってる。
ディレクトリ名の末尾が.mp3の場合もファイルとして扱ってしまう。
int Attributes = faAnyFile ;
↓
int Attributes = faAnyFile ^ faDirectory ;
にして、ディレクトリ名は取得しないようにしたほうがいい。


>>327
条件文自体は間違ってないよ。

(Sr.Attr & Attributes) == Sr.Attr
というのは
(Sr.Attr & ~Attributes) == 0
と同じことだからね。

適当にテストプログラムを書いてステップ実行して、
TSearchRec::Attrに渡される値をみてみなよ。
Borland氏ね!と叫びたくなること請け合いだよ。
0335デフォルトの名無しさん2007/06/16(土) 19:00:59
>(Sr.Attr & Attributes) == Sr.Attr
>というのは
>(Sr.Attr & ~Attributes) == 0
>と同じことだからね。

本当に?
(Sr.Attr & Attributes) == Attributes
ではなくて?
03362962007/06/16(土) 19:20:10
>>335
ごめん、間違ってた。その通りです。

だがしかし、
(Sr.Attr & Attributes) == Attributes
や
(Sr.Attr & Attributes)
に直しても、問題は解決しないのよ。

VCLの定数faAnyFileは0x3Fで、
TSearchRec::Attrに返される値は
圧縮ファイルの場合には0x800がORされているから。

faAnyFileを-1に変更するか、
0x3Fを指定された場合にはVCLのリファレンスヘルプに書いてない隠しビットフラグ0x800を立てるのをやめるか、
どっちかにしてほしいぞ > Borland

FindFirstがフィルタしてるんだから、自前でもう一度フィルタしようとするのが変といえば変なのだが。
0337デフォルトの名無しさん2007/06/16(土) 19:38:56
いやあのね、それ、DOSの頃からのファイル属性の仕様だから(無属性が通常ファイルは)。
VCL上だけ変えたら、よけい混乱する人が続出するだけ。
03382962007/06/16(土) 22:06:28
>>337さんの書き込みを見て気がついた。

> ごめん、間違ってた。その通りです。
↑は前言撤回。
やっぱり間違っていなかった。

>>327と>>335が間違ってる。
0339デフォルトの名無しさん2007/06/16(土) 22:23:05
>>337
(Sr.Attr & Attributes) == Sr.Attr
(Sr.Attr & ~Attributes) == 0
これらは、無属性の通常ファイルの場合も、真になるよ。

フィルターとしては、
指定した属性以外がついているファイルを除外する
ということになる。
0340298,3062007/06/17(日) 04:47:51
>>314
やっぱりあったんですか・・。絶対値って言葉が出てきませんでした。
教えていただきありがとうございます。
自分は308ほど若くは無いですが、高校生くらいまでは学校の勉強に集中するのは同意します。
ていうか小学中学の時点でプログラム組めるとそれで数学やっちゃいそうで計算力が多分付きませんね。
プログラムは半年くらいしかまだやってないですけど、
プログラム以外の事も覚えなきゃなぁ〜とは思っています。。
0341デフォルトの名無しさん2007/06/17(日) 11:10:21
Windows Vista にて
普通のサーバープログラムを sexe でサービスに入れたのですが
通知領域(タスクトレイ)にアイコンが表示されません。
サーバー機能は問題なく動作しているようです。
もちろん「ディスクトップとの対話をサービスに許可」していますし
Shell_NotifyIcon のタイムアウト処理も行い
msgTaskBarRestart によるタスクトレイ再登録も行っています。

直接の原因は Shell_NotifyIcon が全て ERROR_TIMEOUT に
なってしまっていることのようです。(1秒スリープで20回トライ)
対応策はあるのでしょうか?
やはり サービスプロジェクトで書き換えるしかない?
0342デフォルトの名無しさん2007/06/17(日) 11:40:57
↑の書き込みで”全て ERROR_TIMEOUT ”と書きましたが、
”全て ERROR_TIMEOUT 以外”の間違いでした。
これから調べます。すみません。
0343デフォルトの名無しさん2007/06/17(日) 11:51:40
調べたら ERROR_FILE_NOT_FOUND だった。
Shell_NotifyIcon で ERROR_FILE_NOT_FOUND って
何のファイルが無いんだ??? さっぱりわからん。

ちなみにサービス起動でない場合はちゃんとアイコンは表示されます。
0344デフォルトの名無しさん2007/06/17(日) 14:24:46
>>341
それは、C/C++の質問というよりは、Win32APIの質問だ。
Win32APIのスレで質問しなおしたほうがいい。

質問し直しても、
設計が悪い、Windowsのアーキテクチャを理解しろ、
なんて言われるのがオチだが。
0345デフォルトの名無しさん2007/06/17(日) 16:41:34
>>344
了解。
0346デフォルトの名無しさん2007/06/19(火) 00:40:49
char *p[3] は char p[][3] と同じ意味でしょうか?
0347デフォルトの名無しさん2007/06/19(火) 01:11:34
違います。
0348デフォルトの名無しさん2007/06/19(火) 01:23:23
そうですか...
char **p[3] は char p[][3] と同じ意味でしょうか?

0349デフォルトの名無しさん2007/06/19(火) 01:28:22
*はヒープ領域、[]はスタック領域を扱う。
だから、
char* p[3];
p[0] = new char[10];
ということはできても、
char p[][3];
p[0] = new char[10];
ということはできない。
0350デフォルトの名無しさん2007/06/19(火) 01:32:59
>>349
むずかしす、難しいすぎて理解できません、orz
0351デフォルトの名無しさん2007/06/19(火) 01:39:00
char *p[3] は、要素数3の配列で、要素はchar 型のポインタ

char p[][3]; は…こんな型はない。これは配列初期化時の特殊な構文。

char p[][3] = {{1,1,1},{2,2,2}}; とすれば、char p[2][3] = {{1,1,1},{2,2,2}}; だし、
char p[][3] = {{1,1,1},{2,2,2},{3,3,3}}; なら、char p[3][3] = {{1,1,1},{2,2,2},{3,3,3}}; だし、
上の二つは、左辺だけを見れば、一見同じ型のように見えるが、実際に宣言されているのは異なる型。

繰り返すが、char p[][3] という型はない。
Cの配列は、サイズ固定。 

0352デフォルトの名無しさん2007/06/19(火) 01:41:12
×char p[][3]; は…こんな型はない。これは配列初期化時の特殊な構文。
○char p[][3]; は…こんな型はない。これは配列宣言時の特殊な構文。
0353デフォルトの名無しさん2007/06/19(火) 01:50:07
>>351-352 型がキーワードみたいですが、型って何ですか?
0354デフォルトの名無しさん2007/06/19(火) 01:59:31
ここでいう型とは、「データ型」のこと。
ビット列で表されるデータを、どう解釈するか、ということの取り決め。

二進表記で、01100101 は、数値型の取り決めでは 十進数の101をあらわし
同じデータを、文字型ではアスキーコードと解釈して 'A' になる。

あくまでも取り決めであって、それ自体が自ら意味を持っているわけではない。
それぞれの型が、何を意味しているかは、一つ一つそのルールを覚えなければ
理解することはできない。
0355デフォルトの名無しさん2007/06/19(火) 10:10:08
>>349
>*はヒープ領域、[]はスタック領域を扱う。
はい?
おまいはPascal出身か?
0356デフォルトの名無しさん2007/06/19(火) 17:43:03
>>346
関数の仮引数という状況においてだけは、同じ意味になる
0357デフォルトの名無しさん2007/06/19(火) 23:06:30
PSDKのサンプルにあったんだが
CAllocator::CAllocator(HRESULT& hr, HWND wnd, IDirect3D9* d3d, IDirect3DDevice9* d3dd)
: m_refCount(1)
, m_D3D(d3d)
, m_D3DDev(d3dd)
, m_window( wnd )
{
  ....
}
っていう関数の定義があったんだが、引数リストの後、コロン以降はどんな意味がある?
検索したが、検索しにくくて見つけることが出来なかった
0358デフォルトの名無しさん2007/06/19(火) 23:12:00
適当に数字を入力してもらってその数だけ配列を用意したいのですが、どうすれば
できるのでしょうか?

イメージではこんな感じで宣言したい。でもこれだとエラーでる(´・ω・`)
cin>>num;
int i[num];
0359デフォルトの名無しさん2007/06/19(火) 23:14:32
>>357
つ[初期化指定子]

>>358
つ[c99]
つ[std::vector]
0360デフォルトの名無しさん2007/06/19(火) 23:15:04
int*i;
i=new int[num];
0361デフォルトの名無しさん2007/06/19(火) 23:26:58
>>359-360
ありがとうございます。できました(゚∀゚)
これでi[255]なんてぶさいくな宣言せずにすみます
0362デフォルトの名無しさん2007/06/20(水) 05:39:27
delete するの忘れないようにな
使い捨てのコードなら別にいいけど
03633572007/06/20(水) 09:30:27
>>359
検索できた!ありがとう!
ぱっとみ難解だが頑張るよ!
0364デフォルトの名無しさん2007/06/20(水) 14:23:53
>>349
ヒープかスタックかは、型で決まるのではないぞ。
0365デフォルトの名無しさん2007/06/20(水) 21:49:43
>>364
>349は型に言及しているわけではないぞ。
#勿論、演算子に決まるわけではないが。
0366デフォルトの名無しさん2007/06/20(水) 22:01:34
レジスタ割り当てってのもあるぜ。
0367デフォルトの名無しさん2007/06/20(水) 22:10:19
レジスタの前に静的領域を思い出そうぜ。
0368デフォルトの名無しさん2007/06/20(水) 23:40:50
C++でPCAのライブラリ的なものってどっかにあったりしませんか
0369デフォルトの名無しさん2007/06/24(日) 16:39:47
自動配線ツールをCで書こうと思ってるんですけど。
アルゴリズムはmazeをベースで。

書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか?
アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。
サンプルなどがあればと思って質問させていただきました。
誘導していただければ幸いです。
0370デフォルトの名無しさん2007/06/24(日) 17:40:31
マルチするな
0371デフォルトの名無しさん2007/06/25(月) 05:36:17
>>369
「自動配線ツール」だけで通じると思うな。

0372デフォルトの名無しさん2007/06/25(月) 17:12:26
例えば2乗や3乗の時はpowよりもa*aやa*a*aとした方が速いですが、
何条ぐらいまでかけ算に展開した方が速いのですか?
コンパイラは最適化時に自動的に展開してくれるのでしょうか?
0373デフォルトの名無しさん2007/06/25(月) 17:34:19
やってみりゃいいじゃん
0374デフォルトの名無しさん2007/06/25(月) 17:48:47
>>372
学校の宿題っぽいな。
0375デフォルトの名無しさん2007/06/25(月) 20:59:31
っ 実測
0376デフォルトの名無しさん2007/06/25(月) 21:05:17
powのソース嫁

実装をみれば、ああなるほど、と思うぞ。
0377デフォルトの名無しさん2007/06/25(月) 22:17:07
自己参照構造体で、リストの最後尾にデータを追加しようとしています。
エラーが出て困っています。何かわかりましたら教えてください。

構造体が以下のとおりで、
struct list {
  double x;  double y;  double z;
  struct list *next;
};

以下のように呼び出してるのですが、
=========================================
  struct list *listp;  //宣言
   〜〜中略〜〜
  listp = add_list(x,y,z,listp);
=========================================
struct list *add_list(double x, double y, double z, struct list *listp){
  struct list *p;

  if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) {
    printf("malloc error\n");
    exit(1);
  }
  p->x = x;  p->y = y;  p->z = z;
  p->next = NULL;
  listp->next = p; //←←実行時にここでエラーが出ます。

  return p;
}
0378デフォルトの名無しさん2007/06/25(月) 22:29:54
>>377
このスレで何度も言っていることだが・・・

プログラムは省略せず全部コピペしろ!
どんなエラーメッセージが出たのか書け!
デバッガでステップ実行しろ! (変数の値のチェックもな!)

がんばれ。
0379デフォルトの名無しさん2007/06/25(月) 22:58:22
>378のいうとおりなのだが、書いてある範囲で怪しいのは
listp = add_list(x,y,z,listp);
のlistpには何が入っている?
中略がどうなっているかわからんが初めはあさっての方向を
指しているぞ。
03803722007/06/26(火) 02:38:22
やってみたら5乗あたりで抜かれるね
0381デフォルトの名無しさん2007/06/26(火) 07:57:55
そして8乗はx *= x; x *= x; x *= x;に抜き返される悪寒。
後は、精度の問題が出るような数値のときにどうするかだな。
0382デフォルトの名無しさん2007/06/26(火) 10:08:30
ある vector< vector<string> > A と vector< vector<string> > B があって、
Aの1列目とBの1列目が同じIDの集合をもっています。

そこで、Aのsort(たとえばAの2列目を昇順)を実行したときに、BもAと同じ順番に
連動してsortしたいのですが、どのようにすればよろしいでしょうか?
0383デフォルトの名無しさん2007/06/26(火) 10:11:40
その中略の中にlistpの初期化や代入が無かったら
add_listのlistp->next = p でこけるのはあたりまえ。
0384デフォルトの名無しさん2007/06/26(火) 11:19:32
>>383
アンカーくらいつけようよ。

>>382
先ず、Aの2列目をキーにBをソート、然る後にAをソート。
0385デフォルトの名無しさん2007/06/26(火) 13:18:08
>>384
なるほど。ありがとうございました。
0386デフォルトの名無しさん2007/06/26(火) 13:37:17
>>381
powの実装も、
乗数が整数の場合には、
だいたいはそれなんだけど、
ループ回数が可変だから、
どうしてもオーバーヘッドが。
0387デフォルトの名無しさん2007/06/26(火) 13:54:31
>>382
そもそもAとBを分ける必要はあるの?
そして、1列目がID、2列目が何か、というように役割が決まっているなら、どうして構造体にしないの?

typedef struct {
string ID ;
string 何か ;
vector<string> A ;
vector<string> B ;
} HOGE ;

vector<HOGE> AB ;

こういうのじゃ駄目なの?
03883872007/06/26(火) 14:03:09
ちなみに、頻繁にソートかけるなら、

vector<HOGE> AB ;
とは別にソート用に、
vector <HOGE*> AB_PTR ;
を用意して、AB_PTRのほうをソートする。

そしたら今度は、
ABとAB_PTRを同期させる必要が出てくるので、
ABとAB_PTRを裸で見せるのはやめて、クラスでラップする。
0389デフォルトの名無しさん2007/06/27(水) 02:27:37

A ? TRUEの処理 : FALSEの処理;

っていう書きかたを最近知ったのですが
Aが変数ならこの書きかた出来るんですがAが関数の場合はエラーになってしまうんですが
どうやっても無理ですか?
0390デフォルトの名無しさん2007/06/27(水) 02:37:27
>>389
関数の返り値で分岐させたいってこと?
普通に出来るんだが…

コードかエラーメッセージでも挙げてみてくれ
0391デフォルトの名無しさん2007/06/27(水) 03:00:20
すいません今関数作ってやってみたら成功しました

エラー出てたのは関数じゃなくて#defineだったからなのかもしれませんorz
Windowsプログラムになってしまうんですが、こういう事出来ないかなと。


//ウィンドウ生成
hWnd = CreateWindow(
〜略〜
) ? 処理TRUE : 処理FALSE;


error C2440: '=' : 'BOOL' から 'HWND' に変換できません。
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャスト
または関数スタイル キャストが必要です。


とりあえず今は上のようには書かずに次の行にこう書いて妥協してます
hWnd ? 処理TRUE : 処理FALSE;
0392デフォルトの名無しさん2007/06/27(水) 03:24:13
Cond ? 処理TRUE : 処理FALSE;
条件演算子を使う場合、処理TRUEと処理FALSEの値の型は同じか、
または処理FALSEの型から処理TRUEの型への暗黙の変換が可能でなければならない。

つまり型(クラス)HogeとFooとの変換が定義されていない場合、
Cond ? Hoge() : Foo();
のようなことは出来ない。

あと、式の値を再利用する必要がないなら素直に
if(hWnd = CreateWindow(...)) {
処理TRUE;
} else {
処理FALSE;
}
とすべき。
0393デフォルトの名無しさん2007/06/27(水) 03:29:59
>>391
変数 = 関数() ? 値1 : 値2;
と書いたら当然、値1か値2が変数に代入されるわけだが。
やりたいことがよく判らんが、処理を分岐させたいのなら三項演算子は使うべきじゃない。
関数の呼び出し結果を変数に代入しつつ別の変数に評価を入れたいのなら、
変数1 = (変数2 = 関数()) ? 値1 : 値2;
とでもすればできなくはないが、やはりこの場合も無理に一行に書くことはないだろう。
0394デフォルトの名無しさん2007/06/27(水) 03:34:05
>>392
分かりました。ありがとうございます。
ここは素直にIFで書いておきます・・・
0395デフォルトの名無しさん2007/06/27(水) 03:38:08
>>393
何となくコードを削りたくなってしまって、、
0396デフォルトの名無しさん2007/06/27(水) 04:10:33
hWnd = 関数() ? val1:val2;
というのは、
hWnd = (関数() ? val1:val2);
だというのは判ってる?

きみのやりたいのはたぶん
(hWnd = 関数()) ? val1:val2;
0397デフォルトの名無しさん2007/06/27(水) 04:11:59
あ、「出来る」というだけで、決して「やれ」という意味じゃないから
0398デフォルトの名無しさん2007/06/27(水) 05:29:05
>>396-397
ありがとうございます。
自分でも後からいろいろ試してて、、
何か、ちょっと勘違いしてたみたいです

396のでやりたい事が出来ました。
どうせ趣味で書いてるんで自分さえ読めれば良いんでやってきますwwww
0399デフォルトの名無しさん2007/06/27(水) 06:53:09
しばらく経つと、自分でも読めなくなるに一票。
0400デフォルトの名無しさん2007/06/27(水) 10:24:16
そうみたいです・・読みずらいってレベルじゃないですね。
一回全部のIFを書き直してみたんですがいくつか残して戻しましたよorz
ちなみに分岐はこんな風に書きました
A ? 処理:
B ? 処理:
C ? 処理: 0;

何もしないっていう処理は適当に当てはめたんですが
 0; で良いんでしょうか?

なんかこの書き方面白すぎてはまりそうですw
(もう既にはまってるか)
0401デフォルトの名無しさん2007/06/27(水) 10:28:36
>>400
なるほど、処理の分岐に三項演算子を使いたかったのか。
意味的にそんな阿呆なことをする子には教えてあげません。
0402デフォルトの名無しさん2007/06/27(水) 11:38:53
覚えたての言葉を使いたがる子供みたい
0403デフォルトの名無しさん2007/06/27(水) 12:04:58
自分でも、埋め合わせに 0; を思いついた時にこんな馬鹿な話が・・・って思いましたw
でもそんないじわるされるとは予想外でしたwwっうぇw
と・・・こんな風にかく人少ないと思うので
誰かに指摘されるまでは0;やNULL;って書きます
いろいろありがとうございました
0404デフォルトの名無しさん2007/06/27(水) 14:49:10
だから、阿呆だって指摘されているだろう。これ以上何を指摘されたいんだ?
0405デフォルトの名無しさん2007/06/27(水) 15:59:22
ほうっておこうや
時に暖かく見守る事もしつよう(←なぜかry)な事なんだ
0406デフォルトの名無しさん2007/06/27(水) 19:45:15
389みたいなやつを見ると、コーディング規約で3項演算子の使用を禁止したくなる気持ちが、よく分かる。
0407デフォルトの名無しさん2007/06/27(水) 20:17:06
ふっふっふぅ、漏れの策定したコーディングガイドでは三項演算子の「代入用途以外の使用」を禁止している。
0408デフォルトの名無しさん2007/06/27(水) 20:22:17
それよりも条件演算子の重ねがけを禁止すべき
こんなコードを書かれたらたまらん
x = p1 ? p2a ? at : af : p2b ? bt : bf; 
0409デフォルトの名無しさん2007/06/27(水) 21:20:16
きちんとインデントで整理できてれば見やすくないか?
x = p1
  ? p2a
    ? at
    : af
  : p2b
    ? bt
    : bf;
0410デフォルトの名無しさん2007/06/27(水) 21:46:34
でも条件とそれに対応する処理を列挙していくような書き方って
関数型プログラミング言語っぽくて面白い気がする
0411デフォルトの名無しさん2007/06/27(水) 22:22:31
>A ? TRUEの処理 : FALSEの処理;
こう書いている時点で勘違いしているとおもう。
式1 ? 式2 : 式3

式1を評価して0以外なら式2の評価した値が、0なら式3を評価した値が
全体の評価結果になる。

>何もしないっていう処理は適当に当てはめたんですが
> 0; で良いんでしょうか?
こういう発想が出る時点で三項演算子を使うべきではない。
0412デフォルトの名無しさん2007/06/27(水) 22:52:05
>>410
if文でいいじゃないか。
0413デフォルトの名無しさん2007/06/27(水) 23:27:28
>>409
そこまでするくらいならif文でいい希ガス。
0414デフォルトの名無しさん2007/06/28(木) 09:59:27
常にif文でいいじゃないかと言われる運命だなw
マクロで使用して、何をするかがマクロ名で明確にわかるときに使うかなあ。
0415デフォルトの名無しさん2007/06/28(木) 19:56:25
クラスがなかなか覚えられません(´・ω・`)
「はじめてのC++」でもかなりのページしめてるけど、やっぱりそれぐらい大切ってこと?
0416デフォルトの名無しさん2007/06/28(木) 20:22:14
クラス使わないなら C でも使っとけ、って言われるくらい。
0417デフォルトの名無しさん2007/06/28(木) 21:09:18
>>415
「覚える」という言葉を使う時点で、間違っているのですよ。

「覚える」というのは、
セックスで例えるなら、ハウツー本を読み漁るだけの童貞君。

プログラミング言語は使いこなしてナンボ。
セックスで例えるなら、百人切りで鍛え上げたテクニック。
0418デフォルトの名無しさん2007/06/28(木) 21:26:31
百人と浅い付き合いをするくらいなら、一人と深く付き合った方がより使いこなせると思うのだが。
0419デフォルトの名無しさん2007/06/28(木) 21:40:31
C++でSTLを使うのは非常に上手だが、STLを使うことしかできない
そういう人みたいな感じになるぞ。
0420デフォルトの名無しさん2007/06/28(木) 22:14:33
一人と深く付き合った事がある加藤鷹が理想

他の女に乗り換える時に楽
0421デフォルトの名無しさん2007/06/28(木) 22:18:34
ちんこが持たねぇっす
0422デフォルトの名無しさん2007/06/28(木) 22:43:11
C++でSTLとboostを非常に上手く使える人間だったら十分問題ないと思うけど
0423デフォルトの名無しさん2007/06/28(木) 22:47:03
STLを使う/使える案件しかやらないのなら、いいんだよ。

0424デフォルトの名無しさん2007/06/29(金) 00:24:37
ありがとう。やっぱりクラスは大切なのか
これからは積極的に使って身につけていくことにします(`・ω・´)
0425デフォルトの名無しさん2007/06/29(金) 11:58:49
つーかいまどきC++は生産性が悪すぎ。
0426デフォルトの名無しさん2007/06/29(金) 12:07:56
言語間での生産性の差ってそんなに大きくないだろう
0427デフォルトの名無しさん2007/06/29(金) 12:23:40
全ての状況下に於いて、生産性だけが重要とは限らない
0428デフォルトの名無しさん2007/06/29(金) 12:42:54
C++でtemplate meta programmingやマクロを駆使して書いたプログラムが強いところって何でしょう?
「皆が読めなくなるからやめろ、STLやtemplateも出来れば使うな、boostなんて以ての外」
って言うところも多いと聞きますが…
0429デフォルトの名無しさん2007/06/29(金) 13:13:27
STL程度で「皆が読めなくなる」なんて、三流以下のソフトハウスでもなければ言われないと思いますが。
0430デフォルトの名無しさん2007/06/29(金) 13:31:26
三流以下のソフトハウスが多いことの証左なんだろうさ。
ところで、>>428 の
>〜が強いところって何でしょう?
が何を訊いてるんだかよく判らない。
「〜に強い会社ないし集団はどこでしょう?」
の意だろうか。
0431デフォルトの名無しさん2007/06/29(金) 15:12:02
STLの実装にバグがあってトラぶった時、STLなんて使うからだと言う人がいた。
たしかに、使ったSTLの実装は古く、メンテナンスされていないものだった。
だがしかし、その人が書いたSTL相当の独自のクラスにもバグがあった。

ちなみに一流の現場では、STLは使わず、もっと良いテンプレートライブラリを使うと思う。
STLはC++標準に入ってはいるものの、最善策ではないから。
0432デフォルトの名無しさん2007/06/29(金) 16:37:08
C言語で、配列の個数を外部から入力することはできますか?
例えばa[n]という配列に対しnをscanfでキーボードから読みけませて、要素がn個の配列を作るといった感じです。
0433デフォルトの名無しさん2007/06/29(金) 16:49:32
C99じゃなけりゃ、m(c)allocやalloca使うしかないかな
0434デフォルトの名無しさん2007/06/29(金) 18:07:51
>>428
利点を挙げるとしたら、高度の抽象化に役立つということ。
問題は、それを必要とされない、あるいは必要性が理解されないということ。
0435デフォルトの名無しさん2007/06/29(金) 21:28:52
>>432
おれがこの前教えてもらった方法
int *a,n;
scanf("%d",&n);
a=new int [n];//a[0]〜[n]まで確保
Cだと無理なのかな
0436デフォルトの名無しさん2007/06/29(金) 21:44:34
STLやtemplateもboostもstd::もしらないけどc++動かせるよ
どんな利点があるのか教えろ
0437デフォルトの名無しさん2007/06/29(金) 21:46:11
つか、進化した言語の方が優れているなら、アセンブラもC言語も絶滅しているはずだろう
しかししてない
だから使える機能を使えばいい
0438デフォルトの名無しさん2007/06/30(土) 00:59:45
>>436
delete[]のような後処理が要らないしrealloc相当のことができる
std::vectorが取っ掛かりには便利。
Boostは正規表現が実用的だろう。
0439デフォルトの名無しさん2007/06/30(土) 05:31:00
>>438
そんなのはSTLの専売特許ではないしぃ。
0440デフォルトの名無しさん2007/06/30(土) 15:41:07
標準もしくは準標準ってところが大事なのかと
0441デフォルトの名無しさん2007/06/30(土) 19:26:00
STLがどんなにクソッタレでも、C++標準に入っている以上、しかたない。

あの万能ナイフっぷりには呆れるぜ。
0442デフォルトの名無しさん2007/06/30(土) 20:33:49
こんな風にC++の標準関数まとめてくれてるサイトない?

ttp://cham.ne.jp/piro/p_stdfunc.html
0443デフォルトの名無しさん2007/06/30(土) 22:26:36
ある
0444デフォルトの名無しさん2007/06/30(土) 22:30:38
本スレテンプレのコレとか
ttp://www.cppreference.com/index.html
0445デフォルトの名無しさん2007/06/30(土) 22:48:49
>>439
436が使ったことないって言うから、
早速使えそうなものを薦めてみた。
うんちく語っても仕方がないと思ったし。
0446デフォルトの名無しさん2007/06/30(土) 23:05:10
じゃあSTLはまぁそこそこ使える、かつ稲葉氏のページにあるものは一通り知っている
っていう人に対してお勧めのboost library(sandbox含む)を教えてください
0447デフォルトの名無しさん2007/07/01(日) 09:48:04
STLは機能が多すぎて、つまり、注意事項が多すぎて、怖い。

オブジェクトを手っ取り早く永続化したくて、
一定のアドレスにオブジェクトを配置する、
カスタムなヒープを使う、カスタムなアロケータを
使うように指示して、それがちゃんと使われるのか、とか。
0448デフォルトの名無しさん2007/07/01(日) 10:07:28
>>447
そんだけなら単にSTLコンテナ宣言してる場所をgrepすりゃいいだけじゃね
つか、STLに限った話じゃ全然ねー

STL使わんでも普通にmalloc()だのnewだの使われたくないんだろ?



アホじゃないの?
0449デフォルトの名無しさん2007/07/01(日) 11:23:31
>>447
アロケータは使い方を知らないとハマるわな。
0450デフォルトの名無しさん2007/07/01(日) 11:30:39
実装によってはアロケータをガン無視しちゃってるのがなかったっけ
0451デフォルトの名無しさん2007/07/01(日) 13:23:33
setやmapをそのままシリアライズしたいって思うことあるよなぁ。

iteratorで舐めてファイルに書きだしたものを、
ファイルから読んで1つずつinsertするのは、
なーんか無駄っぽいんだ。
0452デフォルトの名無しさん2007/07/01(日) 16:23:59
ライブラリにしとけばええやん。
0453デフォルトの名無しさん2007/07/01(日) 20:32:59
>>452
そういうことではなくて、B木の構築コストがもったいない。
0454デフォルトの名無しさん2007/07/05(木) 11:19:09
ほんと初歩的な事なんですが・・・
C言語には行とかいうのは関係なくて全部一行で書けるって聞いたんですが
#include<stdio.h> main()〜
っていうのはどうやっても出来ないんでしょうか?
0455デフォルトの名無しさん2007/07/05(木) 11:40:20
#include はC言語じゃなくてプリプロセッサ用
0456デフォルトの名無しさん2007/07/05(木) 13:57:29
>>455
プリプロセッサっていうのは、コンパイルの時の処理ですよね
一行ずつ読み込む・・・から、
やっぱ、無理って事でしょうか?
0457デフォルトの名無しさん2007/07/05(木) 14:08:36
ヘッダファイルの中から使う分だけ直接持ってくりゃいいべ
0458デフォルトの名無しさん2007/07/05(木) 17:44:03
>>457
その手が、、、あった。。。ありがとうございました
0459デフォルトの名無しさん2007/07/05(木) 22:25:40
標準ライブラリのヘッダの中身って結構処理系独自拡張のオンパレードだから、
あまりおすすめできないけどな。
0460デフォルトの名無しさん2007/07/05(木) 22:26:50
7行プログラムとかlisp500とか書きたいんだろうか
0461デフォルトの名無しさん2007/07/06(金) 00:07:56
プロトタイプと構造体とtypedefくらいだべ
0462デフォルトの名無しさん2007/07/08(日) 06:21:10
大きな配列を確保する際、newやmallocだと確保できるのに、
プログラム中に最初から
double a[100000]
のように書くと実行時に確保できない旨のエラーがデルのは何故ですか?
0463デフォルトの名無しさん2007/07/08(日) 06:41:41
スタック領域
0464デフォルトの名無しさん2007/07/08(日) 06:51:11
>>462
staticでもつければ?
0465デフォルトの名無しさん2007/07/08(日) 13:20:28
>>462
スタック領域が足りなくなるから。
環境によってはスタック領域を大きくできるぞ。
0466デフォルトの名無しさん2007/07/09(月) 11:12:57
スタックとヒープの違いを把握しましょう
0467デフォルトの名無しさん2007/07/09(月) 13:51:14
ご教授お願いします。

コード
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4566.txt

不正なbreakですとなってしまいます。なぜでしょうか?
0468デフォルトの名無しさん2007/07/09(月) 13:53:55
>>467
なんちゅうスタック破壊
0469467 ◆4usmhdjocU 2007/07/09(月) 14:01:12
すみません詳しく教えていただけると助かるのですが・・・
0470デフォルトの名無しさん2007/07/09(月) 14:01:25
誤>printf("New string --->%s\n,tbl");
正>printf("New string --->%s\n",tbl);
0471デフォルトの名無しさん2007/07/09(月) 14:01:59
>>467
このスレで何回も言ってることだが・・・。

・エラーメッセージの類いは、一字一句そのままコピペすること。
往々にして勝手に要約して端折った部分に大切な情報がある。
それが大切だと分かってないから、問題の原因が理解できない。

・デバッガでステップ実行すること。

がんばれ。
0472デフォルトの名無しさん2007/07/09(月) 14:03:23
>>470
あーあ、答え書いちゃった。

プロセスを教えずにリザルトだけ教えていたら、
いつまでたっても467はヒヨコのままだぞ。
0473デフォルトの名無しさん2007/07/09(月) 14:04:41
>>467
・forの書き方に問題があるから、不正なbreakになる。
・>468も指摘しているが、printf()の使い方にも間違いがある。
0474デフォルトの名無しさん2007/07/09(月) 14:04:41
>>469
getsは危険です絶対に使ってはなりません。
0475467 ◆4usmhdjocU 2007/07/09(月) 14:07:17
C:\Documents and Settings\cp1\デスクトップ\testplog\test.cpp(39) : error C2043: 不正な 'break' です。
cl.exe の実行エラー: error C2043: 不正な 'break' です。


>>470
 ありがとうございます
>>471,472
わざわざ自分のことを考えていただきありがとうございます。
 しかし、エラーがでてなおりません。
 次はヒントでいいので教えていただけませんか?
0476デフォルトの名無しさん2007/07/09(月) 14:07:40
標準関数でtolower()ってのがあるから、使う時はtolower()使ってね☆
0477467 ◆4usmhdjocU 2007/07/09(月) 14:08:19
とてつもない初歩的なミスでした・・・

聞いていたじぶんがはずかしくなりました><

お手数かけました
0478デフォルトの名無しさん2007/07/09(月) 14:08:45
>>475
セミコロン


getsとかtolowerとか、練習で問題文写してるんだろうから
あんまり言うとわからなくなるぞ
0479467 ◆4usmhdjocU 2007/07/09(月) 14:08:52
>>476
勉強します^^
0480デフォルトの名無しさん2007/07/09(月) 14:09:27
for(i = 0;i < max;i++);
0481467 ◆4usmhdjocU 2007/07/09(月) 14:10:14
>>478,480

ありがとうございました
0482デフォルトの名無しさん2007/07/09(月) 14:26:19
そしてthruされる>473、>474……
0483デフォルトの名無しさん2007/07/09(月) 14:52:12
LINK : fatal error LNK1104: ファイル "win32.lib" を開けません。
link.exe の実行エラー

これってどうやれば直りますか
0484デフォルトの名無しさん2007/07/09(月) 14:52:58
そもそも、

固定の文字列を出力するのにprintfを使う
getsを使う

などという、
見習ってはいけない「お手本」を載せている、
クソッタレ参考書がいけないと思うんだよね。

いったい何十年前の本なんだよ、って感じ。
0485デフォルトの名無しさん2007/07/09(月) 14:54:44
>>483
1. ライブラリ名が正しいか確認する
2. リンカのマニュアルを確認する
0486デフォルトの名無しさん2007/07/09(月) 15:18:44
>>484
固定の文字列を出力するのにprintf()を使う以外の見習うべきお手本は何?
0487デフォルトの名無しさん2007/07/09(月) 15:27:00
puts()
0488デフォルトの名無しさん2007/07/09(月) 15:37:30
>>487
puts()に替えたら改行しちゃいました。どうしたらいいでしょう。
0489デフォルトの名無しさん2007/07/09(月) 15:42:43
fputs()
0490デフォルトの名無しさん2007/07/09(月) 15:49:06
どうせコンパイラが最適化でputs()に置き換えたりするんだからprintf()でいいじゃん。
0491デフォルトの名無しさん2007/07/09(月) 15:56:06
そんなコンパイラはgccぐらいしか知らんが
0492デフォルトの名無しさん2007/07/09(月) 16:10:55
打つ量の削減とかそういう理由で使い分けてる
0493デフォルトの名無しさん2007/07/09(月) 16:19:48
わかっていない人のために説明すると・・・

printfの第一引数は、あくまでも書式を指定するための文字列である。
だから、
printf("100%元気") ;
なんてのは大間違いなわけ。

あえてprintfで任意の文字列を出力したいのであれば、
printf("%s", "100%元気") ;
とすべき。

そんな間抜けな間違いはしないよ、というかもしれないが、うっかりミスは恐ろしいし、
void PrintMessage(char* szMessage) {
printf(szMessage) ;
}
なんてことをやったりしたら、収拾がつかなくなる。
0494デフォルトの名無しさん2007/07/09(月) 17:06:51
まあ
printf("%s\n", s);
なら
puts(s);
一択だわな。タイプ量が少なく効率も良い。
printf("%s", s);
を
fputs(s, stdout);
にするかどうかは気分次第だな。

改行を打ち出す時は
puts("");
が短いが、俺は
putchar('\n');
を使うことがおおいな。
0495デフォルトの名無しさん2007/07/09(月) 17:11:41
inline void NEW_LINE() {
putchar('\n');
}

::NEW_LINEみたいにしたり(w
0496デフォルトの名無しさん2007/07/09(月) 17:13:03
>>495
賢いのう、ワレ!
0497デフォルトの名無しさん2007/07/09(月) 18:44:07
>>484
> いったい何十年前の本なんだよ、って感じ。

昔のBASICなどのPRINTと同じ感覚の老人が書いた本だろ。
0498デフォルトの名無しさん2007/07/09(月) 18:46:41
printf(name) ;
printf("\n") ;
printf("ほげほげを入力してください。\n") ;
printf("入力できる数値の範囲は、fooからbarです。\n") ;

こんなの見たら卒倒するよ。
0499デフォルトの名無しさん2007/07/09(月) 19:20:09
JavaやってからC++に戻ってくると>>498みたいに書きたくなる。
0500デフォルトの名無しさん2007/07/09(月) 19:30:03
getsはともかく、printfは別にいいだろ
char配列そのままprintfに渡すのはまずいけど、
文字列リテラルなんかコンパイラによってはputsに置き換えたりする事もある
0501デフォルトの名無しさん2007/07/09(月) 20:20:28
ループ成立w
0502デフォルトの名無しさん2007/07/09(月) 20:32:46
別にprintfでもputs/fputsでも、そんなん好みの問題やん。
0503デフォルトの名無しさん2007/07/09(月) 23:25:28
UDPの通信メッセージの最大長っていくつですか?(socket、bind、sendtoを使います)

SOCK_DGRAMで作成した場合は、固定長最大メッセージをサポート、
ってなってるから、約64KBまで送信できると思うのですが、イーサネットの
フレーム長が1500byteまでとか言う風に書いてあって、よく分からないのです。

オフィス用の一般的なPC(WinXP SP2、10BASE-T)の環境でテストプログラムを
作ったところ、一応60KBちょいまで送受信できたので64KBまでOKなのかな?

あと、さらに質問で、64KBまで送受信できるけどXXbyteを超えると信頼性が
著しく下がるとかありますか?
また、上のほうでも書きましたが、イーサネットで1500byteってのはアプリケーションでは
意識してないけれど、ネットワーク層(?)とかデータリンク層(?)とかのレイヤが
勝手にセグメント化してくれてるのでしょうか?

長々として申し訳ないのですが、どなたかお助けを。
0504デフォルトの名無しさん2007/07/10(火) 00:05:05
TCP/IPではパケットサイズを期待してはいけない。それは下位層によって1バイトずつに分断されているかもしれない。
UDPではパケット到来順序を期待してはいけない。それは経路によって順不同に並べ替えられているかもしれない。
だっけ?
0505デフォルトの名無しさん2007/07/10(火) 08:40:13
>>503
> UDPの通信メッセージの最大長っていくつですか?(socket、bind、sendtoを使います)

環境による。

通信バッファが小さくて長いUDPパケットを受け取れない人もいるし、
なかには、受け取れないどころか即死するヘボ実装の人もいる。

両側とも自分で書いたプログラムなら、通信の最初に、
送受信できる最大サイズを調べるためのメッセージ交換を入れたらどうかな。
最初は128バイトあたりで、送受信を確認できたら、サイズを2倍にしていくの。

> イーサネットのフレーム長が1500byteまでとか言う風に書いてあって

UDPパケットが長い場合、複数のイーサネットフレームに分割して送受信される。

> 64KBまで送受信できるけどXXbyteを超えると信頼性が著しく下がるとかありますか?

パケットサイズが可変なのに対して、パケットのCRCチェックサムのビット数が固定なので、
長さに比例してエラー検出能力が下がっていくけど、あんまり気にしない。
信頼性を気にするなら、更に自前で別のチェックサムを付けてUDPに載せるといい。
0506デフォルトの名無しさん2007/07/10(火) 19:17:26
>>503と>>505は釣りかい?
マジなら>>505はもう一度勉強な。

それから、UDPの送信フレーム数そのものに制限は無い。
どこで知ったかしらないが、64kbyteなんて制限はない。
恐らくAPIレベルの話だろう。64kbyte以上送りたければ、何度もAPIを呼べばいい。

受信側が受け取れなければ、単に破棄するだけだ。
それは、受け取り側が糞なんじゃなくて、そういう仕様。

UDPの通信フレームの最大長は、1500オクテット(=バイト)だが、
IP情報分を除くと1480バイトになる。経路が全てイーサネットで
組まれているのなら、APIレベルで1480バイト以下を送れば分割(フラグメント)は起こらない。
インターネットに流すのならもっと小さくする必要がある。

IPヘッダ専用のチェックサムはあるが、それはデータとは無関係。データ自身には何のチェックバイトもない。
イーサネットフレームのCRCはあるが、それは送信時のもので、異なるプロトコルにぶちあたるとコロリととれてしまう。
イーサネットフレームに戻るときにはCRCも戻るが、それは再構築されたものなので、送信時のものとは全く関係ない。

そもそも、UDPは、次の特徴をもっている。
・>>504が言うとおりIPフレームの到来順序を期待してはいけない。
・戻されたIPフレームがどの順番に届くかは保証されない。
・IPフレームの一部が失われた場合、再送の手順は行わない。
・IPフレームは分割(フラグメント)されるかもしれないが、分割された順序を記憶するフィールドがあり、再構築されるようになっている。

UDPとは、
・本来、内部LANのように信頼性の高い部分で使用することを前提に策定された
・今は、動画や音声のように、一部が失われても十分機能する場合によく用いる

のですよ。ちなみにコレはIPv4の仕様。IPv6はこうとは限らない。
05075062007/07/10(火) 19:33:25
ちょっと訂正
APIで1480バイトを指定するのではなくて、
窓の手でMTUを指定する(Windowsの場合)。
社内LANだけの場合は1500にする。
0508デフォルトの名無しさん2007/07/10(火) 21:13:41
このスレで良いのかわからないのですが、質問失礼します。
データ圧縮されたファイルの1文字当りの平均情報量は、テキストファイルのものに比べてどのように変化するんでしょうか?
できれば理由も説明してくだされれば幸いです。
よろしくお願いします。
0509デフォルトの名無しさん2007/07/10(火) 21:26:20
圧縮後の情報量なんて、圧縮しているのだから1文字当たりの量は増えているとだけは言える。
どれくらいになるかは圧縮率次第。それがわからないと平均なんてわからない。
0510デフォルトの名無しさん2007/07/10(火) 22:05:31
>>508
それ、学校の宿題か?
05115052007/07/10(火) 22:22:05
>>506
お前こそ勉強し直しだ。

> それから、UDPの送信フレーム数そのものに制限は無い。

用語は正しく。
UDPはメッセージもしくはパケットで数える。フレームとは言わない。

> どこで知ったかしらないが、64kbyteなんて制限はない。

UDPヘッダの長さフィールドが16ビットなので、64kbyte弱が上限。

> 恐らくAPIレベルの話だろう。64kbyte以上送りたければ、何度もAPIを呼べばいい。

複数回に分けてSendToを呼ぶと、複数のUDPパケット=メッセージになってしまう。
UDPは、TCPと違ってストリームではなくメッセージなので、意味が変ってしまう。

> 受信側が受け取れなければ、単に破棄するだけだ。
> それは、受け取り側が糞なんじゃなくて、そういう仕様。

なにその教科書どおりの話は。
世の中には、破棄せず不正なステートに陥ったりバッファオーバーフローしちゃう糞実装があるんだよ。

> UDPの通信フレームの最大長は、1500オクテット(=バイト)だが、
> インターネットに流すのならもっと小さくする必要がある。

んなのはIPよりも下のレイヤの話であって、
フラグメントを禁止したりしなければ、
下のレイヤのために小さくする必要はない。

現実には途中の経路のルーターが、
IPのレイヤで蹴落としてくれることがある。
05125052007/07/10(火) 22:30:23
> IPヘッダ専用のチェックサムはあるが、それはデータとは無関係。データ自身には何のチェックバイトもない。

嘘つき。
UDPパケットにもチェックサムはあって、それにはペイロードも含まれている。

ただし、
チェックサムは実装が必須とはされていないので、
相手がチェックサムを確認しない可能性もあるし、
こちらがチェックサムを付加しない可能性もある。

> ・本来、内部LANのように信頼性の高い部分で使用することを前提に策定された
> ・今は、動画や音声のように、一部が失われても十分機能する場合によく用いる

なんか違うなぁ。

コストをかけてコネクションを張る必要のないメッセージのやりとり、という用途も考えられていたし、
DNSなんかもUDPを使うんだけどなぁ。

0513デフォルトの名無しさん2007/07/10(火) 22:40:45
コード
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4580.c
入力文
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4581.txt
言語はCです。
コンパイル(gcc)して文をリダイレクトで入力したのですがどうしても一行目で
処理が終わってしまいます。何が問題なんでしょうか?
0514デフォルトの名無しさん2007/07/10(火) 22:55:52
>>513
このスレで何度も言ってることなのだが・・・

デバッガでステップ実行しろ!
0515デフォルトの名無しさん2007/07/10(火) 22:57:58
>>513
1行しか読んでないから
fgetsは1回実行されるだけじゃん
0516デフォルトの名無しさん2007/07/10(火) 23:02:02
gccみたいな糞環境だとデバッガ使うのも一苦労でしょ^^
VC2005にきなさいな
0517デフォルトの名無しさん2007/07/10(火) 23:03:30
VC2005でデバッグしてからgccにもってくのもあり
0518デフォルトの名無しさん2007/07/10(火) 23:03:50
gdbの事かー

GUIフロントエンドでも使っとけ
05195032007/07/10(火) 23:07:50
>>505,506
サンクス。勉強になった。

で、再度質問で申し訳ないのですが、
要は、やりたい事が最大で5KBくらいのデータを送りたくて、
UDPについて調べてました。(TCP/IPは困ったことにノウハウが無い)

「IPフレームがどの順番に届くかは保証されない」ってのは
例えば4000byteのメッセージをsendtoすると、
1500byte(これをAとする)、1500byte(これをB)、1000byte(これをC)の
フレームに分けられて伝送される。
でも、受信側のアプリケーションでrecvfromした時にバッファに入っているデータが、
A+B+Cの順序で4000byteのこともあれば、B+C+Aの順序になっちゃうこともあるということでしょうか?

それとも1回のsendtoと1回のrecvfromだと、
こういうような順序の不都合は起きなかったりするのでしょうか?

自前のコードで1KB以下のメッセージでセグメント化するのは、
コードが煩雑になるのでできるだけ避けたいんですよね。

0520デフォルトの名無しさん2007/07/10(火) 23:17:16
>>519
> B+C+Aの順序になっちゃうこともあるということでしょうか?

ない。
0521デフォルトの名無しさん2007/07/11(水) 01:15:34
そもそも一回のrecvで全部取れる保証が無い。
0522デフォルトの名無しさん2007/07/11(水) 08:49:29
>>521
それはTCPの場合ね。
05236032007/07/11(水) 09:11:40
>>505
水を得た魚のようにはしゃいじゃって。UDPヘッダを考慮に入れてなかったんだが、お前の反論はただの荒らしだ。

訂正:UDPヘッダには16ビット分のデータがある。64kbyteが限界
(イーサネット上ではIPパケットが1500バイトになるように分割。)

>用語は正しく。
用語は大切だが、ここではそれを議論してんじゃネーだろ。文脈を読めよ。

>> 受信側が受け取れなければ、単に破棄するだけだ。
>なにその教科書どおりの話は。
>世の中には、破棄せず不正なステートに陥ったりバッファオーバーフローしちゃう糞実装があるんだよ。

だーかーらー文脈にそって語れよ。質問者のテスト環境ではWindowsXPって書いてあるだろ。それに、教科書どおりなんて文句言うぐらいなら、用語にケチつけるな。

>> インターネットに流すのならもっと小さくする必要がある。
>フラグメントを禁止したりしなければ、
>下のレイヤのために小さくする必要はない。

下でちゃんと訂正してますー。はしゃぎすぎで良く読んでない証拠だな。

>> ・本来、内部LANのように信頼性の高い部分で使用することを前提に策定された
>> ・今は、動画や音声のように、一部が失われても十分機能する場合によく用いる
>コストをかけてコネクションを張る必要のないメッセージのやりとり、という用途も考えられていたし、

意図と使い方は違ってても問題ないし、たかだか一つの文句を増やすために引き合いにだしたのか?

>DNSなんかもUDPを使うんだけどなぁ。

DNSにUDP?まさに信頼できる接続の典型じゃないか。
お前、どういう形でインターネット使ってるにしろDNS指定されてるだろ?
いきなりDNSルートにつなぎに行かないだろ?
0524デフォルトの名無しさん2007/07/11(水) 10:17:45
>>523
何も有益な話はないな。
0525デフォルトの名無しさん2007/07/11(水) 12:01:24
>>603にプレッシャーがかかりました
0526デフォルトの名無しさん2007/07/11(水) 16:26:50
scanfが入力を受け付けてくれなくて困っています。
char c,d;

printf("数値いれろ");
scanf("%c",&c);
printf("数値入れろ");
scanf("%c",&d);

って感じで実行すると

数値入れろ数値入れろ_(←カーソル)

二番目のscanfだけは入力出来る状態です。何が原因なのでしょうか。
OSはWindwosXPでコンパイラはBCC5.5です。
0527デフォルトの名無しさん2007/07/11(水) 16:37:56
キーバッファからなんか喰ってるんだろ。
0528デフォルトの名無しさん2007/07/11(水) 17:42:56
ファイルから標準入力へリダイレクトすることを考慮に入れず、
人間相手にインタラクティブに入力することだけを考えるなら、

printf("数値いれろ");
という表示をする前に、
すでに入力されているものがあれば、それを全て捨てる処理を入れる。
0529デフォルトの名無しさん2007/07/11(水) 17:44:21
初心者は馬鹿の一つ覚えで
scanf()をfgets()→sscanf()に置換汁
0530デフォルトの名無しさん2007/07/11(水) 17:44:36
毎度おなじみの言葉を言うの忘れてた。
デバッガ上でステップ実行しろ!

とりあえず、
1つ目のscanf("%c",&c);でcに何が入ってきているのか、
デバッガ上で確認してみよう。
0531デフォルトの名無しさん2007/07/11(水) 17:53:41
>>529
そもそも、初心者向けの教科書の内容が古すぎるんだよな。
scanf系なんか、その存在すら教える必要ないのにな。

自分はscanf系を使ったのは、
C言語やりはじめて最初の一ヶ月くらいで、
その後15年間まったく使っていないよ。

使いもしないものを目に触れさせるだけでも無駄だし、
ましてや、それで新人がハマったりするようでは、有害だよ。
0532デフォルトの名無しさん2007/07/11(水) 18:03:45
scanf()も使いどころを知っていれば便利なんだけどね
0533デフォルトの名無しさん2007/07/11(水) 21:13:36
>>531
「scanf系」ってなんじゃらほい?
0534デフォルトの名無しさん2007/07/11(水) 21:16:03
よくわからんが、sscanf()とかfscanf()とかじゃないの
0535デフォルトの名無しさん2007/07/11(水) 21:21:18
一般的に、scanf()系のその他の関数の方は使い途あるんだけどご本尊が使いようが無くて困る。
0536デフォルトの名無しさん2007/07/11(水) 21:48:03
>>535
fscanf()が使えるのならscanf()も使えるでしょ
scanf()は単にstdinに対するfscanf()なのだから
0537デフォルトの名無しさん2007/07/11(水) 21:53:28
>>536
まぁ確かに、リダイレクトすれば使って使えなくも無いけどキー入力用としては使えないよね。
0538デフォルトの名無しさん2007/07/11(水) 22:01:43
>>537
そんなことはないよ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4496.txt
これは以前宿題スレに貼り付けた四則演算が出来るだけのオモチャ電卓だが、
数値を入力する時にscanf()を用いている。getchar()で数値であることを
確認してからungetc()し、改めてscanf()で読んでいるから基本的には安全だ。
scanf()を用いないとすれば実数の入力はずっと面倒になるよ。
0539デフォルトの名無しさん2007/07/11(水) 22:06:04
それならfgets()+sscanf()で充分な気が。と思ったが……
あーそうか、入力を放置したまま、部分ごとに解析できるから使いようが無いわけでもないか。
0540デフォルトの名無しさん2007/07/11(水) 22:08:09
そこまでするんだったら、fgets+sscanfのほうがすっきりすると思う。

そもそも俺はfscanfも使わないだろ派。
scanf系はsscanfと(使ったことないけど)vsscanfだけあればいい
と思っているということも影響しているだろうけど。
0541デフォルトの名無しさん2007/07/11(水) 22:19:39
>>540
fgets()だと行長に恣意的な制限が生じるでしょ。
>>538のやり方だとgetchar()とscanf()しか使っていないから
そういう制限は無いよ。幾ら長い式でも扱える。
倍精度浮動小数点数を使っている以上、実数のサイズに制限はあるけどね。

他にいくつか例を挙げよう。↓はワードカウンタ
#include <stdio.h>
int main() {
    int cnt = 0;
    while (scanf("%*s") != EOF)
        ++cnt;
    printf("%d\n", cnt);
    return 0;
}
0542デフォルトの名無しさん2007/07/12(木) 10:07:18
別に生じないけど、getchar()使ってscanf系を使わない選択肢もあるべ
0543デフォルトの名無しさん2007/07/12(木) 14:03:08
>>542
scanf()使わずにgetchar()だけで数値を読み込む処理作ろうとしたら
少なくとも数行のコードは必要になる。別にやるのは自由だが、
scanf()のが楽で簡潔ではあるよ。
0544デフォルトの名無しさん2007/07/12(木) 15:22:33
>>543
C標準ライブラリ関数しか使わず、なおかつ、自前の関数もダメ
なんていう縛りがあれば、そうかもしれん。

自前の関数が使える or 豊富なライブラリを活用してよい
となれば、使いにくいscanfを騙し騙し使わなくてもいいだろう。
0545デフォルトの名無しさん2007/07/12(木) 16:54:15
>>544
別にクセが分かっていれば全然使いにくくないが。
ま、初心者に薦める気にはならんけどな。
0546デフォルトの名無しさん2007/07/12(木) 17:10:08
組み込みじゃあ、余分な機能のついた肥大な関数は避けたいところではある
ってそもそも入ってないけど、デバッグ用にprintfだけは作ったなあ・・・
0547デフォルトの名無しさん2007/07/12(木) 17:13:16
>>546
scanf()は確かにでかいな。
printf()も、作るとしてもフル機能はいらないでしょう。
0548デフォルトの名無しさん2007/07/12(木) 18:03:08
どっかで見たprintfやscanfの実装では、使わない機能を細かく取り外せるようになってた。
0549デフォルトの名無しさん2007/07/12(木) 22:28:32
sscanf()の%*[^\n]なんかは便利だからついつい使いたくなる。
0550デフォルトの名無しさん2007/07/12(木) 22:36:03
>>549
そうそう、使い方を知ってればscanf()は非常に便利
0551デフォルトの名無しさん2007/07/14(土) 03:24:26
割り込みシグナルについて教えてください

#include<stdio.h>
#include<signal.h>
#include<setjmp.h>
jmp_buf jmpBuf;
void s(){longjmp(jmpBuf, -1);}
int main(){
char buff[20];
signal(SIGALRM,s);
alarm(5);
   if(0==setjmp(jmpBuf)) {
      printf("A");
      fflush(stdout);
      gets(buff);
      alarm(0);
   }
   else {
      printf("B");
   }
}

これをコンパイルするとこのようなエラーが出てしまいます

'SIGALRM' : 定義されていない識別子です。
'alarm': 識別子が見つかりませんでした
'alarm': 識別子が見つかりませんでした

定義されて無いみたいなんですが・・・
どうやったらSIGALRMとalarm()を使えるようになるんでしょうか?
0552デフォルトの名無しさん2007/07/14(土) 04:07:09
POSIXな環境に移行すりゃいいんじゃないかね。
0553デフォルトの名無しさん2007/07/14(土) 08:43:07
>>551
#include <unistd.h>
0554デフォルトの名無しさん2007/07/15(日) 03:03:07
>>552
ありがとうございます
でも出てきたサイトが英語だぁ・・・頑張ってみます

>>553
検索してくうちにそのヘッダを使ってるコードも見つけたんですが
borlandにはそのヘッダは無いみたいです
0555デフォルトの名無しさん2007/07/15(日) 03:05:49
unistd = UNIX standard
0556デフォルトの名無しさん2007/07/15(日) 11:00:46
ぶっちゃけ、>>551には自分がUNIX向けのプログラムを書いているという自覚がないのだろう。
一番簡単な選択肢は、Linuxを使うこと。

Windows上でPOSIX環境を提供する代物もあるが、
そういうのを使いこなす余裕はなさそうだからな。
0557デフォルトの名無しさん2007/07/15(日) 11:20:27
>>551
Windowsではシステムコールにシグナルで割り込んで
中断させるという手法は使えない。
ANSI Cをサポートするコンパイラならsignal()関数は使えるはずだが、
仕様は非常に限定的だし、Unixのシグナルと同じものだとは思わないほうがよい。

Windowsで時間がかかる可能性のあるI/Oを中断したい場合は、
非同期I/O、スレッド、イベント、といったものを使う。
0558デフォルトの名無しさん2007/07/15(日) 22:41:08
ずっと独学で勉強してたせいかdouble型をずっとドウブル型って読んでた
先週初めてダブル型だって知ったよ(|||´・ω・`)
0559デフォルトの名無しさん2007/07/15(日) 22:46:37
>>558
俺はドウブレって読んでた。
0560デフォルトの名無しさん2007/07/15(日) 22:51:07
charはキャラと読む人も居るが、
ttp://www.research.att.com/~bs/bs_faq2.html#char
によると、チャーが正しいようだね
0561デフォルトの名無しさん2007/07/16(月) 00:11:15
この例だとネストは少ないけど、実際は5段6段のネストがあると考えてもらって

テンプレート使ったプログラミングで
typename Foo< typename Hoge<Hage>::type >::type foo;
とかやるのが面倒なんで
#define DECLARE(T,name) \
typename Foo< typename Hoge<T>::type >::type name
みたいなマクロ使うのってあり?
0562デフォルトの名無しさん2007/07/16(月) 00:35:18
勝手にしてください
0563デフォルトの名無しさん2007/07/16(月) 00:50:59
typedefすら面倒なのかよ
0564デフォルトの名無しさん2007/07/16(月) 00:56:32
関数オブジェクトならメンバ宣言内でのtypedefが使えるんだけど
普通の汎用関数ならTがテンプレートパラメータの時typedef使えないんで
そういうときの為に考えたんですけど
そういう場合でもtypedefを使って簡潔にする方法あるんですかね?
0565デフォルトの名無しさん2007/07/16(月) 02:04:58
ないならそれ用のメタ関数を作ればいい。
これを使いたい関数の直前にでも書いておけばよし。
template<typename T>
struct Shortcut
{
typedef typename Foo<typename Hoge<T>::type>::type foo;
};
こうすればShortcut<Hage>::typeと言う具合に1段に減る。

ついでに言うと俺様ライブラリ内だったら、
Boostみたいに名前空間detailにでも放り込めばいいかもしれない。
(ほかにろくな使い道がないなら)
0566デフォルトの名無しさん2007/07/17(火) 10:39:33
クラスの中にクラスを定義できるけど、
関数の中に関数を定義するにはどうすればいいの。

その関数の中でしか使わない関数なので、
クラスの中のスコープに入れてしまいたい。
0567デフォルトの名無しさん2007/07/17(火) 10:40:23
もとい

×クラスの中のスコープに入れてしまいたい。
○関数の中のスコープに入れてしまいたい。
0568デフォルトの名無しさん2007/07/17(火) 10:42:20
>>567
関数内関数はできないので、精精同じソース内に入れるくらいが関の山。
呼ばれる関数をstaticにしておけば、事実上外部からは見えなくなるからね。
0569デフォルトの名無しさん2007/07/17(火) 11:06:24
>>568
ありがとう。

呼ばれる関数を、呼ぶ関数の名前のnamaspaceに入れることにしました。
0570デフォルトの名無しさん2007/07/17(火) 22:04:32
生スペースか
0571デフォルトの名無しさん2007/07/18(水) 02:33:18
関数の中に構造体を定義してその中に関数を定義する。
05725662007/07/18(水) 03:15:23
>>571
目から鱗です。

まさにそれを、STLまわりで無自覚のうちにやってました。反省します。
0573デフォルトの名無しさん2007/07/18(水) 22:54:54
>>524
結局ごまかしてる
0574デフォルトの名無しさん2007/07/22(日) 19:56:30
newされた量が別の所で管理されていると言うことは、
void *p = (void*)new Hoge_t[hugahuga];
delete[]p;
でもちゃんとsizet(Hoge_t) * hugahugaバイトの領域が開放されるんですか?
0575デフォルトの名無しさん2007/07/22(日) 20:06:59
うん
0576デフォルトの名無しさん2007/07/22(日) 20:10:20
>>574
解放はされるけど、そのコードでは、Hoge_tがデストラクタを持っていた場合、
デストラクタが呼ばれないのがまずいという別問題も忘れないでね。
0577デフォルトの名無しさん2007/07/24(火) 17:28:14
今までVC6をつかっていたのですが環境をVS2005 C++に変えました。
メモリアクセス違反を不正なポインタにアクセスして出した場合、いままでは

catch(...)

で例外を捕捉できていたのですが2005にしたらできなくなってしまいました
原因もしくは解決方法をご存じの方がいましたらお願いいたします。

処理としては不正なポインタからローカルの変数に代入しているだけです。
よろしくおねがいします
0578デフォルトの名無しさん2007/07/24(火) 17:38:12
ディスプレイの任意のピクセルの色情報を取得したいんですけど
どんなことをすれば出来るんでしょうか
普通に入ってるwindows.hとかでも出来ますか?

画面丸々ビットマップに変換して〜
とかなら自分でも出来そうなんですけど、全然スマートじゃない気がするので
0579デフォルトの名無しさん2007/07/24(火) 17:52:04
>>578
ディスプレイ=デスクトップとして、
デスクトップのDCを得る。 HDC hdc = GetDC(NULL);
HDCの任意の場所のピクセル情報を得る COLORREF rgb = GetPixel(hdc, x, y);

こんなんでどうか
0580デフォルトの名無しさん2007/07/24(火) 17:59:54
>>579
おお、そんな便利な命令があったんですか
2,3時間ネットで調べて見てもダメだったんですが綺麗に解決しました。
ありがとうございます
0581デフォルトの名無しさん2007/07/24(火) 19:23:04
>>577
コンパイラオプション/EHa使え
0582デフォルトの名無しさん2007/07/24(火) 19:28:20
最近C初めたんですが
#include <string.h>
を入れるとコンパイルしても結果が得られないのですがなぜですか???
超初心な質問だと思いますが・・・
どなたか助言をお願いします
0583デフォルトの名無しさん2007/07/24(火) 19:30:53
嗚呼、ぬるぽ
0584デフォルトの名無しさん2007/07/24(火) 19:41:53
私も最近C初めたんですが
#include <string.h>
を入れるとコンパイルしても結果が得られますのですがなぜですか???
>>582は超初心な質問だと思いますが・・・
どなたか助言をお願いします
0585デフォルトの名無しさん2007/07/24(火) 19:43:57
私も最近C初めたんですが
#include <string.h>
を入れるとコンパイルしても結果が得られないのですがなぜですか???
>>584も超初心な質問だと思いますが・・・
どなたか助言をお願いします
0586デフォルトの名無しさん2007/07/24(火) 19:46:46
>>584
>>582が低脳だから
0587デフォルトの名無しさん2007/07/24(火) 19:52:00
>>582
その「結果が得られない」というソースを張りたまえ。
0588デフォルトの名無しさん2007/07/24(火) 19:56:25
ソースってなんでしょう???ウスターソースならウチにありますが・・・
05895822007/07/24(火) 19:58:19
なんだかよくわかりませんがもう一度コンパイルしたら
でてきました
どうもすいません
0590デフォルトの名無しさん2007/07/24(火) 20:03:37
                           ____     
                         /_ノ  ヽ、_\    
   プギャアアアアアアアアアアアアアア     o゚((●)) ((●))゚o    
                      /::::::⌒(__人__)⌒::::: \ 
               (⌒)     |     |r┬-|     |  
           ,┌、-、!.~〈     |     | |  |     |   
            | | | |  __ヽ、   |     | |  |     |  
           レレ'、ノ‐´   ̄〉. \      `ー'     /   
            `ー---‐一' ̄                  
0591デフォルトの名無しさん2007/07/24(火) 20:49:48
>>581

ありがとうございます。無事動作いたしました。
SEHというものを初めて知りましたが、便利ですね
0592デフォルトの名無しさん2007/07/27(金) 08:19:12
連想配列を実現する関数のサンプルってどこかにありませんか?
0593デフォルトの名無しさん2007/07/27(金) 08:22:35
>>592
std::map?
05945922007/07/27(金) 08:33:40
サンプルを自力で発見しました。
どうもお騒がせしました
0595デフォルトの名無しさん2007/07/27(金) 08:34:27
>>593
C言語で連想配列を実現したかったんです。
舌足らずですみません。
で、こんなHPを見つけて事故解決しました。
http://ew-and-f.hp.infoseek.co.jp/MyStudy/C-Language/associated-array.html
0596デフォルトの名無しさん2007/07/27(金) 09:34:22
Cだとハッシュという言葉のが一般的だからなあ。
0597デフォルトの名無しさん2007/07/27(金) 18:54:56
template <class T>
class foo
{
public:
T _data;
foo(const T& v){ _data = v; }
};
というクラスがあったとして

foo<int> foo1(4);
foo<double> foo2(2.5);
…
foo2 = foo1;
foo<double>foo3 = foo<int>(2);

という代入を実現したいのですがこれは可能でしょうか
テンプレートコンストラクタを作ろうとしたら当然無理でした
0598デフォルトの名無しさん2007/07/27(金) 19:09:34
>>595
STLにあるのに、自分で作るの?

・・・たぶん学校の宿題なんだろうな・・・
0599デフォルトの名無しさん2007/07/27(金) 19:14:03
事故解決したら危ない
0600デフォルトの名無しさん2007/07/27(金) 19:36:30
>>598
C++じゃなくてCだそうだよ。
0601デフォルトの名無しさん2007/07/27(金) 19:43:10
>>597
テンプレートのコンストラクタと代入演算子を用意するだけでは?
template<typename U>
foo(const foo<U>&);
template<typename U>
foo& operator =(const foo<U>&);

これとは関係ないが、コンストラクタでは代入ではなく初期化リスト使え。
0602デフォルトの名無しさん2007/07/27(金) 20:09:03
>>597
あなたが実際にやろうとしていることは、

foo<double> foo_d = foo<int>(2) ;
ではなく、
double d = foo<int>(2) ;
だと思う。

とりあえず
operator T&() { return _data }
を用意すれば、コンパイラが持っているintからdoubleの変換が使われる。
0603デフォルトの名無しさん2007/07/27(金) 20:11:17
ちなみに、
> テンプレートコンストラクタを作ろうとしたら当然無理でした
というのは、
template<class U>
foo(const foo<U>& u) { _data = u }
だったりしないか?

そりゃダメだ。
やはり、
double d = foo<int>(2)
をやろうとしている。

template<class U>
foo(const foo<U>& u) { _data = u._data }
でなければ。
0604デフォルトの名無しさん2007/07/28(土) 00:50:15
>>601-603
回答ありがとうございます
解決できました

template <class U>
foo(const foo<U>& u)
0605デフォルトの名無しさん2007/07/28(土) 00:54:31
途中送信してしまいました・・・

template <class U>
foo(const foo<U>& u)
{ _data = u._data; }

この形式でいけました
ちなみにクラステンプレートだとfoo<T>とfoo<U>とは
別のクラスになるようなので
_dataのゲッタを使って解決できました

ありがとうございました
0606デフォルトの名無しさん2007/07/28(土) 02:44:33
>>605

>>597の通りなら、_dataはpublicだからgetterはいらないよ。
publicではない場合は・・・面倒くさいからgetterを使うか。

同じテンプレートのクラスどうしならいいけど、違っていたらダメだから、
副作用もあるけど、operator T&を用意したほうが便利だと思う。
0607デフォルトの名無しさん2007/07/28(土) 07:50:35
ゲッタを用意するのとoperator T&を用意するのとでは、本質的には何も変わらないだろ。
0608デフォルトの名無しさん2007/07/28(土) 07:55:49
getterを誰が呼ぶのか、getterを呼ぶコードを誰が書くのか、という点で違うと思う。
0609デフォルトの名無しさん2007/07/28(土) 08:16:00
もうfriendにすればいいよ。
template<typename U>
friend class foo<U>;
auto_ptrとかshared_ptrもこんなことやってのかと思ったら、
getterあるから不要だった。
0610デフォルトの名無しさん2007/07/28(土) 08:30:31
>>609
friendにしたところで、肝心のメンバ変数の名前が一致していないとダメだ。

ちなみにVC7.1では、そういうfriend宣言はできない・・・orz
0611デフォルトの名無しさん2007/07/28(土) 14:11:55
Cで、ボタンを押すとファイルから1行ずつ読み取って描写するプログラムを作っています。
テキストの描写にはDrawTextを使っているのですが、うまくいかないので質問したいと思います。

例えば、長い文字列を描写した後、同じ場所に短い文字列を描写すると前の文字列の後ろの方が残ってしまうのです。
1回最小化してまた開くと、うまく表示されるのですが何が悪いのかよく分かりません。

こんな説明ですが、分かる方が居ましたらお願いします。

0612デフォルトの名無しさん2007/07/28(土) 14:14:14
知らないけど、リフレッシュ
0613デフォルトの名無しさん2007/07/28(土) 14:14:58
文字を書く前に、一旦後ろを真っ新に塗りつぶせばいい。
0614デフォルトの名無しさん2007/07/28(土) 14:37:44
文字列に空白でもたくさんつけとけ。
0615デフォルトの名無しさん2007/07/28(土) 14:39:42
あるいは自動で最小化→最大化とか
06166112007/07/28(土) 15:05:28
私の技術力の低さのせいで614さんと615さんの方法しか試せませんでしたが、なんとか解決できました。
提案して下さったみなさん、本当にありがとうございました!
0617デフォルトの名無しさん2007/07/28(土) 18:18:44
えー
ちゃんと描画ハンドラを適切に実装しる
06186112007/07/28(土) 18:53:04
今までにコンソールアプリケーションを作る事はあったのですが、
windowsアプリケーションは初めてで、色々苦戦してます。

メッセージ等初歩的な事は理解できたのですが、分からないことが多いです。
描画ハンドラの適切な実装?を私は
InvalidateRectを呼び出して再描画させる事だと考えたのですが、うまくいかないようです。
見当違いなことを言っていたらすみません。
0619デフォルトの名無しさん2007/07/28(土) 19:16:06
>>618
WindowsのGUIの基礎を勉強したほうがいいと思う。

断片的にやり方を調べてやっていると、
根本的なところを間違ったりするよ。

自前でチマチマやるくらいなら、
VCLとか使ったほうがいいかも。
0620デフォルトの名無しさん2007/07/28(土) 19:20:28
>>618
見当違いなことを言い過ぎで恥ずかしいです。
06216112007/07/28(土) 19:30:50
今回質問をして、明らかに知識も技術も不足していることが分かりました。
もう一度基礎から勉強し直そうと思います。

指摘や指導して下さったみなさん、ありがとう。
次にこのスレに来るときは、もう少しレベルアップしてきます。
では。
0622デフォルトの名無しさん2007/07/28(土) 21:19:59
>>621
し直す

というあたりが不安だ。
一度も勉強していないものを、どうやって し直す のかと。
0623デフォルトの名無しさん2007/07/28(土) 21:50:39
お前さ、どんだけ上から目線なんだよ
0624デフォルトの名無しさん2007/07/28(土) 22:07:01
お前さ、どんだけ下から目線なんだよ
0625デフォルトの名無しさん2007/07/28(土) 22:13:23
#お前さ、どんだけ下から目線なんだよ
0626名無しさん@そうだ選挙に行こう2007/07/29(日) 08:54:31
     ∧_∧
     ( ・ω・ ) <消しゴムが落ちたので拾ってください
      (====)
   ______( ⌒) )
 /\   ̄`J ̄ ̄ ̄\
  ̄ ̄ ̄ ̄| | ̄ ̄ ̄ ̄
         | |
       / \       □
0627名無しさん@そうだ選挙に行こう2007/07/29(日) 09:47:56
##お前さ、どんだけ下から目線なんだよ
0628名無しさん@そうだ選挙に行こう2007/07/29(日) 11:03:13
#ここに初心者に対するコメントをどうぞ
0629デフォルトの名無しさん2007/07/31(火) 18:51:32
#include<stdio.h>
#include<window.h>
main(){
int i;
while(1){
printf("入力して下さい: ");
scanf("%d",&i);
Sleep(5000);//長い処理の代わり
printf("値:%d",i);
}
}
このようなプログラムの場合、sleepしてる間(長い処理)に
キーボードから標準入力を入れると次にscanfに回ってきたとき
sleepしてる間に打った数字が勝手に入ってしまうのですが、
scanfの後、キーボードからの標準入力をいったん停止することはできませんか?


0630デフォルトの名無しさん2007/07/31(火) 18:55:36
読み捨てるしかありません。
0631デフォルトの名無しさん2007/07/31(火) 19:36:16
すいません、読み捨てるって意味がよくわからないです。
0632デフォルトの名無しさん2007/07/31(火) 19:41:46
すいません、これって超基本という感じもするのですが、、、
以下のソースをg++でコンパイルすると
最初の行とその次の行の結果が異なるのですが、
これは何故なのですか?

#include <iostream>
using namespace std;
int main()
{
cout << 1 + 0.05 * (0.25) / 90 << endl;
cout << 1 + 0.05 * (90/360) / 90 << endl;
return 0;
}



0633デフォルトの名無しさん2007/07/31(火) 19:47:00
90 / 360 = 0 だから。
90.0 / 360 とかすれば同じになる。
0634デフォルトの名無しさん2007/07/31(火) 19:53:59
int 型同士の演算はその結果も int 型
90/360 は 0.25 という結果が int 型に切り詰められてゼロになる
0635デフォルトの名無しさん2007/07/31(火) 19:55:36
>>633
そうか!
ありがとうございます。
結構大きなソースを追いかけていたのですが、最後にようやく
上記の行が原因とわかりまして、でもなぜうまく動かないのか
わからなかったのですが、そうですよね、90も360もintになりますよね。
ありがとうございました。

0636デフォルトの名無しさん2007/07/31(火) 19:56:20
>>634
ありがとうございました。
0637デフォルトの名無しさん2007/07/31(火) 20:49:08
>>631
「scanf() 呼ぶ直前に、残った文字を全部読んでしまえ」ってことだろうが
それは無理。
 ttp://www.kouno.jp/home/c_faq/c12.html#26

ついでに
 ttp://www.kouno.jp/home/c_faq/c12.html#20
0638デフォルトの名無しさん2007/07/31(火) 20:52:14
>>637
fflush使わずともscanf("%*[^\n]%*c");みたいにscanfだけでも何とかなる。
0639デフォルトの名無しさん2007/07/31(火) 21:04:46
いや、
>読まれていな い文字は、O/Sレベルのバッファにもため込まれている可能性がある。
だから「それは無理。」なのだろう。
しかしこれはちょっと・・・元の>629はそんなシビアな話ではないと思う。
0640デフォルトの名無しさん2007/07/31(火) 21:08:38
裏で字を食い続けるだけのスレッド動かせばいいんじゃね?

すげー無駄だけど
0641デフォルトの名無しさん2007/07/31(火) 21:48:35
Aというファイルfopenで開き、fgetcでCString型の箱に格納。
Replaceで一部を置き換え、Bというファイルに書き出すというのは可能でしょうか。
0642デフォルトの名無しさん2007/07/31(火) 21:57:17
>>641
そりゃぁできるでしょ。
0643デフォルトの名無しさん2007/07/31(火) 22:00:23
CStringはTCHAR用なので、_gettc()ではなく(f)getc()を使うのなら
CStringAを使え
0644デフォルトの名無しさん2007/08/01(水) 01:58:23
class Counter;
{
/* 略 */
int data[];
int total;
};
int main()
{
Counter counter(N); /* counter[i] = 0 */

クラスCounterは内部に配列を持っていて0で初期化されているとします
counter[i]の値をインクリメントしたとき自動的に
totalもインクリメントされるようにしたいのですが

Counter::inc(index)
{ data[index]++;total++; }
ではなく
Counter::operator ++ (int)で実現する方法はないでしょうか

class val

0645デフォルトの名無しさん2007/08/01(水) 02:01:13
途中送信してしまいました・・・

class value
{
static int total;
int val;
/* 略 */
int operator ++();
};

というクラスを作れば実現できますが
これだとCounter c1,c2;としたときtotalが共有されてしまいます
0646デフォルトの名無しさん2007/08/01(水) 02:02:48
最終的に
counter[i]++;
としたとき
counter.totalも++されるようにしたいのです

なにかいい方法があればご教授ください
0647デフォルトの名無しさん2007/08/01(水) 03:22:28
テンプレートクラスをtypedefする方法ってありますか?
0648デフォルトの名無しさん2007/08/01(水) 05:12:34
>>644-646
ちょっとサンプル作ってみたよ、参考にしてみてくだしあ><
ttp://2ch-library.com/uploader/src/2ch7515.cpp.html

方針としてはDataの配列(サンプルではvectorだけど^^;)
を持つCounterから直接インクリメント演算子を呼び出すんでなくて、
間に別のクラスをかませるってやり方
サンプルではそのクラスが合計インクリメント数も保持しちゃうんだけど、
チョッと弄ればCounterクラスが合計を保持するようにも出来る
この場合はfriend指定使ってるけどboost::functionみたいなデリゲート使えば
必要な関数だけ渡してfriend指定なしにもできる

>>647
ちょっとエスパー回答だけど、例えば
foo< bar< hoge< hage<piyo> > > > …(*)
ってのをtypedefみたいにショートカットするなら
template <type T> struct foo2 {
  typedef typename foo< bar< hoge< hage<T> > > > type;
};
とでもして、foo2<piyo>::typeってすれば(*)と同じような意味になりtypedefみたいな使い方ができる
こういうのをメタ関数と呼ぶらしい
06496462007/08/01(水) 11:39:12
>>648

非常に参考になりました
Binderを内部クラスにする方向で進めてみます

どうもありがとうございました
0650デフォルトの名無しさん2007/08/01(水) 11:39:21
すいません。質問です。
DXライブラリ(DirectXライブラリ)とVC++を使ってゲーム製作の学習中です。
スクリプトエンジンを作るため、テキストファイルを開いてstring型の配列に格納してファイルをクローズする、
という処理が上手く行きません。
ファイルを行と行ごとの内容でアクセス出来るようにしたいので、string型の二次元配列で最初は書いていたのですが、
上手く行きませんでした。
一昨日にvectorの存在を知って、早速試しているのですが、やはり上手く行きません。

vector<string> Scenario;
Scenario.resize(500);
char* ScenarioFile = "Log.txt";
char Buf[256];
int FileHandle = FileRead_open( ScenarioFile );
int i=0;
while(FileRead_eof(FileHandle) == 0){
FileRead_gets(Buf,256,FileHandle);
Scenario.push_back(Buf);
}
FileRead_close(FileHandle);

このように記述しているのですが、Scenario[0]から全て ・ としか表示されず、
どうやら漢字コードの半分だけを表示しているようだと予測しました。
完全に失敗です。
whileの中にブレークポイントいれてみると、Bufの内容はちゃんと1行まるまる入っています。
格納が上手くいっていないようです。

どうすればテキストファイル丸々をstring型配列に落とすことが出来るのでしょうか?
どんどん足していって、改行コード毎に1行と判別させるメソッドを組むしかないのでしょうか?

アホですいません。宜しくお願いします。
0651デフォルトの名無しさん2007/08/01(水) 11:43:54
ファイルのエンコードの問題かな?
プログラムとファイルの双方のエンコードを確認してみては?
0652デフォルトの名無しさん2007/08/01(水) 11:59:53
>>650
>Scenario.resize(500);
もしかして: Scenario.reserve(500);
06536502007/08/01(水) 12:12:39
すいません、誤解を招きそうな書き方をしてしまいました。
『Buf自体にはちゃんと1行入っていて、Scenario.puch_back(Buf)が出来ていないようです』という意味でした。
本当にすいません。

>>651さん
念のため、他のメソッドで使っているイベントデータを読み込んでみましたがダメでした。
ちなみに、そのメソッドはchar型で格納して1行ずつ表示したり、それをstrtok()に掛けるなど
の処理を行っています。こちらは動いています。

>>652さん
リザーブしてもダメでした……


おそらく、文法がちゃんと理解出来ていないせいだろうと思いますが、
例によって何が間違っているのか分からないという状態に陥っています(´・ω・`)
vector<string> a; a.reserve(500);と
string a[500];は、ひょっとすると配列としてはほぼ同じですか?
0654デフォルトの名無しさん2007/08/01(水) 12:20:59
次の3つが、後にa[0]からa[499]までの要素が使えるという点で似たようなもの。
1. std::vector<std::string> a; a.resize(500);
2. std::vector<std::string> a(500);
3. std::string a[500];

push_backは現在の最終要素の後ろに追加するメンバ関数。
a.size()が500のときにpush_back(Buf)したら、
そのBufの内容はa[500]で参照することになる。
06556502007/08/01(水) 12:52:30
>>654さん
push_backの意味、理解出来ました!ありがとうございます。
ひょっとして、std::string Text[512];として、
Text[0]に1行目、Text[1]に二行目、という風に合計512行を
格納出来るんじゃないかという考え方は、そもそも間違っていますか?
char型のa[10]とstring型のa[10]は、どちらも10バイト分の要素を持つ配列、
という意味になってしまうのでしょうか?
てっきり、string型は1行を動的に格納出来る優れものだと思ってました……
行単位で保持しようという考え方が、そもそも無茶なのでしょうか。
ここまできて、ようやく、『ひょっとするとファイルオープンしたままのほうが
面倒が少なくていいんでね?』とか思い始めてきました……(´・ω・`)

ちなみに、リザーブせずにpush_backで継ぎ足していったら、要素を出力した瞬間に
『ハンドルされてない例外エラー』で停止しました……切ないです(´・ω・`)
0656デフォルトの名無しさん2007/08/01(水) 13:03:43
>>655
stringは一行(というか可変長な文字列ひとつ)を扱うクラス。
stringの配列で、行ごとに扱うというのは別に間違ってないよ。

あと、reserveは使うとpush_backが早くなるかもしれないけど、
使わなくてもいいという代物。
reserveしないとエラーが出るというのは、別のとこに原因があるはず
06576502007/08/01(水) 13:19:33
>>656さん
ありがとうございます。
原因は、Scenario[0]を出力しようとしているところにありました。
そして、string型の要素が入ってるくせに、.c_str()が使えないようです。

諦めて、string Scenario[500]; にしてコードを適切に変えたら、
やりたかったこと(1行単位で格納)そのものは出来ました。
やはり、stringの考え方そのものは正しかったようです。
それはそれで嬉しいのですが、今度はvectorの使い方を理解出来ていないと
いうことが発覚して、非常に悔しいです。

改めて、また全く別の質問をさせてください。

vector<string> a(10);
と宣言しても、a. でリストに出てくるメソッドはvectorのもので、stringの .c_str()等が
使えないのはどうしてでしょうか?
また、a[0].にいたっては、リストすら表示されません。
a[0]にはstring型のデータが格納されていると考えるのは間違っていますか?

これが、string b[10];なら、b[0].c_str();が使えることは確認済みです。
てっきり、同じように扱える物だと思っていましたが、どうやら違うようです。

宜しくお願いします(涙)
0658デフォルトの名無しさん2007/08/01(水) 13:38:24
いや、そんな感じだぞ。
vector<string> a(10);とすると、aは10個要素を持った状態になる。
a[0].でstringのメンバが出てこないのは、単にエディタが阿呆なだけだから諦めろ。
0659デフォルトの名無しさん2007/08/01(水) 13:39:13
VC2005だとちゃんと表示されるぜ
0660デフォルトの名無しさん2007/08/01(水) 14:06:47
VC2003だと所々怪しい。
ポインタと配列が組み合わさるとインテリセンスが働かないことがある。
VC6を使ってたときはもっとひどかった。
06616502007/08/01(水) 14:32:24
皆さん、本当にありがとうございます。
泥沼に入り込んだような絶望的状況の中、優しさに泣けてきます。
コーディング専用に使ってる古いノーパソの方はVC++2002でしたので、
メインPCに入っているVC++2005ExpressEditionのほうにソースコード移して、プロジェクト作り直してみました。
(2002と2005で互換性無いみたいで、余計なトラブル防ぐためです)

すると……出ます! vector<string> a; a.resize(500); で、 a[0]にちゃんとstringのメソッドが出ます!
やったぜ!

喜び勇んでデバッグビルド。

……LNK4217やらLNK2019やらLNK1120やら出まくりやがります……(´;ω;`)
どうやら、vectorを使うと出るっぽ……(コメントアウトすると出ない

とりあえずエラーコードを全部ググってみたのですが、正直、専門用語連打で今ひとつ原因が理解できていません。
もうちょっと格闘してみます。
0662デフォルトの名無しさん2007/08/01(水) 14:35:53
#include <vector.h> とかやってるってオチはないだろうね
06636502007/08/01(水) 14:52:27
>>662さん
ちゃんと

#include "string"
#include "vector"

にしてます。
昼飯抜きでやってたので、いまちょっとラーメン食ってます。
今日は有給取ってまとまった時間があるんで頑張ります(^^)
0664デフォルトの名無しさん2007/08/01(水) 15:00:07
ランタイムライブラリの設定がおかしくなっているような気がする。
0665デフォルトの名無しさん2007/08/01(水) 15:44:18
C++のソースを他の言語に移植しているのですが、ちょっとこまったことがありました。

class Hoge
{
 Hoge();
 virtual ~Hoge();
}

といった、クラスがある場合、

ソース中、

 Hoge hoge;

として、動的生成ではなく、静的に宣言?した場合、
デストラクタ(~Hoge);は、スコープから外れると自動で呼ばれるものなのでしょうか?

自動で、呼ばれない言語に移植しているいじっているもので(Delphi)


0666デフォルトの名無しさん2007/08/01(水) 15:45:22
>>665
試してみればわかると思うけど、YES
06676652007/08/01(水) 15:45:28
途中で、送信してしまいました。


自動で、静的な構造体の場合、デストラクタが呼ばれない言語に移植しているもので(Delphi)、
その場合は、手動でデストラクタを呼び出す必要があるということになりますよね。
06686502007/08/01(水) 15:46:10
いろいろ確認しましたが、やはり、vectorを使用するとリンカエラーが出るようです。
vector<int> i;
と宣言して未使用のままでも、エラーが出ます。
stringは問題なく使えます。
他のSTLについては、そもそも使い方をまだ学習していないのでインクルードすらしてません。
ノートの方でエラー出ないってのが不思議です……
どなたか、原因が分かる方いらっしゃいますか?

>>664
設定を戻したいのですが、どのようにしたら元に戻せるんでしょうか?
再配布用のVC++2005 SP1ランタイムは見付けましたが、多分、再配布用じゃないですよね(´・ω・`)
06696652007/08/01(水) 15:49:27
>>666
サンクスです。

こちらにも書いてありました。
C++編(言語解説) 第7章 コンストラクタとデストラクタ
http://www.geocities.jp/ky_webid/cpp/language/007.html

newしない場合は、スコープ外れるときに自動で呼ばれるのですね。
newした場合は、deleteするときに呼ばれる、と・・・。
0670デフォルトの名無しさん2007/08/01(水) 15:54:29
>>668
プロジェクトの設定でC/C++→コード生成で
ランタイムライブラリの設定をDLLからスタティックリンクライブラリにしてみたらどう?
0671650/6682007/08/01(水) 16:10:06
>>670さん
ありがとうございます。
プロパティ→C/C++→コード生成→ランタイムライブラリ を見てみたところ、

マルチスレッド
マルチスレッド デバッグ
マルチスレッド DLL
マルチスレッド デバッグ DLL

の4つ選択肢があって、デフォルトではマルチスレッドデバッグDLL(Debugモードです。リリースだとマルチスレッドDLLになります)に
なっていましたので、スタティックリンクライブラリの意味が正直よく分かっていないのですが、
『マルチスレッドデバッグ』にしてみました。
やはりリンカエラーでます。

「LNK4098: defaultlib 'LIBCMT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。」
これだけ、新しい(?)エラーが出た……のかな???
他はLNK2019,LNK2001,LNK1120(fatal)です。

ざーーーーーっとMSDNやぐぐってヒットした質問掲示板を片っ端から見て行ってるのですが、自分と該当するものは
今のところ見付かっていません。

#include "vector"
vector<int> i;
の二行だけでエラー出るってやっぱおかしいですよね?
0672デフォルトの名無しさん2007/08/01(水) 16:11:49
ライブラリ見てる先が違うのでは?
0673デフォルトの名無しさん2007/08/01(水) 16:23:59
ライブラリの設定をマルチスレッドデバッグDLLに戻して
#include <vector>
でも駄目かね?
0674デフォルトの名無しさん2007/08/01(水) 16:26:36
いやまずは、

char str[100][300];
string str [100];

で読む込むかやって見ろよ


0675デフォルトの名無しさん2007/08/01(水) 16:28:33
char* ScenarioFile = "Log.txt";
char buf[500][256];
int FileHandle = FileRead_open( ScenarioFile );
int i=0;


while(FileRead_eof(FileHandle) == 0){
FileRead_gets(Buf[i], 256, FileHandle);
i++;
}
FileRead_close(FileHandle);
0676650/6682007/08/01(水) 16:30:57
>>672
それだと、stringもダメになりませんかね?
stringは普通に使えてます。

>>673
戻してみて、#include <vector>にしましたがダメでした。
時間掛かるけど、再インストールしてみたほうがいいっすかね?
0677デフォルトの名無しさん2007/08/01(水) 16:32:07
つか、なぜC/C++ライブラリや、windowsAPIを使わないのか教えろ
0678デフォルトの名無しさん2007/08/01(水) 16:37:36
普通のやり方だと動くのか???

#include <fstream>
using namespace std;

fstream fp;
string str;
fp.open("Log.txt", ios::in );

do{
getline(fp, str);
cout<< str<<endl;
}while(!fp.eof());
0679650/6682007/08/01(水) 16:38:12
>>674さん
>>675さん
ありがとうございます。
vectorを使わないで何とかする方法は皆さんのおかげで無事なんとかなりましたm(_ _)m
今は、VC++2005でvectorそのものが使えないという状態で困っております……

>>677
すいません。WinAPIはまだ学習していませんので、使い方が分かりません。
やっとポインターと参照送りを覚えて、STLの存在を知って2週間ばかりのど素人です……
C/C++ライブラリとは、STLのことですよね?
今はSTLのstringを覚えて、vectorに差し掛かったばかりです。
0680650/6682007/08/01(水) 16:41:14
すいません、先ほど>>677にさん付けるの忘れてました。他意はありませんm(_ _)m

>>678
普通のやり方でももちろん動きます。特にDXライブラリが悪さしているとは思えません。
ぜんぜん関係ない、ごく普通のC++の部分でエラー吐いてますので……

vectorさえ使わなければ、エラーも出ず普通に動きます。
さし当たって今やろうとしていることには必要のないものですが、C++の学習が主な目的でもありますので、
使ったらエラーという状態だけは何とかしておきたいなと思っています……
0681デフォルトの名無しさん2007/08/01(水) 16:43:02
2003もアンインスコして再インスコだな
標準でさえこのざまなんだからこの先どんな不具合が起こるかわからないって状況は普通に怖いぞ
0682デフォルトの名無しさん2007/08/01(水) 16:46:06
↓のプログラムをDOSで実行すると、何故か画面がフリーズして
「問題が発生したため、終了します」という画面が出て実行できないのですが
何故なんでしょうか?文法上の誤りも自分で見る限りは特に無いと思うのですが・・・
混じれ酢お願いします。
改行が多すぎて一度に書き込めない様なので分割して書き込ませて頂きます

#include<stdio.h>
#include<string.h>


0683デフォルトの名無しさん2007/08/01(水) 16:47:05
main(int argc, char* argv[])
{


char filename[256];
char key[128];
if(argc>2){strcpy(filename,argv[1]);
strcpy(key,argv[2]);}
else if(argc){
strcpy(filename,argv[1]);
printf("暗号キーを入力してください>");
scanf("%s",key);

} else {
printf("ファイル名を入力してください>");
scanf("%s",filename);
printf("暗号キーを入力してください>");
scanf("%s",key);

}

printf("ファイル名:%s\n",filename);
printf("暗号キー:%s\n",key);

return 0;}
0684デフォルトの名無しさん2007/08/01(水) 16:47:23
vectorは殆ど使い道ないよ
初めから必要な領域を動的確保すればよい
0685デフォルトの名無しさん2007/08/01(水) 16:49:38
>>682
実行するときに引数入れろよ
0686デフォルトの名無しさん2007/08/01(水) 16:52:43
>>683
コマンドライン引数ないとargv[1]参照してエラー起きる

argcは少なくとも1だよ
argv[0]にはプログラム名が入ってるから
0687デフォルトの名無しさん2007/08/01(水) 16:52:45
else if(argc>=2){ にしとけ
0688デフォルトの名無しさん2007/08/01(水) 16:53:07
>>685
実行するときに引数を入れても同じ画面が出てエラーになります・・・
0689デフォルトの名無しさん2007/08/01(水) 16:53:43
途中だったw

if文書きかえて

if(argc > 2) うんたら
else if(argc == 2)うんたら
else うんたら
にしる
0690デフォルトの名無しさん2007/08/01(水) 16:54:24
>>684
それだと解放する手間がかかるでしょ。
例外に強くするためにもvectorに解放を任せるのは有用。

もしかして釣られた?
0691デフォルトの名無しさん2007/08/01(水) 16:59:46
>>689
ありがとうございます!!やってみたらできました
こんなくだらないミスで質問をしてすみません・・・
皆さんありがとうございました
0692デフォルトの名無しさん2007/08/01(水) 17:00:47
一つ一つ内容を増やしていって確保する領域が不明であるケースなんて
ほとんどないよ
それに、個数が多ければ一度に確保しておいた方が速いし、
個数が少なければ多めに確保しておけばエラーは出ない

多くても少なくてもvectorは使えない
0693650/6682007/08/01(水) 17:01:09
>>684さん
なんとなく『最初から上手く設計すればいらないような……?』とは思っていたのですが……_| ̄|○
はっきり言って下さってありがとうございます。
踏ん切りが付きましたので、ひとまずvectorの学習は中断することにします。


あ、でもVC2005の再インストールだけは念のためしておこうと思います(^^;

皆さん、本当にありがとうございました!
0694デフォルトの名無しさん2007/08/01(水) 17:02:41
例えば、100万個データ追加するのに
毎回vectorのメンバ関数で追加するより
a[i]=5とやった方が速いし見やすい
0695デフォルトの名無しさん2007/08/01(水) 17:06:06
               .|   |  | |   |    |  | |   |   |   || | |
               .|   |  | レ  |    |  | |   |  J   || | |
    ∩___∩    |   |  |     J    |  | |  し     || | |
    | ノ\   ,_ ヽ  .|   レ |      |  レ|       || J |
   /  ●゛  ● |   .J      し         |     |       ||   J
   | ∪  ( _●_) ミ             .|    し         J|
  彡、   |∪|   |              .J                レ
 /     ∩ノ ⊃  ヽ
 (  \ / _ノ |  |
  \  "  /  | |
   \ / ̄ ̄ ̄ /
      ̄ ̄ ̄ ̄
0696デフォルトの名無しさん2007/08/01(水) 17:08:56
>>692
reserve

>>694
resize
0697デフォルトの名無しさん2007/08/01(水) 17:10:55
vectorの方が楽
それだけで使用価値があるとは思わないか
0698デフォルトの名無しさん2007/08/01(水) 17:13:17
vectorの方が不便
だって[]での代入が装備されていない
0699デフォルトの名無しさん2007/08/01(水) 17:13:43
>>698
はい?kwsk
0700デフォルトの名無しさん2007/08/01(水) 17:16:27
template <typename T>とtempalte <class T>ってどう使い分けすれば良いんでしょうか?
0701>>6992007/08/01(水) 17:18:39
#include <vector>
#include <iostream>
using namespace std;

main(){
vector<int> v;

v.push_back(1); cout << v[0]<<endl;
v[0]=2; cout << v[0]<<endl;

/* 逆にしたこっちはエラーになる

v[0]=2; cout << v[0]<<endl;
v.push_back(1); cout << v[0]<<endl;


*/

}
0702デフォルトの名無しさん2007/08/01(水) 17:20:46
reserve();で確保すればエラー出ないんだな
しらんかった すまん
0703デフォルトの名無しさん2007/08/01(水) 17:21:27
>>701
そんな使い方ありえないから実装されてない
使いたければオーバライドすればいいじゃん
0704デフォルトの名無しさん2007/08/01(水) 17:26:07
>>700
好みの問題。
ただし、下みたいなテンプレートテンプレートではclassしか使えなかったはず。
template<template<typename T> class T>
こんな機能使わないけど。
0705デフォルトの名無しさん2007/08/01(水) 17:28:39
>>702
reserveで押さえただけ領域は使ってはいけないところ。
vectorで使える要素は0番目からsize()の1つ手前の要素まで。
size()の値を変えるにはresize()。

特に要素がクラスオブジェクトだとコンストラクタが呼ばれていなかったり、
デストラクタが呼ばれた後だったりするのでわかりやすいけど、
組込型でも駄目なことに変わりはない。
0706デフォルトの名無しさん2007/08/01(水) 17:29:21
vectorかnewかどっちがいいかは、巨大配列を確保したときに問われるだろう
何となくvectorは100M超の領域確保に向いていない気がするが・・・
速度、安定性において同程度ならvectorに統一した方がいい


0707デフォルトの名無しさん2007/08/01(水) 17:30:12
>>701
それを不便というなら、比較対照にしてる組み込み型では
int *v = new int[0]
と宣言してるも同然じゃね?
0708デフォルトの名無しさん2007/08/01(水) 17:31:28
>>706
それは仰るとおり
ほとんどの場合はvectorでも問題ないから
おれはvector使う
0709デフォルトの名無しさん2007/08/01(水) 17:31:46
>>704
なるほど
複雑な特殊化をする時に必要となりそうな気がするのでメモっておきます
0710デフォルトの名無しさん2007/08/01(水) 17:37:55
>>706
new[]はoperator new[]関数、newはoperator new関数、
vectorは、operator new関数で確保される。
共に<new>に存在し、operator newとoperator new[]で
異なる実装になっていることは考えづらい。殆どの処理系で、同一の実装だと見なして問題ないはず。
そして、operator newやoperator new[]を自分で定義すれば、メモリ確保ルーチンを差し替えられる。

またvector(やその他全てのコンテナ)はアロケータをテンプレート引数に取り、
それを差し替えることでもメモリ確保ルーチンを変更可能。

不用意にinsertやpush_backしなければ、巨大な配列もvectorにして問題ないと思う。
それでも不安ならshared_array/scoped_arrayなんて選択肢もあるけどね。
0711デフォルトの名無しさん2007/08/01(水) 18:01:21
>>710
>不用意にinsertやpush_backしなければ、巨大な配列もvectorにして問題ないと思う。
是。reserve しとけば push_back も怖くない。
0712デフォルトの名無しさん2007/08/01(水) 18:11:39
>>710
オーバーヘッドが掛かったり無駄に確保したりしていないかvector
new単体で使えば2倍の領域確保とかないだろうし
0713デフォルトの名無しさん2007/08/01(水) 18:33:08


      |
      |
      |
      |              /  ̄   ̄ \
     (=)           /、          ヽ
     J >vector厨     |・ |―-、       |
                   q -´ 二 ヽ      |
                 ノ_ ー  |     |
                 \. ̄`  |      /
                   O===== |
                  /          |
                   /    /      |
0714650/6682007/08/01(水) 18:35:00
戻りました。
VC++2005を修復インストールした結果、vector使ってもwarning LNK4217だけで済みました。
fatalなエラーでビルド失敗と言うことはないです。
やっぱ、何かが潰れていたっぽいっすね〜。
これでダメなら再インストールしようと思っていましたが、無事に済んだようです。

LNK4217エラーは4つ出て、どれも内容は似ています。
warning LNK4217: ローカルで定義されたシンボル ??1exception@std@@UAE@XZ (public: virtual __thiscall std::exception::~exception(void)) が
フィクション __unwindfunclet$??0logic_error@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z$0 にインポートされました。

僕の今の知識レベルでは、なんのことやら意味不明です。
実用上問題ないなら、#pragma warningで切っておきます。
ありがとうございました。

あれからのログを見ていると、vectorもやっぱり押さえておきたい基本技術みたいですね。
折を見て勉強再開します。
0715デフォルトの名無しさん2007/08/01(水) 18:51:31
念の為OSの再インストールからやり直したほうがいいよ
0716デフォルトの名無しさん2007/08/02(木) 21:26:13
typedef std::vector<Hoge> VEC_HOGE;

を定義したいときにHoge は前方宣言で対応可能でしょうか?
それとも#include しなければいけませんか?

前方宣言の可付加の決まり方がいまいちわかりません。
よろしくお願い致します。
0717デフォルトの名無しさん2007/08/02(木) 23:49:38
typedef std::vector<ちぺなめ Hoge> VEC_HOGE;
0718デフォルトの名無しさん2007/08/03(金) 00:11:16
すみません、質問させてください。
Cのプログラムで、popenを使ってpingを打ちたいと思っています。
その時に、p=popen("ping www.google.co.jp", "w")のように
直接相手先を書くのではなく、文字配列に相手先を格納し、
それを用いてpingを打つ方法がわかりません・・。
一応ぐーぐる先生にお尋ねはしたのですが、わかりませんでしたorz
(聞き方がまずかったのかも知れませんが・・)
どうぞよろしくお願い致します。
0719デフォルトの名無しさん2007/08/03(金) 00:31:34
sprintf使えばいいんじゃないの?
0720デフォルトの名無しさん2007/08/03(金) 00:39:38
入門書読んだ方がいいんじゃないの。
ping先壊したって知らないよ?
0721デフォルトの名無しさん2007/08/03(金) 00:54:31
system()じゃいかんのかね。
0722デフォルトの名無しさん2007/08/03(金) 01:02:11
>>716 って何か意味あんの?
07237182007/08/03(金) 21:14:19
遅くなってしまいましたが、アドバイスありがとうございました。
正直自分でも、入門書レベルからやり直した方がいいなぁと
自覚はしているのですが、今回は時間に余裕がなかったもので、
ここでお尋ねした次第です・・すみません。ご忠告ありがとうございます。
system()ではどうかとのことですが、プログラムの中でpingの結果を
受け取って処理をしたかったので、今回はsystem()ではなくpopen()を使いました。
記載し忘れてしましたね。ごめんなさい。
sprintfですか。ちょっと試してみたいと思います。
皆様どうもありがとうございましたm(_ _)m
0724デフォルトの名無しさん2007/08/04(土) 20:36:45
行列で
-1 0 1
-1 0 1
-1 0 1 は以下のプログラムでできるんですけど(wはdouble、l,kはint)
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = -1 + k;
}
}

-1 1 -1
-1 1 -1
-1 1 -1
はどんな感じでつくればいいですかね?増分2してみたいな・・・
上のプログラムを極力いじらない感じでお願いします
0725デフォルトの名無しさん2007/08/04(土) 20:40:50
行列で
-1 0 1
-1 0 1
-1 0 1 は以下のプログラムでできるんですけど(wはdouble、l,kはint)
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = -1 + k;
}
}

-1 1 -1
-1 1 -1
-1 1 -1
はどんな感じでつくればいいですかね?増分2してみたいな・・・
上のプログラムを極力いじらない感じでお願いします
0726デフォルトの名無しさん2007/08/04(土) 20:43:15
すいません 2回も書いてしまいましたorz
0727デフォルトの名無しさん2007/08/04(土) 21:12:58
-1×-1=1
これ算数。
0728デフォルトの名無しさん2007/08/04(土) 21:16:16
-1 + k
↓
(k % 2) * 2 - 1
0729デフォルトの名無しさん2007/08/05(日) 05:27:34
int v;
for(k=0;k<3;k++)
{
v=-1;
for(l=0;l<3;l++)
{
w[k][l] = v;
v*=-1;
}
}
でいいじゃん
0730デフォルトの名無しさん2007/08/05(日) 06:31:29
>>727>>729
本気でそんなプログラミングしているのか?
桑原桑原。
0731デフォルトの名無しさん2007/08/05(日) 06:39:44
>>730
桑原桑原。
0732デフォルトの名無しさん2007/08/05(日) 07:07:12
w[k][i] = i&1 ? -1 : 1;
を提案します(ぉ
0733デフォルトの名無しさん2007/08/05(日) 07:07:59
lだった…orz
0734デフォルトの名無しさん2007/08/05(日) 10:40:58
>>729
int v = 1;
for(k=0;k<3;k++)
{
for(l=0;l<3;l++)
{
w[k][l] = v * -1;
}
}

のほうがすっきり。
0735デフォルトの名無しさん2007/08/05(日) 10:55:06
>>734
9つ全部-1にならない?
0736デフォルトの名無しさん2007/08/05(日) 11:18:23
ここのつ、とう!
はい、よくできました♪
0737デフォルトの名無しさん2007/08/05(日) 11:20:12
??
0738デフォルトの名無しさん2007/08/05(日) 11:49:07
!!
0739デフォルトの名無しさん2007/08/05(日) 11:50:44
3×3の行列の初期化くらいなら、
いちいちfor文で回したりせず、
double w[3][3] = { {-1.0, 0.0, 1.0}, {-1.0, 0.0, 1.0}, {-1.0, 0.0, 1.0} }
これでいいじゃないか。
0740デフォルトの名無しさん2007/08/05(日) 11:58:06
例として3×3にしてるだけで、
実際はもっと大きいんじゃないのかな?
0741デフォルトの名無しさん2007/08/05(日) 12:26:55
えー

for(k=0;k<3;k++)
のように、ハードコーディングしてるじゃん。

もし巨大だったり、任意のサイズだったら、そういうコードになるべ?
0742デフォルトの名無しさん2007/08/05(日) 12:33:55
ていうかさ、
行列の問題なのか、
数列の生成の問題なのか、
切り分けてから質問してほしい。
0743デフォルトの名無しさん2007/08/05(日) 12:57:18
全角数字使うなカス
0744デフォルトの名無しさん2007/08/05(日) 18:49:04
揚げ足取り乙
0745デフォルトの名無しさん2007/08/05(日) 18:52:32
揚げ足ってレベルじゃねぇぞカス
0746デフォルトの名無しさん2007/08/05(日) 19:38:47
カスは自分のことを棚に上げる傾向にあります。
0747デフォルトの名無しさん2007/08/06(月) 21:24:19

スレ違いだったらすいません。

アプリ開発の依頼スレが見つからなかったのでこちらに書かせて頂きました。
当方所有のウェブアプリケーションソフト
(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
がURL先の変更?で突然使えなくなってしまいました。

そこで、緊急で本日中に改変が出来そうな方是非お願いできないでしょうか?
当方、全くの知識不足で言語が C++ということ以外分かりません。
ソースファイルは持っております。料金は2万円でお願いします!

[email protected]
0748デフォルトの名無しさん2007/08/06(月) 21:27:03
本日中ってあと2時間半しかないぞ
0749デフォルトの名無しさん2007/08/06(月) 21:28:22
バイナリエディタで書き換えたら使える
0750デフォルトの名無しさん2007/08/06(月) 21:31:03
マルチすると来る人が居なくなるかもよ
0751デフォルトの名無しさん2007/08/06(月) 21:32:25
マルチすると釣られる人が居なくなるよ
0752デフォルトの名無しさん2007/08/06(月) 21:46:42
>>747
2万じゃ安いな・・8万でどうだ?
0753デフォルトの名無しさん2007/08/06(月) 21:47:59
ちゃんと引継ぎしとけよ・・・
0754デフォルトの名無しさん2007/08/06(月) 21:48:45
>(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
待遇悪くて逃げられたんか?
0755デフォルトの名無しさん2007/08/06(月) 23:08:57
>>747
解析料が必要です。弊社なら50万円で納期2週間で考えてみましょう。
プログラムのソースによって見積もりのさじ加減はかなり違います。
0756デフォルトの名無しさん2007/08/06(月) 23:13:25
2万とか・・・どんだけ買い叩いてんだよ
0757デフォルトの名無しさん2007/08/06(月) 23:14:45
ローカルにプロクシ立てるとかすれば何もいじらずに済むんじゃね?
0758デフォルトの名無しさん2007/08/07(火) 01:09:59
多重ループを一気に抜ける方法って、いちいちbreak文つけるか、gotoしかないんですか?

例えば、swtich文の中のif文で、break文以外の処理も行いたい時、
同じif文を二回書くことになるので、なんか無駄に長くなってしまうのですがorz
0759デフォルトの名無しさん2007/08/07(火) 01:11:53
gotoつかやいいじゃん。
0760デフォルトの名無しさん2007/08/07(火) 02:12:19
もうひとつある
そのループを別の関数に分離してreturn
0761デフォルトの名無しさん2007/08/07(火) 03:22:37
賛否あるが、throwってのもある。
0762デフォルトの名無しさん2007/08/07(火) 03:46:58
つか、何の言語?
0763デフォルトの名無しさん2007/08/07(火) 07:36:16
スレを勃てるまでもないC/C++の質問はここで 2
07647622007/08/07(火) 09:25:29
うぁ、すれ立てるまでもない質問はここでスレだと思ってた!
0765デフォルトの名無しさん2007/08/07(火) 10:06:26
(*´д`)σ))Д`)
0766デフォルトの名無しさん2007/08/07(火) 15:07:36
棒倒し法で迷路を自動生成するプログラムを作ろうとしているんですが、すべての棒が同じ方向に倒れます。
下が棒を倒す部分の関数なんですが、どこが間違ってるのか教えてください。

void KnockDown(){
 int i,j;
 for(j=2;j<19;j+=2){
  for(i=2;i<19;i+=2){
   srand( (unsigned int)time(NULL) );
   switch (rand()%4){
   case 0:// 北
    if(maze[i][j-1]!=0) maze[i][j-1]=0;
    break;
   case 1:// 東
    if(maze[i+1][j]!=0) maze[i+1][j]=0;
    break;
   case 2:// 南
    if(maze[i][j+1]!=0) maze[i][j+1]=0;
    break;
   case 3:// 西
    if(maze[i-1][j]!=0) maze[i-1][j]=0;
    break;
   }
 }}
}
0767デフォルトの名無しさん2007/08/07(火) 15:11:43
>>766
srand()は最初に呼ぶだけにしよう。
0768デフォルトの名無しさん2007/08/07(火) 15:11:45
質問なのですが
動画にマイクで声をつけるのはどうやってやるんですか?
後、動画の編集の仕方も教えてください
よろしくおねがいします
0769デフォルトの名無しさん2007/08/07(火) 15:14:09
板 違 い
0770デフォルトの名無しさん2007/08/07(火) 15:21:32
>>766
0が壁で0以外が通路?何か違和感あるなw
あと、ランダムで決定したところにすでに壁ができていた場合どうなると思う?
0771デフォルトの名無しさん2007/08/07(火) 17:07:05
質問です。
ウインドウズでメモリーリークを知るには_CrtDumpMemoryLeaks()を使いますが、
メモリースマッシュを知るにはどうすればいいのでしょうか?

##二重開放とかそういうことです。
0772デフォルトの名無しさん2007/08/07(火) 18:54:14
>>766
一つ言わせてくれ。

質問する前に2つのことをすべし。
1. デバッガでステップ実行する。変数の値の中身も見ること。
2. 問題を切り分ける。

あなたの問題は、
すべての棒が同じ方向に倒れる
のではなく、
rand()%4が同じ値になる
でしょうに。
0773デフォルトの名無しさん2007/08/07(火) 19:05:37
>>771
二重解放なら、
デバッグビルドをデバッガ上で走らせていれば、
デバッガのトレース出力にメッセージが出たと思う。

とりあえず、
_CrtSetDbgFlagで_CRTDBG_DELAY-_FREE_MEM_DFと_CRTDBG_CHECK-_ALWAYS_DFをオンにして、
わざと二重解放してみよう。

オーバーヘッドが多き過ぎるなら、
_CRTDBG_CHECK-_ALWAYS_DFはオフにして、
自分で_CrtCheckMemoryを呼ぶ。

_CrtSetAllocHookを使って、自分でチェックするのも手。
0774デフォルトの名無しさん2007/08/07(火) 21:54:33
>>773
レスサンクス!!

デバッガが警告出してくれるっぽいですねぇ。
コレで安心してメモリ確保ができるってもんです。
当方、趣味グラマの初心者なのでメモリ確保が苦手なのです。
レスほんと、サンクス!



余談ですが、こういうの作ってました。
http://f20.aaa.livedoor.jp/~tori/html/upboard/updir/SafeArray.lzh
内容は参照カウンタ(本命)と配列クラス(デモ)です。
デバッグは済んでいないので使用は自己責任で。

それじゃー。:D
0775デフォルトの名無しさん2007/08/07(火) 22:02:39
む!直リンできないか。

http://f20.aaa.livedoor.jp/~tori/html/upboard/upboard.cgi
または、
http://f20.aaa.livedoor.jp/~tori/html/upboard/updir/
から、取れるかも。
0776デフォルトの名無しさん2007/08/07(火) 23:21:35
>>774
deleteした直後にNULLを代入するのは、
二重解放によるヒープの破壊を防ぐために良いことだが、
そうすると二重解放していてもチェックに引っかからないぞ!

NULLを代入するのをやめるか、
NULLの代わりに-1などのアリエナイ値を代入するのがいいかと。
0777デフォルトの名無しさん2007/08/07(火) 23:26:58
へー
0778デフォルトの名無しさん2007/08/08(水) 01:41:57
^←これどうやって入力するんでしょうか?いい加減コピペは卒業したい
0779デフォルトの名無しさん2007/08/08(水) 01:43:44
キーボード右上「へ」のキー
ってか、ここはC/C++の質問スレなわけで・・・
0780デフォルトの名無しさん2007/08/08(水) 01:46:35
>>778はポケコンの使い手
0781デフォルトの名無しさん2007/08/08(水) 02:54:30
^おぉ出た〜!!Thank you very much.
演算子で使うんです。
0782デフォルトの名無しさん2007/08/08(水) 03:40:19
>>781
メモ帳とかでキーボードのキー全部押して試してみたら・・・
Shift押しながらのキーも・・・
0783デフォルトの名無しさん2007/08/08(水) 07:38:34
キートップに刻印されているのだから、
キーボードをよく見ろ、でいいと思うが。
0784デフォルトの名無しさん2007/08/08(水) 07:41:12
たまにいくつかの記号の類を出せないキーボードはあるよな
なに考えて作ったのかと思う
0785デフォルトの名無しさん2007/08/08(水) 08:04:29
>>784
もしかして:ASCII配列のキーボードをJIS配列の設定で使用?
0786デフォルトの名無しさん2007/08/08(水) 15:28:10
うちのキーボードは半角の”\”だせなんだぜ?
\になる。
0787デフォルトの名無しさん2007/08/08(水) 15:43:42
前は、チルダの位置が2つずれてなかったっけ。
今のはちゃんとしてるようだが。
0788デフォルトの名無しさん2007/08/08(水) 15:43:50
俺も俺も
0789デフォルトの名無しさん2007/08/08(水) 17:11:13
だいぶ前だけど、I/Oの「今月の添付ディスク」コーナーでは
毎回必ずアンダーバーの入力の仕方が書いてあったことを思いだした
0790デフォルトの名無しさん2007/08/09(木) 17:32:12
変な質問かもしれませんが
OSはC言語で作られているんですよね?

WindowsのアプリケーションはWinMain関数ですが、Windows自体の
main関数はどのような感じに記述されてるんでしょうか?

MSの人で無いと解らないんですかね?
0791デフォルトの名無しさん2007/08/09(木) 17:38:56
>>790
・C言語で書かれた物が、全てmain()を持っているわけではありません。
・main()はアプリケーションの入り口としての規格上の共通部であり、どう実装されるかは環境依存です。
0792デフォルトの名無しさん2007/08/09(木) 17:39:13
>>790
WinMain や main は、それを呼び出すルーチンがあって
リンク時にそれをリンクしてるだけなんだぜ。
そのルーチンがどうなってるかは気にならないのか
0793デフォルトの名無しさん2007/08/09(木) 17:49:47
>>791
>C言語で書かれた物が、全てmain()を持っているわけではありません。
そうなんですか・・。Cの全てのソフトがmainとかWinMainで始まると思っていました。

>main()はアプリケーションの入り口としての規格上の共通部であり、どう実装されるかは環境依存です。
つまり色んなOSのアプリケーションの入り口として〜mainなのですか。

>>792
>WinMain や main は、それを呼び出すルーチンがあって
>リンク時にそれをリンクしてるだけなんだぜ。
>そのルーチンがどうなってるかは気にならないのか

気になりますね。でも、そーゆーの気になりだすと
最終的には電気信号とかのレベルまで行かなくならなきゃならなそうです。。。
とりあえず今はC勉強します。お二方とも解答ありがとうございます。
0794デフォルトの名無しさん2007/08/09(木) 17:56:36
アセンブラの勉強をしてみるといいかもね。
0795デフォルトの名無しさん2007/08/09(木) 18:06:10
あ専ブラですか、分かりました。
0796デフォルトの名無しさん2007/08/09(木) 18:12:19
俺の発言みたいにとられるようなレスしないでください。
どうでもいいけど。
0797デフォルトの名無しさん2007/08/09(木) 18:13:05
crt0.asm とかね
0798デフォルトの名無しさん2007/08/09(木) 18:17:29
>>796
お前の発言みたいにとらないでください。
どうでもいいならレスするな死ね。
0799794=7912007/08/09(木) 18:29:29
>>796
自己主張したいならコテでもつけとけ。
0800デフォルトの名無しさん2007/08/09(木) 18:32:30
>>798
だって>>793のレスに対して>>794はレスされたのに
無関係のお前が>>795みたいなレスされたら誤解するだろ。

>>799
こんな馬鹿げた自演してどうすんだよ。しょーもない。
やっぱどの板でもID表示欲しいわ。とりあえず今日はROMる。
0801デフォルトの名無しさん2007/08/09(木) 18:34:36
どうでもいいんだろ。
誤解されとけや
0802デフォルトの名無しさん2007/08/09(木) 18:45:21
>>793
本題から少し脱線してしまうが・・・
Windowsのアプリケーションの入り口は、厳密には、WinMainではないよ。

Windowsがアプリの実行ファイル(EXE)をロードして実行する際の入り口は、
「エントリポイント」と呼ばれているが、それは特定の名前のC言語の関数ではない。
C言語に限定されていないし、ましてや、C言語の関数名でもない。

マイクロソフトのCコンパイラ・リンカを使っているのであれば、
リンカのマニュアルで/ENTRYオプションの説明を読むべし。
0803デフォルトの名無しさん2007/08/09(木) 18:46:53
アセンブラの勉強しても仕方ないだろう。
マシン後とアセンブリー言語が理解できるようになってから、アセンブラを勉強したほうがイイ。
0804デフォルトの名無しさん2007/08/09(木) 18:54:11
マシン「語」
アセンブリ「言語」
なんて使う必要がなければ、理解しなくていいよ。

基本的なコンピュータのアーキテクチャを知っていれば、それで十分。
0805デフォルトの名無しさん2007/08/09(木) 22:58:02
いや、仕事で使うから覚えますた ってだけじゃぁなぁ
金にはならないかもしれないけどとことんやれば良いと思うよ
0806デフォルトの名無しさん2007/08/09(木) 23:11:36
そういう人好き
0807デフォルトの名無しさん2007/08/10(金) 00:27:24
>>790
初期のUNIXは確かに古いC言語や一部アセンブラで書かれていた。
だが、Windowsや旧MacOSやμiTRONやVxWorksや...(略)はC言語で書かれているのだろうか?
0808デフォルトの名無しさん2007/08/10(金) 00:41:43
今でも一部アセンブラは当然として、
MacOSはObjectiveCかPascal、
他もCやC++、
字句解析などでは適宜別の言語、
などなど適材適所でしょ。
0809デフォルトの名無しさん2007/08/10(金) 08:02:59
>>805
仕事かどうか、金になるかどうか以前に、
人生に許された時間は限られているんだよ。

>>807
WindowsはNT系はC言語で書かれたと聞いてる。
NT4.0の頃に聞いた話なので今は違うかもしれない。
0810デフォルトの名無しさん2007/08/10(金) 16:34:55
低俗な質問でほんとすいません。
クラス型のポインタを持つ配列を作りたくて苦心していますが上手く行きません。

(global.h) extern class hoge *p[10];
(global.cpp) hoge *p[0] = new hoge;

と書いていまして、.cppのほうでエラーが出ます。
文法的に間違っていると思うのですが、どこが間違っているのでしょうか?

宜しくお願いします。
0811デフォルトの名無しさん2007/08/10(金) 17:19:31
いろいろ違う気がするが・・・w
エラーメッセージ出して1つずつ解決しては。

class定義は見える位置にあると仮定して、
extern hoge *p[10];
p[0] = new hoge;
とやるかな。
0812デフォルトの名無しさん2007/08/10(金) 18:24:56
>>810
問題の中身よく見てないけど、とりあえず上の方に出てるやつ数個でも良いからエラーの内容書け
08138102007/08/10(金) 18:43:28
>>811
ありがとうございます。
なお、クラスを定義してる"Hoge.h" もGlobal.hにてインクルードしてます。
今、エラーコード全部ぐぐって内容見てる途中です。

>>812
error C2040: 'PC' : 'int []' は 'cHoge *[4]' と間接操作のレベルが異なります。
error C2440: '初期化中' : 'cHoge *' から 'int []' に変換できません。
error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。
error C2501: 'PC' : 識別名を宣言するのに、型が指定されていません。
(※クラス名だけはcHogeに書き換えています)

というエラーが出るんですが、ぐぐってみても今ひとつ要領を得ないのです。
「ああ、こういう間違った書き方してるから暗黙的にint型にされてるんだな」とは分かるんですが、では正しい書き方はどうなのかというのが分かりません。

普通にint型とかchar型のポインタ配列作る気持ちでやってたら、ちょっと勝手が違うようですね。手強いです。
0814デフォルトの名無しさん2007/08/10(金) 19:03:38
>>813
>hoge *p[0] = new hoge;
は
hoge *p[0];
p[0] = new hoge;

hoge *p[0];
だと
>error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。
が出る。

だから
hoge *p[10];
p[0] = new hoge;

この辺はintやらcharでも変わらんと思うけど。

>>811のexternは書き間違いとちゃうかな。
勘違いだったらすんません。
08158102007/08/10(金) 19:15:13
>>814
ありがとうございます。
いままさに、同じような感じで書いていました。
結果は×でした。エラー内容全く同じ……

(Global.h)
#include "HogeHoge.h"(クラス内容の書かれたヘッダ)
extern class cHoge *PC[4];

(Global.cpp)
cHoge *PC[4];
PC[0] = new cHoge;

という状態で、全く同じエラーでます。

どうやら、PC[0]が*PC[4]の一部と見なされてない感じです。
エディタ上でPC[0]の上にマウスカーソル乗せたら、
cHoge *PC[4]ってポップアップが出てるんで、余計にわけわかんない。
なんで暗黙的int扱いされるんでしょう?
0816デフォルトの名無しさん2007/08/10(金) 19:20:28
ごめん。
全然違うわ。

extern cHoge PC[4];

cHoge PC[4];

こうじゃねぇ?
0817デフォルトの名無しさん2007/08/10(金) 19:23:15
なんだよ、よそで配列定義してあってのexternじゃないのかよ。
ファイル1つでうまくいった上で、分けたらおかしくなってるのか
もともとやりかたがわかんないのかどっちだよ。
0818デフォルトの名無しさん2007/08/10(金) 19:28:08
とりあえず、これでどうなる
(Global.h)
#include "HogeHoge.h"(クラス内容の書かれたヘッダ)
extern cHoge *PC[4];

(Global.cpp)
cHoge *PC[4];
PC[0] = new cHoge;

念のため言っておくけど、こっちではコンパイルできてるから
うまくいかないなら環境書いてね
0819デフォルトの名無しさん2007/08/10(金) 22:31:55
なんか知らんが、トップレベルに
PC[0] = new cHoge;
を書いてるんじゃなかろうな。
08208102007/08/11(土) 09:46:02
おはようございます。
3時過ぎまで頑張っていました。

>>817
そうです。分けたらおかしくなりました。

>>818
Global.h に extern class cHoge *p[4]; と書き、どこでも良いので関数内で
cHoge *p[4]; p[0] = new cHoge; は上手く行きました。

所で、extern class cHoge ではなく、extern cHoge なのですか?
そう書くとずらずらエラーがでるのですが……
ちなみに、他にもextern class hogehoge *tmp; という書き方でグローバルな
インスタンスを3つほど作っていて、そちらは問題なく動いているのですが、
これはexternに対する私の理解が根本的に間違っているのでしょうか?

>>819
えっと、その通りです。global.cppは、関数を含まないソースファイルです。
Global.hでextern宣言したものに実体を与えてグローバルクラスとして使うための
ものです。
上記の通り、トップから外して関数ないで宣言したら普通に使えました。
やはり、根本的に何か間違っていますか?
0821デフォルトの名無しさん2007/08/11(土) 10:27:14
>>820
何というか・・・

まず1つ目
グローバルなオブジェクトには、どこかに実体が必要だが、
その実体というのは、cHoge*なのであってcHogeではない。
グローバルスコープでnewするのは行儀が悪いのでやるべきではない。

2つ目
クラスの定義が既に済んでいるのであれば、class は書く必要がない。
もしclassを書かないと具合が悪いのであれば、クラスの定義が済んでいない。

3つ目
グローバルなオブジェクトは気軽に作るべきではない。
08228102007/08/11(土) 10:53:07
>>821
実はいま、グローバルを極力廃止して書き直してます。
そちらでは問題なく動いています。

「よく使うのはもう纏めてグローバルにしたら?」って言われてやってみたのですが、
確かに初動は早いけどひとたびエラー起こったらわけ分からなくなりました。

>その実体というのは、cHoge*なのであってcHogeではない。
!!!
class書かないとエラーでるので、仰るとおり、定義されてないようです。
そうか、そういうことだったのか……

グローバルスコープでのnewもやめます。
ありがとうございました。
0823デフォルトの名無しさん2007/08/11(土) 22:17:31
最近C++を始めて、静的配列のdelete[]クラッシュにはまったんですが、疑問があったので質問

以下のコードでクラッシュしないのはなぜ?
#include <string>
int main(){
int is=0; //これが無いとクラッシュ
std::string array[2] = {"hoge", "fuga"};
delete[] array;
return 0;
}

コンパイラはMS製です
0824デフォルトの名無しさん2007/08/11(土) 22:18:44
そもそもdeleteなんているのか?newがみえないんだが・・・
0825デフォルトの名無しさん2007/08/11(土) 22:26:43
new[] してないものを delete[] してはいけません。
new[] と delete[] は1対1
08268232007/08/11(土) 22:27:30
いらないことは分かってますけど、ただ疑問に思ったので…
上記のエラーを探ってた時に、変数の有り無しでプログラムのクラッシュするしないが変わるものかなと…
0827デフォルトの名無しさん2007/08/11(土) 22:29:22
スタック破壊。
0828デフォルトの名無しさん2007/08/11(土) 22:31:41
>>826
たまたま使ってるコンパイラではクラッシュしなかっただけの話だろ。
他のコンパイラだと鼻から悪魔が出てきても文句は言えない。
0829デフォルトの名無しさん2007/08/11(土) 22:36:29
>>826
その手の行為で、どんなことが起きるかは、基本的に予測できない。
間違ったことをした、ずーーーーーっと後で落ちる、っていうことも多い。
知らないうちに関係ない変数が書き換わってる、とかいう現象になることもある。
0830デフォルトの名無しさん2007/08/11(土) 23:38:38
サンクス、何となく理解した
0831デフォルトの名無しさん2007/08/11(土) 23:40:09
>>810=>>822
1〜2KByte以下のRAMの少ないマイコンならそういうテもあるが、
そうでもなければグローバルにまとめるのはやめとけ。

PCのプログラミングならグローバル変数を使わなくてはならない状況はまず考えつかない。
仮にあったとしても、保守erが苦労するだけなので使わないようにしている。

ちなみに、
hoge_type *p[10];

みたいな用例は時折あると思うが、演算子の評価順と同じで、この p は、
hoge_type *p;
が10個ある配列になる。だから、通常は

ヘッダファイル
extern hoge_type *p[10];
か、
extern hoge_type *p[];
になる。

時々間違えるのは、ちょっとうまい使い方を覚えたC/C++言語erが

hoge_type *p[10];
という定義に対して

extern hoge_type **p;
または
extern hoge_type p[][10];
などとしてしまうことであり、これは正常に働かない。


0832デフォルトの名無しさん2007/08/11(土) 23:54:09
>>823
ちょっと論点をずらすが、

std::string array[2] = {"hoge", "fuga"};

これは、std::stringの定義を理解した上での記法であり、
std::stringは引数が空のコンストラクタを持っているので、

std::string array[2];
array[0] = "hoge";
array[1] = "fuga";

とした方が安全。
0833デフォルトの名無しさん2007/08/12(日) 00:14:06
VC++2005 Express Editionでは、atoi()やstrtok()といった古い関数は使えないのでしょうか?
VC6で作ったソースを読み込んでコンパイルしたら、コンパイルは通るのですがリンカエラーがでます。
必要なヘッダのincludeはしています。
”LNK2019: 未解決の外部シンボル __imp__strtok が関数 _main で参照されました。”
というリンカエラーやLNK2001がでます。

#include <stdio.h>
#include <string.h>

int main(void)
{
char str[] = "ABCD ef.1234.G";
char *tp;
tp = strtok( str, " ." );
puts( tp );
while ( tp != NULL ) {
tp = strtok( NULL," ." );
if ( tp != NULL ) puts( tp );
}
return 0;
}

例えばこれだと、putsにもstrtokにも同じ上記リンカエラーがでます。
お手上げです。よろしくおねがいします。
0834デフォルトの名無しさん2007/08/12(日) 00:30:30
板違いかもしれません。ですが質問します。
同じ質問をVBスレでしたのですが、
私の聞いた事がレベルが低いのか、書き方が悪いのか、
回答が得られなかったので書きます。

C#.NETとVB.NETの違いって何ですか?

調べてみると、(触り程度)
C#.NETにメモリーを切る(確保)概念が無くなったと。
だったら、方言とコンパイルの速度だけの違いになりますか?
0835デフォルトの名無しさん2007/08/12(日) 00:33:36
>>834
言語が違うってだけじゃ不満?
0836デフォルトの名無しさん2007/08/12(日) 00:35:57
C#.NET と VB.NET の違い・・・ 言語が違います。以上。

メモリーを切るって意味不明
0837デフォルトの名無しさん2007/08/12(日) 00:38:45
ふと、疑問に思った。
.NET自体触ったことないんだけど、VB.NETってインタプリタじゃないの?
0838デフォルトの名無しさん2007/08/12(日) 00:45:30
ない
JITでネイティブコードにコンパイルされる
0839デフォルトの名無しさん2007/08/12(日) 00:47:01
ちょっと、この話は興味ある。
言語が違うだけって、書き方が違うだけなの?
C#の方が、いろいろ出来るイメージがあるけど。
0840デフォルトの名無しさん2007/08/12(日) 00:47:50
やっぱそうなのか・・・
C#とVBでネイティブコードレベルで違いって大きくでたりするもの?
って、違いがあったら.NETの意味がなくなるからそんなことない?
0841デフォルトの名無しさん2007/08/12(日) 00:53:04
人から聞いた話。
C#の方が早いって聞いた。(アプリの動き)
あと、マイクロソフトがVBよりC#に重きを置いてるとも。
0842デフォルトの名無しさん2007/08/12(日) 00:53:27
>>840
ない。前にMSがC#でもVB.NETでも同じコードをコンパイルしたら、
同じIL(中間言語)になると宣伝していた覚えもある。
(ただしデフォルトではオプションが異なるので、そのままでは全く同じILにならないという註付きで)

>>834
記憶域を確保するという概念がなくなったというより、
それを解放する操作を明示する必要がなくなったというのがより正確。
そして、それは.NETの特徴なので、これはC#でもVB.NETでも同じ。
0843デフォルトの名無しさん2007/08/12(日) 00:54:30
つまりは慣れてる言語で書くのがいいってことでFA?
0844デフォルトの名無しさん2007/08/12(日) 00:56:43
>>842
ありがとうございます。

う〜ん、あまり、VBとC#の差異が見えませんね。
調べてみたら、C#の方が開発期間が長くなるとありました。
0845デフォルトの名無しさん2007/08/12(日) 01:07:57
VB.NET だと unsafe コードが書けない、っていうのはある
0846デフォルトの名無しさん2007/08/12(日) 01:30:13
どうでも良いが、なんでこのスレで質問したんだろう・・・。
C#もVB.NETも、C/C++とはほとんど関係ないと思うんだが。
0847デフォルトの名無しさん2007/08/12(日) 03:53:27
「スレ立てるまでもない質問はここで」と見間違えたとかかな?
0848デフォルトの名無しさん2007/08/12(日) 07:14:32
>>823
「クラッシュ」と一言で片付けるあたりがダメぽ。
せっかくランタイムライブラリやOSが情報をくれているのにね。

ちなみにdelete[]の実装を見てみ。
0849デフォルトの名無しさん2007/08/12(日) 07:23:19
>>833
「エラーが出ます」と言って思考停止するなよ。

エラーメッセージは読むこと。
意味がわからなければ、リンカのマニュアルのエラーの解説を読むこと。
0850デフォルトの名無しさん2007/08/12(日) 07:30:35
>>844
VB.NETとC#は当初、機能に違いがなく、字面だけの違いで、機械的に相互にコンバート可能だった。
ぶっちゃけ、VB.NETにはVB風の字面という存在価値しかなかった。

ところが、VB専門の連中が、
VB.NETへの移行のために勉強すべきことが多すぎて嫌だと拒否したので、
しかたなく、VB.NETはVBに近くなるように、C#と機能に違いを持たせることになった。

そういう経緯なので、C#に何の抵抗も無い人は、C#とVB.NETで開発期間は違わない。
VB.NETを使ったほうが便利な部分があれば、そこだけピンポイントでVB.NETで書けばいい。
0851デフォルトの名無しさん2007/08/12(日) 08:26:46
鼻から悪魔なんて久しぶりに
0852デフォルトの名無しさん2007/08/12(日) 08:37:28
>>844
ぶっちゃけ、セミコロンがあるかないかの違い。
VBしか書けないダメ派遣はどうやってもセミコロンが書けないらしいよ。
0853デフォルトの名無しさん2007/08/12(日) 10:19:37
自前の構造体で、
その構造体の中で入力の>>演算子をオーバライドしようとしても上手くいきません。。。

struct {
 int x;
 istream& operator>>(istream& s) {
  s >> x;
 }
}

こうじゃないんですか?

0854デフォルトの名無しさん2007/08/12(日) 10:39:05
>>853
それは演算子の左辺が構造体で右辺が istream の >> を定義していることになる
0855デフォルトの名無しさん2007/08/12(日) 11:01:31
>>854
左辺はistreamじゃないんですかね。。。
勉強不足みたいなんで出なおしてきます。
ありがとうございました。
0856デフォルトの名無しさん2007/08/12(日) 11:18:12
int main(void)
{
String s1;
String s2;
String s3("CCC");
String s4("DDD");
s1.set("AAA");
s2.set("BBB");
s2.add(s3);
s4.add("EEE");
printf("s1:[%s](%d)\n", s1.get(), s1.getLength());
printf("s2:[%s](%d)\n", s2.get(), s2.getLength());
printf("s3:[%s](%d)\n", s3.get(), s3.getLength());
printf("s4:[%s](%d)\n", s4.get(), s4.getLength());
cout << "s1:[" << s1.get() << "](" << s1.getLength() << ")" << endl;
cout << "s2:[" << s2.get() << "](" << s2.getLength() << ")" << endl;
cout << "s3:[" << s3.get() << "](" << s3.getLength() << ")" << endl;
cout << "s4:[" << s4.get() << "](" << s4.getLength() << ")" << endl;
return 0;
}
結果:
s1:[AAA](3)
s2:[BBBCCC](6)
s3:[CCC](3)
s4:[DDDEEE](6)
s1:[AAA](3)
s2:[BBBCCC](6)
s3:[](3)
s4:[DDDEEE](6)
s3の値がcoutで出したときおかしいのだが、bcc55ってこんなに馬鹿なのか?
それともおれが馬鹿?
0857デフォルトの名無しさん2007/08/12(日) 11:26:57
>>851
鼻から悪魔が出るは、何の例えになるのでしょうか?
0858デフォルトの名無しさん2007/08/12(日) 11:37:57
i = i++; のような未定義のコードは何が起きるか分からないという話
未定義のコードを実行をした結果、たとえ鼻から悪魔が出てきたとしても、その処理系は規格に反してはいない

まぁ現実問題、そんなことで悪魔を呼び出せるんならすでに世の中は悪魔だらけだ
0859デフォルトの名無しさん2007/08/12(日) 11:47:24
>>856
bccのStringクラスの仕様が判らんからなんとも言えんが、どうも挙動が不自然だね。
0860デフォルトの名無しさん2007/08/12(日) 11:52:56
>>858
ワクワクしますね、何処かに冒険家いませんかね?
ありがとうございました
0861デフォルトの名無しさん2007/08/12(日) 11:55:03
>>859
Stringクラスは自前なんですが。。
どうやら、cout時点でs3の中のchar*pが""になってるみたいです。
coutの後でprintfしても出ませんでした。
C++初心者状態なのでclassの作り方に失敗してるのかもしれませんね。
coutにバグがあるとも考えにくいですから。。。
0862デフォルトの名無しさん2007/08/12(日) 12:44:25
>>861
んじゃ、領域破壊をしているに一票。
add()の辺りが怪しいと見た。
0863デフォルトの名無しさん2007/08/12(日) 14:09:48
バイナリハックに一票です
0864デフォルトの名無しさん2007/08/12(日) 14:30:42
BCCは3.0から4.5まで愛用したクチだが、いまどきBCCはないだろう。

マイクロソフトのVC++なら、メモリ破壊を(ある程度)検出する機能が付いているよ。
0865デフォルトの名無しさん2007/08/12(日) 14:33:38
自分も昔はBCC愛用してましたが、VC++Expressが出たからもう使ってない
0866デフォルトの名無しさん2007/08/13(月) 03:14:05
僕は自分でC++コンパイラ作って使ってますけど
0867デフォルトの名無しさん2007/08/13(月) 03:18:34
iccやmsvc、gccには一生かかっても勝てません
0868デフォルトの名無しさん2007/08/13(月) 03:19:19
これからC++を勉強しようとしている者ですが
なにか良い勉強ツールはないでしょうか?
できれば「Study C」のようなプログラムをコンパイルせずに実行できるようなものがいいんですが...
0869デフォルトの名無しさん2007/08/13(月) 03:22:32
開発環境ってこと?
0870デフォルトの名無しさん2007/08/13(月) 03:23:51
VC++でも使ってろ
0871デフォルトの名無しさん2007/08/13(月) 03:25:15
VC++Expressがいいんじゃないの?無料だし

0872デフォルトの名無しさん2007/08/13(月) 03:25:45
昔Macintosh使って悪魔を呼び出すって映画があったよな。

>>868
コンパイルをせずにというのが何を意味しているのかよく分からないんだけど、
正直、自分でコードを書かずに言語が身につくとはとても思えない。
コマンドラインからのコンパイルが面倒だというなら
Visual C++ 2005 Express Edition を落として使えばいいんじゃないかと。
0873デフォルトの名無しさん2007/08/13(月) 03:26:42
インタプリタってことだろ
0874デフォルトの名無しさん2007/08/13(月) 03:27:33
あるいはアセンブリャか
0875デフォルトの名無しさん2007/08/13(月) 03:30:43
あのう

PIC使って自動あえぎ声再生機能付きダッチワイフを作りたいんですけど
何から始めたらよかですか?
0876デフォルトの名無しさん2007/08/13(月) 03:32:40
この人何いうとっと?
0877デフォルトの名無しさん2007/08/13(月) 03:33:02
完全防水型圧力センサー
08788682007/08/13(月) 03:36:43
的確な言葉がいえずすいません
プログラム文を書いてワンボタンでそのプログラムの実行結果が確認できるようなツールがほしいのです.
以前C言語の勉強をしていたときに使っていた「Study C」がそういうものだったんでC++でも似たものがないかと思い質問してみました.
0879デフォルトの名無しさん2007/08/13(月) 03:36:46
せがらしか
0880デフォルトの名無しさん2007/08/13(月) 03:39:53
CINT
0881デフォルトの名無しさん2007/08/13(月) 03:57:32
>>876>>879
九州人じゃなかごたんね
無理して九州弁ばしゃべらんでよかよ
0882デフォルトの名無しさん2007/08/13(月) 04:02:09
ばってん
0883デフォルトの名無しさん2007/08/13(月) 04:10:27
ばってん何ね?
0884デフォルトの名無しさん2007/08/13(月) 04:12:11
九州男児を舐めん方がよかね
0885デフォルトの名無しさん2007/08/13(月) 04:14:04
残念
格助詞の「を」は「ば」になるんだ
0886デフォルトの名無しさん2007/08/13(月) 04:15:38
ばりちろ
0887デフォルトの名無しさん2007/08/13(月) 04:16:37
そがどないしたと
0888デフォルトの名無しさん2007/08/13(月) 04:18:34
創作方言やろうぜ
0889デフォルトの名無しさん2007/08/13(月) 04:18:51
どない→どげん/どがん
0890デフォルトの名無しさん2007/08/13(月) 04:20:33
「どぎゃん」とは言わんと?
0891デフォルトの名無しさん2007/08/13(月) 04:20:41
(#^ω^)ピキピキ
0892デフォルトの名無しさん2007/08/13(月) 04:24:02
>>890
言う
0893デフォルトの名無しさん2007/08/13(月) 05:01:36
せからしか!
0894デフォルトの名無しさん2007/08/13(月) 05:26:22
そうかしら!
0895デフォルトの名無しさん2007/08/13(月) 05:40:05
なんでこんな流れに?
0896デフォルトの名無しさん2007/08/13(月) 05:41:10
暇な学生が多い
暇な社会人も(もしかしたら普段より)多い(かもしれない)
0897デフォルトの名無しさん2007/08/13(月) 05:48:12
夏ですな蝉も鳴き始めた時間です
0898デフォルトの名無しさん2007/08/13(月) 05:48:39
お前が上げるからじゃ!
0899デフォルトの名無しさん2007/08/13(月) 05:51:36
さいでした
0900デフォルトの名無しさん2007/08/13(月) 06:17:36
自演厨通報しますた
0901デフォルトの名無しさん2007/08/13(月) 06:28:31
通報しないで|(●)ム(●)| 
0902デフォルトの名無しさん2007/08/13(月) 06:29:08
いやんばか
0903デフォルトの名無しさん2007/08/13(月) 08:52:03
>>878
> プログラム文を書いてワンボタンでそのプログラムの実行結果が確認できるようなツールがほしいのです.

それは目的ではなく手段だよね。

まず、
試行錯誤的にプログラムを書き換えて、「たまたま」目的の動作をするのを見つけ出す
というのは、やめたほうがいい。かえって遠まわりになる。

次に、
勉強段階の人ほど優秀なコンパイラ&デバッガを使ったほうがいい。
とくにデバッガの優劣は、勉強の効率に非常に大きく効いてくる。

というわけで、VC++を勧める。Express Editionで事足りるかはわからないが。
09049032007/08/13(月) 08:57:55
それからもう一つ。

Webで無料で見られるサイト「だけ」で勉強しようとしているのなら、それは良くない。
良質なサイトはたくさんあるが、それでも、良質な本のほうがずっと優れている。

つまらないところで躓くのは、
・それに必要な知識が抜け落ちている
・間違った知識を取り込んでしまっている
・下手な解説に惑わされている
といったことが原因になりやすい。

本を買うのにはお金がかかるが、
人生の限られた時間を浪費するのに比べたら、
本を買うお金なんて安いものです。
0905デフォルトの名無しさん2007/08/13(月) 09:02:30
ちゃんと勉強できる人にはデバッガは強力なツールになるが、
そういう人はデバッガがなくても自分で工夫して何とかできる。
また、デバッガに頼って結果第一主義になると規格に則った知識が身につかない。

従って、余り勧めない方がいいと私は思う。
0906デフォルトの名無しさん2007/08/13(月) 09:28:13
できる・できない、ではなくて、効率の話なんだけどなぁ。

そりゃぁデバッガなくたってデバッグは可能さ。
でも無駄に労力使うでしょう?
0907デフォルトの名無しさん2007/08/13(月) 09:30:22
少なくとも、この手のスレで、
自分が書いたプログラムがうまく動きません、何が悪いのかサッパリわかりません。教えてください。
なんていうような質問する人は、デバッガでステップ実行すらしてないのよ。
0908デフォルトの名無しさん2007/08/13(月) 09:53:08
STL等のテンプレートを使うと、ステップ実行は非常に効率が下がるのだが。
0909デフォルトの名無しさん2007/08/13(月) 12:12:15
だから、デバッガをきちんと役立てることができる人には、わざわざ勧める必要がないんだけどな。
勧められないと使えない人は、きちんと役立てることができないだろうからやはり、勧める必要がないんだ。
0910デフォルトの名無しさん2007/08/13(月) 12:14:06
デバッガがなくても自分で工夫して何とかできる人ほど、デバッガを使うんだなこれが。
0911デフォルトの名無しさん2007/08/13(月) 12:27:42
>>909
そんなことを言っていたら、
自力で習得できない人はプログラミングに向いてないから辞めたほうがいい
ということになってしまうぞ。

スレを見ていると、
デバッガでステップ実行しろ!
と言われて、素直にステップ実行して問題解決している人も、少しはいる。
どんなに能力や素質、やる気があっても、知るチャンスがなければどうにもならない。

残念ながらステップ実行しろと言われても無視しているような馬鹿のほうが多いけどな。
0912デフォルトの名無しさん2007/08/13(月) 12:30:03
>>911
>自力で習得できない人はプログラミングに向いてないから辞めたほうがいい
私の主張したいところはまさしくそこです。
0913デフォルトの名無しさん2007/08/13(月) 12:36:56
>>912
向いてる向いてないに関わらずやらにゃならん状況はあるわけで。
0914デフォルトの名無しさん2007/08/13(月) 12:41:05
そんな香具師にデバッガ渡したら、「偶偶動いたからOK」的なプログラムを量産される羽目になりかねんが。
0915デフォルトの名無しさん2007/08/13(月) 14:11:38
それはデバッガ使わないやつこそそうなるだろう。
デバッガに消極的な人は、便利なツールの無い環境でやってんの?
0916デフォルトの名無しさん2007/08/13(月) 15:15:39
ステップ実行しない = 意図したとおりのパスを通っているか確認しない
ということなわけで、偶然動いているだけなのを見過ごしてしまいやすい。
0917デフォルトの名無しさん2007/08/13(月) 15:18:17
うわぁ、イコールで結んじゃったよ。
0918デフォルトの名無しさん2007/08/13(月) 19:42:47
>>916
趣味でのプログラムの話?仕事でのプログラムの話?
趣味のプログラムならPTなんかしないし(ていうかテスト自体しないけど)
仕事のPTでデバッガ使ってやるような個人に頼ったテストはほとんどしない。

まぁPTで通しにくいパスも確かにあるんで、
デバッガ使ってパス確認を全否定するつもりはないけども、
常にソレに頼るようなのはアホだと思うけどね。
0919デフォルトの名無しさん2007/08/13(月) 20:14:39
>>918
自分は仕事でも趣味でも、程度の差はあるけれども、書いたコードは1度はステップ実行するよ。
PTではなくCDで。会社によってはCDとPTを一緒にしてCPTと呼んでいるかもしれないが。

趣味だとテストなんてしないに等しいから、なおさら、ステップ実行は大切だよ。
0920デフォルトの名無しさん2007/08/13(月) 20:18:41
はいはい
09218782007/08/13(月) 21:12:44
>>903
C++に関してはド素人なんで「初めてのC++」を買って勉強しているんですが,一々100行にも満たないプログラムをコンパイルしてEXEを作って実行とかは煩雑でして...
ちなみにいま使っている開発環境はVC++です。なかなかなれないんで別に使いやすそうなのがあればいいなと思い質問しました。設定次第でステップ実行やワンボタンで実行結果の確認ができるのであれば、このままこれでいこうかとも思ってます。
0922デフォルトの名無しさん2007/08/13(月) 21:28:48
CTRL+F5で実行、質問にyes
でビルド後即実行

これでも面倒ですか?
0923デフォルトの名無しさん2007/08/13(月) 21:32:53
>>921
お前には向いてない
あきらめた方がいい
09248782007/08/13(月) 21:35:30
>>922
そんなんあったんやそれならいけそうです
>>923
うるさい頑張るわ!
0925デフォルトの名無しさん2007/08/13(月) 21:41:04
あほすぎうざい
0926デフォルトの名無しさん2007/08/13(月) 21:49:45
>>924
ちなみにVC++ expressね
起動してからショートカットキーの入力と文字の入力でプログラムプロジェクト作成して
コード入力→ctrl + F5で実行、動作がおかしければF9でブレークポイント設定して
F5でデバッグ実行
と適当にショートカットキー入力してるだけでどんどん作業がすすむ
これで面倒とか言ってたら他のはとてもじゃないけど使いこなせないよ
09278782007/08/13(月) 21:59:37
>>926
うるさいカスタマイズして使うわ!
0928デフォルトの名無しさん2007/08/13(月) 22:08:19
>>926
VC++っていろいろ設定いじれるんですね。C++の勉強するまえにそっちの勉強したほうがよさそうです。
今度マニュアル本でも買っていろいろためしてみようと思います。
あと927は私じゃないんで放置しといてください。助言ありがとうございました。
0929デフォルトの名無しさん2007/08/13(月) 22:10:45
あほすぎ
VC++先に勉強してあほのお前に分かるわけないやろw
0930デフォルトの名無しさん2007/08/13(月) 22:20:48
韓国が8/15終戦記念日に2chを潰そうとしています
ソース
http://cafe.naver.com/makjang212.cafe

日本語訳
http://vista.jeez.jp/img/vi8700172598.jpg
0931デフォルトの名無しさん2007/08/14(火) 06:10:05
で、どうしろと?
0932デフォルトの名無しさん2007/08/14(火) 21:06:30
質問です。

ソースファイルをまたいでCArrayを使用したいのですが、
どのようにやればいいのかわかりません。

具体的には、片方のソース内でAddして、もう片方のソース内で
使いたいです。
0933デフォルトの名無しさん2007/08/14(火) 21:08:38
説明が面倒なので
extern CArray hoge;
0934デフォルトの名無しさん2007/08/14(火) 21:26:36
>>932
自分がやりたいことくらい、相手にわかるように説明しような。
0935デフォルトの名無しさん2007/08/14(火) 21:32:42
>>932
お前にはムリだ。あきらめろ。
0936デフォルトの名無しさん2007/08/14(火) 21:45:30
>>856
だけど、みなさんのアドバイスにしたがってただ今VC++Exなんたらをインストール中
にしても時間がかかるね。。。
0937デフォルトの名無しさん2007/08/14(火) 21:59:54
いちいちそんなこと書くなアホすぎでわろた
0938デフォルトの名無しさん2007/08/14(火) 22:05:20
うるせーばーか
0939デフォルトの名無しさん2007/08/14(火) 22:18:58
殺すぞてめー
0940デフォルトの名無しさん2007/08/14(火) 22:22:15
VC++は初心者にはお勧めできないシロモノですよ。
言語のイロハを学習する前に、ツールの使い方や設定などの前段階で
ワケワカメとなる可能性が非常に高いです。

特に2005のExpressだと、デフォルトではWin32の選択肢が出て来ないという
極悪ぶりですし(すなわち自動的にC/C++ではなく .NET方面へ誘導される)
仮にそこの設定をクリアしたとしても、テンプレートの中身を見てまたまた
目を回す事態にもなるでしょう。

デフォルトでUNICODEの設定フラグが立ってるのも鬼門ですね。
一般的なC/C++の参考書の書式が通用せずに警告が出まくって、これまた
混乱の極み間違いなしです。

sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l
sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l

また、この辺の初歩的な関数の取り扱いは、もはやギャグの領域とも思えます。
0941デフォルトの名無しさん2007/08/14(火) 22:23:41
まっアホには使えないってこったな
0942デフォルトの名無しさん2007/08/14(火) 22:28:08
emacsとか使ってmakefileとかjamfile書く方が楽なのか?
俺はそうは思わないけど
0943デフォルトの名無しさん2007/08/14(火) 22:41:28
怖いなぁ
0944デフォルトの名無しさん2007/08/14(火) 23:20:03
なにこれVC++って新しいんだな

warning C4996: 'strcpy' が古い形式として宣言されました。
0945デフォルトの名無しさん2007/08/14(火) 23:29:47
944古すぎ
0946デフォルトの名無しさん2007/08/14(火) 23:36:14
>>940
その「一般的な」参考書というのは、「レガシーな」参考書の間違いだろう。
入門者に時代遅れのC標準ライブラリを使わせること自体が間違いだよ。
0947デフォルトの名無しさん2007/08/14(火) 23:46:31
そしてM$と心中するわけですね。
0948デフォルトの名無しさん2007/08/15(水) 00:05:45
ちげーよ。
C++のためのステップとしてのCなんて必要ない
ってことさ。

C++ならstrcpyもsprintfも必要ない。
0949デフォルトの名無しさん2007/08/15(水) 00:46:56
>>610

遅レスだが

template<typename U>
friend class foo<U>;

ではなく、

friend foo ;

これで、同じテンプレートから作られたものはfriendになる。
0950デフォルトの名無しさん2007/08/15(水) 01:50:10
>>940
まずはWindows上でC/C++を勉強するのに薦めたい環境を出せ。

インストーラがパスとかも通してくれるし、
勉強程度ならほとんどの場合、F7押すだけでビルド、
F5押すだけでビルドから実行までしてくれる何が難しいのか。
(2005 EEのビルドはF6だっけ?うちはVS2005SEなんで違った気もする)

C/C++の勉強するのになんでWin32APIが出てくるのかも非常に謎。
Cの標準ライブラリの関数は、警告は出るが「通用する」。

まぁCの導入には俺はVC薦めても良いと思うけど、
一歩進むとC99とか完全に置き去りなのがなぁ・・・
095112MHz2007/08/15(水) 09:09:37
Ettercapというツールがありますが、コンソールで動作しているときにメニューを十字キーで
自由に選択できるようになっているのはどのようにして実現しているのですか?
0952デフォルトの名無しさん2007/08/15(水) 10:10:50
>>951
Ettercapがどんなツールか知らないけど、
Linuxでコンソールなら、カーソルキーの入力を取って
ncursesか何かで描画してるんじゃない?
095312MHz2007/08/15(水) 10:32:33
http://kaiya.cs.shinshu-u.ac.jp/pub/c/curses/

こういうことでしょうか?
0954デフォルトの名無しさん2007/08/17(金) 15:51:01
ユーザへのインタラクティブなエラーメッセージ
ログ等へのエラーの記録

この2つは、

ネストの深い位置(エラーを検出したその場所)
ネストの浅い位置(何かの大きなひとまとまりの処理の結果を受け取る場所)

どちらでやるのが良いのでしょうか。
0955デフォルトの名無しさん2007/08/17(金) 20:44:38
好きなほうにしろよ
0956デフォルトの名無しさん2007/08/18(土) 17:05:58
>>955 ・・・好きです
0957デフォルトの名無しさん2007/08/18(土) 20:48:14
そういう意味じゃない
0958デフォルトの名無しさん2007/08/18(土) 20:51:54
じゃあ、どういう意味ですかー!!
私はこんなにも貴方を愛しているっていうのに!!!
0959デフォルトの名無しさん2007/08/18(土) 20:56:12
面白くないよ
0960デフォルトの名無しさん2007/08/18(土) 21:14:27
つまんない奴
0961デフォルトの名無しさん2007/08/18(土) 22:19:42
>>856 だけど

VC++Exなんたら入れてみたけど、設定多すぎてやる気なくしたんでBCCでやってます。
えっと
異常値が出る問題だけど、ようやく解決しました。
自作のStringクラスの中にポインタをもっていてそこにnewしたメモリを紐づけている
わけですが、引数としてこのStringクラスを渡すとこのクラスのコピーが作られて
もちろんメモリと紐づいたポインタもコピーされて関数の終了とともにdeleteでメモリが
開放されていた。という次第です。
コピーコンストラクタなるものを作ってちゃんとメモリもコピーしてやったら直りました。

おまえら役に立たなさ杉だなwww
0962デフォルトの名無しさん2007/08/18(土) 22:23:51
理解できない頭のくせに(笑)
0963デフォルトの名無しさん2007/08/18(土) 22:50:01
自作ライブラリの不具合をソース無しで問われてもエスパー以外には回答不可かと
0964デフォルトの名無しさん2007/08/18(土) 23:28:05
>>961
>862で指摘済みじゃん。しかもどんぴしゃ。
0965デフォルトの名無しさん2007/08/18(土) 23:54:19
>>964
それは失礼しました。ご指摘ありがとうございます。
0966デフォルトの名無しさん2007/08/18(土) 23:54:53



















0967デフォルトの名無しさん2007/08/19(日) 04:22:05
プログラマー共ってもうすこし同類に優しいと思ってたらそうでもないんだな
殺伐としとる
0968デフォルトの名無しさん2007/08/19(日) 04:24:26
優しいよ。どんな戦場に居るんだ?
0969デフォルトの名無しさん2007/08/19(日) 08:21:18
>>968
お手手繋いで仲良く微温湯に使っていたいのでしょうよ。
# 微温湯っつーか、泥沼?
0970デフォルトの名無しさん2007/08/19(日) 12:39:48
>>961
おまえが馬鹿すぎる。

メンバ変数にポインタを持ち、デストラクタでdeleteしているのに、
浅いコピーをするデフォルト生成のコピーコンストラクタを許す(使う)だなんて。
0971デフォルトの名無しさん2007/08/19(日) 16:03:05
開発環境
Windows XP SP2
VC++6.0

質問内容
Windowsでmallocを行った際の動作は
 1.OSがヒープ領域をある程度大きく取る。
 2.確保したヒープ領域内からmallocで指定したサイズで領域確保する。
といった2段階の処理が行われている。

という理解でたぶん合っていると思うのですが、現在組んでいるプログラムで、
for( ii = 0 ; ii < hogehoge ; ii++ )
{
・・・
/* 領域確保 */
hogenhoge->hoge[ii] = (char*)malloc( strlen(line) * sizeof(char) );
  ・・・
}
といった感じに文字列をメモリに格納する処理があるのですが、一部の処理で以下の現象が発生していて対応方法が見つからずに困っています。
 デバックコンパイル(正常動作) -> 「1」で確保したヒープ領域を使い切った後に、新しいヒープ領域を確保しに行く
 最適化コンパイル(異常動作)  -> 「1」で確保したヒープ領域を使い切る前に、新しいヒープ領域を確保しに行く(見た感じでは99%使われていない)
デバックコンパイルしたモジュールでは正常動作するのですが、最適化コンパイルを行った場合に上記問題が発生して途中で領域確保に失敗してプログラムが止まってしまっています。
メモリの状況をチェックするのには「VM Validator」というソフトウェアを使用しています。

問題点は最適化コンパイルしたモジュールの一部の処理でヒープ領域を無駄に確保しにいくという点です。
mallocは他の場所でもあちこちで使っているのですが、ここの部分でのみ上記現象が発生していて現在苦しんでいるところです
どなたかアドバイスをよろしくおねがいします。
0972デフォルトの名無しさん2007/08/19(日) 16:14:08
エスパー
hogenhoge->hoge[ii] = (char*)malloc( strlen(line) * sizeof(char) );
の部分で後からstrcpyで文字列をコピーするんだろうと思うと
hogenhoge->hoge[ii] = (char*)malloc( strlen(line) * sizeof(char) + 1 );
じゃないと、終端文字分の'\0'領域がかくほされない
0973デフォルトの名無しさん2007/08/19(日) 16:17:12
>>971
とりあえず、
hogenhoge->hoge[ii] = (char*)malloc( (strlen(line)+1) * sizeof(char) );
に変えてみ。
0974デフォルトの名無しさん2007/08/19(日) 16:18:41
関係ないけど、sizeof(char)はいらんだろ。
sizeof(TCHAR)とかだったら、必然性あるけど。
0975デフォルトの名無しさん2007/08/19(日) 16:19:47
それにしても、C++とは思えない酷いコードだな。
0976デフォルトの名無しさん2007/08/19(日) 16:21:00
>>974
いる。

あとでcharをTCHARに変えることもある。
そのときに+1なんてのはマジックナンバーになってしまう。
0977デフォルトの名無しさん2007/08/19(日) 16:24:22
>>976
だったら最初からTCHARにしとけばいいじゃん。
なんのためのジェネリックテキストだよ。
09789712007/08/19(日) 17:49:31
うぉっ直りました^^;
デバック版でたまたま動いてたのはヒープ領域確保する際に初期化とかしてるのが最適化版だとしてくれないとかがあって、異なる結果になってたのかな・・・

>>975
ひどいコードですみませんorz
実のところ、掲示板に書いたコードはmallocをfor文で繰り返している部分ってのを表現したくて、その場で書いたコードだったのですが、元のコードでも指摘されたのと同じミスをしていました・・・
しかも今見なおすとforループのhogehogeと領域確保する構造体の名前がかぶっている・・・と思ったら片方はhogeとhogeの間にnが入っている・・・う〜ん質問するに当たってこんなコードのせてちゃダメですね

>>974
sizeof(char)はcharが1バイトではない処理系がもしかしたらあるかもしれないので、そういう意味でこうしてます。
TCHARってのは使ったことないのですが、charとは違った文字列の持ち方をするってことかな?
勉強してみますね^^

皆さんアドバイスありがとうございました。
0979デフォルトの名無しさん2007/08/19(日) 17:53:35
>>978
charはかならず1バイト。
0980デフォルトの名無しさん2007/08/19(日) 18:43:16
>>978
うつろな記憶なんで、嘘だったら誰かフォロー頼む。

デバッグビルドだとデバッグのための領域が一緒に確保される。
なので、バッファオーバーフローしても、デバッグのため領域を食いつぶして
正常に動いてるように見えることが多い。

リリースビルドだと、余分な領域を確保しないので、
オーバーフローするとわけの分からない動きをする可能性が高い。

とかそんな話だったと思う。
0981デフォルトの名無しさん2007/08/19(日) 18:48:18
>>977
TCHARとして書いていないものをTCHARとして書くのは無責任だ。

だいたい意味が分かるように書くべきであって、
型のサイズが既知で変りそうもないからハードコーディングするのはおかしい。
sizeof(DWORD)なんてのも直に4と書けと言うのか?
0982デフォルトの名無しさん2007/08/19(日) 18:58:11
>>978
TCHARというのはWindowsのWin32APIのマクロで、
Win32APIのUnicode版とMCBS版を透過的に使うためのもの。
実体は、

#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef unsigned char TCHAR;
#endif

こういうことになってる。

ちなみにVC++のランタイムライブラリでは、
#ifdef _UNICODE
typedef wchar_t _TCHAR;
#else
typedef char _TCHAR;
#endif
ということになっている。

この2つは厳密には別物であり使い分けるべきなのだけれども、
Win32APIと関係のないところで_TCHARではなくTCHARを使う人が少なくない。
0983デフォルトの名無しさん2007/08/19(日) 19:02:24
>>980
デバッグビルドの場合、バッファオーバーフローを検出するための仕掛けがある。

MSDNライブラリ等で
_CrtCheckMemory
などの一連の項目を見るといい。

簡単に言うと、余分にメモリを確保して、そこに特別な値を書き込んでおき、
その値が変っているかどうかをチェックして、バッファオーバーフローを検出する。
VC++6.0のIDE上でデバッグモードで動かしていれば、
プロセスが終了する間際に、トレースの所に何かメッセージが出ていたと思うよ。
0984デフォルトの名無しさん2007/08/19(日) 19:05:48
>>981
もちろんほかの箇所もTCAHR使うって前提だよ。
>>976 の「あとでsizeof(TCHAR)にすることもある」って話も、そこだけ変えるんじゃないだろ?

ハードコーディングしろって話じゃなくて、sizeof(char)は1だと決まってるんだから、そもそも、いらないって話だよ。
あとでsizeof(TCHAR)に書き直すくらいなら、最初からそう書いておけばいい。




0985デフォルトの名無しさん2007/08/19(日) 19:17:14
>>984
ただ単に
1
と書いたら、意味がわかりにくい。

もう一度聞くが、
sizeof(DWORD)も4と書くのか?
0986デフォルトの名無しさん2007/08/19(日) 19:18:26
誰が1や4と書くなんて書いとんねん
つまらない事で言い合いスンナ!
09879712007/08/19(日) 19:19:18
>>980
おお〜なんか納得できる^^

sizeof(char)に関しては、>>981さんの考え方に近いかな〜
昔32bit -> 64bitの移植に携わったことがあって、その時にちと苦しめられたので明示的に書くようにしてます^^
具体的にはポインタの領域確保するのに、(たぶん組んだ人は動きゃいいやという考え方で適当に組んでいたダメ人間)sizeof(int)使って領域確保してて、
32bitだとポインタもintも両方同じ4バイトだからちゃんと動作するんだけど、
64bitではポインタだけ8バイトに変わるから、そこの部分でエラーが出て、
しかもコピーして使いまわしたらしく同じようなコードがあちこちに点在してて・・・

今となってはいい思い出だけど、あれは大変だったなぁ〜(-_-;)
今回のケースとは大分違うんだけど、明示的に書いておいた方が将来的にどんなふうに仕様が変化するか分からないし安全だなぁ〜って教訓からこうしてます^^
0988デフォルトの名無しさん2007/08/19(日) 19:25:16
TCHARも知らん分際で何ホザいとんねん
0989デフォルトの名無しさん2007/08/19(日) 19:27:16
>>985
だから「いらない」って言ってるじゃん。

malloc(strlen(s) * 1) こんな書き方しろなんて言ってないよ。
0990デフォルトの名無しさん2007/08/19(日) 19:30:02
>>987
intとcharは、事情が違うよ。
0991デフォルトの名無しさん2007/08/19(日) 19:39:00
もうスレが終わりそうだからマトメ

(a) malloc(tcslen(s) * sizeof(TCHAR)) なら普通の書き方。

(b) malloc(strlen(s) * sizeof(char)) のsizeof(char)は意味がない。

あとでcharをTCHARに変えるかもって想定してるなら、この使い方はマジックナンバーを
埋め込んでるより多少はマシだけど、まあ大差ないレベル。
最初から (a)の書き方をするべき。
0992デフォルトの名無しさん2007/08/19(日) 19:42:26
>>989
malloc(strlen(s)+1)
こんな書き方をしたら、気持ち悪いだろ。

mallocが受け取るのは「文字数」ではなく「バイト数」だ。
strlenが返すのは「バイト数」ではなく「文字数」だ。それは+1しても、「文字数」のままだ。
「バイト数」を受け取るところに、「文字数」を渡すのは、気持ち悪すぎる。

sizeof(char)に「文字数」を掛けることで、適切に「文字数」を「バイト数」に変換できる。
だから、たとえsizeof(char)が1だとわかりきっていても、それを省略すべきではない。
0993デフォルトの名無しさん2007/08/19(日) 19:43:53
>>991
99%の確率でバグっているコードを「普通の書き方」なんて言うな。
0994デフォルトの名無しさん2007/08/19(日) 19:48:17
>sizeof(char)に「文字数」を掛けることで、適切に「文字数」を「バイト数」に変換できる。
いいえ。
0995デフォルトの名無しさん2007/08/19(日) 19:48:32
ツマンネェ奴ら
0996デフォルトの名無しさん2007/08/19(日) 19:49:00
>>977 は >>974 でしょ?
元もとstrlenだけで十分だと言ってるんだと思うが...
もし、つけるんだったらsizeof(*line) じゃだめか?
0997デフォルトの名無しさん2007/08/19(日) 19:52:37
>>993
元のコードにあわせただけ。
この話の本筋とは関係ないし。

マイナーな本でsizeof(char)を使えって薦めてるのを見たことあるけど、
まあ、こういうスタイルは、圧倒的に少数派。
こんなクセのある書き方を推奨するやつは、コードを読んで無さ杉。
09989712007/08/19(日) 19:54:19
なんかスレが荒れてしまって申し訳ないです。

皆さん善意で書き込んでくださっているわけなので、感謝してます。
ただ個々人で使用し続けてきたコーディングのスタイルがあって、それでいい争いになってしまっていて、すれが険悪になってしまって申し訳ありません。

今回の件ではバグが取れたという以外にも、文字列絡みの処理に対して再勉強する機会になったのでよかったです。
0999デフォルトの名無しさん2007/08/19(日) 19:55:25
↓1000
1000デフォルトの名無しさん2007/08/19(日) 20:02:37
呼んだ?
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。