トップページ⇒tech
231コメント64KB

気付けば「何だ」と思うよーなMiss[c/c++]

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
こんなのどうでしょう。

CString s1, s2;
s1 += "aho" + '\n';
s2 = s2 + "aho" + '\n';

s1が駄目。
0002デフォルトの名無しさんNGNG
>>1
すんません。厨房なんで解説きぼん。
0003デフォルトの名無しさんNGNG
>>2
実際にMessageBoxとかしてみたらかくにんできるよん。

演算子の優先順位の関係で+=より先に+が評価される。

"aho"はCStringじゃないんで、アドレスの足し算
&("aho") + '\n'(0x0Aだったっけ?)をCString::operator+=
と言う形になる。

MessageBoxとかしたらごみが出たりするかも。
warningとかでないから見落としやすいっすね。
+の後ろが''なのがポイント。"aa"とかだったらコンパイルエラーになるから。

って、さっき他人に指摘されたんでえらそーなこといえないっすけど。(藁
0004デフォルトの名無しさんNGNG
if(a='3') と if(a=='3') の書き間違い。
これ減らすこと出来ないかな
0005デフォルトの名無しさんNGNG
>>4
if('3'==a)と書く癖をつけろ。
0006デフォルトの名無しさんNGNG
warningをちゃんと見ろ。
0007デフォルトの名無しさんNGNG
BOOL bHoge;

...

if (bHoge == TRUE)
{
...
}
とか。
TRUE == 1だけどBOOLが0以外を返却となっている時はシカトされる。
Win32API/MFCなんかでは要注意。

初期化不良の事も考えればboolにしてもありえる話。
bool b /*=0xcc*/とかね。
0008デフォルトの名無しさんNGNG
BOOL bA,bB;

bA=FuncA();
bB=FuncB();

if(bA==bB)
{
...
}

で泣いた事があります。
typedef int BOOL
なんだよね。
0009SAGENGNG
基底クラスのデストラクタに virtual を付け忘れてて…
0010デフォルトの名無しさんNGNG
>>5
それはよく言われるけど、
可読性が下がるから、多人数での開発ではあかんでしょ
0011デフォルトの名無しさんNGNG
大して CPU を食わないんだから、
成功失敗は、BOOL ではなく、
typedef int RESULT;
#define RET_SUCCESS 1
#define RET_FAILURE 0
とか定義して、
if( RET_SUCCESS == hoge()){
}
 とかしたほうがいいと思う。
「この関数って、0 と 1 のどっちが 成功だっけ? -1 か?」
って悩まなければいけないから。
0012デフォルトの名無しさんNGNG
>>9
あるねえ。
データメンバにクラス内でnewしてるようなオブジェクトあったりしたら
どこが原因なのか見つけにくいメモリリークとかあったりするんだよねえ。
0013デフォルトの名無しさんNGNG
char buf[] = "0000000000"/*実際は他の処理で文字列を取得*/
int num;

if( (num = atoi(buf)) == NULL )
return(FALSE);

ウツ出汁脳
0014デフォルトの名無しさんNGNG
>>10
チーム一丸となってそちらにすれば良いのでは?<if('3'==a)
むしろ慣れの問題(と思う)<可読性
タイトルに沿ってないのでsage
0015デフォルトの名無しさんNGNG
for(int i=0; i<10; i++);
{
…
}

0016デフォルトの名無しさんNGNG
class xstring {
 char *buf; // = new char[100]
public:
void operator=( PCSTR szSrc); // buf = szSrc;
operator char*() const { return buf;}
}

xstring str;
str = "hogehoge";

printf( "%s", str); // ×
printf( "%s", (char*)str); // ○

VC++ だと、勝手にキャストされるんだけど、
gcc ( 主にUN*X環境)だと、明示的にキャストしなければ
void* が採用されて、おかしくなる。
0017デフォルトの名無しさんNGNG
typedef struct AAA{
  int a;
  int b;
}
".c"で自作のヘッダをインクルードして使ってたんだけど、そのヘッダの最後がたまたま構造体定義で、最後の";"
が抜けてた。
コンパイルでエラーは出るが、コンパイラは".c"の方に間違いがあると言うので、気付きにくい。

0018デフォルトの名無しさんNGNG
>>15
やったよそれ。この間一日悩んだよ。
0019デフォルトの名無しさんNGNG
>>18
漏れも。デバッガでトレースしてても気づかないって…。
原因がわかったときには本気で廃業考えたヨ。鬱死。
0020あなたのうしろに名無しさんが・・・NGNG
>>14

そのバグってコーディングスタイルをねじ曲げるほど深刻なものなのか?

代入と比較を間違えるバグで悩むなんて、
ほんとうに初心者のころだけじゃないのか?
それにメジャーなコンパイラならたいてい警告出してくれるし。
0021デフォルトの名無しさんNGNG
>>19
うーん。俺それ無いなあ。
for(){}って先に括弧全部書きそろえてしまう癖が
ついてるせいかな。
あとfor();はハマルんでfor(){}って書くことにしてるし。

まぁこんなのEmacsとかの住人からすれば笑い話なんだろけど。
雛形(?)の自動生成とか検証とかに強いから。
#俺ぁvi(m)派。職場マシンに好きなエディタいれさせて貰えないのが痛い(T_T)
0022デフォルトの名無しさんNGNG
↑
おいらは、UNIX上の開発でも、基本的に開発用サーバーに Sambaを
入れて秀丸で開発してるよ・・・。
 vi は、conf を書き換えたりするときぐらいしか使わないし、
emacs は食わず嫌いだなぁ。覚えたほうがいいのは分かってるんだけどね。
0023デフォルトの名無しさんNGNG
>>20
まぁそうなんだけどね…
ただそうしたほうが個人的に「気休めになる」程度。
0024デフォルトの名無しさんNGNG
>>23
僕はif ('3' == a)でないと却って効率が悪くなってしまうように
なってしまいました。ちょっと鬱。

でも最近if (a == '3')と書けるようにリハビリしています。
ただ、今まで123 > aと書いていたものをa < 123と書くことが
結構苦痛だということに気付いたりして、さらに鬱。
0025デフォルトの名無しさんNGNG
int i, j;
for (i=0; i<10; i++)
{
 for (j=0; i<100; i++)
 {
  〜
 }
}

いまだに良くやる…
0026デフォルトの名無しさんNGNG
for(int i=0, i < n, i++){
  // なんたら〜
}
なぜかたまにやってしまう
0027デフォルトの名無しさんNGNG
>>26
コンパイルエラーは対象外っしょ。
0028デフォルトの名無しさんNGNG
>>25

漏れ漏れもー
0029デフォルトの名無しさんNGNG
>>25
ループ変数の廃止、いわゆるイテレータ、まんせー

ちと違うけど最近のdelphiの「ループ変数を勝手に操作したら
コンパイルエラー」っていう一見変な仕様は、
もしかしてそんな場面で役立っているんだろうか?

>>26
for (i=0,j=0;hoge;i++,j++){}
ならよく書くっす(^^;
なので、;と,を間違えたことは無いなあ俺。
0030デフォルトの名無しさんNGNG
DirectX使ってる人なら一度はあるはず。

LPDIRECTDRAWSURFACE surface1, surface2;

このLP定義って何の意味があるの?
紛らわしいだけなんだけど。
0031デフォルトの名無しさんNGNG
>>24
確かに逆に書くことは抵抗があるね。
0032デフォルトの名無しさんNGNG
>>30
でも最近の漏れはCの仕様のほうがおかしいとか思って居たり。
ポインターの宣言は「ある型のポインター変数」の宣言じゃなくて
「ある型のポインター型の変数」の宣言ってしたほうがすっきりすると
思う。
0033デフォルトの名無しさんNGNG
>>31
int型の変数とポインタを書くとき int a,*p; と書けるのが
便利だったんじゃないの。たぶん。
無駄なタイプはしないという考えならこっちも理があるな。
0034デフォルトの名無しさんNGNG
>>30

LPを付けとかないと、何も考えずに

DIRECTDRAWSURFACE surface;

とかやるポインタ厨房がゴキブリのように発生するためだと思われる。

この記述方式だとプログラムが作成された瞬間surfaceを作ろうとするはずだが、その時点ではまだDirectDrawオブジェクトすら出来ていない。
0035デフォルトの名無しさんNGNG
>>34
それ以前に、抽象クラスはインスタンス化できない、とかいわれて
コンパイルエラーになるはずだが。
003634NGNG
>>35
おぉ!そだね。
0037デフォルトの名無しさんNGNG
if (IsFoo()) HogeFunc(); HageFunc();

(HageFuncはIsFooの結果に関係なく常に実行される。)

case 1: Hoge(); Hage(); break;

みたいな感覚でついやってしまうことがあったり。

ぶら下がり文も「ぱっと見」気付きにくいバグの温床だね。
0038デフォルトの名無しさんNGNG
LPじゃなくてPにして欲しいと思ったり
0039デフォルトの名無しさんNGNG
漏れもぶら下がり文でよくやる・・

if( 判定1 )
  処理1;
  if( 判定A ){
    処理A;
    処理B;
  }
else
  処理2;

処理1と処理2は排他のつもり。
0040デフォルトの名無しさんNGNG
>>39
自分の場合、それを防ぐためにif/elseなどにはかならず{}を付けてます。(中身が1行でも)
0041デフォルトの名無しさんNGNG
>>40
俺もそう。スマートインデント機能のあるエディタだったら、if〜のあと
中身を書く前にまず{}を付けて、それから中を埋める。
0042デフォルトの名無しさんNGNG
}のつけ忘れで沢山コンパイルエラーでてきてしかもコンパイルする前にいじりまくってるからどこ直せばいいのかわからなくて冷や汗出る。
0043デフォルトの名無しさんNGNG
>>39
Flash5のActionScriptで、

if(a==1){
gotoAndPlay("start");
}

gotoAndPlay("loop");

この gotoAndPlay が goto文ではなく、gosub文だった訳で…。
(処理は"start"に飛ぶのだよ、実際)
「なんで"loop"部分が動くんだ!」と悩みましたとさ。
0044デフォルトの名無しさんNGNG
>>38
そのLPがWindowsの歴史を端的に表わしている。
0045デフォルトの名無しさんNGNG
Borland C++のエディタだと、"{"の上にカーソルを置いて
"Ctrl+["を押すと、そのカッコに対応した閉じカッコ"}"まで
ジャンプする機能があるので良く使っていた。
でもVisual C++で同じ機能が見つけられなくて困ってる。
そうゆう機能無いの?
0046デフォルトの名無しさんNGNG
>>45
ctrl+eな
0047デフォルトの名無しさんNGNG
STLのiteratorでend()が動くことを考慮しないでループして悩んだことあり。
たとえば、vectorで要素をerase()するとend()で孵ってくる値がずれる。

そういうケースで
vector<xx>::iterator it = hoge.begin();
vector<xx>::iterator itEnd = hoge.end();
for ( ; it != itEnd; ++it)
{
xxx
}
とかやったらはまるよ。
for ( ; it != nv.end());)
{
if (xxx)
{
delete *it;
nv.erase(it);
}
else
{
++it;
}
}
としないと遺憾。
0048デフォルトの名無しさんNGNG
>>7
if( bHoge ) {
...
}
にするとよろしかろう。
んでも、Javaだとエラーなんだよなぁ。
0049デフォルトの名無しさんNGNG
>>45
ctrl+]な
0050デフォルトの名無しさんNGNG
>>47 細かい揚げ足取りね。削除後にイテレータも更新しないとな。
for ( std::vector<Hoge>::iterator it=con.begin() ; it!=con.end() ; ) {
  if ( it->is逝って良し() ) {
    it = con.erase(it);
  }else{
    ++it;
  }
}
005147NGNG
>>50
んだね。すまそ。

ついでにインデント失敗もすまそ。
0052Java使いNGNG
>>48 なんでよ
普段つかいまくっとるけど。
(ちなみにJavaでは typedef int BOOL;なんかできないよ)
005348NGNG
>>52
あ、スマソ、boolだからいいのか。
intとかだとダメ、ということで。ひとつ。
0054ageNGNG
あげとこ。
0055>>33NGNG
タイプ数というよりマクロのためだと思う。
例えば:

#define errno (*_errno())
int errno;
0056デフォルトの名無しさんNGNG
SCROLLINFO si;
si.nPos = max(si.nMin, min(si.nMax-si.nPage, si.nPos));

si.nPos < 0で一周するので何でかなあ?と思って調べてみたら、
SCROLLINFO.nPageがunsignedだったこと(他はsigned)。

デバッグ出力がmin(100, -20)=100とか返してきたから、
一瞬戸惑ったよ。

si.nPos = max(si.nMin, min(si.nMax-(int)si.nPage, si.nPos));

と直した。
0057デフォルトの名無しさんNGNG
LPD3DDEVICE8 hoge;

if (hoge) hoge->Release, hoge = NULL;
0058デフォルトの名無しさんNGNG
CString oBBB;
CString oAAA = oAAA + oBBB;
0059デフォルトの名無しさんNGNG
float a,b;
a = func1();
b = func2();
// この時点でa,bともに0.9fだった
if( a==b )
{
  // ここ実行されない・・・
}

デバッガで見て同じ値だったと思ってても、実際には誤差があるんでイコールに
ならないんだよね。
誤差関連の処理ウザすぎ。
0060デフォルトの名無しさんNGNG
>>59
君のコードダサすぎ。
0061デフォルトの名無しさんNGNG
&nbsp; &nbsp; &nbsp; &nbsp; CString str("Hello, world!");
&nbsp; &nbsp; &nbsp; &nbsp; cout << str << endl;

自らの厨房ッぷりを痛感。
0062    NGNG
for (int i = 0; i < TEISUU; i++);
{
itteyoshi("はにゃ〜ん");
}
0063     NGNG
ががが、
>>15
と同じだった
鬱駄死膿
0064デフォルトの名無しさんNGNG
>>59
floatやdoubleを==で比較するのは、致命的だぞ。
笑ってすませないと思うのだが。
0065デフォルトの名無しさんNGNG
SHリンカーV5.xのオプティマイズリンカーは、アンダーバーから
始まるグローバルな関数が複数存在すると、どれかを選択して、
正常終了してしまう、とんでもないオプティマイズを行うソフト。
0066名無しやんNGNG
switch (state) {
STATE1:
....
break;

STATE2:
....
break;

default:
break;
}

ごくたまにやってしまう。
0067デフォルトの名無しさんNGNG
switch(hoge) {
...
defalt:
// なぜとおらんのや!?
}
で1日悩んだ。
006866NGNG
ある意味、同士だね!
006966NGNG
ある意味、同志だね!
007066NGNG
ある種、同士だね!
007166NGNG
ある意味、同志だね!
007266NGNG
すまん、わけわからんことしちまった。
sage。
0073デフォルトの名無しさんNGNG
if(theAddr = 1)
result = Pack(theAddr);

return result;

結果が変なので、デバックを繰り返し、どうやらresultの値がおかしい。
ってとこまで突き止めたんだけど、何がダメなのか分からず、約一時間も
悩んでしまった・・・。

「ちょっと休憩しよう」ってことで、お昼を食べて、くつろいだ後、
もう一度みたら、一瞬でミスを見つけた。あの、一時間がもったいない・・・。
007473NGNG
ちなみに、

if (theAddr == 1)

が正しいです。
0075デフォルトの名無しさんNGNG
ダイアログプロシジャーで

switch(message){
  case WM_INITDIALOG:
//   aaa();
//   break;
  case WM_COMMAND:
    EndDialog(hDlg);
    break;
}

ダイアログが出なくて1時間悩んだ。
0076デフォルトの名無しさんNGNG
スコープの違う同名ローカル変数とか。

int nHage = 100100;
...
if (jyoken)
{
  int nHage;
  ASSERT(nHage == 100100);
}
0077デフォルトの名無しさんNGNG
if(a =! NULL)
{
  //処理
}

テストプロでやってしまった。
0078デフォルトの名無しさんNGNG
vector<vector<oneType>> hoge;
0079古いんだけどNGNG
>>16
class xstring {
 char *buf; // = new char[100]
public:
void operator=( PCSTR szSrc); // buf = szSrc;
operator char*() const { return buf;}
}

xstring str;
str = "hogehoge";

printf( "%s", str); // ×
printf( "%s", (char*)str); // ○

VC++ だと、勝手にキャストされるんだけど、
gcc ( 主にUN*X環境)だと、明示的にキャストしなければ
void* が採用されて、おかしくなる。



これなんだけど、なぜこうなるかというと、printfの可変数引数の実装の違いに
よって現れる現象では? extern int printf(char *s, ...); の...を、char *
で受け取るかvoid *で受け取るかの違いだね。char *で受け取るVC++の仕様は
operator char* () が呼び出されて、void *で受け取るg++はそのまま渡すように
なってるんだろう。

月並みな結論だけど、iostreamを使えってとこなんだろうね。
printfを使うなら明示的なキャストをすることで実装の違いをカバーできる。
0080デフォルトの名無しさんNGNG
初期化
const int arraySize;
int array[arraySize];
memset( array, 0, sizeof(arraySize) ); // ×
0081デフォルトの名無しさんNGNG
ちょっとずれるけど、
VC6.0の「変数」にポインタを移動させる
関数をいれてしまった。
で、ブレークポイントをで泊まる度にずれる。
あの頃は若かった・・・。
0082デフォルトの名無しさんNGNG
>>79
VC++ ではそのまま値渡しで渡ってるんじゃない?

可変長引数に class 渡したときに、char* にキャストされたり
void* にキャストされたりする、って仕様にありましたっけ?
0083デフォルトの名無しさんNGNG
>>79
ばーか。
可変引数の関数が暗黙の型変換なんてしてくれねーだろ。
なにも指定しないとコンパイラは単に値をintの大きさだと思いこむだけだよ
勝手に変換されるのはVisualC++で都合良いってだけ
ポインタ値がvoid*に変換されるのはgccの都合
0084デフォルトの名無しさんNGNG
>>78
ごめん、なにがいけないのかわからない。。。
スペース?
0085デフォルトの名無しさんNGNG
>>83
何でint?。この場合xstringの値渡しでしょう。
単に先頭のメンバ変数がchar*だから運がよければ
char*としてbufを取得できるって話では?
キャストは無関係。
008678NGNG
>>84
わかってるじゃん。
0087デフォルトの名無しさんNGNG
84>>86
あれ、なんでスペースを入れないとコンパイルを通らないのか未だに解らないんですが。。。
0088デフォルトの名無しさんNGNG
C/C++のトークン切り出しは最長一致法だから。>87
>>だと右シフトと解釈される。
templateの構文は設計ミス。アホだねぇ。
0089デフォルトの名無しさんNGNG
>>88
あああ、なるほど。アホだ。でも、知らないと気づかんわ。
0090デフォルトの名無しさんNGNG
アホな設計age
0091デフォルトの名無しさんNGNG
if(func()==TRUE){
...//アレ?
}
funcの返り血はintだった。
0092デフォルトの名無しさんNGNG
普通TRUEとは比較しない。FALSEとするモノ。>91
(スレ違いですが、scheme言語は#f以外はtrueです。nilさえもtrue)
0093デフォルトの名無しさんNGNG
(当然、数字の0もschemeではtrueです。とにかく#f以外はtrue。)
(ちなみに#fはfalseのschemeでの外部表現)
(boolean型が最初から定義されてる言語は>>91みたいな変なことに悩まなくて良いよ。)
(C++のboolean型は登場するのが遅すぎた感があるね。)
0094デフォルトの名無しさんNGNG
いやぁ、やっちゃいました。趣旨だけ抜くとこんなの。

char buf[256];
unsigned int i;

for( i = 255; i >= 0; --i ){
  buf[i];
}
0095デフォルトの名無しさんNGNG
アンダーフローか。>94
イテレータ使えば起らないミス。
0096デフォルトの名無しさんNGNG
ここ最近ミスはないな。一発コンパイル、一発動作。
ソフトウェア開発環境も研究されて、昔よりずいぶん良くなったもんだ。
009794NGNG
>>95
了解、なるべくvectorでもつかっときます。
0098デフォルトの名無しさんNGNG
>>95はHelloWorldを覚えたばかりの利有消防です。
0099久しぶりのCNGNG
C言語の文字列処理って大変よね。
char a[50], b[50];
1:文字列を結合したくって・・・
c = a + b;
strcat()しなきゃダメなのね。

2:文字列が等しいかを確かめたくって・・・
if(a == b){...
strcmp()しなきゃダメなのね。
0100100NGNG
100あげ
0101デフォルトの名無しさんNGNG
>>99
ハァ?菜に言ってんだ?2はそれif(a == b){... で正解だろ(藁
まったくこういう奴がいるから俺みたいなのが苦労するんだよなぁ・・
■ このスレッドは過去ログ倉庫に格納されています