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

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

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

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

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

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0153デフォルトの名無しさん2008/12/16(火) 20:34:16
指してる先が問題であって、ポインタは別に問題ないだろ
0154デフォルトの名無しさん2008/12/16(火) 20:37:04
確かにそうだった。
頭冷やしてくる。
0155デフォルトの名無しさん2008/12/16(火) 20:58:25
それ以前にstrcpy使っていい対象ですらないな
0156デフォルトの名無しさん2008/12/16(火) 21:15:22
以前に?
それを言おうとしたが言い方を間違えたのが>>152だろ
0157デフォルトの名無しさん2008/12/16(火) 21:18:23
>>156
ごめんリロードしたつもりがしてなかったんです
0158デフォルトの名無しさん2008/12/16(火) 22:26:26
配列って32ビットマシンで32ビット最大値の添え字を超えて扱えるんですか?
0159デフォルトの名無しさん2008/12/16(火) 22:30:02
>>158
アドレス空間自体が32bitなので、オーバーフローして反対側から出てくる。
0160デフォルトの名無しさん2008/12/16(火) 22:30:54
32ビットのアドレス空間を自由にさわれるわけではないのでアクセス違反で落ちる
0161デフォルトの名無しさん2008/12/16(火) 22:34:32
今思ったんだけどもしかして、
pow(2,32)って32bitPCだと無理なの?
0162デフォルトの名無しさん2008/12/16(火) 22:35:49
>>161
なにをいまさらw
即レスでオーバーフローとか言われてただろ
0163デフォルトの名無しさん2008/12/16(火) 22:38:14
そのあと即効でdoubleじゃね?とも言われたな
0164デフォルトの名無しさん2008/12/16(火) 22:38:45
そういうことだったのか!
でも正常に動いてるんだけど内部でも絶対扱えてないの?
0165デフォルトの名無しさん2008/12/16(火) 22:45:31
((*pv8)[(*pVec)[i*2+0]][si.nPos] <= (*pVec)[i*2+1])

すいませんこれ

(((*pv8)[(*pVec)[i*2+0]][si.nPos]) <= ((*pVec)[i*2+1]))

<=の左右式ごとにカッコでくくらないとまずいですか?
0166デフォルトの名無しさん2008/12/16(火) 22:45:35
配列の添え字の範囲とdoubleが扱える範囲は全く関係ない。
0167デフォルトの名無しさん2008/12/16(火) 22:47:19
doubleってすげー
0168デフォルトの名無しさん2008/12/16(火) 22:49:42
>>165
そんだけ書けててわからないのがそこかよ・・・
0169デフォルトの名無しさん2008/12/16(火) 22:54:42
何を心配してくくらないといけないと思ったのかを知りたいわ
0170デフォルトの名無しさん2008/12/17(水) 00:00:34
心配で悩む位ならカッコでくくれば良い。
0171デフォルトの名無しさん2008/12/17(水) 00:16:43
A && B || C とかそういうたぐいではなく、
((*pv8)[(*pVec)[i*2+0]][si.nPos] <= (*pVec)[i*2+1])
を
((*pv8)[(*pVec)[i*2 ( +0]][si.nPos] <= (*pVec)[i ) *2+1])
こうされたらどうしようとか
((*pv8)[(*pVec)[i*2+0]] ([si.nPos] <= (*pVec)[i*2+1]))
こうされたらどうしようとか

そう思うのは逆に珍しいので、どう悩んだのか教えてもらえると、今後他の人に
教える時に役に立つかもしれない。
0172デフォルトの名無しさん2008/12/17(水) 01:56:35
環境はMacです。

以下のプログラムをstdio.h型ではなくiostream型に書き換えるとどうなるんでしょうか?
printfとかscanfとかはcinやcoutに書き換えられるってのは自分で調べて分かったのですがどうもコンパイルするとエラーになってしまうんです。

printfとかscanf以外にも書き換えられる部分があればお願いします。

あと、それぞれの行がどういった命令を出してるのか解説もお願いします…。

for(i=0;i<8;i++){//最初i=0でi<8まで増えていく

と言った感じで…。

#include <stdio.h>
int p,t,a,d,c,v,i,m[90]={0},s,r[]={-10,-9,-8,-1,1,8,9,10};
void k(){if(m[p]==0)
for(i=0;i<8;i++){
for(c=0,v=p+r[i];m[v]==3-t;v+=r[i])c++;
if(c&&m[v]==t){a+=c;v=p;
if(d)do m[v]=t,v+=r[i];
while(m[v]!=t);
}}}
char*h="・○●\n";
int main(){for(i=1,m[41]=m[49]=2;i<10;m[i++*9]=3)m[40]=m[50]=t=s=1;for(;;a=d=0){for(p=9;p<82;++p)k(),printf("%.2s",&h[m[p]*2]);
if(a)for(d=a=s=p=8;a==8;k())t-2?(scanf("%d %d",&p,&i),p+=i*9):++p;
else if(s)s=0,printf("pass");
else break;t=3-t;
}
return 0;
}
0173デフォルトの名無しさん2008/12/17(水) 02:13:46
>>172
死ね
0174デフォルトの名無しさん2008/12/17(水) 02:49:16
どうせマルチするなら七行スレに書けよ。
0175例外2008/12/17(水) 04:37:19
C++で例外を投げたい場合、
書いたら例外を投げてることが分かるという利点と、
例外の種類が多くなるとソースが長くなると言う欠点があると思うのですが、
関数定義にthrowは書いたほうがいいのでしょうか?
0176デフォルトの名無しさん2008/12/17(水) 05:15:09
エラー処理をシンプルに記述できるという多大な利点
0177デフォルトの名無しさん2008/12/17(水) 06:11:08
質問。
std::codecvtの使い方、および説明された書籍、URLなどを教えてください。
特に、~codecvt()がvirtualな理由を知りたい。
std::localeからの利用を意図し、std::codecvt自体はインターフェースなのか?

環境はVC90及びgcc4を想定。
説明用サンプルソースなどもあればよろしく。
以上よろしくお願いします。
0178デフォルトの名無しさん2008/12/17(水) 06:17:00
間違えた。
~codecvt()がprotectedな理由を知りたい。
0179デフォルトの名無しさん2008/12/17(水) 07:42:01
codecvt のことはよく分からんが
デストラクタが protected な場合は
派生クラスだけ作れるようにしたい場合じゃね。
0180デフォルトの名無しさん2008/12/17(水) 08:21:22
>>175
例外仕様のことだね?
例外を投げないことを示す throw () 以外は付けないのが C++ での流儀として定着しつつある。
0181デフォルトの名無しさん2008/12/17(水) 09:04:59
>>180
それは流儀というより、実用上仕方なくでわ?
0182デフォルトの名無しさん2008/12/17(水) 09:33:17
例外投げる場合も throw(投げる例外)とかけるだろ
しかしそうは書かないから流儀って言ってんじゃね?
0183デフォルトの名無しさん2008/12/17(水) 09:37:56
>>181
たとえば Java のチェック付き例外仕様が使えたとしても、使う使わないの
それぞれにどっちが良いとも言いきれないようなメリット・デメリットがある。

後発の言語で同様のチェック付き例外仕様を採用した言語が少ない(無い?)ことから
考えても、「仕方なく」という感じはしない。
0184デフォルトの名無しさん2008/12/17(水) 10:15:02
>>182-183
throw(投げる例外)を付けるとエラー吐くコンパイラがあるからだと思うけどね。
もちろんそのコンパイラが標準C++に準拠していなければ、その仕様で正しい。
というか、時代的に仕方なかった。
と、俺は思う。

一方、仕方なくではなく単なる流儀だとした場合、つけるデメリットって何?
そしてつけないメリットって何?
0185デフォルトの名無しさん2008/12/17(水) 10:23:58
付けるデメリット
マンドクセ

付けないメリット
マンドクサくない
0186デフォルトの名無しさん2008/12/17(水) 10:24:08
>>184
読んどけ。
http://www.gotw.ca/publications/mill22.htm
> So here’s what seems to be the best advice we as a community have learned as of today:
> Moral #1: Never write an exception specification.
> Moral #2: Except possibly an empty one, but if I were you I’d avoid even that.

today つっても 2002 年なんだな。いいかげんに対応する日本語の文書がほしいところだ。
0187デフォルトの名無しさん2008/12/17(水) 10:25:15
規格策定後5年が過ぎてもエラー吐くコンパイラを新製品として発売した
ベンダーがあるけどな。
C++自体終わってるんじゃないか?
0188デフォルトの名無しさん2008/12/17(水) 10:32:46
http://www.ibm.com/developerworks/jp/java/library/j-jtp05254/
Javaの資料だけど、後発の言語が導入しない理由を知るにはちょうど良いかと。
0189デフォルトの名無しさん2008/12/17(水) 10:35:02
http://msdn.microsoft.com/en-us/vcsharp/aa336812.aspx
C# の話もわかりやすい。
0190デフォルトの名無しさん2008/12/17(水) 10:39:41
>>188
これは全く別の話だ。
0191デフォルトの名無しさん2008/12/17(水) 15:43:42
使い捨てカイロを再生させる方法はありませんか?
0192デフォルトの名無しさん2008/12/17(水) 15:44:08
硫酸(r
0193デフォルトの名無しさん2008/12/17(水) 15:52:13
はじめたばかりで恐縮なのですが書き込ませていただきます
たとえば次のようなコードがあったとします
class ClassA{
public:
ClassB cB;
//他の記述
};
class ClassB{
public:
ClassA cA;
//他の記述
};

とした場合、ClassAではClassBより先に書いているのでcBは作ることが出来ないのということで、
もし、どちらもクラス内部で、inline関数として書きたい場合は、あきらめてヘッダーでクラスを書いてその後に
inline void ClassB::関数名...
としていくしかないのでしょうか?
0194デフォルトの名無しさん2008/12/17(水) 16:02:20
ない
0195デフォルトの名無しさん2008/12/17(水) 16:11:37
Aの中のBの中のAの中のBの中のAの中のBの中の・・・
無限ループってこわくね?
0196デフォルトの名無しさん2008/12/17(水) 16:27:57
>>193
先に〜に関しては
class ClassB;
で解決するが、それでも>>195
の言っている状況になるのでポインタで持つしかない
(いやほかの手もあるけどさ)
0197デフォルトの名無しさん2008/12/17(水) 17:27:58
株式の持ち合いみたいだな。
0198デフォルトの名無しさん2008/12/17(水) 18:10:36
マウスダウンのnFlagでMK_LBUTTONが押されているのは当たり前だとおもうのですが、

MK_CONTROL+ MK_LBUTTON

と書かないで

if(MK_CONTROLが含まれているか?)
{
}

これどう書けばいいんでしょうか?
0199デフォルトの名無しさん2008/12/17(水) 18:11:37
知らないけどきっとnFlag & MK_CONTROLじゃないの
てかフラグを足し算するな
0200デフォルトの名無しさん2008/12/17(水) 18:24:10
足し算で済んでしまうこともあるが、OR演算するようにしよう
0201デフォルトの名無しさん2008/12/17(水) 18:30:31
if(nFlag & MK_CONTROL)
{
}
こうですか?
0202デフォルトの名無しさん2008/12/17(水) 19:03:13
すこしでもエラーがあるとアプリがすぐ終了するんですが、
これ異常部分だけ初期化終了とかさせられないんですか?
立ち上げなおしてバグのところまでいくのも一苦労なんですが・・・
アザートが多すぎて泣きそうです
0203デフォルトの名無しさん2008/12/17(水) 19:13:11
言ってる意味がわからない
本当にC/C++の質問ならコード片を貼るなどしてもっと分かるように言え
0204デフォルトの名無しさん2008/12/17(水) 20:01:57
>>201
そうですよ。

>>202
ASSERTをコメントアウトするか、ASSERTが
出ないようにプログラミングすればよいと思うよ。
エラーが発生して終了したら、別プロセスで監視しておいて
再起動をかけるのも有用な対策の一つだよ。
0205デフォルトの名無しさん2008/12/17(水) 20:20:41
ifだけを抜けたい時はどうすればいいのでしょうか?
returnだと全部抜けるし
breakとcontinueの違いがよくわかりません。

:
goto a;
:
:
gotoPoint a;
:

のようなことはC++では出来ないんでしょうか?
0206デフォルトの名無しさん2008/12/17(水) 20:21:19
>>204
ありがとうございます!
0207デフォルトの名無しさん2008/12/17(水) 20:27:13
OS:Linux
コンパイラ:gcc

コンパイルすると
無効なプリプロセスディレクティヴ #!
ってでるんですがどうすればエラー消えるでしょう?
0208デフォルトの名無しさん2008/12/17(水) 20:28:30
制御文の前で必ず1行あける規則は細かすぎると思いますか?
0209デフォルトの名無しさん2008/12/17(水) 20:34:21
>>208
俺はif文がネストする場合の2段目以降のif文だけかな。詰めて書くのは。
大抵そうしてる。
0210デフォルトの名無しさん2008/12/17(水) 20:37:46
>>205
gotoあるよ
continueはループの中で使うよ
0211デフォルトの名無しさん2008/12/17(水) 20:39:21
>>205
C++でもgoto文あるよ。
continueとbreakの違いと使い分けも考え付かない程度なら
絶対使わないぐらいの考えでプログラムしといたほうがいいと思うけど。
0212デフォルトの名無しさん2008/12/17(水) 21:05:32
コンストラクタ内で自身がconst宣言されているか
確認する方法ってないでしょうか?
0213デフォルトの名無しさん2008/12/17(水) 21:12:20
コンストラクタはとにかくメンバを初期化しないといけないので
const で宣言されていようがメンバをいじれないと困る。
だから確認する必要も無いし、確認する方法も用意されていない。
0214デフォルトの名無しさん2008/12/17(水) 21:21:00
やっぱり無いですか。ありがとう。
0215デフォルトの名無しさん2008/12/17(水) 21:29:16
goto使ってるC++のサンプル見たことない
0216デフォルトの名無しさん2008/12/17(水) 21:39:25
エラー処理は例外に取られたから
多重ループ脱出くらいしか使い道ないな
02171752008/12/17(水) 21:40:15
>180-189
返信ありがとうございます。
throw(A)と書くとエラーを出すコンパイラもあるんですね。
例外を投げないことを明示したい場合以外は宣言にthrow(A)を書かないことにします。
0218デフォルトの名無しさん2008/12/17(水) 21:46:43
例外を嫌う人は代わりに goto を使う。
0219デフォルトの名無しさん2008/12/17(水) 23:26:03
>>199
なんで足し算しちゃだめなの?どういう不具合がある?
0220デフォルトの名無しさん2008/12/17(水) 23:42:43
>>219
MK_CONTROLやMK_LBUTTONが実際には複数のビットの組み合わせで、
それに重複がある場合は、足し算すると繰り上がって予期せぬビットが立つ可能性がある
フラグはビット演算子で扱うのが基本
0221デフォルトの名無しさん2008/12/17(水) 23:45:36
nFlag == MK_CONTROL+ MK_LBUTTON
というものを書いた場合、Shiftも押されてた場合はどうするのってなる
0222デフォルトの名無しさん2008/12/18(木) 00:00:56
>>219
MK_* が互いにビット位置の重複がないという保証があって、尚且つ最上位ビットをマスクして
比較できるという条件がなきゃ使えないから。
0223デフォルトの名無しさん2008/12/18(木) 00:32:03
よくわかった。みんなありがとう!
0224デフォルトの名無しさん2008/12/18(木) 00:43:38
>>218
それはありじゃないか。少なくとも少し前にパフォーマンス比較したら
exception 関係入れて測定できるほど実行速度落ちた経験ある。
0225デフォルトの名無しさん2008/12/18(木) 09:06:36
それは使い方に問題があるんじゃないか?
try catchを頻繁に通過するとか、例外が頻繁に発生してるとか
throw用の一時オブジェクトを例外が発生しなくても生成してたりとか…
0226デフォルトの名無しさん2008/12/18(木) 15:55:43
横やりだけど、try自体はコスト0だよね?
throwしたときだけ専用のフローに入ると思ってるんだけど。
0227デフォルトの名無しさん2008/12/18(木) 16:15:14
オブジェクト宣言時に初期化をしなかった場合、コード中で初期化をするにはどうすればいいんですか?

.h
クラス名 obj(引数1, 引数2);

こうしないで

.h
クラス名 obj;
.cpp
obj(引数1, 引数2);

こうしたいのですが
0228デフォルトの名無しさん2008/12/18(木) 16:24:51
ヘッダファイルの方にexternをつけとけばいいんだけど、
今どき、グローバル変数を使ってると嫌われるよ。
0229デフォルトの名無しさん2008/12/18(木) 16:27:29
>>226
関数と同じでスタック積んでたと思う
じゃないと例外発生時にジャンプ先が分からない
02302292008/12/18(木) 16:57:16
気になったから詳しく調べてみた。

まず、関数内にtry catchがある場合、関数実行時にアセンブラで5命令位増える
tryやcatchの数を増やしてもそれ以上命令数は増えない

次にtry実行時、mov命令で整数値を何所かに書き込んでる
try毎に同じ場所に違う値を書きこんでいるため、これを元にthrow時に現在のブロック化を特定している

throwでは関数をコールしているので、try時にセットした値をもとにブロックを特定し、
catchを順次検索して型が当てはまる場所へジャンプしていると思われる

実装依存の可能性もあるけど大体はこんな感じかと
以上、参考になれば。
0231デフォルトの名無しさん2008/12/18(木) 16:58:38
>>226
多分、setjumpと同じ様な事をしていると思う。
0232デフォルトの名無しさん2008/12/18(木) 17:01:45
try catch に直接関係ないところでも、例外発生時にデストラクタが呼び出されるような仕掛けをしている。
0233デフォルトの名無しさん2008/12/18(木) 17:13:53
>>228
externをつけたんですが、ストレージクラスが正しくないと出てコンパイルできません

やりたいのはこれです。
.h
extern CPen pen;
.cppのコンストラクタ内
pen = pen(PS_SOLID, 1, RGB(0,0,0) );
0234デフォルトの名無しさん2008/12/18(木) 17:19:19
pen = pen(PS_SOLID, 1, RGB(0,0,0) );
↓
pen = CPen(PS_SOLID, 1, RGB(0,0,0) );
0235デフォルトの名無しさん2008/12/18(木) 17:20:26
すいません。ありがとうございました。
0236デフォルトの名無しさん2008/12/18(木) 17:20:31
あ、いやなんでもない
0237デフォルトの名無しさん2008/12/18(木) 17:21:39
あれ?それでよかったん?^^;
0238デフォルトの名無しさん2008/12/18(木) 17:22:17
ん?グローバル変数じゃないのか。クラスのメンバ変数なら extern は不要だ。
0239デフォルトの名無しさん2008/12/18(木) 23:04:43
これifのpCにNULLもポイントも入ってないんですがなんでですか?

class A
{
 void Func()
 {
  if(B::pC != NULL)
  {
   B::pC = CClassC();
  }
 }
};

class B
{
 CClassC* pC;
 B(){ pC=NULL; }
};
0240デフォルトの名無しさん2008/12/18(木) 23:09:23
>>239
>これifのpCにNULLもポイントも入ってないんですがなんでですか?
何を根拠にそう判断したのかね。
0241デフォルトの名無しさん2008/12/18(木) 23:10:32
それ以前に文法むちゃくちゃ
0242デフォルトの名無しさん2008/12/18(木) 23:42:31
さすがに少々どころでない間違いだらけだと、
コンパイルが通らないようなコードでは、何が言いたいのか分からないとしか言いようがない……。
0243デフォルトの名無しさん2008/12/19(金) 00:23:08
「だらけ」ってほどじゃないと思うがなぁ。
>241>242には私に見えない何かが見えているのだろうか。
0244デフォルトの名無しさん2008/12/19(金) 00:33:32
>>239
pCの値をチェックしたタイミングがいつなのか謎過ぎるがNULLも有効なアドレスも入ってない訳無いだろ。チェックの仕方がおかしいんじゃないか?
あとB::pCっていうのは、一回変数を作ってb.pCみたいにしないと駄目。
そしてさらにpCはポインタだから*(b.pC) = CClassC();ってしなくちゃ。

ポインタがどういう物なのか分かってる?
0245デフォルトの名無しさん2008/12/19(金) 00:53:28
>>243
class Aでclass Bを参照しているのに定義が後
friend classでもないのにBのprivate要素をAが参照
static memberじゃないpCをstaticのごとく使っている

これが間違い「だらけ」じゃなければ、いったいなんだというのだ?
そもそもオマエは他人のフリをした239じゃないのか?
0246デフォルトの名無しさん2008/12/19(金) 00:58:47
間違えだらけのことをえらそうに言えば教えてもらえるテクニックと思わせるレベル。
0247デフォルトの名無しさん2008/12/19(金) 01:08:08
答える気のない知ったかは黙ってて下さい
privateだのstaticだのは省略されてるだけでしょ
それくらい汲み取れるだろ
0248デフォルトの名無しさん2008/12/19(金) 01:14:20
いったい何が入ってたんだろう・・・・・・
0249デフォルトの名無しさん2008/12/19(金) 01:16:04
>>247
最低限コンパイルが通る形にしてから質問しろ。
質問する側もそうやれば自分で問題点が見えてくるだろ。
0250デフォルトの名無しさん2008/12/19(金) 01:34:00
private省略ならまだしもstatic省略はしない
0251デフォルトの名無しさん2008/12/19(金) 01:55:45
分からないならレスしないで下さい。ウザイだけです。
0252デフォルトの名無しさん2008/12/19(金) 01:57:28
>>251
オマエが他人に問題点を伝えられてないだけ。
ちゃんとコンパイルが通る形で書いて来い。
■ このスレッドは過去ログ倉庫に格納されています