2009-11-14 2 views
1

Примечание: Я добавил фактические фрагменты кода. Просто прокрутите до конца.Weird действующая петля в C#

// 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... 
------------------------- 

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

Похоже, что функция работает правильно (она запускает файлы. Длительность и выходные результаты после этого.) Однако , arg ument, переданный функции, как-то ошибочен (функцию интересно назвать более одного раза. Обычно он должен работать только один раз в этом случае. Я имею в виду, что количество строк в файле сценария определяет количество раз, когда функция вызывает функцию, а файл сценария содержит только одну строку.) Этот аргумент (массив файлов) поступает из 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; 
} 

Caller код функции:

// 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 
+0

У вас есть петля. Код, который вы публикуете, недостаточно, чтобы воспроизвести его, я боюсь .... также: вы делаете что-нибудь интересное с помощью потоков? Может быть, связано с изворотливым «захватом»? –

+0

Вам нужно добавить более подробную информацию, например код, вызывающий эту функцию. И, возможно, и от обработки - это обработка, сделанная async, случайно? –

+0

Я не использую нитки. Я просто читаю файлы и делаю некоторые вычисления. Я отправлю код в ближайшее время. – blahbaa

ответ

4

Похоже то вызывает метод чаще, чем вы ожидаете.

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

+0

Я сделал то, что вы говорите, но проблема не возникала уже второй раз с тех пор. Также есть только одно место, где вызывается вышеупомянутая функция. Это сводит меня с ума. – blahbaa

+0

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

+0

Регистрация - это хорошая идея, но я не уверен, как это сделать. Я действительно смущен. Я попробую это сейчас, но снова я должен ждать много часов, чтобы увидеть результат, который отстой. – blahbaa

Смежные вопросы