CListCtrlの使い方・・・

[戻る]
KENBO 2006/06/09(金) 11:24:27
VC6 XP ダイアログベースです。

リストコントロール(レポート)に1行に4列ある。
1行に文字列を表示したい。
しかし、
以下の関数を実行すると死にます。
この関数は1行分の表示を行なう関数です。
死ぬ理由がわからなくて・・・
間違いはないはずなんですけど・・
誰か何かわかりませんか?

void CLogControlDlg::DispLogData_ListCtl(DWORD index, LOG_INFO *pLog)
{
    LV_ITEM item;
    CString str;
    TIME_INFO *pTim;

    // 表示する行番号の設定
    item.iItem = index;

    // 行の背景色を設定する
    switch( pLog->ErrClass ){
    case ERROR_PRIORITY_W:
        item.lParam = RGB(255,255,0);    // 黄
        break;
    case ERROR_PRIORITY_E:
        item.lParam = RGB(255,0,0);        // 赤
        break;
    default:
        item.lParam = RGB(255,255,255);    // 白
        break;
    }

    // ログ番号表示(1列目)
    item.iSubItem    = 0;
    item.mask        = LVIF_TEXT | LVIF_PARAM;
    str.Format("%5d",index+1);
    item.pszText    = str.GetBuffer(0x100);
    str.ReleaseBuffer(-1);
    m_LstCtl_Ctrl.InsertItem(&item);

    // 時刻表示(2列目)
    item.mask        = LVIF_TEXT;
    item.iSubItem    = 1;
    pTim = (TIME_INFO *)&(pLog->time);
    str.Format("%04d/%02d/%02d %02d:%02d:%02d.%03d",pTim->year,pTim-
>month,pTim->day,pTim->hour,pTim->min,pTim->sec,pTim->ms);
    item.pszText    = str.GetBuffer(0x100);
    str.ReleaseBuffer(-1);
    m_LstCtl_Ctrl.SetItem(&item);

    // 識別コード(3列目)
    item.mask        = LVIF_TEXT;
    item.iSubItem    = 2;
    str.Format("%s",(1<=pLog->code && pLog->code<=6)? pSikibetuCode[pLog-
>code] : msg_Fumei );
    item.pszText    = str.GetBuffer(0x100);
    str.ReleaseBuffer(-1);
    m_LstCtl_Ctrl.SetItem(&item);

    // ログ情報(4列目)
    item.mask        = LVIF_TEXT;
    item.iSubItem    = 3;
    switch( pLog->code ){
    case ERROR_ID_MAIN:
    str.Format("%s",(0<=pLog->ErrType && pLog->ErrType<=2)? pMainData
[pLog->ErrType] : msg_Fumei );
        break;

    case ERROR_ID_RS232:
    case ERROR_ID_RS422:
        str.Format("%s",(0<=pLog->ErrType && pLog->ErrType<=17)? pRs232422
[pLog->ErrType] : msg_Fumei );
        break;

    case ERROR_ID_HOUCYOU:
        str.Format("%s",(0<=pLog->ErrType && pLog->ErrType<=15)? pHoucyou[pLog-
>ErrType] : msg_Fumei );
        break;

    case ERROR_ID_TCPIP:
        str.Format("%s",(0<=pLog->ErrType && pLog->ErrType<=4)? pTcpIp[pLog-
>ErrType] : msg_Fumei );
        break;

    case ERROR_ID_CMD:
        str.Format("%s",msg_Cmd);
        break;

    default:
        str.Format("%s",msg_CodeErr);
    }
    item.pszText = str.GetBuffer(0x100);
    str.ReleaseBuffer(-1);
    m_LstCtl_Ctrl.SetItem(&item);
}

てんてく 2006/06/09(金) 11:49:14
回答とは違いますけど
この関数の どこで エラーが発生するのかデバッグはしてみましたか?
まずはそこからだと思いますが。

シャノン 2006/06/09(金) 11:52:44
「死ぬ」とは、何を指していますか?
おそらく実行時エラーなのでしょうけど、そのエラーの内容は?
また、ステップ実行してみて、どこで死んでいるのかを突き止めてください。
すぐにわかる注意点としては…CString::GetBuffer はそうやって使うものじゃありませ
ん。

> 間違いはないはずなんですけど・・

十中八九、コードの間違いです。

KENBO 2006/06/09(金) 13:06:44
すいません。内容が足りませんでした。

>「死ぬ」とは、何を指していますか?
実行時エラーのことです。

エラー内容は以下のとおりです。
Debug Assertion Failed!!
Program : D\xxx.exe
File : winctrl2.cpp
Line :547
For information on how your program can cause an assertion failere, see the 
VisualC++ documentation on asserts.
(press Retry to debug the application)

この関数を実行中に死ぬわけではないのです。
関数を出た後に死にます。
しかし、この関数をコメントして実行すると死にません。
なぜ?やっぱりこの関数が原因なのでしょうか?

>CString::GetBuffer はそうやって使うものじゃありませ
ん。
どうやって使うのですか?
ではCString型の文字列の先頭アドレスを欲しい場合はどうするのですか?

ねこたま 2006/06/09(金) 13:22:40
使い方云々はとりあえず置いておいて

解放後の CString 操作でバッファが再確保されることがあるので、GetBuffer 関数から返さ
れるアドレスは、ReleaseBuffer 関数を呼び出した後では無効になります。CString のを長さ
を変更しないときは、バッファの再確保は行われません。

と、MSDNにもあるようにReleaseBufferした後で参照してるからでないのかな?

KENBO 2006/06/09(金) 13:31:19
>と、MSDNにもあるようにReleaseBufferした後で参照してるからでないのかな?
今回のようにGetBufferで直接item.pszTextにポインタを代入してるので、
ReleaseBufferは必要ないということですか?
言われてみればそうですね・・・(戻り値をポインタに代入してるわけではないから)

KENBO 2006/06/09(金) 13:33:18
CStringの使い方は死ぬ原因とは無関係ですよね。
上の記述でも、
item.pszTextに正確に代入されてますし・・・

Blue 2006/06/09(金) 13:34:06
> ReleaseBufferは必要ないということですか?
は必要ですよ。

まぁCStringでは色々面倒なので普通に TCHAR型配列を用意してやるほうが楽なのでは。

>     str.Format("%5d",index+1);
>    item.pszText    = str.GetBuffer(0x100);
>    str.ReleaseBuffer(-1);

TCHAR str[ 0x100 ];


_stprintf( str, "%5d", index + 1 );
item.pszText = str;

Blue 2006/06/09(金) 13:36:10
訂正
> _stprintf( str, "%5d", index + 1 );
_stprintf( str, _T( "%5d" ), index + 1 );

ほかのところは全部char型(TCHARを意識していないので)なので動き的には変わらないけ
ど。

KENBO 2006/06/09(金) 13:38:15
>まぁCStringでは色々面倒なので普通に TCHAR型配列を用意してやるほうが楽なので
>は。
楽なのはわかってもす。
しかし、せっかくVCなのでできるだけC言語は使わないでやってみたかったもの
で・・・

ねこたま 2006/06/09(金) 13:59:30
関係ないかもですが、item.iItem にInsertの結果を代入せんくていいのかな?
ていうか、SetItemで適当なアドレスに値セットに行ってたりしない?
InsertItemの戻り値とindexが同じならいいですけど、ここがちがったりしない?

Blue 2006/06/09(金) 14:08:39
GetBufferで試してみました。やはりそこが原因ではなさそうです。
一応
>    item.pszText    = str.GetBuffer(0x100);
>    str.ReleaseBuffer(-1);
>    m_LstCtl_Ctrl.SetItem(&item);
item.pszText = str.GetBufferSetLength( str.GetLength() );
m_LstCtl_Ctrl.SetItem(&item);
str.ReleaseBuffer();
のほうがよさそうだけど。


ということで、
> 「死ぬ」
ということを明確にしてください。
もしかしてデバッグができないのでしょうか?

KENBO 2006/06/09(金) 14:15:45
> 「死ぬ」ということを明確にしてください。
winctrl2.cppの547行目、
以下の関数のASSERTを実行すると死にます。

void CListCtrl::DrawItem(LPDRAWITEMSTRUCT)
{
    ASSERT(FALSE);
}

この関数はいつコールされてるのでしょうか?

Blue 2006/06/09(金) 14:19:02
> この関数はいつコールされてるのでしょうか?
デバッグして、コールスタックをさかのぼってください。

意味がわからないのであれば、ある程度ブレイクポイントを仕掛けて、
F5実行でここまでは大丈夫、ここでASSERTが出る。じゃぁもう少しブレイクポイントの
範囲を狭くしてみようと言う行為をして、絞り込んでください。

Blue 2006/06/09(金) 14:28:53
あれ?
> void CListCtrl::DrawItem(LPDRAWITEMSTRUCT)
ってことは、もしかしたらオーナドローをするのにその処理がないってことかな?

リストビューのプロパティをいじったのであればその情報がほしいです。
(レポート形式にしたのしかワカラン)

で、将来的にカスタムドローかオーナドローをするようなんですが、そこら辺の情報も
ください。

KENBO 2006/06/09(金) 14:48:54
>リストビューのプロパティをいじったのであればその情報がほしいです。
これをうけてプロパティーを見たのですが、
『オーナー描画固定』にチェックが入ってました。
このチェックをはずしたらしななくなりました。(^o^)/

>で、将来的にカスタムドローかオーナドローをするようなんですが、そこら辺の情報も
>ください。
この辺の話はよく意味がわからないのですが・・・
リストコントロールに表示したいだけです。

Blue 2006/06/09(金) 14:58:54
> この辺の話はよく意味がわからないのですが・・・

> // 行の背景色を設定する
ってことは、リストビューの背景色を変えたいということですよね?
item.lParamに色の情報を設定するだけでは、デフォルトのCListCtrlは何もしてくれま
せん。自前で、lParamの値をみて色をつける必要があります。

以前似たような質問を解答したことがあるので参考に載せておきます。
http://www2.moug.net/bbs/program/20060302000002.htm

KENBO 2006/06/09(金) 16:56:03
上記WEBの説明では、
NM_CUSTOMDRAWを追加しろとのことですが、ないのですが・・・
他のやり方はないのでしょうか?
InsertItemをする前に
設定するのでしょうか?

Blue 2006/06/09(金) 17:08:57
> NM_CUSTOMDRAWを追加しろとのことですが、ないのですが・・・
VC6だとないですね。面倒ですが手動で入れるしかないです。

手動でいれる方法は、こちらを参考にどうぞ
http://www24.cds.ne.jp/~neg/pro/piyo1/clc/custom.html

KENBO 2006/06/09(金) 23:28:04
>手動でいれる方法は、こちらを参考にどうぞ
>http://www24.cds.ne.jp/~neg/pro/piyo1/clc/custom.html
他にもっと簡単にできる方法はないですかね?

Ban 2006/06/10(土) 00:25:33
大差ないのでは?
新しいVCを買えば設定は多少は楽になるかもしれませんが、VC自体の習熟はもっと大変かも。
後は出来合を探して導入するとか、発注するとか。結局、別の手間(と予算)がかかるでしょう。

シャノン 2006/06/10(土) 19:09:26
CString に関しては、

item.pszText = const_cast< CString::PXSTR >( static_cast< CString::PCXSTR >( 
str ) );

でよかとですよ。

PATIO 2006/06/12(月) 10:09:02
VC++に関しては融通が利くし、色々細かい制御ができる代わりに
手間はそれなりにかかる物になっていると思います。
なので、使う方がそれなりに習熟する必要があるわけです。
この辺の話はトレードオフなので細かい制御を諦めて標準の動作で我慢するのか
勉強してでも細かい制御ができるようにマスターするのかの何れかでしょう。

なんにしても良くわからないで使うのが一番問題があるので
そこのところはなんとしてもきちんと納得いくまで調べるなり、
デバッグするなりしましょう。
良くわからないけれど動いているからいいやが一番怖いです。

KENBO 2006/06/12(月) 15:12:00
[[解決]]
>手動でいれる方法は、こちらを参考にどうぞ
>http://www24.cds.ne.jp/~neg/pro/piyo1/clc/custom.html

この通りに実行したら、
背景色を変更することができました。
ただし、
これだと4列(作成した列は4列)までで
5列目以降は変化しませんでした。

Blue 2006/06/12(月) 15:24:03
> ただし、
> これだと4列(作成した列は4列)までで
> 5列目以降は変化しませんでした。
どのようなコードを書いているのかワカリマセンが、
プログラムは記述したとおりにしか動きません。そういう記述をしているのでしょう。
(エスパーじゃないからこれだけではワカランでしょ。)

KENBO 2006/06/12(月) 15:35:49
>item.pszText = const_cast< CString::PXSTR >( static_cast< CString::PCXSTR >( 
>str ) );

PXSTR と PCXSTR 
には何が入るのでしょうか?

KENBO 2006/06/12(月) 15:37:26
>どのようなコードを書いているのかワカリマセンが、
>プログラムは記述したとおりにしか動きません。そういう記述をしているのでしょう。
こんな記述です。

void CLogControlDlg::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMLVCUSTOMDRAW lcd=(LPNMLVCUSTOMDRAW)pNMHDR;

    switch( lcd->nmcd.dwDrawStage ){
    case CDDS_PREPAINT :
        *pResult = CDRF_NOTIFYITEMDRAW;
        break;
    
    case CDDS_ITEMPREPAINT:
        lcd->clrTextBk = lcd->nmcd.lItemlParam;
        *pResult = CDRF_NEWFONT;
        break;

    default:
       *pResult = CDRF_DODEFAULT;
        break;
    }
}

Blue 2006/06/12(月) 16:06:15
類似スレ
■ リストビューのカスタムドローで、一行全体を塗りつぶすには?
http://homepage1.nifty.com/MADIA/vc/vc_bbs/200409_04090038.html
で、「カスタムドローでは不可能」という結論に至っているようです。

オーナードローするしかないですかねぇ。。。(カスタムドローに比べてカナリ面倒)

KENBO 2006/06/12(月) 16:18:27
>オーナードローするしかないですかねぇ。。。(カスタムドローに比べてカナリ面倒)
う〜ん・・・仕様でそうせざるをえないか、あるいは時間に余裕があれば、
オーナードローでやってみます。。。


少し前の話になりますが気になったもので。
>item.pszText = str.GetBufferSetLength( str.GetLength() );
>m_LstCtl_Ctrl.SetItem(&item);
>str.ReleaseBuffer();
>のほうがよさそうだけど。
MSNDには
【GetBuffer 関数から返されたポインタを使って文字列の内容を変更するときは、次に
任意の CString メンバ関数を使う前に、ReleaseBuffer 関数を呼び出す必要がありま
す。】
と記述されてますが、
文字列の内容を変更しない時は、
ReleaseBufferはする必要がないということなのでしょうか?

シャノン 2006/06/12(月) 19:13:39
> PXSTR と PCXSTR 
> には何が入るのでしょうか?

そのまんま。PXSTR と PCXSTR です。コピペで通りませんか?
…VC++ 6 だと通らないかなぁ。だったらゴメン。
そのままコピペでエラーが出るようであれば、

item.pszText = const_cast< LPTSTR >( static_cast< LPCTSTR >( str ) );

で。

> MSNDには
> 【GetBuffer 関数から返されたポインタを使って文字列の内容を変更するときは、
> 次に任意の CString メンバ関数を使う前に、ReleaseBuffer 関数を呼び出す
> 必要があります。】
> と記述されてますが、
> 文字列の内容を変更しない時は、
> ReleaseBufferはする必要がないということなのでしょうか?

そもそも、GetBuffer は文字列の内容を変更するために使うものでしょう。

KENBO 2006/06/13(火) 08:53:20
>item.pszText = const_cast< LPTSTR >( static_cast< LPCTSTR >( str ) );
これで通りました。
ありがとうございます。

>そもそも、GetBuffer は文字列の内容を変更するために使うものでしょう。
なるほど。言われてみればそうですね。。。
代入するだけで関数を二つもコールするのは確かに腑に落ちないですね。
先輩がこの使い方をしてたもので真似してみました。
キャストの仕方が思いつかなかったもので・・・

シャノン 2006/06/13(火) 12:10:37
> キャストの仕方が思いつかなかったもので・・・

2回キャストしなければならないので、確かにややこしいですね。

static_cast は、CString が持っているキャスト演算子を呼び出して、LPCTSTR(読み取
り専用の生の文字列のポインタ)を取得します。
これは「読み取り専用」であることに注意すべきです。
GetBuffer が返すのは書き込み用のポインタです。

const_cast で、LPCTSTR を LPTSTR に変換します。これで表面上は書き込み可能になり
ましたが、このポインタに書き込んではいけません。
読み取り専用なものを、無理やり書き込み可能にしているので、ここに書き込むと不具
合が出る可能性があります。
では、何故こんなことをするのかと言うと… LVITEM::pszText が LPTSTR 型なので、こ
うしないとエラーが出るため仕方なく、ですね。LVITEM はアイテムの情報を取得する時
にも使う構造体なので、読み取り専用に出来ないのです。

CListCtrl::GetItem を使ってアイテムの情報を取得する時には、LVITEM::pszText にセ
ットするポインタは GetBuffer で取得しましょう。

なお、一回のキャストで LPTSTR に変換することは出来ません。
LPCSTR にする時は、CString の「LPCTSTR にキャストした結果を返すキャスト演算子」
を呼び出していましたが、CString は LPTSTR に変換する演算子を持っていませんので
ね。

KENBO 2006/06/13(火) 19:34:36
>CListCtrl::GetItem を使ってアイテムの情報を取得する時には、LVITEM::pszText に
>セットするポインタは GetBuffer で取得しましょう。
ん?どういう意味ですか?GetItemは取得するだけだから、セットすることはないですよ
ね?
以下の方法でCString型の文字列に代入できるはずですけど・・・(?_?)

LV_ITEM item;
CString str;

m_ListCtrl.GetItem(&item);
str = item.pszText;

シャノン 2006/06/13(火) 20:57:07
> 以下の方法でCString型の文字列に代入できるはずですけど・・・(?_?)

できます?
運が悪けりゃ、不正終了で落ちますよ。それ。

LVITEM::pszText は、アイテム名を保持するバッファのポインタです。
GetItem を呼ぶのに先立って、pszText に有効なバッファのポインタを、cchTextMax 
に、そのバッファのサイズを入れておかなければ、GetItem できません。

つまり、こういうこと。

LVITEM item;
CString str;

item.pszText = str.GetBuffer( 256 );
// ↑これが「GetItem で使うポインタは GetBuffer で得たものをセットする」てこと

item.cchTextMax = 256;
m_ListCtrl.GetItem( &item );
str.ReleaseBuffer();

これを、

item.pszText = const_cast< LPTSTR >( static_cast< LPCTSTR >( str ) );

って書いちゃダメですよ、って話。

KENBO 2006/06/14(水) 11:55:34
>item.pszText = const_cast< LPTSTR >( static_cast< LPCTSTR >( str ) );
>って書いちゃダメですよ、って話。
この文章意味がわからなかったけど、
>item.pszText = str.GetBuffer( 256 );
>// ↑これが「GetItem で使うポインタは GetBuffer で得たものをセットする」てこと
>item.cchTextMax = 256;
>m_ListCtrl.GetItem( &item );
>str.ReleaseBuffer();
こうするとGetItemで得たitem.pszTextに格納されている文字列が
strにも格納されるという意味だったんですね?

>できます?
>運が悪けりゃ、不正終了で落ちますよ。それ。
普通にできましたよ。

tetrapod 2006/06/14(水) 12:25:09
だーかーらー
問題を抱えたコードがたまたま動いている ってのと
問題が無いことがわかっているコード ってのは問題の次元が違う。

たまたまでも、動きゃいい と思ってるならこの業界向きではないです。
転職なり考えたほうがいい

>こうするとGetItemで得たitem.pszTextに格納されている文字列が
>strにも格納されるという意味だったんですね?
ちがう。

っていうかスレ長すぎるよ...

KENBO 2006/06/14(水) 13:00:33
>問題を抱えたコードがたまたま動いている ってのと
>問題が無いことがわかっているコード ってのは問題の次元が違う。
そんなことわかってるよ。
今回のことと関係ないでしょ!?

>たまたまでも、動きゃいい と思ってるならこの業界向きではないです。
>転職なり考えたほうがいい
そんなことてめーに言われる筋合いないよ

>っていうかスレ長すぎるよ...
長いのはダメなんて誰が決めたんだ?

シャノン 2006/06/14(水) 13:09:18
> っていうかスレ長すぎるよ...

ごめんねぇ。
CString 周りのことは本題じゃなかったらしいけど、続けちゃってるから…。

>> できます?
>> 運が悪けりゃ、不正終了で落ちますよ。それ。
> 普通にできましたよ。

うん。俺は「運が悪ければ」って言った。
動いたのは、たまたま運がよかっただけ。
そういうこともあるけれど、毎回できるとは限らない。
あなたの書いたのはそういうコード。

> こうするとGetItemで得たitem.pszTextに格納されている文字列が
> strにも格納されるという意味だったんですね?

微妙に違います。

ポインタって何だか理解されてますか?
「文字列ポインタ」と「文字列」はイコールではありません。「文字列ポインタ」と
「CString」もイコールではありません。
ポインタ(pointer)は、その名の通り、「指し示すもの」でしかありません。
「文字列ポインタ」ってのは、「別の場所にある文字列を指し示すもの」です。
ポインタだけでは何の役にも立ちません。指し示す先(この場合は文字列)とペアで使
って、初めて意味があります。

item.pszText の型は LPTSTR です。これは文字列ポインタです。
item.pszText には文字列は格納されません。
item.pszText は、どこかにある、取得した文字列を格納するためのメモリ領域の場所を
指し示すためのものです。

CString は文字列ポインタではありません。これは文字列そのもの(に、ちょっと便利
な機能をつけたもの)です。
ですから、CString は、ポインタによって指し示される、実際の格納場所になることが
できます。

> item.pszText = str.GetBuffer( 256 );
> item.cchTextMax = 256;
> m_ListCtrl.GetItem( &item );
> str.ReleaseBuffer();

これは、
1:CString の内部に、実際の格納領域として 256 文字分のバッファを用意し
2:その格納領域を指し示すポインタを item.pszText にセットし
3:格納領域のサイズを、item.cchTextMax にセットし
4:CString の内部に確保したバッファに、アイテムの文字列を取得し
5:CString の後始末をする
というコードです。

> こうするとGetItemで得たitem.pszTextに格納されている文字列が
> strにも格納されるという意味だったんですね?

item.pszText は str を指すポインタでしかなく、文字列領域ではないため、
item.pszText には文字列は格納されません。
str にだけ格納されるのです。

>> item.pszText = const_cast< LPTSTR >( static_cast< LPCTSTR >( str ) );
>> って書いちゃダメですよ、って話。
> この文章意味がわからなかったけど、

CString の中にある文字列領域のポインタを得る手段は2つあり、用途によってどちら
を使うべきかが異なるということです。
CString の中にあるデータを読み取りたいだけならば、キャストを使います。
CString の中にデータを書き込みたい場合は、GetBuffer を使います。

> しかし、せっかくVCなのでできるだけC言語は使わないでやってみたかったもの
> で・・・

C 言語をよく知らないうちに手を出すと火傷しますよ。
Win32 API も MFC も、C 言語を知らずに使えるものではありません。

シャノン 2006/06/14(水) 13:10:07
#キレてんじゃねぇよ…
#真面目に長文書いてたのがアホらしくなってきたorz

KENBO 2006/06/14(水) 13:42:21
>ポインタって何だか理解されてますか?
理解してます。
>item.pszText の型は LPTSTR です。これは文字列ポインタです。
そうなんだ!!実体のバッファがあるのかと思ってました。
ポインタだけなんだ。
ならすべて納得できます。

>#キレてんじゃねぇよ…
あれはキレマスヨ。
いきなりでてきて言ってることは全て間違ってるわ。
あんあこといちいち発言する必要がないよ。
あれでキレナイ奴とは会話する価値がないと思うよ。
自分こそ話の内容全く理解してないと思うよ。
むいてないんじゃない?

REE 2006/06/14(水) 14:30:00
>あれはキレマスヨ。
>いきなりでてきて言ってることは全て間違ってるわ。

素朴な疑問ですが、どこが間違っていたのですか?

シャノン 2006/06/14(水) 16:19:37
転職云々は余計ですけれども。

>> 問題を抱えたコードがたまたま動いている ってのと
>> 問題が無いことがわかっているコード ってのは問題の次元が違う。
> そんなことわかってるよ。
> 今回のことと関係ないでしょ!?

関係ありますよ。思いっきり。

Ban 2006/06/14(水) 16:26:05
個人的には、キレやすい人は向いてないようにも思うのですけどね。

> 自分こそ話の内容全く理解してないと思うよ。

tetrapod さんの書き込みは正しく理解しているように読み取れたのですが、
私も何か理解できてないのでしょうか。どこでそう思われたのでしょう。

# tetrapod さんでも向いてないとすると、向いてる人ってのは相当難しいそう…。

KENBO 2006/06/14(水) 17:09:04
やっぱ答えたほうがいいの?
くだらない・・・

>実体のバッファがあるのかと思ってました。
ってことで、問題を抱えたコードとは思わなかったということだよ。

>問題を抱えたコードがたまたま動いている ってのと
>問題が無いことがわかっているコード ってのは問題の次元が違う。
だから、この2行だけの意味はわかるけど、
今回とは関係ないということね。

>たまたまでも、動きゃいい と思ってるならこの業界向きではないです。
>転職なり考えたほうがいい
たまたまでも動けばいいなんてまったく思ってないよ。
この業界向きかどうかは関係ないんだよ。
この業界に向いてると思ったことは一度もないし、
向いてるか、向いてないかは俺にとって仕事を選ぶにあたって全く関係ないんだよ。
転職するかどうかは、
この俺が決めることであって、
誰かに言われる筋合いはない。

>個人的には、キレやすい人は向いてないようにも思うのですけどね。
俺から言わせるとtetrapod のほうがキレヤスイんじゃない。
わざわざあんな発言書き込むひつようがない。

俺はキレタというより、
tetrapodにその発言により不愉快になってるんだぞ!
って教えてあげたんだよ。
言われなきゃ自分が悪いと思わない奴はいっぱいいるからね。
言われてもわからない奴もいるけど・・・
まぁ、わざと不愉快にさせるために発言したんならいいけどね。

みなさん、これでわかったかな?

Blue 2006/06/14(水) 17:21:56
> 実体のバッファがあるのかと思ってました。
だったら、InsertItem、InsertItemのときにのitemには

strcpy( item.pszText, str );

てな感じで格納することになるでしょうね。

char s[ 10 ];
s = str;

っての書けませんからね。



> 長いのはダメなんて誰が決めたんだ?
一応、らららさんの掲示板を利用させてもらっている以上
無駄にリソースは使わないほうが良いということでしょう。
ただ、今回の流れはあまり無駄なことは無かったですが。
# あえて言うなら、私の誤投稿ですな。。。。orz

ねこたま 2006/06/14(水) 17:51:34
途中から本筋それてスレが伸びてるのが問題なんじゃないかと
途中で質問変わってますしね〜
変えるなら新しくスレ立てするもんじゃないのかな?
#途中で2回程質問が変わってますね

で、このスレ内でKENBOさん自身が動いてるからおkという発言してるの気付いてますか?
注意・警告受けたことに対し、自分が勘違いしていたとしてもそれで動いてるからいいんだよ
ね?というとこです
#どの発言かはちゃんと読みかえせばすぐわかると思いますよ

それから、不快になるのは誰でもありますのでそれを咎めるつもりはありませんが、
自分が不快だったからと暴言吐くのは自分が周りを不快にしている事にも気付きましょう。

ということで、新しい質問は別スレでしましょう。
#同じ質問でスレが伸びる分には誰も何も言わないと思いますよ。

てことで、この話題終わり終わり^^

2006/06/14(水) 23:18:39
# スレが長いことが質問者の勉強不足だと思われたのでしょう。

PATIO 2006/06/15(木) 14:28:09
というか、かなり前の方で同じような事を私も書いているのだけれど、
軽くスルーされているし。

動いている=OKではなくて、
問題が無いという論理的な根拠が必要と言うことです。
思っているというのは論理的な根拠にはなりませんからね。
運がよければ動くと言う時点で既に問題があるわけですからね。

ITO 2006/06/16(金) 11:57:21
スレの内容が尋常でないので
横から失礼します。

tetrapodさんが

>問題を抱えたコードがたまたま動いている ってのと
>問題が無いことがわかっているコード ってのは問題の次元が違う。
発言したのは、

>できます?
>運が悪けりゃ、不正終了で落ちますよ。それ。
に対して
>普通にできましたよ。
と答えたからです。

結果「問題を抱えたコード」だとわかったというのは2のつぎ3のつぎです。

一番まずかったことは、
 「運が悪けりゃ、不正終了で落ちますよ。」
のことをまず受け止めなかったことです。
「普通にできましたよ。」と軽く受け流してはいけません。
僕は「たまたま動く」コードが一番怖いと思ってます。
こーやれば必ず駄目になるコ−ドは、最悪客先に
「こうゆう方法で使わないで下さい。」と言えば済みます。
「たまたま動く」コードはどうにもなりません。

古いスレッドには追加発言できません。