C# - 関数を渡して配列内の入力値を取得する

okwaves2024-01-25  8

この質問にはすでに答えがあります: すでに変数を定義しているのに、変数が存在しないことを示すエラーが表示されるのはなぜですか?

(答えは2つ)

名前は現在のコンテキストに存在しません - 解決するにはどうすればよいですか?

(回答は 1 件)

3 年前

に閉店しました。

配列に入力された値を取得する際に問題が発生しています。 「メソッド」の関数を作成する必要があります。さらに詳しく説明しましょう。

コードの完全なブロックは次のとおりです。

using System;
class LabExer
{

  static void arrayVal(string[] arr)
  {
    for(int i = 0; i < arr.Length; i++)
        {
            Console.Write(arr[i] + ": ");
            arr[i] = Console.ReadLine();
            
        }
  }

  static void Method1(){
      //Console.Write(letters[i]);
  }
  
  static void Main ()
  {
    string[] letters = {"S", "T", "U", "V", "W", "X", "Y", "Z"};
    int choice = 0;
    while (choice!=5)
    {
        
        Console.WriteLine("Hello! Enter values, then choose your action below:");
        arrayVal(letters);
        
        Console.WriteLine("\n1. Method 1");
        Console.WriteLine("2. Method 2");
        Console.WriteLine("3. Method 3");
        Console.WriteLine("4. Method 4");
        Console.WriteLine("5. Exit");
        
        choice = int.Parse(Console.ReadLine());
        
        switch(choice)
        {
            case 1:
                Method1();
        }
    }
    
  }
}

方法 1 の場合:

letters[i] で呼び出して、arrayVal からユーザー入力値を取得しようとしていますが、コンテキストに存在しないというエラーが表示されます。当面は、何をすべきかを理解するのに役立つ可能性があるため、関数を使用して値を出力しようとしています。残念ながら、まだできません。

ご提案があれば大変助かります。

配列を Main の外で静的フィールドとして宣言する必要があります。

– insane_developer

2020 年 9 月 4 日 19:55

その方法がよくわかりません。ごめんなさい。それをどのように実装しますか?

– ガァァァァブ

2020 年 9 月 4 日 19:57

1

配列にアクセスできるように配列を arrayVal に渡したのと同じように、Method1 にもアクセスを許可する必要があります。配列を引数としてメソッドに渡すか、配列をクラス フィールドとして宣言して、クラスのすべてのメソッドからアクセスできるようにします。

– ルーファス L

2020 年 9 月 4 日 20:01

@insane_developer 静的変数は必要ありません。メソッドをパラメータ化するだけで十分です。静的変数はステートフルであるため、多大な害を及ぼす可能性があります。

– ンドガク

2020 年 9 月 4 日 20:13

@N.Dogac 静的メソッドでインスタンス フィールドを参照できますか?もちろん、これらをすべて非静的に変更することもできますが、現状では静的である必要があります。

– insane_developer

2020 年 9 月 4 日 20:29



------------------------

これが Method1 である必要があります -

static void Method1(string[] letters)
{
    for (int i = 0; i < letters.Length; i++)
        Console.Write(letters[i] + " ");    // spacing for formatting, nothing functional

    Console.WriteLine("\n\n");    // new lines for next iteration, nothing functional
}

そして、これがあなたがそれを呼び出す方法です -

switch (choice)
{
    case 1:
        Method1(letters);
        break;
}

これにより、arrayVal メソッドによって保存されたすべてのユーザー入力を出力します。

特定の入力を出力したい場合は、 -

static void Method1(string[] letters, int index)
{
    Console.Write(letters[index]);

    Console.WriteLine("\n\n");    // new lines for next iteration, nothing functional
}

そしてそれを

で呼び出します
switch (choice)
{
    case 1:
        Method1(letters, 6);    // pass the desired index as the second argument
        break;
}

それがうまくいくことを願っています。

編集: すでに文字の配列をパラメータとして arrayVal メソッドに渡しているため、文字を Main メソッドの外に移動することは提案しませんでした。ただし、それをクラスのプライベート フィールドにすることは確かに可能です。その場合、arrayVal も Method1 も、署名に string[] パラメータを必要としません。

0



------------------------

次のようなことを試してください:

 static void Main(string[] args)
{
    string[] letters = { "S", "T", "U", "V", "W", "X", "Y", "Z" };
    int choice = 0;

    while (choice != 5)
    {
        Console.WriteLine("Hello! Enter values, then choose your action below:");
        arrayVal(letters);

        // print your array with new vales
        for (int i = 0; i < letters.Length; i++)
        {
            Console.WriteLine($"{i + 1}. {letters[i]}");
        }

        choice = int.Parse(Console.ReadLine());

        // to take a single value of array
        string indexValue = letters[choice];

        switch (choice)
        {
            //remind that the array start in position zero (0)
            case 1:    
                Method1();
                break;

            default:
                Console.WriteLine("Invalid Option");
                break;
        }
    }

arr の値を取得したい場合Method1 では、次のように変更する必要があります。

static void Method1(int i, string[] letters)
{
    Console.Write(letters[i]);
}

// and the call (in the Main)
 case 1:    
     Method1(choice, letters);
     break;

2

理由はよくわかりませんが、それでも「名前 `letters'」と表示されます。方法 1 の現在のコンテキストには存在しません。

– ガァァァァブ

2020 年 9 月 4 日 20:17

ああ、これは文字が Method1 ではなくメイン コンテキストのみだからです。これを忘れてしまいました, しかし、今はコードを編集して更新しました。解決には 2 つの方法があります: => Method1(int Choice, string[] Letters) OR => のように、Method1 に文字を渡します。クラスプログラムでグローバルのような文字を宣言します

– ウェリントン ジュニア

2020 年 9 月 4 日 20:32



------------------------

これがアイデアです:

using System;
class LabExer
{
  private static string[] letters = {"S", "T", "U", "V", "W", "X", "Y", "Z"};

  static void arrayVal(string[] arr)
  {
    for(int i = 0; i < arr.Length; i++)
        {
            Console.Write(arr[i] + ": ");
            arr[i] = Console.ReadLine();
            
        }
  }

  static void Method1(int index){
      Console.Write(letters[index]);
  }
  
  static void Main ()
  {
    int choice = 0;
    while (choice!=5)
    {
        
        Console.WriteLine("Hello! Enter values, then choose your action below:");
        arrayVal(letters);
        
        Console.WriteLine("\n1. Method 1");
        Console.WriteLine("2. Method 2");
        Console.WriteLine("3. Method 3");
        Console.WriteLine("4. Method 4");
        Console.WriteLine("5. Exit");
        
        choice = int.Parse(Console.ReadLine());
        
        switch(choice)
        {
            case 1:
                Method1(0); //your logic to decide which index
                break;
        }
    }
    
  }
}

文字が Main() メソッドのスコープ内にあるため、エラーが発生します。これをクラス レベルに置くと、クラス内の任意のメソッドからアクセスできるようになります。

2

文字[i]を印刷しようとしましたが、何も印刷されません。それとも印刷時に何か間違ったことをしているのでしょうか?

– ガァァァァブ

2020 年 9 月 4 日 20:05

メソッドにパラメータを追加する必要があります。これは配列 static void Method1(int i){...} のインデックスであり、必要なインデックス Method1(0);` を使用してメソッドを呼び出します。私の答えは、静的フィールドを配置する方法を示すことを意味していました。私はコードを実行しないでください。スコープを理解するには、これをお読みください:tutorialspoint.com/scope-of-variables-in-chash

– insane_developer

2020 年 9 月 4 日 20:20

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。