C/C++小心者スレッドP ..
[2ch|▼Menu]
159:デフォルトの名無しさん
08/09/15 23:59:55
>>137,157
回している回数じゃないかな
Sigma[i=1...499998]i = 499998*(1+499998)/2 = 124999250001
待っていればいつか終わると思うよ

160:デフォルトの名無しさん
08/09/16 00:05:22
>>157
{}の位置が悪い
自分より小さい数で割るたんびにcountを0に戻してる
自分より小さい数で全部割りおわってからcountが2であるかどうか調べないと


161:156
08/09/16 00:21:21
>>158
なるほど、そういうことか。
確かに、operator=を定義していなくても、オブジェクトの代入とか出来ますからね。
あれは暗黙で定義されているからってことか。一つ賢くなりました。
ありがとうございます。

162:137
08/09/16 01:03:17
>>159
ありがとうございます。
デバッガで見てみると回ってはいるようなので、しばらく待ってみることにします。

>>160
基本的なアルゴリズムが間違っていたのですね、、
ありがとうございます!

163:デフォルトの名無しさん
08/09/17 14:09:12
引数にリファレンスを渡すとオーバーヘッドが小さくなるんですか?


164:デフォルトの名無しさん
08/09/17 14:42:16
値のサイズがリファレンス(=ポインタ)のサイズに比べてかなり大きければなる

165:デフォルトの名無しさん
08/10/04 23:05:01
 今勉強のために文字列クラスを自作しています。
それでoperator+=で文字列の代入結合まではなんとかできたのですが、
operator+の定義がうまくできません。

CString a, b, c;
a = "abc";
b = "def";
c = a + b; //"abcdef"にならない

デバッガで確認したところ、
CString CString::operator+(CString& str)
{
CString temp(*this);
temp += str; //ここまではうまくいっている。
return temp; //ここでデストラクタが呼び出されて、正しい結果を返せない。
}

一応デストラクタはこんな感じです。
CString::~CString()
{
if(ptr) delete[] ptr;
}

tempをstatic宣言したら、結合はうまくいったのですが、プログラム終了時に例外が出るようになってしまいました。
どうすればうまくいくのかどなたか教えて下さい。


166:デフォルトの名無しさん
08/10/04 23:14:22
>>165
コピーコンストラクタとoperator=作ってる?

167:デフォルトの名無しさん
08/10/04 23:16:07
いろいろと辺

168:165
08/10/05 08:09:11
>>166
operator=は作っていたのですが、コピーコンストラクタは作っていませんでした。
(operator= を定義しておけば必要ないと思っていたもので・・・)
コピーコンストラクタを作ったところ、うまく動作するようになりました。
どうもありがとうございました。

169:デフォルトの名無しさん
08/10/05 08:46:10
CString::operator+で、足し算定義しているのに、なんでその関数内部で
足し算が出来るんだよ? コンパイル通るのかよ

170:デフォルトの名無しさん
08/10/05 10:41:38
+ と += は別物だよ

171:デフォルトの名無しさん
08/10/05 11:27:46
べつなのはわかっている ここはなぜいいんだよ

temp += str; //ここまではうまくいっている。

172:デフォルトの名無しさん
08/10/05 11:38:20
// 実は勘違い

173:デフォルトの名無しさん
08/10/05 11:40:14
すまん間違えた

174:デフォルトの名無しさん
08/10/06 14:08:04
単純な事質問するんだけど

型の宣言って複数の関数をまたいでするって出来ないのかな?
うまく説明出来ないんで悪いんだけど
例えば
read.cpp
global.h
test.cpp
の3つがあった場合。

read.cpp内でint型を宣言するとread.cppで宣言した型を使った関数を作る(ここで代入)。
次にglobal.h内でread.cppで作った関数をextern void 何々();とする。
そして、test.cppでglobal.hをインクルードして、test.cpp内でread.cppで作った関数内で代入されたint型を読み込ませたい。

記述は間違ってないと思うんだけど、ビルドするとtest.cppで読み込んだはずの代入されたint型が読み込まれてなくて、定義されてないと出る

・・・初歩的な事で悪いんだけど、根本が違うのかな?ご教授お願いします。

175:デフォルトの名無しさん
08/10/06 14:11:48
>>174
「int型を宣言」とか「int型を読み込む」とか、かなり奇怪な話になっててよくわからん。
どうせ単純なミスかなんかだろ。実際のコード晒してみるのがいいよ。

176:デフォルトの名無しさん
08/10/06 14:19:44
余計な所省いて晒してみる、まだ日が浅くて酷いコードでごめん。
ReadingFile.cpp

int enemy_img;
void readingfile(){
enemy_img = LoadGraph("date/img/enemy.bmp");
}

GlobalM.h
extern void readingfile(); //全ての素材


enemy_move.cpp

void enemy_move_02(){

move02.enx+=sin(PI*move02.eny/80)*5;
move02.eny+=1.5f;

DrawGraph( move02.enx , move02.eny , enemy_img , TRUE ) ;
                           ↑ここでReadingFile内の関数で指定したのを読み込ませたい。
DeleteGraph( enemy_img ) ;


}

177:デフォルトの名無しさん
08/10/06 14:28:55
>>176
extern int enemy_img;

178:デフォルトの名無しさん
08/10/06 14:35:16
>>177
ありがとおおお
でもどうしてintも読み込ませないといけないんだ?

既にReadingFile.cppで読み込んでいるし、多重定義になるかと思ってた。

179:デフォルトの名無しさん
08/10/06 14:47:41
コンパイラは、各ソースファイルを別々にコンパイルしている
他のソースに何か書いてあっても、
今コンパイルしてるソース (と、そのインクルード先) に書いてなければ、コンパイラには判らない

180:デフォルトの名無しさん
08/10/06 15:15:44
>>177は「int型のenemy_imgという変数がどこかにあるはず」という情報。
コンパイラはその「あるはず」という仮定をオブジェクトファイルに埋め込む。

そしてリンカが全部のオブジェクトファイルからその変数を探して、実際のアドレスに直す。
(見つからなかった場合はリンクエラーになる)

181:デフォルトの名無しさん
08/10/16 01:38:42
>>155ではありませんが、今私、全く同じ状況で困っています。
どなたかお答えいただけませんか?

182:デフォルトの名無しさん
08/10/16 02:10:05
>>181
URLリンク(www.microsoft.com)
これじゃだめなの?

183:デフォルトの名無しさん
08/10/16 03:47:20
問題文:2つの円の位置関係(交わる(交点)、含まれる、離れている)

先週C++を始めたばかりなので色々と書き方が解りません;;
考え方は解るのですが……

二乗や平方根などなど……

184:デフォルトの名無しさん
08/10/16 04:27:08
>>183
//
// 2つの円の重なりをチェックする。
//
// 引数
// x1, y1, r1 円1の中心x座標、中心y座標、半径
// x2, y2, r2 円2の中心x座標、中心y座標、半径
//
// 戻り値
// 0: 接する 正: 離れている 負: 重なる
//
int circle_check(int x1, int y1, int r1, int x2, int y2, int r2)
{
return (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) - (r1+r2)*(r1+r2);
}

185:デフォルトの名無しさん
08/10/16 15:19:36
srand(0)とsrand(1)が同じ系列を生成するので、ソースコードを見てみたいのですが、
srandのソースコードってどこにありますか?


186:デフォルトの名無しさん
08/10/16 16:02:43
お使いのコンパイラによって実装は異なる

187:181
08/10/16 19:24:11
>>182
参考書を買って勉強しようと思っているのですが、その参考書で
『C++ Compiler 5.5/Turbo Debuggerをダウンロードして、それを使って勉強』
なものだったので、別のソフトだと操作方法がわからないんじゃないかと不安だったのです・・・。
とりあえずこれでやってみます!回答ありがとうございました。

188:デフォルトの名無しさん
08/10/16 20:24:04
C++の質問です。2つお願いします

・CString 形式のデータで""hogehoge""というデータが入っていた場合、
前後のダブルクォーテーションを簡単に除去する方法はありませんか?

・char buff[255][3][255] のようなデータをファイルで入出力したいのですが、
何か良い方法はありませんか?

189:デフォルトの名無しさん
08/10/16 21:18:55
>>188
メモリマップドファイルとstd::stringならsubstr

190:デフォルトの名無しさん
08/10/16 21:36:55
VC++2008proにて
特定のコード上で右クリックすると確実にフリーズするんですが
似たようなケースさらには対処法あったら教えてください。。
ググったけどほとんど情報が無く、似たような質問がされている所も未だ解答がなかったとです。。

原因は調査中です。ヘッダーファイルを適当にインクルードしまくったから無限ループ起きたか?
と思って全部コメントアウトしてみたけど無意味でした。。

他の情報としては、
普通はマウス乗せたらメンバの情報が出てきますが、そのコードではそれすら出てきません。
一応左クリックおよびファイルの編集はできます。
右クリックだけ永久砂時計が発動します。

他も何か手がかりになりそうな所あれば探したいんで
アレがひっかかってるんじゃね? とか言っていただけると助かります。

191:190
08/10/16 22:42:32
すまんスレチだったか。過疎なのか?
ちょっと他のところで聞いてみます。

192:デフォルトの名無しさん
08/10/16 22:44:03
インストールしなおしかな?

193:デフォルトの名無しさん
08/10/16 22:51:43
>>192
と思ったらこんなタイミングで……なるほど。

しかしDream SparkでDLした奴なんでもう一度isoをDLできるかどうか……?
MSに報告したほうがいいんでしょうかね。

194:190
08/10/16 23:35:13
他スレにて解決しました。お騒がせしました。

別件ですがついでにこちらで質問してみたいことが。

bool b1,b2,b3,b4;があって、
if(b1 && b2 && b3 && b4)
{ 〜〜 }
のようにやることは
if(b1){
if(b2){
if(b3){
if(b4){
〜〜
}
}
}
}
のようにやる事と同じように働いてくれるんでしょうか?
それとも前者はb1〜b4をすべて求めてから論理積を計算し、
後者はfalseがあった時点で処理をやめる、という違いが生じるんでしょうか?

前々から疑問に思っていました。

195:デフォルトの名無しさん
08/10/16 23:42:58
前は、if-ifの方が速いと思ってたけど、実測すると論理積の方が速い
分岐予測より、論理積のコストは少ない

196:デフォルトの名無しさん
08/10/16 23:46:47
>>194
短絡評価と言って、左から順に見ていきfalseが出てきたら残りは評価されない。
だから上と下のどっちの書き方でも同じ意味になる。
もちろん、実際にコンパイラがどういうコードを吐くかは別として。

197:190
08/10/16 23:51:54
>>195-196
本当ですか、安心しました。
短絡評価、まぁ考えてみたら、してくれないとスマートじゃないですよねw
実測とかしたことない……やっぱそういう経験も役に立つんですね。
ありがとうございましたm(__)m

198:デフォルトの名無しさん
08/10/17 00:54:32
>>189
亀レスだけどサンクス、調べてみるよ。

199:デフォルトの名無しさん
08/10/17 02:49:46
>>198
str.trim('\"')でできそう!

200:デフォルトの名無しさん
08/10/17 09:01:45
>>185
メルセンヌツイスターのソースを使えば良いジャマイカ

201:デフォルトの名無しさん
08/10/17 14:06:39
簡単にコピペできるのはXORシフト ライセンスとかあんまりなさそうだし 
商用に組み込んだとしても問題にならないのでは

202:デフォルトの名無しさん
08/11/04 18:46:54
文字列を入力して、それを配列に1文字ずつ入れていきたいのですが、どのようにすればよいですか。
具体的にソースを挙げて教えてください。
よろしくお願いします。

203:デフォルトの名無しさん
08/11/04 18:58:54
>>202
char buf[適当な長さ];
fgets(buf, sizeof(buf), stdin);

204:デフォルトの名無しさん
08/11/04 19:18:29
>>203
返信ありがとうございます。

205:デフォルトの名無しさん
08/11/05 14:47:28
typedef unsigned char bBuffer[128];
typedef DWORD wBuffer[32];

bBuffer A;
wBuffer B;

AからBにキャストするにはどうすればよいのでしょうか?
でるぴだと B:= wBuffer(A); なんですけど

206:デフォルトの名無しさん
08/11/05 15:24:37
キャストに配列を指定してはいけない。つまり、foo = (Foo [])bar;こういうのはできないのよ。
代入したいのならmemcpy()でも使う。

それにしてもObjectPascalは、型が緩いんだろうか。

207:205
08/11/05 16:37:40
>>206 ありがとうございます。
memcpy()で期待通りに出来ました。

delphiだとなぜか使えるんです。

208:デフォルトの名無しさん
08/11/07 16:14:41
wiiリモコンのライブラリってどこにあるんですか

URLリンク(www.thinkit.co.jp)
に載ってるところ探しても無いんですが

209:デフォルトの名無しさん
08/11/07 23:43:09
あるじゃん

210:デフォルトの名無しさん
08/11/08 01:32:35
あ、あった
ここですね
URLリンク(wiiyourself.gl.tter.org)

どうもです

211:デフォルトの名無しさん
08/11/08 02:14:04
ここで聞いていいのかわからんけど一応きいてみる
スレチならごめん

今、ユーグリット云々つかって最大公約数を求めるプログラム作ってて
URLリンク(kansai2channeler.hp.infoseek.co.jp)
ってとこまではできたんです。2つはできるんですけど
問題は3つ以上の数を調べるときなんです。普通に文字数を増やして計算させるだけじゃできないようで、
いろいろしたんですけど詰まってしまいまして
どこをどう変更すれば、3つ以上の数の最大公約数をしらべるプログラムになるのでしょうか



212:デフォルトの名無しさん
08/11/08 02:15:22
gcd(gcd(x, y), z);

213:デフォルトの名無しさん
08/11/10 19:33:43
¥nで文字数があわなくて1日中悩んでいたが
¥r¥nかよ!
ゲイツのバカヤロー!

214:デフォルトの名無しさん
08/11/10 19:58:35
>>213
何をいまさら。 UNIX原理主義者は始末に終えんな。

それは、デジタルリサーチのCP/M-80(CP/M-86)との互換性を保つために
そうなっている。 文句があるなら、墓の下で眠るゲイリーキルドールに
言え。

ちなみに、OS-9の行末コードは'\r'のみだ。

215:デフォルトの名無しさん
08/11/10 20:31:53
タイプライターに文句いえ

216:デフォルトの名無しさん
08/11/11 07:09:03
初歩的な質問なのですが、
staticはどう言った変数や関数に付ければ良いのでしょう。
staticの働き事態はわかるのですが・・・

217:デフォルトの名無しさん
08/11/11 08:44:01
>>216
・関数
外部に公開しない全ての関数につける。
単一ソースファイルでプログラムを作るのなら、staticをつけないのはmain()だけでいい。

・変数
自動変数で事が足りない場合。
関数外部で宣言したい場合で、外部に公開する必要がない場合。

218:デフォルトの名無しさん
08/11/11 12:09:23
C++でビットマップを表示するのに、("ファイル名")ではなく(variable)を使用するにはどうしたらいいでしょうか?

例:
String^ variable = "C:ファイル名";
Bitmap^b = gcnew Bitmap(variable); // エラー

219:デフォルトの名無しさん
08/11/11 13:04:54
C++/CLIは別スレへ

220:デフォルトの名無しさん
08/11/11 15:47:57
コンパイルをすると
_declspec(align('16'))の仮引数は配置されません
とエラーが出てしまいました。vectorのせいだと思うのですが、このエラーは
どういったときに出るのでしょうか・・・


221:デフォルトの名無しさん
08/11/11 17:35:36
Ubuntu 8.10 で手持ちの ANSI C プログラムをコンパイルしようとしたら、
usleep が無いと言われたのですが、usleep は unistd.h に入ってるはずですよね?
ちなみに Darwin の cc でコンパイルしたときはうまくいきました

/usr/include/unistd.h をみてみると

#if defined(__USE_BSD) || #defined (__USE_XOPEN_EXTENDED)
...
#endif

で囲まれてました。そこで cc に -D__USE_BSD オプションをわたしてみたものの
やっぱり定義されてないと言われます。
ubuntu の cc で usleep を使うときはなにかしらやり方があるのでしょうか?

222:デフォルトの名無しさん
08/11/11 17:49:13
URLリンク(www.linux.or.jp)
> POSIX.1-2001 では、この関数は過去のものと宣言されている。代わりに nanosleep(2) を使うこと。
> POSIX.1-2008 では、 usleep() の規定が削除されている。

とか書いてあるので、代わりに nanosleep を使ってみたらどうだろう

223:デフォルトの名無しさん
08/11/11 18:07:14
>>221
ansi cにusleep()などない!

224:デフォルトの名無しさん
08/11/11 23:26:53
>>218
まさかとは思うが、"C:\\ファイル名"とかいうオチじゃないだろうなw

225:221
08/11/12 09:58:31
>>222
情報どうもです。
とりあえず
#ifndef __USE_BSD
# define __USE_BSD
# include <unistd.h>
# undef __USE_BSD
#else
# include <unistd.h>
#endif

としてその場をしのいだんですが、そのうち nanosleep を使うように書き直したいと思います

226:デフォルトの名無しさん
08/11/14 03:21:41
メモリリークを調べるため_CrtSetDbgFlag関数を使おうとして
以下のように書いたのですがリンクエラーが出ます

#include <crtdbg.h>
 ・
 ・

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
// メモリリーク検出
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
 ・
 ・
 ・
}

エラー内容
GameT error LNK2019: 未解決の外部シンボル __CrtSetDbgFlag が関数 _WinMain@16 で参照されました。

他にも何かインクルードする必要がありますか
開発環境はVS2003で、OSはWinXP_SP3です

227:デフォルトの名無しさん
08/11/14 08:05:07
ゲ製板からの出張乙
リンクエラーと自分で書いてるだろ
するべきことはインクルードではない

228:デフォルトの名無しさん
08/11/14 12:54:30
リリースビルドだったりしてな。

229:デフォルトの名無しさん
08/11/14 20:37:24
2003にあったっけ?

230:226
08/11/14 23:40:50
>>227
なぜゲ製板とわかるのでしょうか

>>228
DebugかReleaseのとこですよね
Debugにしています

よくわからないので新規プロジェクトで試したらできました
これに少しづつ作ったものを貼り付けていって原因を探してみる

231:デフォルトの名無しさん
08/11/15 23:28:04
不特定多数のデータを受け取る際に、スペースで区切りながらそれらを配列に格納するにはどうすればよいのでしょうか。
例として、
「2 3 5 6」
「2 3 1 3 4 5 2」
というスペースで区切られた数があり、これらをそれぞれ別の配列に格納したいのです。
入力は
2 3 5 6(ここでエンター)
2 3 1 3 4 5 2
となります。
コードと一緒に解説してくださるとありがたいです。

232:デフォルトの名無しさん
08/11/16 00:16:28
つ[strtol()]

233:デフォルトの名無しさん
08/11/16 00:52:12
すいません。
C++で、コンパイラのように構文解析をする処理などを勉強できる書籍はないでしょうか?
プログラム板に初めてくるので、このスレでいいのか判断に迷いますが、、、
よろしくお願いします。

234:デフォルトの名無しさん
08/11/16 01:03:27
コンパイラの教科書の最初の方に載ってるよ

235:デフォルトの名無しさん
08/11/16 01:12:08
アサーションをインラインで宣言して、どこの行でエラーが起こったか知りたいです。
以下の様に書いてみましたが、インライン関数MUSTOKの行数でエラーが起こった、もしくは、assert関数がある行が
表示されてしまいます。できればこの関数MUSTOK(0==1);がある行が知りたいのですが、どうしたらよいでしょうか?

実行環境
gcc バージョン 4.2.4 (Ubuntu 4.2.4-1ubuntu3)
ubuntu8.4
ソースコード
==
#include <cassert>
#include <iostream>
inline void MUSTOK(bool cond)
{
if(!cond)
{
std::cout<<"file=:"<<__FILE__<<"\tlie=:"<<__LINE__<<std::endl;
}
assert(cond);
}
int
main(int argc,char *argv[])
{
MUSTOK(0==1);
return 0;
}
==
実行結果
file=:assert_test.cpp lie=:7 assert_test: assert_test.cpp:9: void MUSTOK(bool): Assertion `cond' failed. Aborted



236:デフォルトの名無しさん
08/11/16 01:21:33
>>235
MUSTOKをマクロで実装するしか。

237:デフォルトの名無しさん
08/11/16 01:23:50
>>235
backtrace,backtrace_symbolsってのを使うとどこから呼び出されてるか表示出きるみたいだよ。

238:デフォルトの名無しさん
08/11/16 10:42:04
>>234さん
233です。ありがとうございました。
書泉に行ったときに探してみます。

239:デフォルトの名無しさん
08/11/16 12:33:25
Cのプログラムで、他のプログラムhogeをコマンドラインパラメータ付きで実行し、
その実行の終了を待って、hogeのmain関数が返した値を取得したいのですが、
どうすればよいでしょうか?標準のC関数だけでできますか?

240:デフォルトの名無しさん
08/11/16 12:40:35
できません。winAPIでやってください

241:デフォルトの名無しさん
08/11/16 12:50:22
Cで、引数で指定されたファイルを、system関数を使って、
メモ帳で開くにはどうすればよいでしょうか?
ご教授お願いします。

242:デフォルトの名無しさん
08/11/16 12:58:13
system("メモ帳の場所 引数で指定されたファイル")

あとは
URLリンク(www.google.co.jp)
から探しなー

243:デフォルトの名無しさん
08/11/16 13:06:03
>>240
馬鹿も休み休み言ってください。

>>239
一般的に、アプリはsystem()で起動すればmain()の戻り値を回収できる。
但し、GUIアプリなどで動いているにも拘らずすぐに戻ってきてしまう場合は、
コマンドインタプリタ(command.comとかbashとか)の支援が必要になる。
コマンドインタプリタを介在させたくなければ、そこでやっと>240の言うようなAPIの出番となる。

>>241
system("notepad any.txt")でいいとして、そのテキストファイル名を可変にしたいなら
文字列を組み立てればいい。

244:デフォルトの名無しさん
08/11/16 13:36:09
リソースから拾ってきた文字に対して置換ってどうやってる?
たとえば
 「File %1 is too long.」  ⇒ 「File "C:\hogehoge.foo" is too long.」
みたいな。

変換先文字列分拡張して memmove で必死に頑張ってもいいんだけど、
ATL/WTL 使ってるのでそれらのライブラリで便利なのがあればいいなぁと
思って…

教えてエロい人><

245:デフォルトの名無しさん
08/11/16 13:39:01
>>244
%1を適当に変換してから、sprintf()

246:デフォルトの名無しさん
08/11/16 13:40:18
置き換えしたいところを%sとかにして、sprintf使うとか。

247:デフォルトの名無しさん
08/11/16 13:40:47
boost::format使えば楽じゃね。

248:デフォルトの名無しさん
08/11/16 13:48:57
>>245、246

そうか、%1 じゃなくて別にいいんだもんね。
「File %s is too long. (sizeof: %s. current: %s)」
とかにして順番に sprintf の引数に積めばいいのか!

>>247

STLワカンネ・・・orz
でもせっかくなので勉強してくるYO!


即レスthx!!!
みんな優しいね。大好き。

249:デフォルトの名無しさん
08/11/16 21:02:14
FormatMessage の立場がねーな、おい。

250:デフォルトの名無しさん
08/12/17 02:15:02
入力によって処理を変えるプログラムを作っていて、予期せぬ入力があった時メッセージを表示して、もう一度入力させるプログラムを作っているのですが、2度同じ表示が出てしまいます。

for(;;)
{
scanf("%c",&input);
if(input == 'S' || input == 's')
{
printf("GAME START!¥n);
}

else if(input == 'Q' || input == 'q')
{
printf("GAME QUIT¥n");
return 0;
}

else
{
printf("input failed¥nPlease input again¥n");
}
}

どこを変更すれば、2度表示されなくなるでしょうか。
よろしくお願いします。

251:デフォルトの名無しさん
08/12/17 02:35:15
たぶん改行('\n')が残っているんだと思うよ。
scanf()の後に、
if ( input != '\n' ) {
while ( (c = getchar()) != '\n' ) {
; /* 意図した空文 */
}
}
こういうの追加しておくとか。

scanf()で文字ではなく文字列受け取って、最初の要素だけ利用するとか。
fgets(,,stdin)で、上記と同じようにするとか。

 ゲーム作っているみたいだから、がんばってとしか言えないけど。

252:デフォルトの名無しさん
08/12/17 07:48:35
const で変数宣言する必要性を教えて下さい

253:デフォルトの名無しさん
08/12/17 23:46:16
>252
・誤って内容を変更するコードを書いた場合エラーになる。
・(条件が揃えば)定数として使える。

254:デフォルトの名無しさん
08/12/18 08:59:45
>>251
弄っていたら、
scanf("%c",hoge);

scanf("%s",hoge);
にしたら出来ました。
ありがとうございました。

255:デフォルトの名無しさん
08/12/19 08:36:18
質問です。

後処理さえすれば、コンストラクタで例外を投げても良いと聞いたんですが、
自分自身(this)がリークすることはないんでしょうか?

256:デフォルトの名無しさん
08/12/19 11:35:37
ないよ。

257:デフォルトの名無しさん
08/12/19 11:55:39
ありがとうございます。
これで安心して例外投げれます。


258:デフォルトの名無しさん
08/12/19 12:10:50
>>255
これだね。
URLリンク(www.kijineko.co.jp)

259:デフォルトの名無しさん
08/12/19 15:58:08
大変参考になるリンクどうもです。
スッキリしました^^

260:デフォルトの名無しさん
08/12/19 16:07:06
専用メソッド作ってた自分がバカみたいでした……

261:250
08/12/19 17:56:15
入力した数*数の二次配列に、任意の文字を入れて、それを.txtとして出力するプログラムを作っているのですが、
scanfで各配列に入れた文字を書き込むにはよいのですが、a[i][j] = '*';という入れ方で書き込むとtxtファイルが開けなくなってしまいます。
何が問題なのでしょうか。
よろしくお願いします。

262:デフォルトの名無しさん
08/12/20 02:21:57
>>261
ソースと結果を示してください。
fopen() を使っているなら perror() してみるとか。

263:デフォルトの名無しさん
08/12/20 02:40:07
>>261
 たぶんfprintf(fp, "%s", a[i]);とかやって、ナル文字('\0')が見付からなくてメモリの適当なところまでファイルに書き込んだためにメモ帳などでテキストファイルとして開けない。
とエスパーしてみる。書き込みがSJISっぽいから、Windowsと仮定するけど。
 最初から、バイナリで書き込んでバイナリで読み込むといいかも知れない、ゲーム作ってんだろ。
fwrite(a, sizeof(a[0][0]), sizeof(a), fp); foo型配列a
fread(a, sizeof(a[0][0]), sizeof(a), fp); foo型配列a
その代わりメモ帳では開くなよ。開いてもなんとかなるかもしれないけど。

264:デフォルトの名無しさん
08/12/20 18:50:18
バイナリエディターで覗くというのも手だな。
ファイルサイズが想定以上なら263で正解だと思う。

265:250
08/12/20 19:20:53
>>262
すみません。改行が多すぎるそうで、書き込みができませんでした。

>>263
ありがとうございます。
バイナリで開いて書き込んだら、できました。

>>264
そのような確認の仕方もあるのですね。
勉強になりました。ありがとうございました。

266:デフォルトの名無しさん
08/12/24 09:35:35
ちょっと質問したいんだが
コンストラクタで例外投げるのってどういう時に使うんだ?
分岐にでも使うのか?

267:デフォルトの名無しさん
08/12/24 14:08:45
>>266
エラー通知に決まってるだろ。コンストラクタでも普通の関数でも同じ。

268:デフォルトの名無しさん
08/12/24 21:19:49
コンストラクタだとエラーを返せないから例外を使う。

269:デフォルトの名無しさん
09/02/10 18:39:30
スレリンク(bobby板)l50

168 名前:よしよし ◆2U93Cmvv1o [sage] 投稿日:2009/02/10(火) 07:02:42 ID:???
おいハゲどもポインタの質問だ

------
p は指し示す先のアドレス
&p はポインタ変数pそのもののアドレス
*p は指し示す先の値
------
だよな?なのにポインタ配列の解説のところで
------
data+i がそのもののアドレス
data[i] が指し示す先の値
*(data+i) が指し示す先のアドレス
------
ってことになってんだよ
俺は本の書き間違えだと思って実際にプログラム打ち込んで
コンパイル、実行してみたらあってるんだよ
どういうことだ説明しろ
「*」はポインタが指し示す先の値を出力するんじゃねーのかよ

270:デフォルトの名無しさん
09/02/10 18:43:21
169 :おいら名無しさんヽ(´ー`)ノ:2009/02/10(火) 09:02:32 ID:???
3番目の"*(data+i)が指し示す先のアドレス"は間違ってるな。
ハゲの理解が正しい。どこの糞入門書だ。さらせ。

171 :よしよし ◆2U93Cmvv1o :2009/02/10(火) 11:50:38 ID:???
>>169ありがとう。ハゲじゃないが言ったようにコンパイルすると
結果は入門書どおりになるんだよ。俺が何か間違っているはず。
#include <stdio.h>
int main (void){
char* data[4]={"par","birdie","eagle","albatross"};

int i;
printf("data[i]    値    アドレス :ポイント先の値\n");
for(i=0;i<4;i++){
printf("data[%d] %10d %10d %10s\n",i,*(data+i),data+i,data[i]);
}
return 0;
}
-------------------------------------
C:\Source>point.exe
data[i]    値    アドレス :ポイント先の値
data[0] 4235576 1245052 par
data[1] 4235580 1245056 birdie
data[2] 4235587 1245060 eagle
data[3] 4235593 1245064 albatross
-------------------------------------

271:デフォルトの名無しさん
09/02/10 18:44:48
スレリンク(bobby板)

177 名前:よしよし ◆2U93Cmvv1o [sage] 投稿日:2009/02/10(火) 14:48:08 ID:???

要するに
int i=5;
int *p;
とかと
char* data[4]はそもそも違うっちゅーことだな?

*pってのは「指し示す先の値」のことだけど、
* data[4] ってのは「指し示す先のポインタ」のことなんだな?
* data[4]様はポインタ様*(data + i )やdata[i]のさらに違う場所
(メモリの)にいる奴なんだな?


メモ-----------
*(data + i )とdata[i]はまだポインタなの。

「ポインタの配列」→「ポインタ」→「指し示す先の値」

* data[4]→ *(data + i )とdata[i]→ *(*(data+i))または*data[i]

char* data[4]=
--------------


272:デフォルトの名無しさん
09/02/11 08:43:54
小心者スレということなので投下してみます。
VC++ Expressでウインドウアプリを作っています。

(ファイル A.h)
class A{
public:
A();
vertial ~A();
};

(ファイル B.h)
#include ゙A.h゙
class B:public A{
public:
B();
~B();
};

(ファイル C.h)
#include ゙A.h゙
class C:public A{
public:
C();
~C();
};

この時、Aが再宣言されたとか、Aが未定義だとかでコンパイラに怒られます。なぜ

273:デフォルトの名無しさん
09/02/11 08:56:55
vertial ~A();

274:デフォルトの名無しさん
09/02/11 09:47:54
if文をやっと覚えたところでニコニコ動画のビットレート計算
というのがあったのでこれを参考に簡単なプログラムを作っていたのですが
コンパイルエラーはでないのですが、最後の部分を入力するとエラーで落ちます
何がいけないのでしょうか?

Source PW:c
URLリンク(www1.axfc.net)

275:274
09/02/11 10:01:04
最後のif文で演算子が抜けていますが
ここは >= にしていました

276:274
09/02/11 10:02:21
補足
>最後の部分を入力
プログラムを実行して順番に進んでいって最後の部分を入力

277:デフォルトの名無しさん
09/02/11 10:41:14
>>274
scanf("%d", movieb);

278:デフォルトの名無しさん
09/02/11 13:03:11
>>273
virtual A();の間違うぃ
スマネm(_ _)m


279:デフォルトの名無しさん
09/02/11 13:25:47
そういうくだらない間違いをする奴がレスに何を書こうとも、
実際のコードをきちんと再現できているとはとても思えない。
従って、再現するソースとエラーメッセージを貼るか、帰れ。

280:デフォルトの名無しさん
09/02/11 13:41:40
何を偉そうに

そっから推測できる間違いが指摘できねーんならそれこそカエレだ

281:デフォルトの名無しさん
09/02/11 13:48:51
>>280
別にあなたが指摘なさっても宜しくってよ。それとも、あなたご自身が指摘もできないで書いてらっしゃるとでも仰るのかしら?

282:デフォルトの名無しさん
09/02/11 14:15:15
はいそうです

283:デフォルトの名無しさん
09/02/11 14:17:36
知らレス

284:デフォルトの名無しさん
09/02/11 14:40:16
>>272
こうじゃね?

#ifndef _A_
#define _A_

class A{
public:
A();
virtual ~A();
};

#endif

285:デフォルトの名無しさん
09/02/11 15:15:46
>>284
神!


正直、#include ゙A.h゙してれば逝けるとおもてました。
(BCCでは#includeしてれば逝けてたから)
ありがとうございますた。


286:デフォルトの名無しさん
09/02/11 16:30:16
インクルードガードぐらい常識として知っておけ

287:デフォルトの名無しさん
09/02/11 18:54:22
>>284 予約識別子死ね。

288:デフォルトの名無しさん
09/02/11 20:22:41
>>277
scanf("%d", movieb);
という箇所が間違っているということでしょうか?
または、ある部分を上のように書き直せということでしょうか?

289:288
09/02/11 20:28:46
解決しました
&が抜けているということですね
スレ汚しすみませんでした

また、回答ありがとうございました

290:デフォルトの名無しさん
09/02/11 20:31:43
>>287
_A_ はプリプロセッサの識別子。C/C++の予約識別子には該当しないよ

291:デフォルトの名無しさん
09/02/11 20:40:50
>>290
ライブラリの実装に _A_ 使ってるところがあったらぶっ壊れるだろうが。

292:デフォルトの名無しさん
09/02/11 20:45:53
あたま悪いの?

293:デフォルトの名無しさん
09/02/11 20:54:32
>>290
何を根拠にそんなことを言うのかね。

ISO C (draft n1336)
7.1.3 Reserved identifiers p2 にはマクロ定義についても明示的に禁止されてる。
> If the program declares or defines an identifier in a
> context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved
> identifier as a macro name, the behavior is undefined.

ISO C++ にはマクロ定義について明示的な記述は無いようだけど、 >291 があるから
やっぱりダメだろう。

294:デフォルトの名無しさん
09/02/11 22:11:00
どうせ、VCかgccしかつかわないもん。

295:デフォルトの名無しさん
09/02/12 05:49:25
#ifndef _A_
#define _A_
  :
#endifと、
#pragma onceは同じ意味じゃないの?

296:デフォルトの名無しさん
09/02/12 05:55:30
いいえ、後者は一部の処理系でしか使えません。

297:デフォルトの名無しさん
09/02/12 05:57:16
>>295
VC厨はこれだから・・・

298:デフォルトの名無しさん
09/02/12 07:53:33
VC厨扱いしていただけるなんて光栄でごぜえます。

299:デフォルトの名無しさん
09/02/12 09:08:54
>>297
gccでもCodeWarriorでも使えるし
PC向けのメジャーなコンパイル環境で使えないのはbccくらいなんだが
ポータビリティ意識して書くのは当然としても、
>VC厨はこれだから…
ってどういうこと?


300:デフォルトの名無しさん
09/02/12 22:48:59
>>299
CodeWarriorってタダで使えるの?
wikipediaで見たらかなりのプラットホームをサポートしてるみたいだから
使ってみたいのだが

301:デフォルトの名無しさん
09/02/13 00:16:57
>>300
コンシューマゲームの開発やってると、無料でダウンロードできる場合もある
俺が使ったのはこのパターン。
すまんが小売してるかどうかは知らん。
とりあえず使いにくいことは確か。

302:デフォルトの名無しさん
09/02/13 00:18:57
>>299
#pragma onceがおそらくVC発祥だからでしょ。
#ifdef _MSC_VER >= 1020で囲むコードを良く見かけるし、
まだまだVC限定のイメージが拭いきれていないと思う。

303:デフォルトの名無しさん
09/02/13 09:03:50
>>302

> #ifdef _MSC_VER >= 1020で囲むコードを良く見かけるし、
すまんが意味がわからない。
コンパイラによってifdefとpragma onceを切り替えるコードがあるって話?(なわけないか)
VC限定のイメージとの関係は?


304:デフォルトの名無しさん
09/02/13 09:08:11
つーか、ifdefで比較演算ってなんだよw
とは思った。

>>303
pragma onceは厳密には全く違う意味に解釈される可能性もあるから、
使えるコンパイラを限定することに意味はないわけでもない。

305:デフォルトの名無しさん
09/02/13 14:55:58
>>304
意味ないだろ
それならifdefだけで十分なんだから。

306:デフォルトの名無しさん
09/02/13 15:26:48
>>305
古い MSC には #pragma once がなかったんじゃないの?そのための比較だと思うけど。

307:デフォルトの名無しさん
09/02/13 15:59:56
>>303
ごめん間違えた。正しくはこんな感じ。見ない?
#if _MSC_VER >= 1020
#pragma once
#endif

308:デフォルトの名無しさん
09/02/13 18:14:42
>>307
全く答えになってないんだがww

309:デフォルトの名無しさん
09/02/13 22:15:10
素直にインクルードガードしとけってことだ!!

310:デフォルトの名無しさん
09/02/13 22:50:41
#ifndef _strcpy
#define _strcpy
int _strcpy(){return 0;}
#endif

311:赤西仁
09/02/13 22:57:03
1年間悩んでます。お力をお貸しください。

アークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。

◆試してダメだったこと

 ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
 (ちなみに他のゲームはほとんど抽出可能)

◆教わったこと

 ・アークザラッドUは独自の画像形式を使っているから抽出できない。
 ・PS上で表示されてるということは絶対に摘出はできるはず。

◆抽出は不可能ではないということを知ったとき

 2ちゃんねるで質問したところ、
 ある方が実際にキャラクターの歩行画像を抽出して
 私が立てたスレにアップしてくださいました。

スクリーンショットじゃ嫌なんです。どうか皆さん、お力をお貸しください。

312:デフォルトの名無しさん
09/02/13 23:44:15
マルチ失せろ。

313:デフォルトの名無しさん
09/02/14 00:00:30
>>306
コンパイラの種類/バージョンチェック云々以前の話なんだが、わかってるか?
VCでifdefやifndefが使えないわけじゃあるまいし、
あえてpragma onceを混ぜる理由が無いだろ


314:デフォルトの名無しさん
09/02/14 00:05:42
普通のインクルードガードと307みたいなVC限定でpragma onceを組み合わせて使うコードの存在が、
#pragma onceがあたかもVC限定かのように思わせるのではないかと言いたいんだけど

315:313
09/02/14 01:00:52
>>314
>>306なの?
横レスで他人へのレスをされても噛み合わないレスしか返せないぞ

316:306
09/02/14 04:46:01
>>313
マクロによるインクルードガードでは2回目もファイルを開いて少なくともインクルードガードを
読む必要がある。 #pragma once なら2回目以降ファイルを開かずにスキップするような実装が
考えられる。

そのため、インクルードガードを置いて移植性を持たせつつ、特定のコンパイラでの
コンパイル時間を短縮する目的で #pragma once を置くことが考えられる。

URLリンク(en.wikipedia.org)

317:デフォルトの名無しさん
09/02/14 12:32:24
おまいら
                       ._,,,,,,。,,、       广'x、   ,,、._    」'゙''i、
     ,,,,,_.,,,,、广゚┐     .,,,v―冖"~゛   ゙'i、      .ト  ,|,_  riゃ .}   .,i´ '冖i、
     .] ` f゙,l° ,i´     .゙l_ .y-┐ 'や'゙"゙’    _,,,vr"   .゙ト.゙'x,,,,广 ィ・'''゙~  .._,,v・゚ヒ''''・x、
     入、rУ ,iレ-v,,,、   .,r°."'''l゙  ,|√゙゚'i、   匸 ._  .y・'゙゚,,,v―-,  .:゚ーa  .√ ._,rll_  :}
  .,r''y|゛゙゙l..,i´ ,i"゙l,  .゙ト  ,r°,,,  ..,  ._,,vぐ    .`√ .,i´l广._,,,,,,,,i´  ,,i´ ,i´ ,「 .:| .~''''″
 .r″ .|゙l、 “ .,i″.yi入-イ  il∠i、.` .,メ|  |   」'ト   .,,i´ .,i´ ,, ̄      .[  .,i´.,,,,,,! .]_
 .゙l_,i´,レ  .'_,,,,レ ~''┐   .,r°.,i´.|  .|   ,l゙ :゙l、 ,,i´ ,i´ l゜.゚L__   .:―ヤ゚″_   :~''=、
   .,r″.,x=,,      .,i´  ,x'".,,x'″ .゙l、 ゙冖''″ .] |  .,i´ .゙l,    .~1   .゚L '゙〃 ,n, .,,}
  .,l彡'''″  .゙~"''''''''''"゜  .テ''~゛    .:゚'―---―・° ―″   .~''¬―'″    .:゚=_,r

318:デフォルトの名無しさん
09/02/16 17:47:44
皆様こんばんは。
VC++ ExpressEditionでのリーソスの事について質問させてくダサイ。

(Resource.h)
#define GAZOU000 1000
#define GAZOU001 GAZOU000 + 1
   :    :
   :    :
#define GAZOU030 GAZOU001 + 030

(Resource.rc)
GAZOU000 BITMAP "bmp000.bmp"
   :    :
   :    :
GAZOU030 BITMAP "bmp030.bmp"


これでビルドしようとしたら
.\Resource.rc(5) : error RC2135 : file not foundみたいなのが
ズラズラズラ〜〜〜っと出てきました。

仕方が無いのでResource.hの、
#define GAZOU030 GAZOU000 + 30みたいに記述しているのを
全部#define GAZOU030 1030のように書き直したらビルドできました。

なぜ最初の書き方でダメだったんですか

319:デフォルトの名無しさん
09/02/16 21:07:15
最初の書き方だと、
GAZOU001 BITMAP "bmp001.bmp"
のGAZOU001をマクロ展開すると、
1000 + 1 BITMAP "bmp000.bmp"
になるだろ?リソースファイルはスペースを区切りと扱うので、正しく認識できなくなる。

320:デフォルトの名無しさん
09/02/16 21:57:46
>>319
えー!そうなんですか〜
初歩的ミスだったのですね。お恥ずかしい・・・

でも、お蔭様で、またひとつ勉強になりました。
ありがとうございました。

321:デフォルトの名無しさん
09/02/16 22:04:41
>>316
大抵の場合、フルビルドを立て続けにやることはなく、プリコンパイルヘッダの効果で意味がないと思われ

322:デフォルトの名無しさん
09/02/16 22:37:19
google C++コーディングスタイルに、
cppファイルの無名名前空間の使用は推奨されてたのですが
理由はなぜでしょうか。cppファイルは別に何をやってもいいような。
cppファイルですらusing使うのは駄目なの?

323:デフォルトの名無しさん
09/02/16 23:46:37
>>322
ほかのcppファイルから見える必要のないものを隠すために使えという意図だと思う。
同じ目的で、名前空間上のstaticも使えるけど、
一般的に、この意味ではstaticより無名名前空間のほうが推奨されている。

324:デフォルトの名無しさん
09/02/16 23:57:52
static指定のかわりですか、なるほど。
名前空間上の関数定義だったら別だけど
クラスのメンバ定義だけしか書かない分には
気にしなくてもいいのかな。

>staticより無名名前空間のほうが推奨されている。
これは等価だと理解してましたが、なぜでしょう。
どっちも他のファイルからは見えないのに?

325:デフォルトの名無しさん
09/02/17 00:39:05
>>324
もともとC/C++のstaticに静的記憶期間とファイル内って2つ意味があるのはややこしいから、
後者の意味を分離しようという動機で無名名前空間が導入されたという経緯がある。
だから大事に使ってあげてねと言うわけ。

326:デフォルトの名無しさん
09/02/17 03:30:11
>>324
C++ ではオーバーロードやテンプレートの関係で、クラス名などもグローバルな定義の
識別に使われるので、関数や変数以外に class, struct, enum も別々の .cpp で同じ
名前空間内に同じ名前のものを定義するとマズイ。これが無名名前空間で解消できる。

327:デフォルトの名無しさん
09/02/21 02:20:15
お題。

ISO/IEC 14882:2003とXLib、Win32APIの範囲内でスクラッチからエディタを作る。
Win32、XLibともに標準C++ライブラリとかぶる機能があるが、この場合
標準C++を優先して使う。
これは、少しでも移植性を高めるための努力と考えてほしい。
また、拡張性の担保ともなりうる。

これは時間かかるけど、やりがいあるよ?

328:デフォルトの名無しさん
09/02/21 02:56:40
なんだコピペだったのか。

329:デフォルトの名無しさん
09/02/21 03:02:01
まずISO/IEC 14882:2003がなんなのか調べるのめんどくせえから挫折
→XlibかWin32?どうせなら両立できるwxだろと意気込むがインストール失敗して挫折
→そもそも標準C++が分からなくて挫折
→努力なんかできなくて挫折
→わたるが死んじゃう!(自殺)

330:デフォルトの名無しさん
09/04/11 22:30:51
すいません
CとC++を実践の中で学びたいのですが
なにを作ればいいか、というよりなにをその言語で作れるのか漠然として・・・
JavaやC#のようなオブジェクト指向言語ならイメージ浮かびやすいんですけど
コンソールだとコントロール等がないのでどうしても・・・

331:デフォルトの名無しさん
09/04/12 00:19:13
C++もオブジェクト指向言語なんだが・・・

332:デフォルトの名無しさん
09/04/12 09:37:07
つーか、好きにライブラリを選べばいいのがC/C++流。

333:330
09/04/12 10:24:27
そういやC++もオブジェクト指向言語でしたw
まだイメージができないあたり、ライブラリの知識が不足しているようですね。

334:デフォルトの名無しさん
09/04/12 10:29:32
ライブラリの前にオブジェクト指向と言語仕様の知識も不足してる

335:デフォルトの名無しさん
09/04/12 11:54:22
それを言ったら情報工学の基礎から何から全部だろう
ポトペタでさくさく作っている間は必要のない知識だ

336:デフォルトの名無しさん
09/04/12 12:45:19
なんだポトペタって。

337:デフォルトの名無しさん
09/04/12 19:33:18
一覧からマウスで選択したコントロールをフォームに
ポトっと落とすとペタっと張り付く機能やそれを備えたIDEのこと

338:デフォルトの名無しさん
09/04/13 00:50:39
Stringクラス的なものを参考すればいいんじゃね?
まさにコントロールじゃない目に見えないクラスオブジェクト。

339:トミー ◆xb8eIST5.k
09/04/25 20:19:22
>>182
ぼくもそれをダウンロードして使ってみました。
うまくいきそうです。
どうもありがとうございました!

340:トミー ◆xb8eIST5.k
09/04/25 20:21:25
>>339はこのスレの>>155です。

341:デフォルトの名無しさん
09/05/10 22:02:48
ここはvc++は駄目かえ?

342:デフォルトの名無しさん
09/06/07 16:31:54
正の数であれば、小数点以下を四捨五入する場合、0.5を足して、intで切り捨てればいいのですが、
負の数も含めて、四捨五入をする場合、どのようなコードを書けばよいのでしょうか?

343:デフォルトの名無しさん
09/06/07 19:14:53
GUIアプリを作るのにC++を勉強しようと思っているのですが
VC++EEとBCCどっちが作り易いですか?
また言語自体はどちらも同じですか?


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

4854日前に更新/246 KB
担当:undef