char*型から unsigned int 型への変換方法について

解決


まーち  2009-04-11 07:23:15  No: 69974

初歩的な質問ですみません。
型変換がうまくいかず困っています。

やりたい事は、文字列を自分で書いて一旦、char*型へ入れ、そして、それを、unsigned int型へ変換して使おうというものです。

  char *sss="ISI2";
  
  long L;            
  L = atol( sss );
  
  unsigned int ui;
  ui=L;

  CEdit* test=(CEdit*)GetDlgItem(ui);

これで実行しようとすると、コンパイル時にはエラーが出ませんが、実行時に止まってしまいます。
どうか宜しくアドバイスお願いします。


まーち  2009-04-11 07:26:08  No: 69975

書き忘れました。

環境は、VC++6.0(SP6)、、OSはXPです。


wclrp ( 'o')  2009-04-11 07:47:27  No: 69976

別に止まるような処理見当たらないなあ。
"ISI2"を数字として読むと"I"は数字じゃないから
L = 0;
ui = 0;
CEdit* test=(CEdit*)GetDlgItem(0);
になって、
止まることはない。


瀬戸っぷ  2009-04-11 08:49:03  No: 69977

>char *sss="ISI2";
>
>long L;            
>L = atol( sss );
>
>unsigned int ui;
>ui=L;
>
>CEdit* test=(CEdit*)GetDlgItem(ui);

"ISI2"というコントロールIDをつけたエディットボックスの取得したい。
というのであれば正しくないです。
リソースエディタでそういう「ID」をつけたのか、そういう「名前」をつけたのか…で微妙に対応は違いますが。


まーち  2009-04-11 09:45:51  No: 69978

wclrp ( 'o')さま、瀬戸っぷさま、早々なる返信に感謝します。

ほんとに有難うございます!m(__)m

恐縮ですが、ソースを一行忘れてました、ほんっとすみません。。

test->SetWindowText("");

これが最後にきます。。

(修正後)、、、

char *sss="ISI2";

long L;            
L = atol( sss );

unsigned int ui;
ui=L;

CEdit* test=(CEdit*)GetDlgItem(ui);

test->SetWindowText("");

この最後のソースが無いと、実行もスムーズに動き、止まらないみたいです・・・。

はい、、"ISI2"というコントロールIDをつけたエディットボックスを取得したいと思っています。

名前はリソースエディタでつけたんですけどまずかったですか??
どんな名前にしたらよかったでしょうか??
どうかご教授よろしくお願いします。。


wclrp ( 'o')  2009-04-11 10:37:13  No: 69979

ところで文字列でリソース作っているの?
文字列でも指定できるけどまずめったにしないよ。


wclrp ( 'o')  2009-04-11 10:41:53  No: 69980

さっきの間違えました。
リソースのIDなら文字列あるけど
コントロールIDに文字列は無いや。

どこかに(例)
#define ISI2 150
みたいなのがあると思うんだけど。

int id = ISI2;
CEdit* test=(CEdit*)GetDlgItem(id);

int id = 150;
CEdit* test=(CEdit*)GetDlgItem(id);
ってなるはずだけど。


rin  2009-04-11 11:50:26  No: 69981

>この最後のソースが無いと、実行もスムーズに動き、止まらないみたいです・・・。

つまるところ

>CEdit* test=(CEdit*)GetDlgItem(ui);  ←これが失敗してるから
>test->SetWindowText("");            ←これが正常に動作せずに落ちる。

>名前はリソースエディタでつけたんですけどまずかったですか??
まずくはないが、認識がちと間違い
リソースエディタでつけたIDは、データとしての文字列ではなく
「本当は数字だけど、プログラムを書く上で、
なんか意味をこめた言葉とか決められた単語にしておくと扱いやすい」
というための「ID」で、
ビルドしたときには数字に変換されてしまってるので
実際に動くときには「文字で表現されたID」は意味がなくなってます。

たとえばこんな感じ
#define  TEST 1
int kekka = 10 + TEST;

変換とかとっぱらっちゃって

CEdit* test=(CEdit*)GetDlgItem(ISI2);
test->SetWindowText("");

この2行だけでOK

#リソースエディタでつくったのなら
#ISI2  というIDの定義はresource.h  ってファイルにあるはず


まーち  2009-04-11 20:23:18  No: 69982

wclrp ( 'o')さま、rinさま、詳しいところまでご教授戴き、誠に感謝です。。
なるほど、、resource.hで、ビルドすると文字でなくなることを確認しました。
int型の数値を入れたら、出来ました!!めちゃ助かり解決しました!

瀬戸っぷさま、wclrp ( 'o')さま、rinさま、お忙しい中、丁寧にご教授戴き本当に有難うございました。。


瀬戸っぷ  2009-04-11 22:17:52  No: 69983

解決していますが…

>CEdit* test=(CEdit*)GetDlgItem(ui);
>test->SetWindowText("");
>この最後のソースが無いと、実行もスムーズに動き、止まらないみたいです・・・。

不正なコントロールIDを渡したのでGetDlgItem()がNULLを返却し、
その後でNULLポインタアクセスで落ちたのでしょう。
その際にエラーなりが表示されたでしょうからそちらも掲示されると解決が早くなるかと思われます。
# 掲示板に書く前に自分で気づけるかもしれませんし。


まーち  2009-04-11 23:36:51  No: 69984

瀬戸っぷさま、何度もすみません。。
なるほど、NULLポインタアクセスになってたわけですね。

最初に書き忘れて、、わかりにくい質問になってしまってすいませんでした。m(__)m

お陰さまで、今回コントロールについて少し解かってきたように思います。

はい、おっしゃる通りです、出来るだけ、今度質問する際、その点も気をつけ、、また、なるべく、自分で気付けるものは気付いて勉強していきたいと思います。ほんとに助かりました。感謝します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加