Странно действующий цикл в C # - PullRequest
1 голос
/ 14 ноября 2009

Примечание: я добавил фактические фрагменты кода. Просто прокрутите до конца.

// files is created by a OpenFileDialog.
public void Function(String[] files, ...)
{
    for(int i; i<files.Length; i++)
    {
        WriteLine("File " + i + "/" + files.Length + " being processed.");
        //... processing for a long time and printing information to console ...
    }

    //... print results, e.g.: "Results: bla bla"...
}

Функция вызывается в другом цикле. Я запускал код несколько раз и думал, что это работал хорошо, пока я не увидел, что однажды это действовало странно. Я предоставил вышеуказанную функцию с длиной массива, равной 6, и ожидаемый результат был таким:

-------------------------
File 0/6 being processed.
...lots of output...
File 1/6 being processed.
...lots of output...
File 2/6 being processed.
...lots of output...
File 3/6 being processed.
...lots of output...
File 4/6 being processed.
...lots of output...
File 5/6 being processed.
...lots of output...

Results: bla bla...
-------------------------

Однако вывод, который я получил, был таким:

-------------------------
File 0/1 being processed.
...lots of output...

Results: bla bla...

File 0/3 being processed.
...lots of output...
File 1/3 being processed.
...lots of output...
File 2/3 being processed.
...lots of output...

Results: bla bla...

File 0/3 being processed.
...lots of output...
File 1/3 being processed.
...lots of output...
File 2/3 being processed.
...lots of output...

Results: bla bla...

File 0/6 being processed.
...lots of output...
File 1/6 being processed.
...lots of output...
File 2/6 being processed.
...lots of output...
File 3/6 being processed.
...lots of output...
-------------------------

Когда я увидел этот вывод, я завершил выполнение до того, как закончился текущий цикл (он запускается очень долго.)

Похоже, что функция работает правильно (она запускает файлы. Длительное время и выводит результаты после этого.) Однако аргумент, переданный функции, почему-то неверен (функция интересно вызывается более одного раза. Обычно в этом случае выполняется только один раз. Я имею в виду, что количество строк в файле сценария определяет, сколько раз была вызвана вышеупомянутая функция, а файл сценария содержит только одну строку.) Этот аргумент (массив файлов) происходит из OpenFileDialog Это означает, что я не имею к этому никакого отношения. Я просто передаю массив в функцию.

Я все еще пытаюсь понять причину такого странного исхода. Это случилось только один раз, но мне все еще нужно диагностировать проблему; потому что я оставлю программу работающей, может быть, на пару дней. Должно работать правильно.

У вас есть идеи по поводу этой чепухи?


Фактический код вышеуказанной функции:

public String Start(String[] files, StreamWriter reportWriter)
{
    List<SortedDictionary<int, SortedDictionary<long, int>>>[] allResults
        = new List<SortedDictionary<int,SortedDictionary<long,int>>>[files.Length];
    List<SortedDictionary<int, SortedDictionary<long, int>>> results;
    Simulation_DenemePositionEstimator p;
    Simulation_WimaxStreamReader reader;
    String ret;

    for (int i = 0; i < files.Length; i++)
    {
        System.Console.WriteLine("File " + (i+1) + "/" + files.Length + " being processed.");
        reader = new Simulation_WimaxStreamReader(grids, new StreamReader(files[i]));
        p = new Simulation_DenemePositionEstimator(grids, reader);
        // Using parameters in script file which were saved into
        // different variables when Simulation instance was created.
        results = 
            p.StartInvestigation(maxRssiDiff, maxCinrDiff, maxAvgTxPwrDiff, 
                maxUncontinuity, radiusForNeighbors, expansionFactor, increment,
                n, numberOfIterations, resetCountForPositioning);
        allResults[i] = results;
        reader.Close();
    }

    ret = Statistics(allResults);
    System.Console.WriteLine(ret);
    reportWriter.WriteLine(ret);
    reportWriter.Flush();

    return ret;
}

Код функции звонящего:

    // read a line from script file.
    while((line = reader.ReadLine()) != null)
    {
        // line starting with # is comment.
        if (line.StartsWith("#") == false)
        {
            // save parameters retrieved from script file into an array.
            values = line.Split(delimiters);
            // new Simulation instance with new parameters
            sim = new Simulation(map, values);
            // Start simulation. scenarioFiles comes from OpenFileDialog.
            report = sim.Start(scenarioFiles, reportWriter);
            //reportWriter.WriteLine(report);
            reportWriter.WriteLine("---------------NEW-PARAMETERS---------------");
            reportWriter.Flush();
        }
    }

Файл сценария:

# Horizontal grid count
# Vertical grid count
# maxRssiDiff is the maximum RSSI difference allowed.
# maxCinrDiff is the maximum CINR difference allowed.
# maxAvgTxPwrDiff is the maximum AvgTxPwr difference allowed.
# maxUncontinuity
# radiusForNeighbors
# expansionFactor
# increment
# n -> MT'den gelen kaç değerin ortalaması alınıp yer bulma algoritmasına girdi olarak verilsin?
# Algoritma kaç adımda bir sonuçları dosyaya yazsın?
# Kaç adımdan sonra yer bulma işlemine sıfırdan başlamış gibi devam etsin?
# 
# Örnek:
# 118   90  4   3   4   2   1   1   1   3   10  100
118 90  6   4   6   2   1   1   1   3   250 500
# 200   140 4   3   4   2   1   1   1   3   10  100

1 Ответ

4 голосов
/ 14 ноября 2009

Кажется, что что-то вызывает метод чаще, чем вы ожидаете.

Поместите точку останова в первую строку метода и посмотрите, когда и почему он вызывается. Ошибка почти обязательно связана с вызывающим кодом, а не с самим методом, что означает, что мы не можем больше помочь, чем предлагать такие вещи, как точки останова, протоколирование трассировки стека и т. Д.

...