C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: c#で配列を座標として使用したいのですが...


(過去ログ 144 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■84538 / inTopicNo.1)  c#で配列を座標として使用したいのですが...
  
□投稿者/ emu (1回)-(2017/07/14(Fri) 00:45:10)

分類:[C#] 

2017/07/14(Fri) 00:49:00 編集(投稿者)

Unityでc#を用いてプログラムを書いています。
2次元配列としてデータが以下のソースで格納されています。
//-----------------------------------------
public data1(double q, double a1)
{
this.q = q;
this.a1 = a1;
}
//-----------------------------------------

この二つのデータをx,y座標として順番に点を取っていきたいのですが、
//---------------------------------------------------------
for (int idx = 0; idx < 100; idx++)
{
Point.Add(new Vector2(q[idx],a1[idx]));
}
//---------------------------------------------------------
と書くと"角かっこ[]付きインデックスを'double'型の式に適用することはできません"
と、エラーがでます。対処法を教えてください。
引用返信 編集キー/
■84540 / inTopicNo.2)  Re[1]: c#で配列を座標として使用したいのですが...
□投稿者/ ぽぴ王子 (44回)-(2017/07/14(Fri) 09:15:00)
ぽぴ王子 さんの Web サイト
No84538 (emu さん) に返信
> Unityでc#を用いてプログラムを書いています。
> 2次元配列としてデータが以下のソースで格納されています。
> //-----------------------------------------
> public data1(double q, double a1)
> {
> this.q = q;
> this.a1 = a1;
> }
> //-----------------------------------------

このコードを見る限り「2次元配列として」は格納されていないような気がします。
this.q と this.a1 の型が明示されていないのでわかりませんが、パラメータ q, a1
を見る限りは double 型ですよね。
それを格納しているということは this.q も this.a1 も double 型のような気が
するのですが、だとすると2次元配列ではないですよね。

> この二つのデータをx,y座標として順番に点を取っていきたいのですが、
> //---------------------------------------------------------
> for (int idx = 0; idx < 100; idx++)
> {
> Point.Add(new Vector2(q[idx],a1[idx]));
> }
> //---------------------------------------------------------
> と書くと"角かっこ[]付きインデックスを'double'型の式に適用することはできません"
> と、エラーがでます。対処法を教えてください。

上記の流れから考えるに q も a1 も2次元配列ではないので、このエラーが出るのは正しい
状態だと思われます。
まずは this.q と this.a1 を2次元配列として宣言するべきかと思います。
(同時にデータを格納する処理も変更する必要があります)

引用返信 編集キー/
■84541 / inTopicNo.3)  Re[2]: c#で配列を座標として使用したいのですが...
□投稿者/ emu (2回)-(2017/07/14(Fri) 09:41:59)
2017/07/14(Fri) 10:06:20 編集(投稿者)

No84540 (ぽぴ王子 さん) に返信

> このコードを見る限り「2次元配列として」は格納されていないような気がします。
> this.q と this.a1 の型が明示されていないのでわかりませんが、パラメータ q, a1
> を見る限りは double 型ですよね。
> それを格納しているということは this.q も this.a1 も double 型のような気が
> するのですが、だとすると2次元配列ではないですよね。
>
格納したいデータは今回csvファイルの内容です。,区切りで読み取り、Double.Parseでdouble型
に変換したうえで格納しています(つもりです)。これは2次元配列になっていないんですかね?

//-------------------------------------------------
public List<data1> qtArray;
public csvreadp(string data1)
{
this.qtArray = new List<data1>();
StreamReader sw = new StreamReader(data1, System.Text.Encoding.UTF8);
string line;
while ((line = sw.ReadLine()) != null)
{
string[] strs = line.Split(',');
if (strs.Length != 2) continue;

double a= Double.Parse(strs[0]);
double b= Double.Parse(strs[1]);
qtArray.Add(new data1(a, b));

// Debug.Log("q:" + a + ", a:" + b);
}
//-----------------------------------------------------
引用返信 編集キー/
■84543 / inTopicNo.4)  Re[1]: c#で配列を座標として使用したいのですが...
□投稿者/ ぽぴ王子 (45回)-(2017/07/14(Fri) 10:23:44)
ぽぴ王子 さんの Web サイト
No84541 (emu さん) に返信
CSVファイルはこっちへ置いておくとして、最初の投稿の

> //-----------------------------------------
> public data1(double q, double a1)
>     {
>         this.q = q;
>         this.a1 = a1;
>     }
> //-----------------------------------------

このコードだと、ソース(この場合はソースコードの意味もあるけど、元ネタという意味で)
が足りなくて、ちょっと推測というより推理する感じになっちゃってましたね。

> //-------------------------------------------------
> public List<data1> qtArray;
>  public csvreadp(string data1)
>     {
>         this.qtArray = new List<data1>();
>         StreamReader sw = new StreamReader(data1, System.Text.Encoding.UTF8);
>         string line;
>         while ((line = sw.ReadLine()) != null)
>         {
>             string[] strs = line.Split(',');
>             if (strs.Length != 2) continue;
> 
>            double a= Double.Parse(strs[0]);
>            double b= Double.Parse(strs[1]);
>             qtArray.Add(new data1(a, b));
> 
>           //  Debug.Log("q:" + a + ", a:" + b);
>         }
> //-----------------------------------------------------

合わせて読むと data1 が座標をあらわすクラスで、最初のコードは data1 のコンストラクタ
で、その中に q と a1 という( X と Y にあたるのかな)座標を定義している…ということ
でしょうか。
今回出てきたコードと合わせて読むことでなんとなくそこまで『推測』できるぐらいになりましたが
最初のコードでは、やはり『推理』レベルだと思いました。動きが読み取れる程度の最低限の
コードを提示していただければと思います。

そして合わせて読んでみた限りですが CSV ファイルを読んだ結果得られるのは data1 クラス
のリストで、結論から言うとこれは 2 次元配列ではないですね。 1 次元配列です(正確に言うと
配列でもないですが)。

最初の投稿にあったコード

> //---------------------------------------------------------
> for (int idx = 0; idx < 100; idx++)
>       {
>            Point.Add(new Vector2(q[idx],a1[idx]));
>         }
> //---------------------------------------------------------

の意図(のようなもの)を解釈するとすれば、こんな感じになるんじゃないでしょうか。
(よく見ると idx でループしているので、これも2次元ではないですね)

    for (int idx = 0; idx < 100; idx++)
    {
        Point.Add(new Vector2(data1[idx].q, data1[idx].a1));
    }

自分は Unity は触ったことがないのでわからないですが、むしろ 1 次元だ 2 次元だというより
「なぜこういうコードなのか」「このコードはどういう意図で書かれているのか」をもう少し
理解するように努めたほうがいいのかな…という気はしました。

引用返信 編集キー/
■84545 / inTopicNo.5)  Re[2]: c#で配列を座標として使用したいのですが...
□投稿者/ emu (4回)-(2017/07/14(Fri) 10:54:39)
No84543 (ぽぴ王子 さん) に返信


> 合わせて読むと data1 が座標をあらわすクラスで、最初のコードは data1 のコンストラクタ
> で、その中に q と a1 という( X と Y にあたるのかな)座標を定義している…ということ
> でしょうか。

情報提示不足で申し訳ありません。推測された通りのことを実行しようとしています。


> の意図(のようなもの)を解釈するとすれば、こんな感じになるんじゃないでしょうか。
> (よく見ると idx でループしているので、これも2次元ではないですね)
>
> for (int idx = 0; idx < 100; idx++)
> {
> Point.Add(new Vector2(data1[idx].q, data1[idx].a1));
> }

意図の解釈もこちらの意図と整合していると思いますが、こちらのコードだとdata1の部分が
"'data1'は種類です。これは特定のコンテンツでは無効です"と表示されてしまいます....




引用返信 編集キー/
■84549 / inTopicNo.6)  Re[3]: c#で配列を座標として使用したいのですが...
□投稿者/ ?????q (1回)-(2017/07/14(Fri) 12:47:36)
?????q さんの Web サイト
No84545 (emu さん) に返信
>> for (int idx = 0; idx < 100; idx++)
>> {
>> Point.Add(new Vector2(data1[idx].q, data1[idx].a1));
>> }
>
> 意図の解釈もこちらの意図と整合していると思いますが、こちらのコードだとdata1の部分が
> "'data1'は種類です。これは特定のコンテンツでは無効です"と表示されてしまいます....

あっ、そうですね。コード間違えてますね。data1 はクラスなので、この場合は qtArray に
なりますね。

for (int idx = 0; idx < 100; idx++)
{
Point.Add(new Vector2(qtArray[idx].q, qtArray[idx].a1));
}

という感じになるかと思います。

あと、コードを投稿するときは投稿モードを「図表モード」にしておいたほうが、インデントが
崩れなくていいですよ。
引用返信 編集キー/
■84550 / inTopicNo.7)  Re[3]: c#で配列を座標として使用したいのですが...
□投稿者/ ぽぴ王子 (46回)-(2017/07/14(Fri) 12:48:35)
ぽぴ王子 さんの Web サイト
No84545 (emu さん) に返信
>>    for (int idx = 0; idx < 100; idx++)
>>    {
>>        Point.Add(new Vector2(data1[idx].q, data1[idx].a1));
>>    }
> 
> 意図の解釈もこちらの意図と整合していると思いますが、こちらのコードだとdata1の部分が
> "'data1'は種類です。これは特定のコンテンツでは無効です"と表示されてしまいます....

あっ、そうですね。コード間違えてますね。data1 はクラスなので、この場合は qtArray に
なりますね。

    for (int idx = 0; idx < 100; idx++)
    {
        Point.Add(new Vector2(qtArray[idx].q, qtArray[idx].a1));
    }

という感じになるかと思います。

あと、コードを投稿するときは投稿モードを「図表モード」にしておいたほうが、インデントが
崩れなくていいですよ。

引用返信 編集キー/
■84553 / inTopicNo.8)  Re[4]: c#で配列を座標として使用したいのですが...
□投稿者/ emu (5回)-(2017/07/14(Fri) 16:53:14)
No84550 (ぽぴ王子 さん) に返信

>     for (int idx = 0; idx < 100; idx++)
>     {
>         Point.Add(new Vector2(qtArray[idx].q, qtArray[idx].a1));
>     }

今度はdoubleをfloatに変換できませんってなりました....
 
> あと、コードを投稿するときは投稿モードを「図表モード」にしておいたほうが、インデントが
> 崩れなくていいですよ。

早速使ってみました!

引用返信 編集キー/
■84556 / inTopicNo.9)  Re[5]: c#で配列を座標として使用したいのですが...
□投稿者/ Azulean (834回)-(2017/07/14(Fri) 23:41:33)
No84553 (emu さん) に返信
> 今度はdoubleをfloatに変換できませんってなりました....

それは配列にする前からそうなるのでは?
Vector2 が float 型しか受け入れないなら、float 型の精度でよいのなら float 型にキャストする、ダメなら Vector2 を使わないという風にあなたが判断する必要があります。
引用返信 編集キー/
■84561 / inTopicNo.10)  Re[6]: c#で配列を座標として使用したいのですが...
□投稿者/ ぽぴ王子 (47回)-(2017/07/15(Sat) 19:28:04)
ぽぴ王子 さんの Web サイト
No84556 (Azulean さん) に返信
> ■No84553 (emu さん) に返信
>>今度はdoubleをfloatに変換できませんってなりました....
>
> それは配列にする前からそうなるのでは?
> Vector2 が float 型しか受け入れないなら、float 型の精度でよいのなら float 型にキャストする、ダメなら Vector2 を使わないという風にあなたが判断する必要があります。

Azulean さんのおっしゃる通りです。
「ってなりました」だけだと「 float にキャストするしかないのでは」という回答案しかなかったのですが
そこは質問者さん自身が判断するしかないですし、判断できないと今後も質問しかできないようになってしまう
のではないかと。
まずはエラーメッセージで Google などで検索してみる癖をつけるのもいいかもしれません。
本来ならエラーメッセージそのままがいいのですが、とりあえず「doubleをfloatに変換できません」で検索
してみたところ DOBON.NET さんの以下のページが該当しました。このあたりを読むだけでもだいぶ知識が広がる
と思いますので、そういった癖をつけるようにしてみてください。
https://dobon.net/vb/dotnet/beginner/cast.html

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -