【初心者歓迎】C/C++室 Ver.41【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.41【環境依存OK】 - 暇つぶし2ch175:デフォルトの名無しさん
07/08/10 10:50:52
>>172
pubsetbuf()でバッファでかく取っとくと、一般には速くなると期待されるんだが、
gccの少なくとも古いバージョンでは、open済みのstreambufに
pubsetbuf()を実行しても、何食わぬ顔をして元のバッファを使うようだ。

mmap()したポインタをstrstreamにそのまま突っ込むのが多分一番速いが、
移植性に欠ける上にstrstreamがdeprecatedなのがネックだな。
stringstreamのstrメンバを使うとせっかくmmap()したものを
わざわざコピーしてしまうし、
stringstreamのpubsetbuf()も有効とは限らないようだ。
(少なくともVC++では平然とシカトされる)

>>173
それ記述が簡単でいいんだが、少なくとも
VC++のostream実装とかだと、大して速く無さそうなんだよな。
sgetc()/snextc()と、sputc()使って1文字ずつコピーしてるし
微妙に無駄の多いコードになってるんで、
下手すりゃ手書き1文字コピー回したしたほうがまだ速いかもしれん。

176:デフォルトの名無しさん
07/08/10 10:52:02
>>174
どっちもだめ
ディレクトリのないファイルシステムもあるんで、CやC++の標準は
ディレクトリがらみを一切扱っていないはず

177:デフォルトの名無しさん
07/08/10 10:57:35
>>168
C99はCであって、
互換性がないのはCとC++

178:漏れが書かなくてもきっと誰かが書く
07/08/10 10:58:24
>>176
そこでboostですよ。

179:デフォルトの名無しさん
07/08/10 11:12:01
>>178
無論そんなことは知っているが、>>174は「標準ライブラリだけ」と
2度も強調しているんだし、非標準の方法があることぐらいは知ってて
聞いてるんだろ

180:175
07/08/10 11:23:23
ごめんあほなこと書いた
> stringstreamのpubsetbuf()も有効とは限らない
そもそもpubsetbuf()を入力を食わせるのに使えるはずがないな

181:デフォルトの名無しさん
07/08/10 11:26:26
>>179
>178の名前欄。

つーか、>176はなんで「扱っていないはず」なんて曖昧なままにしておくのだろう。
調べれば直ぐに答が出ることなのに。

182:デフォルトの名無しさん
07/08/10 11:28:03
>>181
すまん、扱っていないことは知っている
理由のほうが推測だ

183:デフォルトの名無しさん
07/08/10 11:35:59
>>182
なるほど、それは失敬。そしてその推測は妥当だろう。
実際、CP/Mやtronにはディレクトリがない。

184:デフォルトの名無しさん
07/08/10 11:42:45
まぁ一方ではsignal()なんかが標準だし
わけわからんところもあるよな

185:デフォルトの名無しさん
07/08/10 11:50:07
大丈夫、signal()は内容が規定されていないから存在しない環境では何もしなければいいから。

186:174
07/08/10 11:53:44
>>176
レスありがとです。
標準ライブラリにディレクトリ絡みがまったくないのでおかしいなぁ
とは思ってたんですが、そんな理由があったとは。。
ソースを他環境に持ってたとき、すぐコンパイルできないとイヤだなと思って
できるだけ標準でやる方法を探してたんですが、
>>178さんの仰るとおり、こりゃおとなしくboost使っといたほうがいいですね。

187:デフォルトの名無しさん
07/08/10 12:06:28
なんだboost厨の自演か

188:デフォルトの名無しさん
07/08/10 12:09:27
やっぱりブーストがいちばんですね^^

189:デフォルトの名無しさん
07/08/10 12:31:53
char *p = "hogehoge";
の時
*(p++)
がさす値はoですか?

190:デフォルトの名無しさん
07/08/10 12:34:48
いいえ

*(p++) の値は 'h' になります

191:デフォルトの名無しさん
07/08/10 12:37:41
いいえ

*(p++) の値は 'g' にもなります

192:デフォルトの名無しさん
07/08/10 12:37:42
はい、トムはペンです

193:デフォルトの名無しさん
07/08/10 12:38:25
出力してみりゃ分かることだろうに。
2ch に書き込むより早く分かる。

194:デフォルトの名無しさん
07/08/10 12:44:01
*(++p) オヌヌメ

195:デフォルトの名無しさん
07/08/10 12:52:10
*next(p)
^^;;

196:デフォルトの名無しさん
07/08/10 12:53:03
>>189
p が指す値と
式 *(p++) の値を混同してないか?


197:デフォルトの名無しさん
07/08/10 12:53:46
有り難うございます。
ちなみに
*pには何が代入されているんですか?

198:デフォルトの名無しさん
07/08/10 13:01:58
*pには何も代入されていないと思いますが。

199:デフォルトの名無しさん
07/08/10 13:02:37
夏・・・

200:デフォルトの名無しさん
07/08/10 13:09:34
最近は季節に関係なく年中馬鹿が湧く、と考えていたけど、
やっぱり長期休暇は頻度もスケールも一回り違うかな。

201:デフォルトの名無しさん
07/08/10 13:36:08
出力してみりゃわかることをうだうだと質問してからに・・・

202:デフォルトの名無しさん
07/08/10 15:01:04
ちょっとしつもんします
ギャルゲーとかで「フラグをたてる」ていうんですが
フラグというのはビットなんですか?

203:デフォルトの名無しさん
07/08/10 15:03:07
ビットなフラグはビットフラグ
ビットじゃないフラグも当然ある

204:デフォルトの名無しさん
07/08/10 15:07:07
「立てる」っていう表現をするようなフラグなら、
「立てる」か「倒す」かだからビットだろうなぁという気はする。

205:デフォルトの名無しさん
07/08/10 15:10:54
死亡フラグは立てるのに倒れてしまう件

206:デフォルトの名無しさん
07/08/10 15:22:38
私生活では全くフラグが立たない件について

207:デフォルトの名無しさん
07/08/10 15:26:46
>>204
boolは大抵intかcharで実装されている罠。

208:デフォルトの名無しさん
07/08/10 15:27:55
>>206
立ち過ぎてて困るから
1ビット分けてあげるぞ

209:デフォルトの名無しさん
07/08/10 19:04:06
cygwinまたはlinuxの環境下でコンパイラに追加依存ファイルの検索パスを与えようとしています
仮に追加依存ファイルのパスを~/xxx/includeとすれば
.bash_profileではexport CDPATH="$CDPATH":"~/xxx/include/"のようにして環境変数を設定し
シェル上でcd includeと打てばカレントパスが意図通りに変化するところまでは設定しています

ここから、このパス下にあるtest.hppを#include <test.hpp>のように指定しているファイル
~/main.cppを
コンパイルする目的で~/下でg++ main -I includeと打ったのですが
コンパイラからはtest.hppが見付からないというエラーが返ってきます

正しくはどのように指定するべきなのでしょうか?


210:デフォルトの名無しさん
07/08/10 19:13:01
CDPATH はその名前の通り cd コマンドにしか効かないんじゃない?
-I~/xxx/include
ってやれば?

211:デフォルトの名無しさん
07/08/10 19:15:55
CDPATHはcdに関係するだけでコンパイラには関係ないんじゃないか?
何がしたいのか良く分からないけど、普通に-I~/xxx/include/とか書くとか

ていうか、そもそも-Iの後ろにスペースあるのはOKだっけ?

212:デフォルトの名無しさん
07/08/10 19:39:34
なるほどフルパスで指定しないと駄目なんですね、あと' 'が入ってても駄目と
それら二点に気を付けて打てば通りました
助言ありがとうございました

213:デフォルトの名無しさん
07/08/10 19:45:54
>>212
相対パスでもいけるけど、「ソースがある場所からの」相対パスであることに注意

214:213
07/08/10 19:47:00
あ、-Iオプションで指定する場合はそうじゃないか?
すまん、俺自身あやふやになってきた。忘れてくれ

215:デフォルトの名無しさん
07/08/10 19:53:16
-Iオプションは相対パスでもいけるハズ。
たぶんコンパイラ実行時の作業ディレクトリかなんかからの相対パスになると思うけど・・・。
いつもmakefileコピペ改変でやっちまうから、俺も記憶があやふやだ・・・

216:デフォルトの名無しさん
07/08/10 20:29:01
相対パスでOK。
Makefileに-Ipathと書いておいて、ln -s どっかの/pathとかよくやる。

217:デフォルトの名無しさん
07/08/10 22:46:58
クラスの実際の型に応じた処理を簡単に書く方法はありますか?

例えば、基本クラス Hoge を継承するクラス Foo と Bar があるとして、
void func(const Hoge &hoge)
{
  // hoge が Foo の時の処理
  // hoge が Bar の時の処理
}
というのを簡潔に書きたいのですが。普通にdynamic_castを使って(ダウンキャストの例外呼ばれたくないのでポインタで)
{
  if ((const Foo *p = dynamic_cast<const Foo *>(&hoge)) != NULL)
    ...;
  else if ((const Bar *p = dynamic_cast<const Bar *>(&hoge)) != NULL)
    ...;
}
とやる方法と、try...catchの変な使い方で
{
  try {
    throw hoge;
  } catch (const Foo &foo) {
    ...;
  } catch (const Bar &bar) {
    ...;
  }
}
っていうのも思いついたんですが、こんな書き方はしないですよね。実際はどういう書き方が普通でしょうか。
instanceofとかisとかC++にはないようなので。

218:デフォルトの名無しさん
07/08/10 22:50:17
そのクラスに virtual 関数を作ればいいんじゃないの?
instanceof は dynamic_cast
いちおう typeid もあるけど

219:デフォルトの名無しさん
07/08/10 22:52:33
>>217
funcをHogeの仮想関数にする(必要に応じて純粋仮想関数にする)。
そして、FooとBarがそれぞれオーバーライドする。

instanceofとかisとかがある言語でも、
そんな書き方よりこういう仮想関数でやる方法が普通だぞ。

220:デフォルトの名無しさん
07/08/10 23:00:22
>>217
void func(const Foo& foo);
void func(const Bar& bar);
...

221:デフォルトの名無しさん
07/08/11 00:26:58
Lisp じゃないから。

222:デフォルトの名無しさん
07/08/11 10:54:08
>>217
基底クラスが派生クラスの面倒までみるべきではないよ

223:デフォルトの名無しさん
07/08/11 13:04:07
>>222
funcはHogeのメンバ関数じゃ無い、とかそんな状況な気もする

224:デフォルトの名無しさん
07/08/11 13:54:38
func から Hoge の仮想関数呼べばいいだけだよ

225:デフォルトの名無しさん
07/08/11 16:49:10
あぁ、いや。
単に基底クラスに面倒見さそうとしてるわけじゃないんじゃない?というだけの話で。

226:デフォルトの名無しさん
07/08/11 18:31:47
その、try...catchの変な使い方、だが、結局投げてるのはHoge型だから
本当のクラスでは捕まえられない。

#include <stdio.h>
struct B{virtual ~B(){}};
struct D1:B{};
struct D2:B{};

int main(){
B *b = new D1;
try{ throw *b; }
catch( D1 &){ puts("D1"); }
catch( D2 &){ puts("D2"); }
catch( B & ){ puts("B"); }
}

227:デフォルトの名無しさん
07/08/11 20:52:01
ダブルディスパッチ使えばいいじゃん。

228:デフォルトの名無しさん
07/08/12 06:43:01
それなにぬねの

229:デフォルトの名無しさん
07/08/12 07:11:10
#include <stdio.h>

struct B { virtual ~B(){} virtual void Throw() { throw this; } };
struct D1 : public B { virtual void Throw() { throw *this; } };
struct D2 : public B { virtual void Throw() { throw *this; } };

int main(){
B *b = new D1;
try{ b->Throw(); }
catch( D1 &){ puts("D1"); }
catch( D2 &){ puts("D2"); }
catch( B & ){ puts("B"); }
}

230:デフォルトの名無しさん
07/08/12 08:44:07
#include <stdio.h>

struct B { virtual ~B(){} virtual void Func() { puts("B"); } };
struct D1 : public B { virtual void Func() { puts("D1"); } };
struct D2 : public B { virtual void Func() { puts("D2"); } };

ダントツでこれが一番いいんだけどなぁ

231:デフォルトの名無しさん
07/08/12 08:45:40
そりゃそうだ。

232:デフォルトの名無しさん
07/08/13 09:30:33
基本に戻るような質問

VC8Express (cl v14.00.50727.762 for 80x86)で、

void main(void){main();}

を、

cl /MD stackov.cpp

でコンパイルして実行しても、黙って落ちるだけで、_invoke_watsonされない
そういう例外って、なにかしらダイアログ出して落ちるものとばかり思っていたのに

昔からこんなでしたっけ、これってこういうもん?

233:デフォルトの名無しさん
07/08/13 10:19:39
スタックオーバーフローで落ちるだけじゃないの?

234:デフォルトの名無しさん
07/08/13 11:51:22
うん。まさに、スタックオーバーフローで落ち…
…たときに、アプリケーションエラーって出ないのが

デバッガから起動すれば、ちゃんと
Stack overflow - code c00000fd (first chance)
って捕捉されるんだけど…。

235:デフォルトの名無しさん
07/08/13 12:08:26
コンソールアプリだからじゃないのかな。

236:デフォルトの名無しさん
07/08/13 12:10:47
int ch = ' '
if (!isspace(ch) && !iscntrl(ch))
break;
という文なのですが、
何故かbreakされてしまいます。
chがスペースでないときかつchが制御文字でないとき
にbreakされるはずなのですが、条件式間違っているでしょうか?

237:デフォルトの名無しさん
07/08/13 12:14:01
gcc gdbではSIGSEGVでstack over flowにならんのだけど
検出する方法は別にあるんだろうな、あるんだろうね

238:デフォルトの名無しさん
07/08/13 12:26:17
>>236
動かない断片を提示されてもなんとも言えませんが。
症状を再現できる最低限のロジックを提示してみてください。

239:デフォルトの名無しさん
07/08/13 12:33:45
iscntrl()はロケールに依存するとされるし、
chか、iscntrl()の挙動が直感に反しているのでは

printf("%x: %d, %d\n",ch,isspace(ch),iscntrl(ch));

をifの前に置いてみては。

240:デフォルトの名無しさん
07/08/13 12:41:07
>>232
気になって試した

どうもスタックのサイズによるみたい
void main(void){
char cc[4096];
main();
}
とすればダイアログはでる。
(アセンブラ見ると、__chkstk の呼び出しが追加されてる)

ただし、VCのオプション的にはスタックサイズが4Kより小さいときでも、
/Gs0 とか付ければいけそうに思えるし、実際アセンブラリストに
__chkstk の名前でてるんだけどダイアログはでない。謎。

241:デフォルトの名無しさん
07/08/13 12:44:01
>>238,239
失礼です。
IDEでソースコードを読んでるんですが、動きが気になったので
static int
skip_space(void)
{
int ch ;

for (;;){
if ((ch = getc(stdin)) < 0)
return -1; /* end-of-file */
if (!isspace(ch) && !iscntrl(ch))
break;
}
return ch;
}

chに'¥t'や' 'を代入して/*if ((ch = getc(stdin)) < 0) return -1; */
として、ステップオーバーしていったのですが、
> if (!isspace(ch) && !iscntrl(ch))
の段階で止まってしまって、ブレイクしたのかなと思って。


242:デフォルトの名無しさん
07/08/13 12:50:44
誰か、エスパー頼む

243:デフォルトの名無しさん
07/08/13 13:42:25
>>241
関数名から推測して

static int skip_space(void)

を呼び出す上位関数に問題があるんじゃないか?例えば

int main(void) {
int ch;
for(;;) {
if(-1 == (ch = skip_space())) break;
putc(ch,stdout);
}
return 0;
}

とか。


244:デフォルトの名無しさん
07/08/13 14:16:01
ははぁ、成る程!
ちなみに (!isspace(ch) && !iscntrl(ch))
な文字コードってどんなのが当てはまりますかね?

245:デフォルトの名無しさん
07/08/13 14:38:10
>>244
空白文字でも制御文字でもない文字。
まぁ、大抵の可読文字が該当する罠。

246:デフォルトの名無しさん
07/08/13 16:49:05
すいませんわかりました。
自分馬鹿だorz
ほんと皆さん電波な質問して申し訳有りません
二徹して疲れたので寝ます

247:デフォルトの名無しさん
07/08/13 18:57:05
eclipse with CDTが生成したmakefile用の依存リストで
src/test.d src/test.o: ../src/test.cpp \
H:/root/usr/src/boost/boost/shared_ptr.hpp \
H:/root/usr/src/boost/boost/config.hpp \




248:247
07/08/13 19:03:44
(ミスして送信しちまったorz 続き)

の最初の行で
multiple target pattern stop
とmakeがエラーになるんですが、
これはどうすれば解決するんでしょうか?

test.dと.oのルールを同じ行で定義しているのが問題かと思ってわけてみたり
test.d(つまり自分自身)のルールを定義しているのが問題かた思ってtest.dを消してみましたが
解決しませんでした

249:デフォルトの名無しさん
07/08/13 19:48:51
インクルードパスにドライブ名が入ってるとだめらしい
C: とか H: とか
代わりに /cygdrive/c/ や /cygdrive/h/ を使うと大丈夫とかいうことらしい

250:247
07/08/13 20:15:55
>>249
そのようにしたらmakeのエラーは消えdebugができるようになりました
しかし今度は
Invalid project path: Include path not found (\cygdrive\\root\usr\src\boost)
のような警告がでてきましが、これなら実害ないので我慢します
助言ありがとうございました

251:デフォルトの名無しさん
07/08/14 06:40:57
char *parse( char *buff )
{
int c;
int at = 0;
while( (c = getchar()) != EOF ) {
if( isdigit( c ) ) {
buff[at++] = c;
} else if( isspace( c ) ) {
if( at == 0 ) {
continue;
} else {
buff[at] = '¥0';
return buff;
}
}
}
int main( void )
{
char buff[256];
int i;
for(i=0;i<256;i++)
buff[i] = 0;
char *s;
while( (s = parse( buff )) != NULL ) {
printf( "read %s¥n", s );
}
}
というプログラムなのですが、
これって¥0とNULLが同じってことですよね。
buffはただのchar型の配列のはずなのになぜ¥0がNULLになるんでしょうか?
char *buff[256]ならNULLで判定出来るのは理解出来るのですが。


252:デフォルトの名無しさん
07/08/14 07:26:45
NULLはヌルポインタ、\0はヌル文字
当然、ヌル終端文字列は後者を末尾に持つ

253:デフォルトの名無しさん
07/08/14 07:27:29
parse内のgetcharがEOFだった時、何を返すんだ?
思いっきりバグ、もしくはコピペミスだろ。

254:デフォルトの名無しさん
07/08/14 07:27:44
どこの\0とどこのNULLだ?
12行目の'\0'と24行目のNULLなら別物だし、
比較も代入もしていないが

255:デフォルトの名無しさん
07/08/14 07:37:24
parseからNULL返って来ないな

256:デフォルトの名無しさん
07/08/14 07:40:16
お前ら朝から優しいな

257:デフォルトの名無しさん
07/08/14 07:41:58
あーそうか、parseが切れてるのか。
{}が対応してないな。

258:デフォルトの名無しさん
07/08/14 07:54:20
朝から結構人がいてワロタw


259:デフォルトの名無しさん
07/08/14 08:15:31
こんな感じで隠れてる

    (⌒─-⌒) EXILE!EXILE!
  〃((´・ω・`)) ミ ○
((´・ω・`))  O((´・ω・`))   
Oヽ(    )〃ノO      
   ∪⌒∪          
""" "" " """ "" " """ "" " ""

260:デフォルトの名無しさん
07/08/14 09:55:22
亀ですが

>>240 ありです、それかもな感じ 何かがひらめいた予感 ちょっと調べてみます
>>235 ちなみに、WinMainでやってみても、なんもいわれんかったのです;

261:デフォルトの名無しさん
07/08/14 12:54:16
>>251
コンパイルできるソースをもってきてください。

それから処理系によって'\0'とNULLは同じじゃない。

#define NULL ((void *)0)
と定義してあったら違う型。
#define NULL 0
と定義してあったら同じ型として扱える。

'\0'は、int型の整数だから後者の処理系なら比較できてしまう。
     ~~~~~
しかし、もともとNULLはヌルポインタ(どこも指していないポインタ)を意味しているので
'\0'(整数)とNULL(ポインタ)の比較をしているソースは窓から放り投げろ。

推測だが、char *parse(char *buff)
の最後の方は、こんなふうになってるんだろう。
buff[at] = '\0';
return buff;
}
}
}
return NULL;
}

それから、buff[256]はスタックオーバーしていて不定な値だ。
*buff[256]なんてどこを指しているかわかりゃしない。NULLじゃない。
このプログラムは、文字数を判定していないから、'\0'を入れて256文字以上になると
スタックオーバーで動作は不定になる。うまく動いてもそれは運がいいだけ。


262:251
07/08/14 13:07:51
どうやってソースを窓から放り投げるんだ・・・?

263:デフォルトの名無しさん
07/08/14 13:12:15
ソースを窓から放り投げるを開始するには、まず窓を開けます。

264:デフォルトの名無しさん
07/08/14 13:12:43
バッファオーバーフローであってスタックオーバーフローとは(ry

265:デフォルトの名無しさん
07/08/14 13:21:55
なぜこれがコンパイルエラーになるのですか?

class A
{
public:
void hoge(int i) { MessageBox(NULL, _T("A"), _T("hoge(int)"), 0);}
virtual void hoge() = 0;
};
class B : public A
{
public:
void hoge() { MessageBox(NULL, _T("B"), _T("hoge()"), 0); }
};
int _tmain(int argc, TCHAR **argv)
{
B b;
b.hoge(1); // コンパイルエラー C2660
}

266:デフォルトの名無しさん
07/08/14 13:24:09
なんでそんなこともわからないのですか?

267:デフォルトの名無しさん
07/08/14 13:29:50
>>266
まぁそう言わんと。

>>265
EffectiveC++を読むことをお勧めしておきます。

268:デフォルトの名無しさん
07/08/14 13:47:53
>>266
初心者だからです。例えば、以下のJavaのソースはコンパイルが通るので、C++でも同様のことが可能かを考えています。
public class Test1 {
public static void main(String[] args) {
B b = new B();
b.hoge(1);
}
}
abstract class A {
public void hoge(int i) {System.out.println("A : hoge(int)");}
public abstract void hoge();
}
class B extends A {
public void hoge() {System.out.println("B : hoge()");}
}
>>267
このあたりですか?
URLリンク(www002.upp.so-net.ne.jp)
265のclass Aのhoge(int)はhogeImplのようにするこで解決できました。ありがとうございます。

269:デフォルトの名無しさん
07/08/14 14:09:57
>>265,268
hoge という名前の関数は B に 1 個あるので、それ以上辿って A まで探しには行かない
で、見つかった hoge() は引数が一致しないのでエラー

C++ と Java が一緒だと思ってるのが間違い

270:デフォルトの名無しさん
07/08/14 14:12:39
>>269
>hoge という名前の関数は B に 1 個あるので、それ以上辿って A まで探しには行かない
なるほど。すっきりしました。ありがとうございます。

271:デフォルトの名無しさん
07/08/14 16:26:39
wavファイルの再生について質問があります。
PlaySoundを使う方法は簡単にできたのですが、wavファイルを実行ファイルに組み込むことはできるのでしょうか?
できるなら、方法や資料を教えて頂けませんか?
宜しくお願いします。

272:デフォルトの名無しさん
07/08/14 16:44:38
とりあえずC/C++とは関係ない

273:デフォルトの名無しさん
07/08/14 16:46:19
実行ファイルの種類による

274:デフォルトの名無しさん
07/08/14 16:47:42
PlaySound リソース でぐぐれば?

275:271
07/08/14 17:15:30
PlaySoundでできるとは思っていませんでした。
本当に助かりました。ありがとうございます。


276:デフォルトの名無しさん
07/08/14 19:59:40
関数テンプレートの特殊化ってできないんですか?
もしできないのなら、いずれ出来るようになる見込はありますか?

template <typename T, typename U> void func(T&) {}
template <typename T> void func<T,int>(T& u) {}

error : partial specialization `Func<T, int>' of function template

277:デフォルトの名無しさん
07/08/14 20:24:53
>>268
そんなサイトあったのか、本買っちゃったよ

278:デフォルトの名無しさん
07/08/14 20:34:59
>>276
テンプレートパラメータの制限は関数とクラスで微妙に違う。
ただ、パラメータを常に指定するなら↓で同じことができるはず。

template <typename T, typename U> class func_object {
 explicit func_object(T&) { ... }
};:
template <typename T> class func<T, int> {
 explicit func_object(T& u) { ... }
};

使い方
func_object<A,B>(x);
func_object<C,int>(y);

279:デフォルトの名無しさん
07/08/14 20:44:54
>>277
そのサイトはヒント程度だぞ。何やら勘違いに近い記述も見られるし、本は読むべき。

280:デフォルトの名無しさん
07/08/14 20:56:11
>>276
関数テンプレートの場合、完全な特殊化はできるが部分特殊化は出来ない。
代わりに関数オーバーロードが使える。

281:276
07/08/14 21:48:52
やっぱ無理なんすか
テンプレート引数を汎用関数のtraitsとして利用したかったのですが…
変数の型を態々書くくらいなら関数オブジェクトとして作る方が良さそうですね

282:261
07/08/14 23:00:51
>>264
え?スタックオーバーフローなんて一言も言ってませんがなにか?
              ~~~~~~

283:デフォルトの名無しさん
07/08/15 03:27:58
>>282
コレは他人が装ってる釣りか?
ちょっと釣られて見ますよ

284:デフォルトの名無しさん
07/08/15 04:00:47
演算子の優先順位についての注意。インクリメント(++)/デクリメント(-- --)演算子と間接参照演算子(*) の優先順位は、間接参照の方が低い。だから、
while(1){
sub( *++p );
}
というコードは頻出するが、単独の文
*++p;
は間接参照の文が無意味である。(ポインタpをインクリメントした後で、ポインタが示す値を参照し、値を捨てる)
って言う文があるのですが、
「単独の文
*++p;
は間接参照の文が無意味である。」
ってどう意味なのでしょうか?
実例を挙げていただけないでしょうか。

285:デフォルトの名無しさん
07/08/15 04:12:51
>>284
間接参照演算子「*」
間接参照はポインタの先を「*」で参照すること。

int main(){
int a=10;
int *p=&a;
*p; /* <- この文意味ないべ? */
return 0;
}

286:デフォルトの名無しさん
07/08/15 05:07:32
ああ、そういう意味だったんですか。
分かりました。
自分、日本語読む力が無いなぁ。

287:デフォルトの名無しさん
07/08/15 05:31:19
>>284
これおかしいな。
ここで例としてあげるべきなのは *p++ であって *++p ではない。
そもそも * と 前置 ++/-- とは優先順位が同じだ。

288:デフォルトの名無しさん
07/08/15 07:12:56
>>284
内容がひどいのでさらしておこう。
URLリンク(www.nurs.or.jp)


289:デフォルトの名無しさん
07/08/15 08:09:10
>sub( *++p );
>というコードは頻出するが
こらこら、副作用があるコードを関数呼び出しで書いちゃ遺憾。
もしこのサイトにあるように頻出するとしたら、よっぽど腐った環境だ。

つーか、このサイト管理者、頭大丈夫か?
URLリンク(www.nurs.or.jp)

290:デフォルトの名無しさん
07/08/15 08:21:09
別に書いていいだろう。
未定義動作でもあるまいし。

コーディングスタイルの話としても、
宗教戦争になる程度のこうじゃないといけないとは言えない内容だな。

291:デフォルトの名無しさん
07/08/15 08:29:14
>>290
その「sub()がマクロだったら」と考えてみてくれ。
いつ仕様変更でそのようなことになっても大丈夫なように副作用を発生させないのは常識だ。

292:デフォルトの名無しさん
07/08/15 08:35:04
それだったら*++pではない場合にもいえてしまうんじゃないの?
マクロってなんなのかしらないけど

293:デフォルトの名無しさん
07/08/15 08:43:51
なんだ、ただのもの知らずか。たとえばこんなの。
#define sub(x) (x < 0 ? -x : x)

294:デフォルトの名無しさん
07/08/15 08:44:08
>>289
>こらこら、副作用があるコードを関数呼び出しで書いちゃ遺憾。
どいう意味?


295:デフォルトの名無しさん
07/08/15 08:56:22
>>293
なるほど、マクロって絶対値ってことか

296:デフォルトの名無しさん
07/08/15 08:58:23
そうだよ。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで

297:デフォルトの名無しさん
07/08/15 09:11:47
>>296
いや、違うでしょ?

298:デフォルトの名無しさん
07/08/15 09:12:45
>>297
そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで

299:デフォルトの名無しさん
07/08/15 09:14:25
初心者歓迎とかスレタイにあるのに何やってるの

300:デフォルトの名無しさん
07/08/15 09:21:19
>>299
そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで

301:デフォルトの名無しさん
07/08/15 09:27:40
恥ずかしいからってそんな連投しなくてもいいのに

302:デフォルトの名無しさん
07/08/15 09:30:09
あんああんあんああんあん

303:デフォルトの名無しさん
07/08/15 09:30:30
>>301
そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで

304:292
07/08/15 09:35:28
>>300,>>303
あなたの相手は僕でしょ?

305:デフォルトの名無しさん
07/08/15 09:36:37
>>304
そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで

306:292
07/08/15 09:38:05
マクロも知らなかった初心者に指摘されたのが悔しかったの?
プライドを傷つけてごめんね

307:デフォルトの名無しさん
07/08/15 09:42:16
マクロも知らない初心者の来る所じゃないんだ。
どれだけそいつに時間とレスを割く必要があるか分かるだろう?
そんなレベルの低い奴が来ると釣りかと思う。

308:292
07/08/15 09:45:23
>>307
マクロ知らないとは書き添えたけど質問したわけではありません
あなたの勇み足では?

309:デフォルトの名無しさん
07/08/15 09:49:39
>>306の言ってる指摘ってひょっとするとコレ?
>それだったら*++pではない場合にもいえてしまうんじゃないの?
いくらなんでもマジとは思えん(だから>>293もスルーしたんだろう)。

310:デフォルトの名無しさん
07/08/15 09:50:25
>>308
みんな馬鹿で、お前だけが正しいことを言ってる。
誰もお前の頭の良さについていけなくて、悔しさのあまり暴れてるだけなんだよ。

だからママの所に行っておいで。

311:デフォルトの名無しさん
07/08/15 09:52:13
>>307
>どれだけそいつに時間とレスを割く必要があるか分かるだろう?
って
>そうだね。でもここは君の居る所じゃないんだ。そろそろママの所に行っておいで
の事かwアホじゃね?

312:デフォルトの名無しさん
07/08/15 09:53:52
>>311
日本語でおk

313:デフォルトの名無しさん
07/08/15 09:53:59
>>311アホですね

314:292
07/08/15 09:55:13
>>309
>>293のこれだけのレスをみれば、意図的にスルーしているとはとても…

315:デフォルトの名無しさん
07/08/15 09:55:59
>>314
その辺が低脳。全て293のレスだと思ってやがる。

316:デフォルトの名無しさん
07/08/15 09:57:26
>>315
見苦しい言い訳

317:デフォルトの名無しさん
07/08/15 09:57:57
>>315
あああなたでしたかごめんなさいね

318:307
07/08/15 09:58:34
どうせ俺の事も>>293だと思って勇み足で回答したとでも言いたいんだろう?
マクロも知らない初心者の来る所じゃないんだと思っている奴が、
わざわざマクロも知らない初心者に答えるわけがないだろう。

319:292
07/08/15 09:58:49
>>317は僕です
しっかり名乗ります!

320:292
07/08/15 10:00:03
>>318
マクロくらいわかるよw
フィーリングでね

321:デフォルトの名無しさん
07/08/15 10:00:14
どう見ても292の方が見苦しい言い訳。
バカなんだからバカにされたくらいでレス繰り返さなくてもいいのに

322:デフォルトの名無しさん
07/08/15 10:01:24
>>320
フィーリングで分かるなら空気くらい読めるだろ?

323:デフォルトの名無しさん
07/08/15 10:02:59
>>295はうまい荒らしだったな

324:292
07/08/15 10:03:36
あ、ずっと安価間違ってた
>>291さんでした

325:デフォルトの名無しさん
07/08/15 10:03:55
>>318
初心者に答えるわけがない なんてレスの無駄だから偉そうに宣言しなくてもいいよw
答えないんじゃなくて答えられないんだろ

326:309
07/08/15 10:16:16
結局>>306の言ってる指摘ってのはコレな訳?
>それだったら*++pではない場合にもいえてしまうんじゃないの?

327:デフォルトの名無しさん
07/08/15 10:18:32
>>326
かもしれないけど、なにしろ何がどう「いえてしまう」のか
まるでわからん文章だからなぁ。

328:309
07/08/15 10:19:46
>>326
意味わからんよなー

329:309
07/08/15 10:23:07
>>326
多分、>>289から続く
>副作用があるコードを関数呼び出しで書いちゃ遺憾。
について言ってるんだと思う。

330:329=309
07/08/15 10:25:08
アンカーミス。>>327ね。

後、>>328誰だw

331:デフォルトの名無しさん
07/08/15 10:26:15
マクロに放り込むんだり引数の評価順に左右されるような場合はマズいけど
別にこのケースは何の問題も無いわな

スタイルとして自分がそう心がけているというだけの話なら
ご立派ですねで終わりだが

実にどうでもいい


332:292
07/08/15 10:26:21
適切な日本語ではなかったけど、脳の衰え始めている先輩方には難しかったかな?
むしろ適切であったとしてもまともにこたえる気はなさそうにおもえる

333:デフォルトの名無しさん
07/08/15 10:27:23
2chで煽るのだけが生き甲斐の厨房に
煽り返す厨房か

334:309
07/08/15 10:44:58
>>331
今は問題無いからいいって考えはどうかと思うぞ。後々の仕様変更に耐えられるコードを書く方がいい。
もっとも今回は副作用で問題が出るマクロにするのが一番悪いが。

>>332
>まともにこたえる気はなさそうにおもえる
何でそう思ったか知らんが結局質問は「副作用があるコードを関数呼び出しで書いちゃ遺憾って言ってるけど、それって*++pではない場合にもいえなくない?」って事か?

335:デフォルトの名無しさん
07/08/15 10:49:04
>>331
話題がループするが、sub()がマクロなら問題だからするべきではないという話だろ。
件のサイトではsub()が何か提示されていないのだから、問題がないとは言えない。

336:292
07/08/15 10:54:44
皆さんの話がかみ合ってないかもしれないので整理しましょう

*++pってなんですか?

337:デフォルトの名無しさん
07/08/15 11:00:13
>>335
マクロにsub()なんて名前をつけてるのならそっちのが問題じゃね
マクロは大文字で目立たせるのが基本だし
subはサブルーチンのサブだろう

ま、標準ライブラリの一部の関数はマクロで実装することも許されているけどな

338:デフォルトの名無しさん
07/08/15 11:13:27
>>336
死ね

339:デフォルトの名無しさん
07/08/15 11:32:32
すみません、教えてください。

C++でコンテナからイテレータを取り出すときに、iterator とconst_iterator とを
区別するのはどうやっているんでしょうか?

std::vector<>::iterator begin();

std::vector<>::const_iterator begin() cons;

のように、同じ関数でiterator を返したりconst_iterator を返したりしたいんですが、上手くいかない……


340:339
07/08/15 11:40:56
ごめん、忘れてください。超間抜けなこと聞いた。

暑くて頭がボケてたみたい……

341:デフォルトの名無しさん
07/08/15 11:42:17
while(1) sub( *++p );

で意味をなす単項subってどんなマクロ(関数)なんだろ

342:デフォルトの名無しさん
07/08/15 11:46:15
>>337
<*grep*>:319:crt/src/minmax.h:21:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:333:crt/src/stdlib.h:166:#define __max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:340:crt/src/stdlib.h:472:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:342:crt/src/v2tov3.h:71:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:387:include/minmax.h:21:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:399:include/stdlib.h:146:#define __max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:406:include/stdlib.h:424:#define max(a,b) (((a) > (b)) ? (a) : (b))
<*grep*>:603:PlatformSDK/Include/WinDef.h:177:#define max(a,b) (((a) > (b)) ? (a) : (b))
なるほど、標準ライブラリにないmax()系がこんなにあるとはM$は問題だらけだね。

343:デフォルトの名無しさん
07/08/15 11:48:41
>>341
きっとこんなのだよ。
#define sub(x) putchar(x)

344:デフォルトの名無しさん
07/08/15 12:04:17
>>342
そうだな。実際最悪だろ。

345:デフォルトの名無しさん
07/08/15 12:06:28
マクロは名前空間にもくるめないしなあ

346:デフォルトの名無しさん
07/08/15 12:08:02
>>342
実際、それが問題になることがあって、
min,maxを定義しないようにするための NOMINMAX というマクロが存在する

347:デフォルトの名無しさん
07/08/15 12:08:48
>>342
実際そのマクロの存在の為に、VC6の<algorithm>にはstd::max, std::minがない。
これはC++の移植性において、由々しき問題である。

348:デフォルトの名無しさん
07/08/15 12:10:11
まあVC6はそれ以前に色々ダメすぎだけどな
今となっては

349:デフォルトの名無しさん
07/08/15 12:10:29
>>342
Effective C++でも第1項でいきなり問題視してるじゃん。

350:デフォルトの名無しさん
07/08/15 12:41:16
Effective C++(笑)

351:デフォルトの名無しさん
07/08/15 12:50:00
質問です。
Windows Vista買ったら、Borland C++5.01のダイアログエデイタが正常に動作しません。
Xpマシンもありますがどうすればいいでしょうか?
1.プログラムはXpマシンで作成してコピーする。
2.ダイアログの部分だけXpマシンで作成してコピーする。
3.Vistaで動作する開発環境を買って移植する。

352:デフォルトの名無しさん
07/08/15 12:57:03
マルチ死ね

353:デフォルトの名無しさん
07/08/15 14:18:31
>>349
URLリンク(kamaitachi.blogdns.net)
これか。別にそんなに問題視はしてないように見えるが。

354:デフォルトの名無しさん
07/08/15 14:21:04
問題視しまくりじゃないか。

355:デフォルトの名無しさん
07/08/15 14:47:21
ここで言う「マクロと関数に名前の区別」というような点は問題視してない

356:デフォルトの名無しさん
07/08/15 14:56:09
確かに>337が指摘しているような「大文字ではない」ことについてはなんら言及されていないね。

357:デフォルトの名無しさん
07/08/15 15:01:51
>>349>>342宛なんだから、「ここで言う」はmaxマクロに対応させないと。

358:デフォルトの名無しさん
07/08/15 15:14:41
なるほど。確かにそっちはそうだな。

359:デフォルトの名無しさん
07/08/15 18:25:13
今北産業。

>>284
> 「単独の文
> *++p;
> は間接参照の文が無意味である。」
> ってどう意味なのでしょうか?
> 実例を挙げていただけないでしょうか。

無意味でない例なら出せる。

volatile int* p;

とか宣言されていて、p が実はメモリマップド I/O
で読むだけでも意味がある場合がある。

>>293
> #define sub(x) (x < 0 ? -x : x)

sub(a+b) とかでおかしくなるから >>342 みたいに () 使おう。


360:デフォルトの名無しさん
07/08/15 18:29:58
>>359
p が volatile int* であっても
*++p; と書いて、pがdereferenceされることは保証されてないだろ。


361:デフォルトの名無しさん
07/08/15 19:14:24
>>360
すまん、よくわからんのだが「p が deference されることは保証されない」のは、特に

*++p;

に言える、と言ってる?それとも、

*p;

でも同様だと言ってる?

362:デフォルトの名無しさん
07/08/15 19:24:20
>>360
とりあえず volatile な *p; については

URLリンク(c0x.coding-guidelines.com)

の 1488-1489 辺りで「最適化で削除しちゃいかんよ」ってな事になってるが。
もっといえば

volatile int x;

x;

でも一緒。

363:デフォルトの名無しさん
07/08/15 20:19:08
更にいうと

const volatile int x;

x;

でも処理系は x の読み出しを削除してはいけないし、
x の値を何かに使う場合複数回の読み出しで同じ値だと仮定してもいけない。
この場合の const は「書き込めません」っていう意味だ。

364:デフォルトの名無しさん
07/08/16 07:37:42
char *p;
char *q;
p = "hoge" + 1;
q = "hoge"[1];
この場合pはoになることは正しいですよね。
pにはhのアドレスが代入される訳ですから。
んでqの場合は配列じゃないので、
char x[] = "hoge";
int r = x[1];
なら正しくrにはoが代入されますけれど、
q = "hoge"[1];とかいても警告は出ますし、
無意味な値が代入されるけれどもコンパイルはされてしまいます。
どうしてコンパイルエラーにならないんでしょうか?

365:デフォルトの名無しさん
07/08/16 07:55:01
"hoge" + 1
はポインタだが、
"hoge"[1]
はポインタではない。

366:デフォルトの名無しさん
07/08/16 08:01:25
それは分かるんですけれども、
なんでコンパイル出来るのか?
が疑問なんです。

367:デフォルトの名無しさん
07/08/16 08:04:43
>>364
char* p = 定数;

ならわかる?

368:デフォルトの名無しさん
07/08/16 08:13:50
>>366
>pにはhのアドレスが代入される訳ですから。
間違い。

369:デフォルトの名無しさん
07/08/16 08:20:38
>>364
C言語だと、整数からポインタへの代入は警告止まりになる。
C++ だとエラーになる。

370:デフォルトの名無しさん
07/08/16 08:38:00
>>367,369
char* p = 定数;
いや、もちろんポインタに数値をキャストしなくても
代入出来ることは知ってます。
q = "hoge"[1];
ってコンパイラはどういう風に解釈するんですか?
>>368
>pにはhのアドレスが代入される訳ですから。
え、じゃ文字列の先頭のアドレスで正しいですか?

371:デフォルトの名無しさん
07/08/16 08:42:22
>>370
"hoge"+1なんだから、当然'o'ヘのポインタだ。

372:デフォルトの名無しさん
07/08/16 08:43:32
>>370
hのアドレス=文字列の先頭のアドレス
代入は+1が行われたあとだろ?
だからすでにアドレスが変わってる

373:デフォルトの名無しさん
07/08/16 08:45:27
>>370
q = "hoge"[1];



static const char x[] = "hoge";
q = x[1];

は大体同じ。

374:デフォルトの名無しさん
07/08/16 08:59:29
>>372
すいません、勘違いしてました。
>>371,373
えっと自分が聞きたいのは、
char *q = "hoge"[1];
という文がなぜコンパイル出来るかってことなんです。
char q [] ="hoge";
char *p = "hoge";
はあきらかに違うのに
char *q = "hoge"[1];
がコンパイル出来るとまるでこの二つが同じように錯覚してしまって
間違いの元になるんじゃないかって思ったんです。
んで、そういう事が出来るのはきっと何か理由があるに違いないと思ったんです。


375:デフォルトの名無しさん
07/08/16 09:05:40
特に理由はない。
文法上問題がないから警告止まりでコンパイルされるだけ。

376:デフォルトの名無しさん
07/08/16 09:08:16
> char q [] ="hoge";
> char *p = "hoge";
> はあきらかに違うのに
> char *q = "hoge"[1];
> がコンパイル出来るとまるでこの二つが同じように錯覚してしまって
> 間違いの元になるんじゃないかって思ったんです。

なぜ二つが同じように錯覚するの?

377:デフォルトの名無しさん
07/08/16 09:27:30
>>375
ほんとだ。
char *x = "hoge";
p = x[1];
がコンパイル出来る。
x 0x85fd8
p 0x6f
pのアドレスってどこから出てきたんだろう?


378:デフォルトの名無しさん
07/08/16 09:28:33
>>374
= の右辺に書かれた T 型の文字リテラルは T 型の static 配列と同じです
= の右辺に書かれた T 型の配列は T 型の配列の先頭要素を指す「Tのポインタ型」になります

理由としてはっつーか便利だし~みたいな?

379:デフォルトの名無しさん
07/08/16 09:31:29
>>377
'o' に決まってるだろう。

380:デフォルトの名無しさん
07/08/16 09:36:05
>>377
m9(^Д^)プギャー

381:デフォルトの名無しさん
07/08/16 09:39:47
>>377
一応言っておくけど0x6fはアドレスじゃないよ
'o'に対応するアスキーコード
URLリンク(c-production.com)

382:デフォルトの名無しさん
07/08/16 10:00:58
qはそれ自身が配列であり、右辺の"hoge"はコンパイラに対する
初期化内容としてのみ解釈される。定数"hoge"は実行時には存在しない。
pの場合、実行時に定数"hoge"をメモリ上に用意して、そのポインタを利用する。
なので同じように見えても右辺の意味がまったく違う。

もともとqは以下のように記述すべきものだったんだろうけど、
char q[] = {'h', o'', g'', 'e', '\0'};
不便なので、利便性のために
char q[] = "hoge";
という書き方も受け入れるようになっただけ。
結果的にpとqの右辺が似ているけど、たまたま。

383:デフォルトの名無しさん
07/08/16 10:07:36
*p = "hooge"
p[] = "hooge"

は同じだろ

384:デフォルトの名無しさん
07/08/16 10:11:42
>>383
本気で言ってるのか

385:デフォルトの名無しさん
07/08/16 10:20:58
>>383
別物

386:デフォルトの名無しさん
07/08/16 10:44:01
>>383
どっちもセミコロンが無いからエラーになる→同じこと
ってオチは無しだぞw

387:デフォルトの名無しさん
07/08/16 10:49:20
>>383
>>364未満だな

388:デフォルトの名無しさん
07/08/16 10:49:57
型名もないしな

389:デフォルトの名無しさん
07/08/16 10:52:18
フフ

390:デフォルトの名無しさん
07/08/16 11:30:57
void foo() {
 auto char *p = "hoge";
 auto char p[] = "hoge";
 …
}
とした時の挙動からして違うことは判るだろ

391:デフォルトの名無しさん
07/08/16 11:48:08
char p1[] = "hoge";
char *p2 = "hoge";

p1[1] = 'a';
p2[1] = 'a'; // <=

392:デフォルトの名無しさん
07/08/16 12:16:13
Perlの無名配列みたいに
{1000,100,10}[0] もいけたらいいのに

393:デフォルトの名無しさん
07/08/16 12:24:01
C99

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

int main() {
printf("%d\n", (int[]){1,3,5,7,9}[1]);
}

394:デフォルトの名無しさん
07/08/16 12:33:57
>>393
こんな事出来るんだ。
知らんかった。

395:デフォルトの名無しさん
07/08/16 12:49:24
>>393
うは、いけるんやwありがと

396:デフォルトの名無しさん
07/08/16 21:01:08
配列として認識されるのか…すげー

397:デフォルトの名無しさん
07/08/16 21:45:24
これでC99準拠のコンパイラがもっと増えてくれれば

398:768
07/08/16 22:36:05
C99、便利だけどC言語としてみるとキモい・・・

399:デフォルトの名無しさん
07/08/16 22:38:18
C++と同期とって進化してくれれば歓迎なんだけどな。

400:デフォルトの名無しさん
07/08/16 22:57:51
C99準拠のコンパイラって少ないの?
GCCしか使ってないから知らんのだけど。

401:デフォルトの名無しさん
07/08/16 23:02:56
>>400
Comeau

402:デフォルトの名無しさん
07/08/16 23:06:00
前使ってた Borland C++ 5.5.1 は C99 非準拠だったな.

403:デフォルトの名無しさん
07/08/16 23:06:01
ICC

404:デフォルトの名無しさん
07/08/16 23:20:10
VC++ のやつが無視しやがってるから広まらないのかな。

405:デフォルトの名無しさん
07/08/16 23:20:51
C99はDと同じ運命をたどればいいんだよ

406:デフォルトの名無しさん
07/08/16 23:22:13
VC++はC++コンパイラだからC99対応しないよ、ってMSの
中の人が言ったんだっけか。

407:デフォルトの名無しさん
07/08/16 23:29:51
確かにVC++8.0で試すと凄い勢いでエラー出るな

408:デフォルトの名無しさん
07/08/16 23:35:47
まあ、C99 使うくらいなら C++ 使うってのは確かだが

409:デフォルトの名無しさん
07/08/17 00:35:35
数式を画面に表示させるためのライブラリって無いでしょうか?
x^2みたいなのを、綺麗に表示するためのライブラリがほしいのです。
できれば、ソース公開している奴で、無ければソースは無くてもいいのですが
とにかく、アプリに組み込んで開発できる奴がいいです。


ちなみに、開発環境はVC++2005、WinXPProを想定しています。
動作環境も同様にXPProです。

よろしくお願いします。

410:デフォルトの名無しさん
07/08/17 04:48:29
>>409
ググっただけなんで、中身はシラネ。
URLリンク(www.vector.co.jp)

411:デフォルトの名無しさん
07/08/17 05:26:10
ビット演算がうまくなるコツってないですかね?
全く使いこなせてないので、
他人のソース読んでて、使いこなせていると凄く羨ましいんですけれど。

412:デフォルトの名無しさん
07/08/17 05:27:47
才能ないよ諦めた方がいい

413:デフォルトの名無しさん
07/08/17 05:37:52
コラー!

414:デフォルトの名無しさん
07/08/17 05:49:50
自虐し過ぎ

415:デフォルトの名無しさん
07/08/17 06:14:34
>>411
グラフィックまわりをいじって変な画面効果とか作るのが楽しいかも
上達が見てわかるし

416:デフォルトの名無しさん
07/08/17 08:06:25
>>411
エンディアンと変数型のバイト幅を意識すること。
算術シフトと論理シフトを意識すること。
コツっていうとこんぐらい?

フラグ的な使い方の話だったら、
必要になった時だけ使うのが良いんじゃないかなぁ。


417:デフォルトの名無しさん
07/08/17 08:08:28
>>411
論理演算、真理値表、2進数⇔16進数変換。
この辺のキーワードを調べ使いこなせるようになるとずっと違うと思うよ。
例えばこんなの。
a b c r
0 0 0 0
0 0 1 0
0 1 0 1
0 1 1 0
1 0 0 x
1 0 1 x
1 1 0 0
1 1 1 1
こいつからrを求める式を導き出せれば一歩前進。

418:デフォルトの名無しさん
07/08/17 09:16:08
皆さんアドバイス有り難うございます。
ビット演算は大事ですからね。
精進します。
>>417
グヌヌ。
難しいぞ。分かんないっす。

419:デフォルトの名無しさん
07/08/17 09:22:07
プッ ヘボすぎ

420:デフォルトの名無しさん
07/08/17 09:29:14
~(a^c)&b
こうですか?

421:デフォルトの名無しさん
07/08/17 10:04:58
タンクローリーを運転する人に見えたのは俺だけでいい。

422:デフォルトの名無しさん
07/08/17 11:18:41
int foo;
int bar;
bar = (unsigned int)foo & 0x0fffffff;
という事をしょっちゅうしているプログラムがあるんですけど、
どういう意図を持ってこの処理をしてるんでしょうか?
最初は、int型の変数をunsigned int型にキャストしてint型の変数に代入すると、
例えば-5が代入されてたら4294967291になるのかなぁと思ってたんですが、
そういう訳でもないみたいですし。


423:デフォルトの名無しさん
07/08/17 11:21:44
>>422
意図については、そのプログラムを書いた人に聞くのが一番!

あと、もう少し基礎を勉強したほうが良いよ

424:デフォルトの名無しさん
07/08/17 20:27:31
動的な配列を作る時は
int* a=(int*)malloc(sizeof(int)*10);
if(a==NULL)
みたいにしてポインタが有効かチェクしますよね?
二次元の配列を作る目的で
int** b=(int*)malloc(sizeof(int*)*10);
とやったら、この時も
if(b==NULL)
で、bが有効なポインタかどうか判断していいんですか?


425:デフォルトの名無しさん
07/08/17 20:31:19
はい

426:デフォルトの名無しさん
07/08/17 21:12:36
>>424
if(b==(void**)0)

427:デフォルトの名無しさん
07/08/17 22:36:27
>>424
#include<stdio.h>
#include<stdlib.h>

#define X_SIZE 15
#define Y_SIZE 10

int main(void){
int x, y;
int **b;

b=malloc(sizeof(int*)*Y_SIZE);
if(b==NULL) exit(1);
b[0]=malloc(sizeof(int)*X_SIZE*Y_SIZE);
if(b[0]==NULL) exit(1);
for(y=1;y<Y_SIZE;y++) b[y]=&b[0][y*X_SIZE];

for(y=0;y<Y_SIZE;y++)
for(x=0;x<X_SIZE;x++) b[y][x]=y*X_SIZE+x;

for(y=0;y<Y_SIZE;y++){
for(x=0;x<X_SIZE;x++) printf(" %3d", b[y][x]);
printf("\n");
}

free(b[0]);
free(b);

return 0;
}

428:デフォルトの名無しさん
07/08/17 23:01:35
>>426
キャストしたらダメだろ。
意味変わる。

429:デフォルトの名無しさん
07/08/17 23:07:24
>>420
それでもいいけど、(b&~c)^aの方がシンプルだろう。

430:デフォルトの名無しさん
07/08/18 01:15:04
a^b&~c ってなところか。

>>411
最低限の論理学の勉強をする。
ド・モルガンの法則とかは必須。

431:デフォルトの名無しさん
07/08/18 07:42:18
#define NULL (void*)0
だから
ポインタへのポインタが"NULL"かどうかは
(void**)0で調べないといけない

432:デフォルトの名無しさん
07/08/18 08:20:03
>#define NULL (void*)0
>だから
いいえ。

433:デフォルトの名無しさん
07/08/18 10:12:01
世界中のC言語を使える人のコンピューターに対する理解度の高さの平均と、
世界中のJavaを使える人のコンピューターに対する理解度の高さの平均は、
どっちが高いですか?

434:デフォルトの名無しさん
07/08/18 10:16:53
マルチ死ね

435:デフォルトの名無しさん
07/08/18 10:18:08
>>433
スレ違い

436:DEFORTの名無し
07/08/18 13:41:52
ひさしぶりぶり
MinGWつかってみたけど微妙

437:デフォルトの名無しさん
07/08/18 13:47:02
またお前か

438:デフォルトの名無しさん
07/08/18 14:28:50
>>422
0x0fffffff でマスクってことは、下位28ビットが欲しいってだけじゃね。
あと、unsigned int へのキャストは無駄だな。

439:デフォルトの名無しさん
07/08/18 15:32:58
>>431
どこからそんなデマを仕入れてきた?

440:デフォルトの名無しさん
07/08/18 16:02:21
脳内

441:デフォルトの名無しさん
07/08/18 16:06:10
新聞

442:デフォルトの名無しさん
07/08/18 20:10:13
ある特定のウィンドウがアクティブになった時に、そのウィンドウのメニュー内の
特定のコマンドを実行するようにしたいのですが、どのよう記述したら良いでしょうか?
具体的にはXSIとゆう3DCGソフトの「アニメーションエディタ/編集/オリジナルコマンド」
を自動実行させたいのですが、、、

宜しくお願いします。

443:デフォルトの名無しさん
07/08/18 20:13:48
C/C++じゃなくてスクリプトで書けば?

444:デフォルトの名無しさん
07/08/18 20:16:44
C/C++の勉強すれば分かるよ

445:デフォルトの名無しさん
07/08/19 00:24:05
WSHとかの領域になるんかな?あっちの詳細を全部知ってるわけではないけれども

446:デフォルトの名無しさん
07/08/19 00:43:34
new int[n]; ← このnのところは、何の型で渡すのか決められてますか?
intとかlongとか(負数はあり得ないので、unsignedでしょうか)

あと、Windowsの32ビット環境では、intとlongはまったく同じ型として扱っても問題ないですか?

447:デフォルトの名無しさん
07/08/19 00:45:47
>>442
ウィンドウメニュー内の特定のメニュー項目が選択されたときって、
たぶん、WM_COMMANDとかのウィンドウメッセージが飛ぶと思うんだけど、
その具体的なパラメタを調べて、アクティブとかのイベント関係なく
直接呼んじゃだめなの?

もし、アクティブになると同時って条件をつけたいなら、
1)ウィンドウをアクティブにする
2)ウィンドウメッセージを送信する
っていうだけの簡単なプログラムを作るとか。

448:デフォルトの名無しさん
07/08/19 01:13:18
>>446
特定の型には決まっていない。整数ならいい。
負の数になったら未定義動作。

int と long は違う型です。

449:デフォルトの名無しさん
07/08/19 01:30:05
スレリンク(musicjf板:72番)
おもしろいIDでた

450:デフォルトの名無しさん
07/08/19 01:32:34
わざわざ他板のを持ってこなくてもいいんだよ

451:デフォルトの名無しさん
07/08/19 01:34:41
>>448,446
>特定の型には決まっていない。整数ならいい。
C++の言語仕様の詳細は知らないけど、VCならsize_tでいいんじゃね
URLリンク(msdn2.microsoft.com)(VS.80).aspx
URLリンク(msdn2.microsoft.com)

>int と long は違う型です。
これもVC(x86)の範囲内で同じようにつかえるかって質問なら、問題ないと思うけど
URLリンク(msdn2.microsoft.com)


452:デフォルトの名無しさん
07/08/19 01:36:23
>>450
この板ID無いが。

453:デフォルトの名無しさん
07/08/19 01:57:33
>>451
operator new 関数の第1引数は VC に限らず size_t 。
でもそれと new 式の配列要素数を表す式の型とは別。

サイズが同じだろうがなんだろうが int と long は違う型。
まったく同じ型として扱うのには問題がある。

454:デフォルトの名無しさん
07/08/19 03:13:14
>>453
ごめん、1点分からないので、教えていただきたい。
とりあえず、>>446はVCの利用上(実装上)の制限が知りたいんじゃないの、
と思ったので、その観点だけで書いたのは自分の思い込みで、それで意見が
すれ違うのは仕方ないんだけど、

>特定の型には決まっていない。整数ならいい。
>でもそれと new 式の配列要素数を表す式の型とは別。
の箇所。
そうはいっても、ソースをコンパイルしてバイナリに落とす以上、コンパイラ定義かも
しれないけど、具体的な値の有効範囲ってかならずあるんじゃないの?
実際、MSDNの配列定義のサイズ指定の箇所では
0以上の整数型、ただしMicrosoft仕様では... としてsize_tに言及してるわけだし。

それにoperator new 関数の第1引数がsize_tに決まってるなら、size_t以上の値を
記述して受け入れてくれるコンパイラがありそうにないので、
その意味でも「整数ならいい」ってのはあいまいな感じがする。

なので、「整数ならいい」ってのは純粋に言語仕様の話として語っているのか、
それとも、コンパイラの実装やソース記述上の制限を語る場合でも同じ回答
になるのか、気になって眠れなくなりそうなんで、正確なところが知りたいんだけど。

455:デフォルトの名無しさん
07/08/19 03:20:37
 
   ________    
     /   |         
    /__  |     
   /   /.  |-―‐.                
  / \ /     |              
 /  ./      |          
   ノ        ヽ__」    


   |
 .―┼‐フ  
   |/   
  /|/ ̄ ̄ ̄\ 
 //|       | 
   |       |  
   |     (二X

456:デフォルトの名無しさん
07/08/19 03:39:56
>>454
現行の規格ではだいたい >>453 みたいなことしか言えない。ある意味
これが正確なところ。

new とは別に、各処理系が定めるべきいろいろな数値の上限の中に
「オブジェクトのサイズ」というのがある。配列オブジェクトもこの制限を
うけるので、値の範囲はこれに基づくとも言える。これについて規格が
最低限のガイドラインとして提示しているのは 262144 。

まだ規格化はされてないけどこんな話もある。
URLリンク(www.open-std.org)

457:デフォルトの名無しさん
07/08/19 04:45:36
ありがとう、これで寝られる。
仕様自身は結局釈然としない部分があるけど、
>>448,453の回答が正確で誠実な回答というのは理解できた。

リンク先は策定中の次期規格?
また、膨大な項目が...
現状でさえ、もうついていけないくらいややこしいのに。

458:デフォルトの名無しさん
07/08/19 12:35:03
#include "DxLib.h"

int WINAPI Winmain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
}
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return(-1);
DrawBox(0, 0, 120, 65535, TRUE);

WaitKey();
DxLib_End();
return(0);
}

というプログラム書くとエラー出るのはなぜでしょうか?ちなみに
14さいからはじめるリアルに動くゲーム物理プログラミング教室C言語編
という本に載ってます。

459:デフォルトの名無しさん
07/08/19 12:38:39
エラーの内容かけ。

460:458
07/08/19 12:40:14
エラー E2141 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 宣言の構文エラー
エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 不要な }
エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 不要な }
エラー E2303 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 型名が必要
エラー E2356 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 'ChangeWindowMode(int)' の再宣言で型が一致していない
エラー E2344 C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib\DxLib.h 1017: 一つ前の 'ChangeWindowMode(int)' の定義位置
エラー E2063 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 不正な初期化
エラー E2293 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: ) が必要
エラー E2040 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 6: 宣言が正しく終了していない
エラー E2303 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 型名が必要
エラー E2356 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 'DrawBox(int,int,int,int,int,int)' の再宣言で型が一致していない
エラー E2344 C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib\DxLib.h 1519: 一つ前の 'DrawBox(int,int,int,int,int,int)' の定義位置
エラー E2063 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: 不正な初期化
エラー E2293 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 7: ) が必要
エラー E2040 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 11: 宣言が正しく終了していない
エラー E2190 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 12: 不要な }
*** 16 errors in Compile ***

** error 1 ** deleting Debug\dxtest.obj

です。
ちなみに今日勉強したばかりでさぱりとわかりません

461:デフォルトの名無しさん
07/08/19 12:41:46
勉強してないからエラーが出る

462:デフォルトの名無しさん
07/08/19 12:42:05
どんなエラーがでてるの?

463:デフォルトの名無しさん
07/08/19 12:42:21
最初に4行目にエラーが出ているだろう。
4行目を穴があくまでじっくり見ろ、その教科書とひたすら比較しろ。
それでわからなかったらもっかいおいで。

464:デフォルトの名無しさん
07/08/19 12:45:46
彼はエラーの見方がわからないと思う

465:デフォルトの名無しさん
07/08/19 12:46:33
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC)
{
ChangeWindowMode(TRUE);
if(DxLib_Init()==-1)return(-1);
DrawBox(0, 0, 0, 120, 65535, TRUE);

WaitKey();
DxLib_End();
return(0);
}

466:デフォルトの名無しさん
07/08/19 12:49:38
ChangeWindowMode(1);
こっちのがいいかも分からんね

467:458
07/08/19 13:11:31
>>465のように書いてみましたが
まだ
Fatal: ファイル VORBISFILE_STATIC.LIB が開けません
と出ます。
>>464
まったくおっしゃるとおりです

468:デフォルトの名無しさん
07/08/19 13:59:36
>>467
エラーの通りvorbisfile_static.libってファイルが見つからないんだろ。
あとは環境が分からないと何も言えないと思う。

自分の開発環境を検索ワードに入れて、
(「vorbisfile_static.lib VC++」とか「vorbisfile_static.lib BCC」とか)
その辺でググって見たらどうよ?

469:デフォルトの名無しさん
07/08/19 15:14:22
というか似たような質問を、DxLibのサイトで何度も見た気がするんだ。

470:デフォルトの名無しさん
07/08/19 15:55:17
vorbisfile_static.libはDxLibのアーカイブに同梱されてるから
それをソースと同じディレクトリにコピー
というか「このフォルダのファイルを全てコピー」みたいなフォルダなかったか?

471:230
07/08/19 23:24:29
GNU Compiler Collectionのg++コンパイラで
-std=c++98というコンパイラオプションというのがあるらしいのですが
ぐぐってもよく分かりませんでした。
誰か教えてください。

472:471
07/08/19 23:25:32
230というのははミスです。すみません(汗

473:デフォルトの名無しさん
07/08/19 23:42:30
コンパイラマニュアルとかないの?

474:デフォルトの名無しさん
07/08/19 23:48:12
>>471 URLリンク(gcc.gnu.org)

475:471
07/08/19 23:49:45
どもです。探し見てみます。

476:デフォルトの名無しさん
07/08/19 23:51:50
もう見てないかな
まるちか?2ちゃんではマルチポストは叩かれるですよ
せめて、主とする、質問したスレを付記
機嫌が良ければ、そこにヒント書きますから

477:デフォルトの名無しさん
07/08/19 23:56:08
今更VC++6.0のMFCなんですけれど、
ツリーコントロールのアイテムの文字列が長いときに
横スクロールにせず、文字列を折り返すことってできますでしょうか?

478:デフォルトの名無しさん
07/08/20 01:12:13
curses(ncurses)のプログラミングを euc-jp 環境で行って来たのですが、
訳あって utf-8 環境で行うことになりました。

euc-jp 環境で作ったファイルを utf-8 環境に持ってきて、
iconvで文字コードを変更し、コンパイル、実行すると、出力(日本語)が文字化けてしまいます。

utf-8 環境に持ってきた euc-jp のファイルを、
文字コードをそのままにして、端末の表示文字コードを utf-8 から euc-jp に変更した上で、コンパイル、実行すると、正しく表示されます。

これななぜでしょうか?
curses が utf-8に対応していないとかってありますか?

479:デフォルトの名無しさん
07/08/20 01:14:08
>>478
ソース文字セットと実行文字セットは別。
gcc のオプション -finput-charset と -fexec-charset を参照すべし。

480:デフォルトの名無しさん
07/08/20 01:15:56
>>478
curses 関係あるのか?
puts("あいうえお") とかで試せばわかると思うけど。

481:デフォルトの名無しさん
07/08/20 01:20:45
先ずは問題の切り分けだね。
>480の言うように標準出力に出力してみてその時点で文字化けしているならgccのオプションなどを調節。
その上でcurses使うと化けるのなら、cursesの設定か何か、その辺りの調査。

482:デフォルトの名無しさん
07/08/20 01:36:08
operator=で返す自分の参照は、constつけるべきですか?

483:デフォルトの名無しさん
07/08/20 01:42:23
>>482 いいえ。

484:デフォルトの名無しさん
07/08/20 01:48:55
寧ろつけてはいけません。

485:デフォルトの名無しさん
07/08/20 02:10:18
>>447
どうもです
XSIではコマンドを実行する際にエディタのIDのような物が必要で、
エディタウィンドウを複数開いている時には、コマンド実行前に
その時アクティブなウィンドウのIDを取得する必要があります。

WM_ACTIVATEとかを使えば良いのでしょうか?


486:デフォルトの名無しさん
07/08/20 02:24:33
動画とかをエンコードするデコーダって色々ありますよね。
あれ使えるソフト作るのって大変なんでしょうか?
AVIutlみたいなソフトって個人では簡単に作れないんですかね?
どの辺勉強したらいいんでしょうか?

487:デフォルトの名無しさん
07/08/20 02:27:35
>>478 です。

>>479,480,481
さんを参考にして少しいじってみました。

まず、480さんの言うように、単純に puts("あいうえお") を行うプログラムを書き実行してみました。
すると、”-finput-charset=utf-8 -fexec-charset=utf-8”が有る無しに関わらず、文字化けしませんでした。

次に、cursesのコンパイルを、”-finput-charset=utf-8 -fexec-charset=utf-8”を付けて実行してみたところ、やはり文字化けが発生しました。

488:デフォルトの名無しさん
07/08/20 02:43:20
単にcursesがutf-8に対応して無いんじゃないの?
utf-8だと端末上での漢字の幅がバイト長と単純に一致しなくなるし
naiveな実装だと色々問題起きそう

489:デフォルトの名無しさん
07/08/20 03:30:44
VC++2005で<cstdio>等をインクルードすると、
std::printf はもちろん、名前空間のない ::printf も使えてしまいます。

BCB2006だと逆に、<stdio.h>をインクルードすると
::printf を使えますが、 std::printf も使えます。

どちらが正しいのでしょうか。また、正しくない方を正しくする方法はありますか?

490:デフォルトの名無しさん
07/08/20 04:18:35
>>478です。
URLリンク(www.hakodate-ct.ac.jp)
というサイトがあったので、
・-lncurses ではなくて -lncursesw をリンクする
・#include <locale.h>
・setlocale( LC_ALL, "" );

を取り入れたところとりあえず、euc-jp 環境のファイルを utf-8 環境に持ってきて、
このファイルの文字コードを utf-8 に変えてコンパイルし実行すると、
文字化けしない ・・・というのは達成できました。

しかし、私は UNIX(LINUX) にあるような SLコマンド のクマAA バージョンを作って遊んでいたのですが、
euc-jp環境とutf-8環境では少し動きが変わってしまいました。
その動きの変わってしまう場所が、euc-jp環境で苦労して改良したところなので、
かなりショックです。

まぁ、なんとか解決策があればいいのですが、
私の知識ではちょっとつらいかも知れません。

491:デフォルトの名無しさん
07/08/20 07:47:38
for(;;)
;
こんなのあるのね
びっくり

492:デフォルトの名無しさん
07/08/20 09:25:05
無限ループの常套手段

493:デフォルトの名無しさん
07/08/20 09:27:33
俺はwhile(1)派

494:デフォルトの名無しさん
07/08/20 09:31:18
自分も無限ループはwhile派かな
カウンタが要るときはfor使うかもしらんけど

495:デフォルトの名無しさん
07/08/20 09:46:09
>>489
<cstdio> で std::printf が、 <stdio.h> で ::printf が使えるようになることになっている。
1つのヘッダで両方が使えるようになることは保証されない。

496:デフォルトの名無しさん
07/08/20 18:43:51
std::bad_allocを捕まえたりいろいろ例外処理を書いているのですが、
メモリ4GBもあるので、デバッグ中にbad_allocが投げられることは今まで一度もありません。
投げられた際の動作をデバッグしたいのですが、そういうときはどうすればいいでしょうか。
敢えてメモリを消費したりするんですか?

↑ではbad_allocのことですが、他にもWindowsのAPI関数が失敗したときとかも、
ちゃんと自分が書いた処理が動作するか確かめたいんですが。

497:デフォルトの名無しさん
07/08/20 19:07:29
throw std::bad_alloc();

498:デフォルトの名無しさん
07/08/20 19:37:17
>>496
適当にラップして失敗に相当する結果を返せばいいべ

499:デフォルトの名無しさん
07/08/20 20:47:05
起動時に malloc(100000000) とか適当にやっとけば足りなくなるんじゃない?

500:デフォルトの名無しさん
07/08/20 21:09:14
例えば、"a"とか"あ"の文字コードを出力する方法ってありますか?

501:デフォルトの名無しさん
07/08/20 21:11:15
printf( "%d", 'a' );

502:デフォルトの名無しさん
07/08/20 21:30:04
>>501
ありがとうございます。

このページ
URLリンク(ash.jp)
の、UTF-8の欄のような値を出力する方法ってありますか?

503:デフォルトの名無しさん
07/08/20 22:23:30
%Xでの表示をぐるぐるまわせばおわりだろうに。

504:デフォルトの名無しさん
07/08/20 22:26:44
>495
URLリンク(www.open-std.org)
によると、
> Including the header <cxxx> declares a C name in namespace std.
> Including the header <xxx.h> declares a C name in namespace std (effectively by including
> <cxxx>), then imports it into the global namespace with an individual using declaration.
ということで、xxx.h だと std とグローバル両方で宣言されるというのが規格の意図らしい。
なので、BCB2006 の挙動は(それだけ見ると)規格に合致している。

が、現実的には
> If you want to assuredly declare a C name in the global namespace, include <xxx.h>.
> You may or may not also get the declaration in namespace std.
> If you want to assuredly declare a C name in namespace std, include <cxxx>.
> You may or may not also get the declaration in the global namespace.
ということで、>495 が妥当な仮定。
規格もこの現状を追認する形での修正が提案されている。

>502
自分がやりたいと思っていることをもうちょい正確に表現して欲しい。
文字が表示されて欲しいのか、文字コードが表示されて欲しいのかどっち?
入力として考えているのはどんなデータ?外部から与えられる文字列か、文字列リテラルか。文字コードは?

505:504
07/08/20 22:28:32
最初のアンカーは >489 につけるべきだった。

506:デフォルトの名無しさん
07/08/21 02:01:29
別人ですが
>>499
バグでそんな値(もっとでかい、0x40000000とか)を与えたことがあるけど、
無理に仮想記憶拡大して確保しようとして、システムが実質操作不能になるだけだった

507:デフォルトの名無しさん
07/08/21 02:33:09
Windowsって1プロセスが使用できるメモリ空間のサイズって指定出来ないの?
Win2000の頃は2G制限とかあった記憶があるけど、今はどうなんだろ。

508:デフォルトの名無しさん
07/08/21 03:06:41
>>507
以下は単なる思いつき。
1. プログラムの改造が可能なら、自分用の一定量しか領域確保できないメモリマネージャを作る。
2. メモリ取得APIをフックして自力で制限する。
3. SetProcessWorkingSetSizeを指定して、同時にスワップを小さくする。


509:デフォルトの名無しさん
07/08/21 05:28:56
たった1000行のソースも完全に把握できねぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇぇ
もうだめだぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁ

510:デフォルトの名無しさん
07/08/21 05:38:16
やっと気付いたか。
さっさと人生やり直せ。

511:デフォルトの名無しさん
07/08/21 08:15:52
>>509
1関数1000行なら窓から投げ捨てろ

512:デフォルトの名無しさん
07/08/21 08:40:46
10万行超えると見る気すら失せる

513:デフォルトの名無しさん
07/08/21 09:28:25
float hoge = new float[100];
foo->CopyArray(hoge);


Cfoo:Cfoo()
{
float m_array = new float[100];
}
void Cfoo:CopyArray( float arg[])
{
arg = m_array;
}

配列のコピーをしたいとき、
上のように配列の名前(=先頭のポインタ?)
だけコピーするだけではダメなようなのですが、なぜですか?
for(int i=0;i<100;i++)
arg[i]=m_array[i];
}
のように中身を一つずつきちんとコピーしないとダメなんでしょうか?

514:デフォルトの名無しさん
07/08/21 09:37:17
arg = m_arrayだとコピーじゃなくて同じ配列に別名を付けてるだけになる

515:デフォルトの名無しさん
07/08/21 09:43:12
::memcpy(arg, m_array, sizeof(float) * 100));

516:デフォルトの名無しさん
07/08/21 09:47:54
std::copy(&m_array[0], &m_array[100], &arg[0]);

517:デフォルトの名無しさん
07/08/21 11:12:35
>>513
>float hoge = new float[100];
コンパイルできるコードを提示しなさい。
>arg = m_array;
それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。

518:デフォルトの名無しさん
07/08/21 11:13:18
>>515
そんなコードを書く香具師は野垂れ死に値すると思います。

519:513
07/08/21 11:55:54
皆さんいろいろありがとうございます。

>>517
>コンパイルできるコードを提示しなさい。

float* hoge = new float[100];
でした。

>それは、仮引き数にメンバ変数の値を代入しているだけなので、仮引き数の寿命とともに無に帰します。

というわけで、分かっておられると思いますが渡してるのはポインタでして
寿命は関係あるんですかね?

>>514
これもちょっと理屈が分かりません。
なぜ配列に別名をつけてることになるんですか?
配列の名前って先頭のポインタをさしてるんじゃなかったでしょうか?

>>518
一行で済むのでforで要素を一つずつコピーするよりは>>515>>516はいいかなと思ったんですが、
どうして>>515はダメなんですか?

520:デフォルトの名無しさん
07/08/21 12:04:44
>>519
>寿命は関係あるんですかね?
その仮引き数の寿命は、その関数を抜けるまでです。
ポインタがポイントしている先のことは言及していませんね。
もう少し、ポインタ変数と言うものを理解しておいた方が良さそうです。

>なぜ配列に別名をつけてることになるんですか?
ポインタ変数にポインタ変数の値を代入するだけでは、
ポイント先の複写は行なわれません。
もう少し、ポインタ変数(ry

>どうして>>515はダメなんですか?
どうしてダメじゃないと思うんですか?

521:デフォルトの名無しさん
07/08/21 12:06:18
>>519
> どうして>>515はダメなんですか?
float配列ならば動くけど、一般のオブジェクトの配列なら破滅的。
たとえば、string配列をmemcpyしたらどうなると思う?


522:デフォルトの名無しさん
07/08/21 12:17:40
float で大丈夫ならダメとは言えないだろ。もっといい方法があるってだけで。

523:デフォルトの名無しさん
07/08/21 12:24:46
>>520
>ポインタ変数にポインタ変数の値を代入するだけでは、
>ポイント先の複写は行なわれません。

いま気づきました。狂ってました。すいません。

要するに考え方として
「呼ぶ側で作った配列を渡してm_arrayの中身をコピーして貰ってくる」んじゃなくて
「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような
感じの書き方はできないんですかね?
呼ぶ側で、m_arrayの先頭のアドレスとサイズだけ分かれば
中身にアクセスできそうに思うのですが。

例えば、クラスメンバで持っているprivateな普通のオブジェクトインスタンスのポインタなんかの場合は
わざわざ中身をコピーしないでアドレスだけGet~とかで貰って使ったりするじゃないですか?

>どうしてダメじゃないと思うんですか?

試したらとりあえずうまくいったんで・・・

>>521
わかりません。floatでは一応動きましたが、なんでダメなんでしょうか。
サイズ指定した範囲をコピーすればうまく動くと思うのですが。

524:デフォルトの名無しさん
07/08/21 12:29:27
>>523
> 「ポインタを渡してm_arrayの先頭のアドレスだけ貰ってくる」っていうような
> 感じの書き方はできないんですかね?

なんでできないと思うの?

525:デフォルトの名無しさん
07/08/21 12:31:36
>>524
書き方が分からないんで
そういう書き方が出来るなら教えてください、
ってことなんですが。

526:デフォルトの名無しさん
07/08/21 12:34:01
やっぱりポインタ変数とポイント先の関係がわかっていないような……

527:デフォルトの名無しさん
07/08/21 12:35:28
floatやint、char[]ならmemcpyしても問題ないが、下みたいなクラスだと問題が出てくる

class hoge {
 char *str;
 int length;
};

main() {
hoge* v1, v2;
v1 = new hoge;
v1->str = new char[100];
memcpy(v2, v1, sizeof(hoge));
strcpy(v1->str, "v1");
strcpy(v2->str, "v2");
printf("v1.str is %s.\nv2.str is %s", v1->str, v2->str);
}


528:デフォルトの名無しさん
07/08/21 12:41:40
>呼ぶ側で、m_arrayの先頭のアドレスとサイズだけ分かれば
>中身にアクセスできそうに思うのですが。

思いついて下のようにやったらうまくいったようなのですが、
これってなんか危険だったりしますか?

float* hoge = new float[100];
hoge = foo->GetArray();


Cfoo:Cfoo() {
float m_array = new float[100];
}

float* Cfoo:GetArray(){return m_array;}


529:デフォルトの名無しさん
07/08/21 12:47:45
>>528
最初のnew float[100]で確保したメモリはどうやって解放するんだい?

530:デフォルトの名無しさん
07/08/21 12:52:23
>>528
配列のコピーをしたいんじゃなかったのか?

531:デフォルトの名無しさん
07/08/21 12:58:48
>>527
理解にしばらく時間を要します。
脳のクロックが著しく劣っているのですいません。

>>529
これでもうまくいったっぽいですが、これならOKですか?

float* hoge;
hoge = foo->GetArray();

Cfoo:Cfoo() {
m_array = new float[100];
}

float* Cfoo:GetArray(){return m_array;}

>>530
すいません、コピーというか、m_arrayの中身を
どうにかして呼ぶ側で使えれば何でも良かったのですが。

532:デフォルトの名無しさん
07/08/21 13:00:55
floatの計算速度ってdoubleよりも遅いんですか?

533:デフォルトの名無しさん
07/08/21 13:02:09
>>528
巧くいってない巧くいってない。

>>531
だから、なんでコードの断片載せるんだって。
で、なんでまたfooはポインタなんだ?

534:デフォルトの名無しさん
07/08/21 13:03:27
>>532
足し算などは同じ。超越関数などは速い可能性が高い。
しかし、他の方への変換が入ったりすると遅くなることもある。

結論:一概には言えない。

535:デフォルトの名無しさん
07/08/21 13:06:07
もうスマートポインタコンテナとかRange conceptとか使う方がいいよ

536:513
07/08/21 13:14:09
つまりはどうしたらいいのでしょうか?もうわけ分かりません。

やりたいことはCfooのメンバとしてもってるfloatの配列m_arrayの中身を
コピーするなりポインタを貰うなり、どういう方法があるのか分かりませんが
正しい方法で使いたいってことなんですが。
元の中身を書き換える必要はありません。知れればいいです。
で、とりあえず531で動いてますが、これは危険でしょうか。
要素数は別個貰うなりすれば分かるので
その範囲内だけアクセスするなら大丈夫そうなんですが、ダメですか。


537:デフォルトの名無しさん
07/08/21 13:16:58
>>536
特に問題はないんじゃないの

538:デフォルトの名無しさん
07/08/21 13:28:14
>>537
そうですか。ではひとまずこれでやっときます。
どうもお騒がせしました。

539:デフォルトの名無しさん
07/08/21 13:36:29
書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。
それ以前に、Cfooを何故ポインタにしているかを知りたいんだが。

540:デフォルトの名無しさん
07/08/21 13:52:24
floatならSSEで高速化しやすい

541:513
07/08/21 13:53:03
>>539
>書き換えないなら戻り値はfloat *ではなくconst float *にするべきだな。

なるほど。

>Cfooを何故ポインタにしているかを知りたいんだが。

特に理由はないですが、
newしたCfooのポインタをメンバとして持ってるだけです。
ポインタで持ってるほうがいろいろ別のクラスに連れまわしたりするとき便利かなと。
むしろなぜそこが気になるのか知りたいんですが。

542:デフォルトの名無しさん
07/08/21 14:03:17
>>541
>むしろなぜそこが気になるのか知りたいんですが。
半ば個人的な興味だ。無条件にnewしたがるJava出身者が身近にいるもんでね。
# しかも、悪いことにdeleteする癖はついてないと来たもんだw

543:513
07/08/21 14:06:22
>>542
はい、まさに私のことです。

544:デフォルトの名無しさん
07/08/21 14:10:56
W

545:デフォルトの名無しさん
07/08/21 14:16:01
>>542
BCB使いもnewする癖が‥‥

546:デフォルトの名無しさん
07/08/21 15:40:21
OOっぽく書こうとするとそうなるんじゃないかな
C++的にはスマートポインタを使え、ということになるんだが
いずれにせよ常にownershipを意識している必要はあるね

547:デフォルトの名無しさん
07/08/21 16:02:26
ローカルなオブジェクトまでnewを使い始めたらもう、末期症状だ。
# オブジェクトは全てグローバルに管理されているとしたら、それはそれで難だけど。

548:デフォルトの名無しさん
07/08/21 16:03:31
>>545
VCL使ってると確かにnew癖つくなw

549:デフォルトの名無しさん
07/08/21 18:22:21
カウンタ付けて自動でdeleteするclassくらい自作しろ

550:デフォルトの名無しさん
07/08/21 21:25:00
何で既にあるもん作りなおさにゃならんのん・・・

551:デフォルトの名無しさん
07/08/21 22:27:07
boostの名前あげるとboost厨ウゼェとか言われるから

552:デフォルトの名無しさん
07/08/22 00:16:08
std::tr1::shared_ptrならいいのか?

553:デフォルトの名無しさん
07/08/22 04:50:10
俺はboost::intrusive_ptrが好きだが、めんどい人にはめんどいだろうな。

554:デフォルトの名無しさん
07/08/22 10:37:52
もうIUnknown/comdef.hでいいよw

555:デフォルトの名無しさん
07/08/22 12:21:10
int main (int argc, const char * argv[]) {
char string[] ="Hello,World";
char copystring[13];
stringcopy (string,copystring);
printf("%s¥n",copystring);
return 0;
}
void stringcopy (char *buff,char *copy){
int i = 0;
while(buff[i]){
copy[i] = buff[i];
i++;
}
copy[i] = '¥0';
}
でwhile(buff[i]){…}を
for(i=0;buff[i] == 0;i++)
copy[i] = buff[i];
とすると動かないんですけれど、何故ですか?

556:デフォルトの名無しさん
07/08/22 12:25:25
>>555 条件逆にして動くとでも思ってんの?

557:デフォルトの名無しさん
07/08/22 12:29:42
for(i=0;buff[i] == 0;i++){
printf("loop %d\n",i);
copy[i] = buff[i];
}

ってやってみたら、なにか気づくかも

558:デフォルトの名無しさん
07/08/22 12:36:13
わかった!
for(i=0;buff[i] != 0;i++)
ってすると動くぞ!

559:デフォルトの名無しさん
07/08/22 12:49:13
Containerというクラス名をAAというクラス名にしたら、

Container.h:9: an anonymous union cannot have function members
Container.h:26: abstract declarator `<無名 class>' used as declaration
Container.h:26: anonumous 名前空間の集合体は static でなければなりません



560:デフォルトの名無しさん
07/08/22 12:50:45
>>559
すいません、間違えて「書き込む」ボタン押してしまいました。

Containerというクラス名をAAというクラス名にしたら、

AA.h:9: an anonymous union cannot have function members
AA.h:26: abstract declarator `<無名 class>' used as declaration
AA.h:26: anonumous 名前空間の集合体は static でなければなりません

というエラーが出てきたのですが、このエラーの意味が理解できません。
教えてください。

561:デフォルトの名無しさん
07/08/22 13:12:06
エスパー募集するんでもなければコード貼れよ。

562:デフォルトの名無しさん
07/08/22 13:16:23
>>560
最初のエラーだけとってみれば
無名共用体には関数メンバを持つことができない
というエラー。
だから名前だけじゃなくて何か意味または構造が変わるような修正をしてると
思うけど、情報が不足してるのでこれ以上のことは分からない。

563:デフォルトの名無しさん
07/08/22 13:42:53
>>559です。
自己解決しました。

ContainerからAAに名前を変えたときに、

#ifndef CONTAINER
#define CONTAINER
#include "Container.h"
#endif



#ifndef AA
#define AA
#include "AA.h"
#endif

としていたためにエラーが出ていました。

情報の足りない質問で申し訳ありませんでした。m(_ _)m

564:デフォルトの名無しさん
07/08/22 13:51:53
>>563
まあ、解決したのはよかったけど、
そもそものソースの構造がおかしいんじゃないのか?
普通は Container.h の中で全体を

Container.h
-----------------
#ifndef CONTAINER
#define CONTAINER



#endif
-----------------
としてくくるんであって、includeする側では、二重取り込み防止マクロなんて書かないだろ。

565:でいびす
07/08/22 16:08:55
VC++5.0でファイルリードをやってます。

その時、読込んだ値を文字として認識できるか

調べたいのですが、やり方を教えてもらえませんか?

ループしながら、1文字づつ調べたいです。

ちなみに、文字列には半角の日本語と全角の日本語が混在しています。

お願いします。

566:デフォルトの名無しさん
07/08/22 16:23:15
文字として認識ってのがあいまいだけど
_ismbbprint
あたり使えるか調べて見れ

567:でいびす
07/08/22 16:51:43
>>566

_ismbbprintは使えませんでした。

ビルドが通らなかったです。


568:デフォルトの名無しさん
07/08/22 16:55:13
URLリンク(msdn2.microsoft.com)(VS.80).aspx

569:デフォルトの名無しさん
07/08/22 16:59:27
なんだってVC++5.0なんてもんを使ってるんだ

570:でいびす
07/08/22 17:04:29
>>569

古いプログラムをカスタマイズする事になったので使ってます。

571:でいびす
07/08/22 17:11:52
>>570

古いプログラムをカスタマイズする事になっても使う必要ありません。

572:デフォルトの名無しさん
07/08/22 17:23:18
いやー、そうとも限らんぞー

573:でいびす
07/08/22 17:24:06
>>570

いやー、そうとも限らんぞー

574:デフォルトの名無しさん
07/08/22 17:25:49
VC++5.0ってSTLがはじめてバンドルされた版だよな
無理やり使ったが、今にして思えばひでえ出来だった

575:デフォルトの名無しさん
07/08/22 19:20:05
new が失敗した時に NULL を返すことを前提にプログラムしてたりするんだろうなあ。

576:デフォルトの名無しさん
07/08/22 19:22:18
new が失敗した時に NULL を返すことを前提にプログラムしてたりしてます。

577:デフォルトの名無しさん
07/08/22 19:42:58
new(nothrow)使えば問題なし

578:デフォルトの名無しさん
07/08/22 19:45:10
newハンドラ使えば問題なし

579:デフォルトの名無しさん
07/08/22 20:49:37
set_new_handler じゃなくて _set_new_handler で、
new ヘッダじゃなくて eh.h で宣言されてたんだっけ。
bad_alloc は VC5 で宣言されてたっけ?

580:デフォルトの名無しさん
07/08/22 21:01:23
>>565
VCだと昔から日本語対応の関数はあって、どこかのバージョンで
_ismbXXXX のようなマルチバイト系関数であることを明示するような
関数名になったはず。
それがVC++5.0かどうか知らないが、でもだから対応する関数はあるはず。

で、ぐぐると以下のサイトに適度に古そうな関数名がならんでいるので
試してはどうだろうか。
URLリンク(www.geocities.co.jp)

581:デフォルトの名無しさん
07/08/22 21:08:46
UTF-8だったりEUC-JPだったりISO-2022-JPだったりする可能性は?
というのは余計なお世話か。

582:デフォルトの名無しさん
07/08/22 21:12:02
文字コードについては>>565が勝手に判断するでしょ。
だいたいVC++5.0の時代のアプリにShift_JIS以外使ってるとも思えないけど。

583:でいびす
07/08/22 21:14:17
VC9使うことにしますた

584:デフォルトの名無しさん
07/08/22 22:09:24
VC++はソースのエンコードすら指定できない糞コンパイラ

585:デフォルトの名無しさん
07/08/22 22:13:51
>>584はVC++はソースのエンコードすら指定できないコンパイラと思っている糞

586:デフォルトの名無しさん
07/08/22 22:20:15
できるの?
clにそれらしいオプションが見当たらないからできんのかと思ってた

587:デフォルトの名無しさん
07/08/22 22:24:34
>>585
どうやって指定するの?

588:デフォルトの名無しさん
07/08/22 22:31:21
>>585
おれもきになる


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