1

私はc#にかなり慣れていません。コマンドライン引数で問題が発生しました。私がやりたいのは、3番目のcmd行引数を利用してそれに書き込むことです。書き込みたいファイルなどのパスを指定しました。しかし、ここでの問題は、ユーザー定義関数からコマンドライン引数(たとえば、args [3])にアクセスできるかどうかです。どのようにtatを行いますか?以下は私のコードです。

public class Nodes
{
public bool isVisited;
public string parent;
public string[] neighbour;
public int nodeValue;

public Nodes(string[] arr, int nodeValue)
{
    this.neighbour = new string[arr.Length];
    for (int x = 0; x < arr.Length; x++)
        this.neighbour[x] = arr[x];//hi...works??
    this.isVisited = false;
    this.nodeValue = nodeValue;
}


}

public class DFS
{
static List<string> traversedList = new List<string>();

static List<string> parentList = new List<string>();
static BufferBlock<Object> buffer = new BufferBlock<object>();
static BufferBlock<Object> buffer1 = new BufferBlock<object>();
static BufferBlock<Object> buffer3 = new BufferBlock<object>();
static BufferBlock<Object> buffer2 = new BufferBlock<object>();

public static void Main(string[] args)
{

    int N = 100;
    int M = N * 4;
    int P = N * 16;

    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();

    List<string> global_list = new List<string>();


    StreamReader file = new StreamReader(args[2]);

    string text = file.ReadToEnd();

    string[] lines = text.Split('\n');


    string[][] array1 = new string[lines.Length][];
    Nodes[] dfsNodes = new Nodes[lines.Length];

    for (int i = 0; i < lines.Length; i++)
    {
        lines[i] = lines[i].Trim();
        string[] words = lines[i].Split(' ');

        array1[i] = new string[words.Length];
        dfsNodes[i] = new Nodes(words, i);
        for (int j = 0; j < words.Length; j++)
        {
            array1[i][j] = words[j];
        }
    }
    StreamWriter sr = new StreamWriter(args[4]);

    int startNode = int.Parse(args[3]);

    if (args[1].Equals("a1"))
    {
        Console.WriteLine("algo 0");
        buffer.Post(1);
        dfs(dfsNodes, startNode, "root");
    }
    else if (args[1].Equals("a2"))
    {
        Console.WriteLine("algo 1");
        buffer1.Post(1);
        dfs1(dfsNodes, startNode, "root",sr);
    }
    else if (args[1].Equals("a3"))
    {
        buffer3.Post(1);
        List<string> visitedtList = new List<string>();
        Console.WriteLine("algo 2");
        dfs2(dfsNodes, startNode, "root", visitedtList,sr);
    }

    stopwatch.Stop();

    Console.WriteLine(stopwatch.Elapsed);
    Console.ReadLine();
}

public static void dfs(Nodes[] node, int value, string parent,StreamWriter sr1)
{
    int id = (int)buffer.Receive();
    sr1=new StreamWriter(arg
    Console.WriteLine("Node:" + value + " Parent:" + parent + " Id:" + id);
    sr1.Write("Node:" + value + " Parent:" + parent + " Id:" + id);
    id++;
    traversedList.Add(value.ToString());
    buffer.Post(id);
    for (int z = 1; z < node[value].neighbour.Length; z++)
    {
        if (!traversedList.Contains(node[value].neighbour[z]))
        {
            dfs(node, int.Parse(node[value].neighbour[z]), value.ToString(),sr1);
        }

    }
    return;



}

public static void dfs1(Nodes[] node, int value, string parent, StreamWriter sr)
{
    int id = (int)buffer1.Receive();
    sr.Write("Node:" + value + " Parent:" + parent + " Id:" + id);
    node[value].isVisited = true;
    node[value].parent = parent;
    id++;
    buffer1.Post(id);
    for (int z = 1; z < node[value].neighbour.Length; z++)
    {
        buffer2.Post(node[int.Parse(node[value].neighbour[z])]);
        if (!isVisited())
        {
            dfs1(node, int.Parse(node[value].neighbour[z]), value.ToString(),sr);
        }

    }
    return;



}

public static void dfs2(Nodes[] node, int value, string parent, List<string> visitedtList, StreamWriter sr)
{
    int id = (int)buffer3.Receive();
    sr.Write("Node:" + value + " Parent:" + parent + " Id:" + id);
    id++;
    visitedtList.Add(value.ToString());
    buffer3.Post(id);
    for (int z = 1; z < node[value].neighbour.Length; z++)
    {
        buffer2.Post(node[int.Parse(node[value].neighbour[z])]);
        if (!visitedtList.Contains(node[value].neighbour[z]))
            dfs2(node, int.Parse(node[value].neighbour[z]), value.ToString(), visitedtList,sr);

    }
    return;



}

public static bool isVisited()
{
    Nodes node = (Nodes)buffer2.Receive();
    return node.isVisited;
}

}

つまり、各dfsの出力をコマンドライン引数として指定されたファイルに書き込みたいということです。だから私はdfs、dfs1メソッドの引数にアクセスできますか?ありがとうございました。

4

3 に答える 3

4

それを保持するために静的フィールドを保持するか、単に を使用することができますEnvironment.GetCommandLineArgs()

于 2012-06-04T23:07:00.540 に答える
3

まあ、最も単純な形では、後で使用するために保存するだけです

class Program
{
    static string _fpath;
    static void Main(string[] args)
    {
        // ...stuff
        _fpath = args[3];
    }

    static void WriteFile()
    {
        using(var stream = File.Open(_fpath, ...))
        {
            // write to file
        }
    }
}

必ずしも私がどのように行うかは正確ではありませんが、アイデアはわかります。

また、このコードについては...

this.neighbour = new string[arr.Length];
for (int x = 0; x < arr.Length; x++)
    this.neighbour[x] = arr[x];//hi...works??

あなたは単に書くことができます

this.neighbour = arr;

ああ、マネージド コードの素晴らしさ :D. 要素を 2 番目の配列にコピーする必要はありません。もちろん、引数配列 ( arr) 内の要素への変更が内部配列に反映されるという事実を考慮する必要があります。

于 2012-06-04T23:09:38.713 に答える
2

引数を渡すための「隠された」方法に依存するのではなく、引数を関数に渡す方がよいでしょう。

静的変数とGetCommandLineArgsはどちらも、(他の回答で指摘されているように)隠された方法でそれらを渡すのに役立ちます。欠点はテストが難しく(静的な共有依存関係を設定する必要があるため)、将来の読者にとって、この隠れた依存関係があることはあまり明確ではありません。

于 2012-06-04T23:17:49.257 に答える