[質問]型が一致しません.

タグの編集
投稿者 708  () 投稿日時 2007/9/8 03:41:00
visual basic 6.0を使用している初心者です.  
 
プログラムを実行したところ,エラー13「型が一致しません」  
 
という表示がでてプログラム中(一部)の  
 
sc(i) = rnd * 1  
 
を黄色で指摘されました.  
 
何かアドバイスがあればお願いします  
 
プログラムは次のような感じです(一部のみ掲載)  
 
 
Private Sub strboronoi(wd As Variant, hght As Variant)  
Picture1.Cls  
Randomize  
xa1 = 0  
ya1 = 0  
m = 0  
dtotal = 0  
ii = 0  
NNN = wd * hght  
 
For i = 0 To NNN  
'節点座標の設定  
ax(i) = (0.1 + rnd * 0.8 + i Mod wd) * Picture1.Width / wd  
ay(i) = (0.1 + rnd * 0.8 + (i - i Mod wd) / wd) * Picture1.Height / hght  
ad(i) = dis1(0, 0, ax(i), ay(i))  
Picture1.PSet (ax(i), ay(i)), vbBlack  
Next i  
 
 
'最下段について、各要素の乱数を決める。  
For i = 0 To wd  
sc(i) = rnd * 1  
Next i  
 
 
'上で決めた乱数に対して、条件節を作り、奇数列についてき裂の発生の有無を判定する。  
'最下段の各要素について、各要素の乱数が、パーライト組成率0.27以下の場合、つまりき裂が発生しない要素の決定  
For i = 0 To wd  
If sc(i) < 0.27 Then  
crack(i) = 1  
For j = 1 To (hght / 2)  
crack(i + j * 2 * wd) = 1  
Next j  
End If  
Next i  
 
 
'2列目について各要素を決める  
For i = wd To (2 * wd - 1)  
sc(i) = rnd * 1  
Next i  
 
 
'上で決めた乱数に対して条件節を作り、奇数列についてき裂の有無を判定する。  
'2列目の各要素について  
For i = wd To (2 * wd - 1)  
If sc(i) < 0.27 Then  
crack(i) = 1  
For j = 1 To 11  
crack(i + j * 2 * wd) = 1  
Next j  
End If  
Next i
投稿者 後藤  () 投稿日時 2007/9/8 05:17:00
sc の宣言部がないので断言できませんが 
Rnd関数はSingle型を返すので sc はSingle型を 
格納できる型でなければいけません。 
sc の型が Single Double Object などに 
なっているか確認してみて下さい。 
 
あと、動作は問題ありませんが気になった点 
sc(i) = rnd * 1 
      ↑この * 1 は必要ないと思うのですが..
投稿者 708  () 投稿日時 2007/9/8 06:27:00
>>1 
ありがとうございます! 
 
初心者すぎてほんまに申し訳ありません  
 
宣言部分とはこれでいいんでしょうか?  
 
Dim NNN As Variant  
'ax()=ボロノイ点のx座標 ay()=ボロノイ点のy座標  
'ad()=原点とボロノイ点の距離  
Dim sxxo, syyo, sxyo, aspc As Variant  
Dim ntsbd, xcrtn, nssc, mlm, tn, ttsang As Variant  
Dim xrnyn, xrnwd, xrnmz As Variant  
Dim lmax, mmax, nmax As Variant  
Dim tnang(10000), tsang(10000), nang(10000, 20), sang(10000, 20), tc(10000) As Variant  
Dim sc As Variant  
Dim rnd As Variant  
'試験片の形状  
Dim wd, hght As Variant
投稿者 neptune  () 投稿日時 2007/9/8 07:02:00
>>2 
こんにちは 
 
>Dim sc As Variant   
はホントですか? 
Dim sc() As Variant とかDim sc(要素数) As Variant 
にしてないんですか? 
本来は要素数をあらかじめ指定 
Dim sc(要素数) As single 
か、 
Dim sc() As single 
か 
Dim sc() As double 
として、要素数でredimするのが一般的です。 
 
>Dim wd, hght As Variant  
は 
Dim wd As Variant  
Dim hght As Variant  
と同義で 
Dim wd, hght 
とも同義です。 
 
先ずは、 
Variant は万能ですが、キチンとデータ型を指定してやってはどうでしょう?
投稿者 後藤  () 投稿日時 2007/9/8 17:03:00
>>2 
Dim sc As Variant 
↑sc を単独の入れ物として宣言しておきながら 
 
sc(i) = rnd * 1 
↑使用時にscのi番目の入れ物に rnd*1 を入れなさい 
 
としているため、エラー13「型が一致しません」と叱られます。 
 
最初に示されたコードを見ると動的配列ですので 
Dim sc() As Variant に変更すればOKです。 
使うときは ReDim で配列の大きさを設定して下さい。 
詳細はヘルプの動的配列に載っています。 
 
neptuneさんが示された型については、ここの講座でも詳しく書かれています。 
一度ご覧になると良いと思います。(私なら Dim sc() As Single と宣言します) 
 
第36回 型の指定 
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard36.htm
投稿者 708  () 投稿日時 2007/9/14 21:19:00
アドバイスありがとうございました!! 
 
もうひとつお聞きしたいのですが、プログラム中の 
 
If sc(i) < 0.27 Then   
crack(i) = 1 
..... 
 
の部分で、sc(i) < 0.27にあてはまるとcrack(i) = 1となり、「さらにその部分を黒で塗りつぶす」というコードを加えたいのですが、どうすればいいでしょうか?? 
 
アドバイスお願いします。
投稿者 後藤  () 投稿日時 2007/9/15 03:08:00
>>6 
>crack(i) = 1となり、 
 
と言われましても、crackが何を示すのか判りません。 
 
>「さらにその部分を黒で塗りつぶす」 
 
と言われましても、その部分とは何を指すのか判りません。 
 
私の解読力が低いのかもしれませんが、お示しになったコードから 
は読み取れませんでした。