現在、C#で重複なしでランダムに画像を表示するプログラムを作成しています。
下記のように書いてコンパイラをすると
型 'string' を型 'int' に暗黙的に変換できません
名前 'n' は現在のコンテキスト内に存在しません。
名前 'n' は現在のコンテキスト内に存在しません。
名前 'n' は現在のコンテキスト内に存在しません。
というエラーが出て直し方が分からない状態です。
このエラーは、GetNextIndex()関数内で起こっています。
どうか力を貸してください。お願いします。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//定数
private const int IMAGES = 3;//イメージの総数=各配列の要素数
//メンバー変数
private string[] sPathes = {@"D:\A.BMP",//1番目の画像のパス
@"D:\B.BMP",//2番目の画像のパス
@"D:\C.BMP",//3番目の画像のパス;//パス配列の宣言と定義
};
private Image[] myImages = null;//イメージ配列変数の宣言
private int m_nIndex;//表示する画像の番号
//private int[] m_nUsed = null;//表示済画像の番号の配列
private int m_nTimes = 0;//これまでに表示した枚数(3まで)
public void Init()//引数なし、メンバー変数の初期化
{
//イメージ配列の初期化
//・・・インスタンスメモリの確保(メモリーの確保は最初の1回だけ)
if (myImages == null)
myImages = new Image[IMAGES];//本当はnewのチェックが必要
//・・・ファイルを読み込んでイメージ配列に格納
for (int n = 0; n < IMAGES; n++)
{
string sPath = sPathes[n];//パス文字列
Image img = Image.FromFile(sPath);//イメージ読込
myImages[n] = img;//配列に格納
}//for終わり
//this.m_nUsed(-1);
}
protected virtual void OnCreate()//OnLoadから呼ばれる
{
//変数の初期化を行う
this.Init();
}
//初回更新用の関数
protected virtual void OnInitialUpdate()
{
this.OnUpdate();//更新をかける
}
//更新関数
protected virtual void OnUpdate()
{
if(m_nIndex < 0)//画像番号が設定されていなければ何もしない。
return;
//画像の更新
pictureBox1.Image = myImages[m_nIndex];
}
//次に表示する画像番号の取得
protected int GetNextIndex()
{
//ランダムな配列を作成
Random r = new Random();
//重複チェック
int[] a = new int[n];
for (int i = 0; i < n; ++i) a[i] = i + 1;
for (int i = n; i > 1; --i)
{
int k = r.Next(i);
int tmp = a[i - 1];
a[i - 1] = a[k];
a[k] = tmp;
}
return r.ToString();
}
private void button1_Click(object sender, EventArgs e)
{
if(m_nTimes >= IMAGES)
return;
int n = GetNextIndex();//次なる番号の取得
if (n < 0)//適当な番号が得られなければ
return;//何もしない
//やっと画像番号を変える
m_nIndex = n;
//更新を呼び出す
this.OnUpdate();
}
}
}
No.2ベストアンサー
- 回答日時:
> 値として何を返せばよろしいのでしょうか?
それを考えるのが「プログラミング」というものです。
まず、プログラムの仕様をまとめた方がいいです。
それから、一気に作らず、各メソッドが期待通りに動作しているか、テストした方がよいでしょう。今回のだったら、画像の表示等は後にして、GetNextIndexが「重複していない整数」をちゃんと返すかどうか、確認してから次へ進めましょう。
button1_Clickの動作からして、GetNextIndexは、m_nIndexに設定するための0以上IMAGES未満の整数を、重複無しにランダムに返してくることが期待されているのではないでしょうか。あとは、エラー時には負の整数を返すことも。
そこで、GetNextIndexを見ると、returnの直前では
int a[] : 1以上n以下の整数をシャフルした配列
となっています。nは定義されていないので、IMAGESの間違いで、
> for (int i = 0; i < IMAGES; ++i) a[i] = i + 1;
の a[i] = i + 1;をa[i] = i ;にすれば
int a[] : 0以上IMAGES未満の整数をシャフルした配列
となり、このaの値をGetNextIndexが呼ばれる度に一つずつ返せば、目的の動作になるはずだ、ということがわかります。
なので
return a[X] ;
のような形になるでしょう。
ところが、今のままでは、
・配列aを毎回作っている。これではシャフルの意味がない
・どこまで使って、次に何を返せばいいのか、覚えておく仕組みが無い
・配列をリセットする手段が無い。
と言う問題があります。
解決策としては、Randomのようなインターフェースで専用のクラスを用意するのがいいのでは、と思います。
回答ありがとうございました。
kmeeさんのおっしゃる通りに1つずつ作成していったら
目標とする動きが出来ました。
ありがとうございました。
それでは、失礼いたします。
No.1
- 回答日時:
> protected int GetNextIndex()
と宣言したのに
> return r.ToString();
なぜstringで返すのでしょう?
戻り値がintのはずなのに、stringが指定してあって、戻り値の型にあわせるためにstring→intの変換をしようにも変換方法がわからない(暗黙の変換が無い)というエラーです。
そもそもこのGetNextIndexですが
・Randomクラスであるrを返すこと自体おかしい
・呼ばれるたびに、毎回新しい乱数と新しい重複チェック配列を作っています。これらはreturn後に自動で削除されます。
まったく、重複チェックになっていません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java Java 配列<選挙> 4 2023/07/31 15:07
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで配列の計算
-
VB.net 引数で配列変数を渡す際...
-
EXCEL VBA で、0から?1から?
-
変数を動的に作るには?
-
パソコンキーボードで時分秒を...
-
動的配列が存在(要素が有る)か...
-
VBで作った乱数を一度も重複さ...
-
C言語 重複しない4ケタの乱数...
-
配列の要素数を超えた参照のコ...
-
IF関数でEmpty値を設定する方法。
-
10進数を4桁のバイト配列に格納...
-
遅延バインディングを使用でき...
-
C# 多次元配列の要素数の変更
-
ジャグ配列とは
-
C# での文字列パディング
-
空き番号探し
-
応用情報技術者試験の令和元年...
-
VBでbyte配列型のインスタンス...
-
グループ分け
-
c# 他プロセス起動 リダイレク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
応用情報技術者試験の令和元年...
-
IF関数でEmpty値を設定する方法。
-
VBAで配列の計算
-
パソコンキーボードで時分秒を...
-
EXCEL VBA で、0から?1から?
-
動的配列が存在(要素が有る)か...
-
変数を動的に作るには?
-
C言語 重複しない4ケタの乱数...
-
VBで作った乱数を一度も重複さ...
-
VB.net 引数で配列変数を渡す際...
-
配列の要素数を超えた参照のコ...
-
C#の質問
-
複数のテキストボックスに同じ...
-
VBでbyte配列型のインスタンス...
-
For文と配列
-
遅延バインディングを使用でき...
-
【MFC】GetCount()とGetSize()...
-
配列プロパティをREDIMする方法...
-
Excel VBAで配列の途中から(X)M...
-
五目並べのプログラムを配列と...
おすすめ情報