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

C言語なら、俺に聞け! <32>

■ このスレッドは過去ログ倉庫に格納されています
0001SHOW-A孫NGNG
漏れ10才。3才のときから父SHOW-A息子にプログラムを叩き込まれてきたんだ。
いろいろな言語を極めたけど、一番漏れになじんだのはCかな。
Cのことなら父をも超えた。疑問な点があったら漏れに聞け。

便所とメシ食ってる時以外は暇だが、いちいちFAQに載った質問に応えるほど暇じゃないよ。
課題丸投げなら別スレにいってね。あと、至急父に仕事を与えてやってください。

コンパイラ、過去ログなどのリンクは>>2-5 あたり
0153119NGNG
>>152
あれだめぽ
ごめん
0154デフォルトの名無しさんNGNG
GlobalFree(this); ってのは…?
0155デフォルトの名無しさんNGNG
>>150
中途半端すぎて笑える。何故
TreeObj<T> **pChild;
なんだ? std::vectorを使用しない理由は?
0156デフォルトの名無しさんNGNG
std::mapが木構造を使っているのは有名な話だと思っていたんだが。
上まあスレ違いなわけだが。苦笑。
0157155NGNG
・メンバ変数はコンストラクタの初期化リストで初期化しましょうね
・コピーコンストラクタを、実装するかは別にして書きましょうね
・operator=の戻り、おかしいですよ?
・addChildの引数は値渡しでいいんですか?

以下延々と続く…

0158デフォルトの名無しさんNGNG
ちなみに delete this は気をつければ危険ではないよ。
object suicide という。
0159119NGNG
>>154
TreeObj.cppは捨てて下さい
>>155
>>156
VC5.0だとvectorは自己参照ポインタ使うと引っかかるんですよ
メモリの動的確保も練習したいし
んでmap使うと習作の意味がなくなるんで
0160155NGNG
>>159
STLPort入れろって
0161119NGNG
>>157
はい参照渡しでないと大量コピーが起こります
=の戻りおかしいですか?
0162デフォルトの名無しさんNGNG
>>154
>GlobalFree(this); ってのは…?
そういえば MS 社は WinAPI::waveOut*** のサンプルで
HeapAlloc() 使ってるけどよそのサイトでは malloc で済ませてる
ところもあるんだけど、malloc じゃダメなのかな。
0163155NGNG
一般的には TreeObj<T>& operator=(ほげ); で定義して
return (*this); ね。

多分Effective C++かMore Effective C++に載ってる。
0164155NGNG
夜が明けるのでスレ違いはこのへんでやめます。ゴメンナサイ。
0165デフォルトの名無しさんNGNG
// 子供から先に解放していく
while(ChildNum) (*pChild)->del();

これ大丈夫なん?
0166119NGNG
>>163
ほげはどう使うんですか?
漏れには無変化に思えてしまうのですが・・・
=(ほげ){Obj=ほげ;return(*this);}
ですか?
0167162NGNG
ねぇ誰か教えてよ
0168119NGNG
>>165
それは大丈夫なはず(弱気
子供が解放されると親のChildNumが減ってくから
常に先頭の子供を解放してやればいいはず
0169155NGNG
最後ね。もしくは別スレに移動してくれ。
return (*this); しないと

TreeObj<std::string> x, y;
x = y = "foo";

の2行目がコンパイルできないだろう?
0170119NGNG
>>169
ああ、そうですね勉強になりました

聞きたいことはまだありますがやめときます
スレ違いだけど燃料になりましたか?
0171デフォルトの名無しさんNGNG
卑屈になんなよ(ワラ
個人的には全部ディープコピーってあたりが漢だねぇって感じだヨ
0172デフォルトの名無しさんNGNG
楽しいときには邪魔がはいるものだねぇ
0173119NGNG
>>172
C++スレ行ってしばいてくれるんなら行きますが(自爆
行きますか?
0174デフォルトの名無しさんNGNG
相手が教えてクンだと盛りあがりに欠けるねぇ・・・
燃料になんないよ
0175デフォルトの名無しさんNGNG
>174
NULL紛争でも起こしたいのか?(藁
0176デフォルトの名無しさんNGNG
>>174
http://pc3.2ch.net/test/read.cgi/tech/1031028125/
銭湯員随時募集中
0177119NGNG
隠蔽とかクラスとか無理矢理実装できるけどそれは置いといて
Cの標準的な文法で比較的分かりにくいのって
ポインタと再帰呼び出しくらいですよね
0178デフォルトの名無しさんNGNG
> 再帰呼び出し
文法関係ない
0179119NGNG
>>178
書き方誤り
文法->手法
これならどう?
0180デフォルトの名無しさんNGNG
>>119
わかりにくいならsignal()の定義はなかなかのものだと思う
0181119NGNG
>>180
WinProcもsignalも似たようなもんじゃない
漏れはDOS時代にint86使ってたけど確かに割り込みは敷居高いかも
0182119NGNG
>>181
WinProcつーかThreadProc
0183デフォルトの名無しさんNGNG
>>181
void (*signal(int sig,void (*func)(int)))(int);
まあ似たようなもんですが
WinProcなら LRESULT CALLBACK (*WinProc)(HWND ...); ですかね
0184119NGNG
int86に比べてThreadのEvent定義って若干使いやすくなったよーな
これも進化ですかね
0185デフォルトの名無しさんNGNG
燃料の意味を考えよう
0186デフォルトの名無しさんNGNG
おならぷー
0187119NGNG
>>185
うんだから必死だよ(w
多分木言われたとこ直してみたり(まぁ、相変わらずmemcpy()使ってないが
Cでのクラス実装で突っ走ったこと逝ったりすればいいのかな
0188119NGNG
あ、子供ポインタリストリークしてた
逝ってきます
0189デフォルトの名無しさんNGNG
インクリメントとデクリメントって
0190デフォルトの名無しさんNGNG
大分出身なの知ってました?
0191デフォルトの名無しさんNGNG
>>189
++,--

>>190
なんとなく言動で気づいていました。
0192セミコロンってどうよ?NGNG
セミコロンってどうよ?
0193デフォルトの名無しさんNGNG
>>192
そうか、もう秋なんだね。
0194デフォルトの名無しさんNGNG
>>193
そっちか 風流だなぁ
おれはセミの匂いのするコロンかと思ったよ
0195155NGNG
>>187
http://www.sage-p.com/process/cool.htm
これで書け(藁
0196 ◆ZMVdytmo NGNG
int a = 123;ってなってるのをchar s[10]に文字列123としていれる方法を教えてください。
0197デフォルトの名無しさんNGNG
voidには教えたくない
0198 ◆ZMVdytmo NGNG
>>197
そこをなんとか教えてください
0199デフォルトの名無しさんNGNG
>>196
だからぁ〜
aを10で割ると余りはどうなるよ?アレになるっしょ?そんな感じで...
0200デフォルトの名無しさんNGNG
>>199
なるほど!
ありがとうございました
0201119NGNG
コンパイルしないで直接書いてるんでバグったらごめん
for文の継続条件ちょっと違うかも。でもこんなかんじだとおもわれ
char *hoge(int a)
{
  static char str[256];
  int i,j,k;
  //桁拾い
  for(i=0,j=a;j>0;i++,j/=10);
  //代入
  for(j=0,k=a;j<i;j++,k/=10) str[j]=k%10+'0';
  return(str);
}
0202119NGNG
>>201
あれ桁拾いは要らなかったけ?
0203155NGNG
>>201
なんで snprintf(s, 10, "%d", i); じゃいけないんだ?
0204119NGNG
>>203
実装方法知ってると改造できるでしょ
例えば、printf()でQWORDを表示したり・・・

つーかすいませんsnprintf()知りませんでした
0205デフォルトの名無しさんNGNG
sprintfでいいじゃん・・・>>203
0206デフォルトの名無しさんNGNG
>>205
DQN
0207201NGNG
ぐはぁ、最後に'\0'入れ忘れますた
逝ってきます
0208デフォルトの名無しさんNGNG
>>206
オーバーフロウするかどうか判断できない方がDQN
0209201NGNG
それにa==0の時何も表示されなさそう
もっかい逝ってきます
0210201NGNG
>>208
オバーフローしないでしょ下げっぱなしなんだから
でもa<0の時は・・・
またまた逝ってきます
0211デフォルトの名無しさんNGNG
>>208
考え方がC-dog
終ってる

0212デフォルトの名無しさんNGNG
>>210
オーバーフロウってバッファオーバーフロウのことだよ。
0213155NGNG
>>208
LP32を仮定しろってことですか?
0214デフォルトの名無しさんNGNG
snprintf使ったら宣言のない関数の呼び出しと言われた上に、リンクエラーが発生しますた。
0215155NGNG
>>214
適宜読みかえてくださいな。僕はVC++は知らない。

0216201NGNG
>>212
int型で255桁は逝かないと思うが10桁は逝くね
0217デフォルトの名無しさんNGNG
>>216
255桁も10桁も逝くか逝かないかはintのビット数によるだろ。
0218155NGNG
というわけで、208には賛同しかねるってことで。

0219208NGNG
標準関数でできることは標準関数でやればいいと言っているだけなんだけど・・・
C99?しらん
0220201NGNG
>>217
現状ではintがそんなに大きいの無いと思われ
スパコンでだって10進256桁のintなんてメモリがひどいことになるよぅ
0221デフォルトの名無しさんNGNG
>>220
重箱の隅をつついてみただけだ。気にしないでくれ。
0222155NGNG
>>219,220
普段高級言語しか使わない身では考え方についていけない。
でかけます。さよならw
0223201NGNG
>>220
つーか10進256桁のintって楽しすぎ
biosからvramまで1つの転送で終わり?
0224デフォルトの名無しさんNGNG
itoaって標準関数だと思っていて、Linux+gccで使えなくて初めて標準関数じゃないと知った。
馬鹿だった・・・・
0225デフォルトの名無しさんNGNG
255桁のintはかんがえられんが、10桁ゆかないintなら考えられるな。
0226デフォルトの名無しさんNGNG
fp = fopen ("file", "r");// or fp = fopen ("file", "rb");
fseek (fp, 0, SEEK_END);
l = ftell (fp);
このコードってUNIX系でしか正しく動かないようなのですが
標準でファイルサイズを取得する方法はあるんですか?
0227デフォルトの名無しさんNGNG
>>226
Windowsでも正しく動くけど・・・
0228デフォルトの名無しさんNGNG
>>227
そうなんですか。
確かfseekにSEEK_ENDを指定したときはテキストモードでオープン
しないと動作は保証されないようなことを読んだことがあったので。
UNIXだとバイナリモードもテキストモードも同じなので"rb"でオープン
しても問題ないけど両方のモードが違ったときはまずいのかと思ってました。
0229デフォルトの名無しさんNGNG
>>228
じゃあバイナリモードで開けばいいでしょ・・・
0230デフォルトの名無しさんNGNG
>>229
いや、それだとだめってことなんですけど。
バイナリファイルの場合に。
0231デフォルトの名無しさんNGNG
whileとfgetcでファイルポインタを末尾までもってゆく。
0232デフォルトの名無しさんNGNG
>>230
「バイナリモードではfseekが正しく機能しない」?
とりあえず、、、

はつみみです

てか、困らない?
0233デフォルトの名無しさんNGNG
自分としては動作を保証するモードが逆だと思うんですけどね。
0234デフォルトの名無しさんNGNG
>>232
バイナリモードで「SEEK_ENDを指定した」場合です。
0235デフォルトの名無しさんNGNG
つか、>>228の思い込みだろ。あるいは、モードを逆に憶えているか

> 確かfseekにSEEK_ENDを指定したときはテキストモードでオープン
> しないと動作は保証されないようなことを読んだことがあったので。
0236デフォルトの名無しさんNGNG
とりあえず >>228 はうろおぼえみたいだから、
SEEK_END ともう一つ別の方法でファイルサイズをとってみて、
食い違うっていう例を、自分のハードディスクの中でみつけてから
逝ってくれ
0237デフォルトの名無しさんNGNG
http://www.bohyoh.com/CandCPP/C/Library/fseek.html
これはいま検索したんですが今までもおかしいと思っていたので
複数あたっていました。
0238デフォルトの名無しさんNGNG
>>237
この記述も俄かには信じがたいけど、「サポートしなくてもいい」って意味だよね
じゃあ、特定のライブラリの仕様を確認すればいいんじゃないの?

少なくとも、↓ここには変なことは書いてない
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_fseek.asp
023916NGNG
みなさん沢山のレスをどうもありがとうございます。
まずはレスの中身を理解してからレスします。

(休日出勤です。すこし寝過ぎました。)
0240デフォルトの名無しさんNGNG
>>238
書籍でも「C言語によるプログラミング スーパーレファレンス版」と
あと一冊名前を忘れてしまった本にも載ってました。
いまwindowsでgccでやってみたら問題なかったです。
以前 linux で libc の fopen のソースを見たら確かにモードを区別
していなかったのでそっちでは安心して使っていたんですが。
0241デフォルトの名無しさんNGNG
>>240
もしサポートしてなければ、たぶんエラーコードを返したりすると思うから、
それをはじけば問題ないんじゃない。まあ、まったく出鱈目な結果になるという
恐れもあるが。。
0242デフォルトの名無しさんNGNG
offsetof についての質問なのですが、

struct foo {
int member;
} foo;

とあるのをファイルに出力するときに、

foo f;
ptr = &f;
len = offsetof(f, member) + sizeof(int);

とやっているのがあるのですが、
これは、やっぱり構造体の padding を意識しているのでしょうか?(C FAQより)
とすると、メンバーを

struct foo {
int member;
long member2;
} foo;

と追加したときには、

ptr = &f;
len = offsetof(f, member) + sizeof(int) + sizeof(long);

とするのが正しいのでしょうか? それとも、

ptr = &f;
len = sizeof(struct foo);

とするのが正しいのでしょうか?
0243デフォルトの名無しさんNGNG
http://profiles.yahoo.co.jp/tengaiten2002
0244デフォルトの名無しさんNGNG
>>242
つまり、一番最後尾にあるかもしれない詰め物を、避けているってわけ?
だとすれば、member2が最後の要素なんだから、

ptr = &f;
len = offsetof(f, member2) + sizeof(f.member2);

こうじゃないの?最後の要素の末尾=全体の末尾
0245デフォルトの名無しさんNGNG
絵で描くと、
|member1|???|member2|???| (= f)
これを、ファイルの中では
|member1|???|member2|
これだけにしたいのでは?
0246explosion.cppNGNG
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Explosion.h"

#include "global.h"
#include "RenderTex.h"
#include "debug.h"
#include "RenderSprite3.h"
#include "d3dutil.h"
#include "sndset.h"
#include "sndid.h"
#include "TexSet.h"
#include "particle.h"
#include "sub.h"

#include "debug.h"
USE_TR;

//---------------------------------------------------------------------------
#pragma package(smart_init)
0247explosion.cppNGNG
//---------------------------------------------------------------------------
// 爆発・抽象基本クラス
//---------------------------------------------------------------------------

// 爆発クラスへのCasterを返す (DeleteClass用)
//static
const LAppCaster<CExplosion>& CExplosion::Caster()
{ SV
static LAppCaster<CExplosion> c;
return c;
}

// cter, dter
CExplosion::CExplosion()
:CAppObj(g->appMan)
{ SV
}

CExplosion::~CExplosion()
{ SV
}
0248explosion.cppNGNG
//---------------------------------------------------------------------------
// 普通の爆発
//---------------------------------------------------------------------------

static const intTEX_NUM = 9, TEX_NX=999;
static const CPointTEX_POS(0, 0);
static const CSizeTEX_SIZE(54, 54);
static const floatANIM_TIME = FPS30*4.0f;

CNormalExplosion::CNormalExplosion(const CVector3& pos, float size)
:CExplosion(),
mTime(0.0f), mIndex(0)
{ SV
mSpr.pos = g->camera->Proj2D(pos, 640.0f, 480.0f,
P2D_CENTER|P2D_CENTER, TEX_SIZE.cx*size, TEX_SIZE.cy*size);
mSpr.scale = CVector2(size, size);
mSpr.tex = g->texBomb;
mSpr.rect = CRect(TEX_POS, TEX_SIZE);
g->renderSprite->Add(&mSpr);
0249デフォルトの名無しさんNGNG
>>246 C++はスレ違い。それ以前に、長いソースはうpしろヴォケ
0250explosion.cppNGNG
for (int i=0; i<20; i++)
{
float cr, cg, cb;
// 一定の確率で、真っ白の火花
if ( g->rand(100) < 10 )
cr = cg = cb = 1.0f;
else // それ以外は適当な色
cr=frand(0.7f,1.0f), cg=frand(0.7f,1.0f), cb=frand(0.0f,1.0f);

CParticle::New(pos,
1.5f, 0.4f,
CVector3(-15.0f, -15.0f, -15.0f), CVector3(+15.0f, 15.0f, 15.0f),
CVector3(1.0f, 1.0f, 1.0f),
CParticle::Tex(CParticle::WHITE), 0.5f,
cr, cg, cb
);
}

g->sysSnd->Play(SE_HIT01); // 爆発音
}
0251デフォルトの名無しさんNGNG
>244-245
あーなるほど。最後の詰め物だけを除いているわけですか。
ふむふむ。そうかそうか。

ところで、こういうコーディングって一般的なんでしょうか?

いや、今回初めて見たんですけども、
最後の詰め物_だけ_を取ってる、ということは、
メンバーが増えれば増えるほどその意義は小さくなりますよね?

んー、やってることは分かったけど、
意図しているところが全然分からんちーん。

他の構造体では sizeof(struct bar) とかやってるし。
0252デフォルトの名無しさんNGNG
まあ、構造体をそのままの形で保存するって事自体、
あまりよくないと思うけどね。面倒でも適切なバイト列に変換する
手続きを書いた方がいいかと
■ このスレッドは過去ログ倉庫に格納されています