こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

初歩的なことだとはおもいますが・・・・。

abc=int(asd)

abc はint
asd はdouble


です。

なぜかエラーが出てしまいます。

やり方が間違っているんでしょうか?

(.net です)

投稿日時 - 2003-09-21 01:16:33

QNo.660213

暇なときに回答ください

質問者が選んだベストアンサー

 ti = Int(1000 / (kaisuu_s/ jikan_s))  はオーバーフローになります
>(明らかではありませんか? 後者は、変数値が0ですから) >>>
なぜですか?

0除算は可能ですか?

>kaisuu_s = Val(kaisuu.Value)
>jikan_s = Val(jikan.Value)
>それぞれプロパティが5になっています。
>ので5がそれぞれに代入されるのではないのでしょうか?

プロパティって どの値ですか? kaisuu.Value や jikan.Value ですか?
また値については、この処理のプロシージャの先頭あたりにブレークポイントを設定して、
F10キーでワンステップずつ実行して各々の値の変化をよく見てください。

>kaisuu・・・・NUMBERUPDOWNの name
>jikan・・・・NUMBERUPDOWNの name

それなら値は、kaisuu=0、jikan=0 のように書くのではなく、
jikan.Value=0、jikan.Value=0 のように書くべきではありませんか?

もう少し頭を整理して、基本的なところから見直すべきだと思いますよ。
残念ながら、これ以上はお付き合いできませんので、回答は今回で最終にします。

投稿日時 - 2003-09-22 03:16:44

お礼

そうします。
ご回答ありがとうございました。

投稿日時 - 2003-09-22 15:42:27

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(9)

ANo.9

今までの話を見てみると、jikanとkaisuなどを文字変数扱いにしているのでは無いでしょうか?
かなりの推測なのですが、
それでtextboxの表示のみを5にしているとか。
ボックスにjikanとか名前を変えてtextを変えても、文字としか認識していませんので、計算させたら足し算で文字が繋がったりするだけで掛け算など出来ませんよ。
そんな事をするなら、文字変数から普通の数字の変数に変えてあげなければなりません。

text1.textの文字を変数に欲しいならば、

Dim jikan as Short  '16bit(2の16乗)で十分です
jikan = val(text1.text)

それと変数のスケールというものがあり、定義していても違うプロシージャでは別物になったりしますので(モジュールレベル変数は別)気を付けてください。
.Netからかなり厳しい様です。

VBは定義しなくても変数を使えますが、何の変数を何処で使う等を紙に書いて、よく考えてからコーディングしてください。
では、頑張ってください。
出来あがったら教えてくださいね♪

参考URL:http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-1.asp

投稿日時 - 2003-09-24 00:21:47

お礼

一応解決は出来たようです。

何の変数を何処で使う等を紙に書いて、よく考えてからコーディングしてください。
そうですね。。。そうします。
いくつかのPGを平行してしているので自分でもこの変数なんだ???ってことはよくあります。

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

投稿日時 - 2003-09-25 01:30:17

ANo.8

基本的に数学で0で割ると割れません。なぜなら、ずっと続くからです。
1/0を電卓でやってみるとEが出ます。Eはエラーです。
VBでも四則演算は電卓とほぼ同じです。切り捨て繰り上がり繰り下がりなどが変数の型や命令で変えることができるくらいで同じと思ってください。
なので0で割る事をやるとコンピュータが考えこむのです。
今は動かないこと(ハング)を無くすためにエラーとして停止してくれます。なのでどういった計算をさせたのかを、プログラマーが頭の中で考える必要があると思います。
もっと大きなプログラムの場合、何処が悪いのか全然見当もつきませんから、ブレークポイントをいくつも置いて変数値を見ながら頭の中でシュミレーションを行ってください。
判断するには高校レベルの数学の知識があれば大丈夫でしょう。
プログラムで必要な事は決して諦めない事と毎日考える事です。
間を空けると流れが判らなくなり、始めから考えなければならなくなります。
気合で頑張ってください。仕事でなければ徹夜して明日の8時までに仕上げろとか上司に言われないので、気楽に頑張ってください。

投稿日時 - 2003-09-22 23:15:09

ANo.6

>ブレークポイントを設定してしてみると
>kaisuu=0、jikan=0
>と帰ってきました。
それなら、
ti = Int(1000 / (kaisuu/ jikan))  はオーバーフローですね。

kaisuu と kaisuu_s、 jikan と jikan_s の関係もわかりません。

投稿日時 - 2003-09-22 02:29:22

補足

kaisuu・・・・NUMBERUPDOWNの name
jikan・・・・NUMBERUPDOWNの name


kaisuu_s・・・ソース上の変数
jikan_s・・・ソース上の変数

です。


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

投稿日時 - 2003-09-22 02:30:16

ANo.5

#3の補足を見てあきれます。何をやってるのかさっぱりわかりません。
・パターン1 :kaisuu=3、jikan=3
・パターン2 :kaisuu=1、jikan=3
・パターン3 :kaisuu=3、jikan=1
これなら、
 ti = Int(1000 / (kaisuu/ jikan)) はOKですが
 ti = Int(1000 / (kaisuu_s/ jikan_s))  はオーバーフローになります
(明らかではありませんか? 後者は、変数値が0ですから)

ブレークポイントを設定してやってみればすぐにわかるはずです。
この程度の規模で間違いが発見できなければプログラミングはあきらめてください。

下記のコードに置き換えて見てください。(コピー&ペーストで)
Dim i, j, k As Integer
Dim d As Double
i = Val(kaisuu.Value)
j = Val(jikan.Value)
d = 1000 / (i / j)
k = Int(d)

どこでエラーが出ますか?
尚、Val()は使用しなくてもOKのはずです。

投稿日時 - 2003-09-22 00:26:02

補足

私も何がいけないのかわかりません。

ブレークポイントを設定してしてみると
kaisuu=0、jikan=0
と帰ってきました。

プロパティでは各5に設定しています。


l1.Text(ラベル) =kaisuu_s & vbCrLf & jikan_s


とすると
5
5


となります。
※数字を変えるとラベルも変わります。


--------------------------------
作成中のPG
ラベルに一定の間隔(※1)で一定の回数(※2)数字を出す。
(早い話が暗算ソフト)
以上

※1
1000/(回数/時間(秒))→st(sleepする時間)
sleep(st)

※2 フォームから変更可能
(これはなぜか1と帰ってくる(プロパティでは5)

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

投稿日時 - 2003-09-22 01:58:35

お礼

 ti = Int(1000 / (kaisuu_s/ jikan_s))  はオーバーフローになります
(明らかではありませんか? 後者は、変数値が0ですから) >>>
なぜですか?

kaisuu_s = Val(kaisuu.Value)

jikan_s = Val(jikan.Value)

それぞれプロパティが5になっています。
ので5がそれぞれに代入されるのではないのでしょうか?

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

投稿日時 - 2003-09-22 02:26:20

ANo.4

ccの値をブレークポイントで見て下さい。
Int型の使える数は±32000くらいなのでその値を超えているかもしれません。
.Netを持っていないので使えるか判りませんが、ブレークポイントを設定して、マウスポインタを当てると変数の値がわかります。
または、Debug.print ccとやってもイミディエイトウインドウに表示され値を読む事が出来ます。
まずはどの時にエラーになるのか、値をしっかりと把握する事がデバックの第一歩です。

投稿日時 - 2003-09-21 17:27:26

お礼

はいしました。
詳しくは↑です。

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

投稿日時 - 2003-09-22 02:29:04

ANo.3

>実行時にでます。
やはりそうですよね。

>1~25の間整数です。
> as>sd、as<sd、as=sd すべてのパターンがあります。
ますます何のことかわかりません。
具体的にその部分のソースを提示していただかなければ難しいですね。
(実行するたびに状況が変わる?)
本当に、abc=int(cc) の部分で例外が発生しているのかも疑わしいです。
別なところに問題があるのかもしれません。

自分でやるなら、下記の2行にブレークポイントを設定して
そのときの各々値を確認しながらやってみてください。
 cc=200/(as/sd)
 abc=int(cc)

投稿日時 - 2003-09-21 15:30:04

補足

kaisuu_s = Val(kaisuu.Value)
jikan_s = Val(jikan.Value)

ti = Int(1000 / (kaisuu_s/ jikan_s))


↑です。kaisuuとjikanはNUMBERUPDOWNを使用しています。

パターン1
kaisuu=3
jikan=3

パターン2

kaisuu=1
jikan=3


パターン3
kaisuu=3
jikan=1

です。

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

投稿日時 - 2003-09-21 22:12:25

ANo.2

>ビルド時です。オーバーフローしました というエラーです。

オーバーフローはビルド時に出ないはずですが...
実行時のエラーではありませんか?
ビルド→ソリューションのビルド でその様なエラーが出ますか?

>ちなみに実際は
>cc=200/(as/sd)
>abc=int(cc)
>というような式が入っています。
>※as(<>0)、 sd(<>0) ともに整数です

as,sdの具体的な値はどうなっているんでしょうか?

投稿日時 - 2003-09-21 02:15:47

補足

>何もでません。
実行時にでます。


1~25の間整数です。
as>sd
as<sd
as=sd

すべてのパターンがあります。

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

投稿日時 - 2003-09-21 14:59:53

ANo.1

>なぜかエラーが出てしまいます

abc=int(asd) 自体はOKですが...
ビルド時ですか? 実行時ですか? なんというエラーでしょうか?

投稿日時 - 2003-09-21 01:43:00

補足

ビルド時です。
オーバーフローしました
というエラーです。

ちなみに実際は


cc=200/(as/sd)
abc=int(cc)


というような式が入っています。
※as(<>0)、 sd(<>0) ともに整数です


ありがとうございました。

投稿日時 - 2003-09-21 01:45:33