2009-11-14 4 views
1

Note: J'ai ajouté des extraits de code réels. Faites défiler jusqu'à la fin.Weird acting loop in 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"... 
} 

fonction est appelée dans une autre boucle. J'ai couru le code plusieurs fois et je pensais que c'était qui fonctionnait bien jusqu'à ce que j'aie vu qu'une fois il a agi bizarrement. J'ai fourni la fonction ci-dessus avec une longueur de tableau qui était 6, et le résultat attendu était comme ça:

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

Cependant, la sortie je suis arrivé était comme ça:

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

Quand j'ai vu cette sortie je quitte l'exécution avant que la boucle actuelle soit terminée (il fonctionne depuis très longtemps.)

Il semble que la fonction fonctionne correctement (Elle exécute des fichiers. Les temps de longueur et les résultats de sorties après cela.) Cependant , l'arg Le passage passé à la fonction est en quelque sorte défectueux (la fonction est appelée de manière intéressante plus d'une fois. Normalement, il ne devrait fonctionner qu'une seule fois dans ce cas. Je veux dire, le nombre de lignes dans un fichier de script détermine le nombre de fois que la fonction est appelée, et le fichier de script ne contient qu'une ligne.) Cet argument (tableau de fichiers) provient d'un OpenFileDialog, ce qui signifie que je n'ai rien à voir avec il. Je passe juste le tableau à la fonction. J'essaie toujours de comprendre la raison d'un résultat si étrange. Cela n'est arrivé qu'une seule fois, mais je dois encore diagnostiquer le problème; parce que je vais laisser le programme fonctionner pendant quelques jours. Cela devrait fonctionner correctement.

Avez-vous des idées à propos de cette absurdité?


code actuel de la fonction ci-dessus:

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; 
} 

code de fonction de l'appelant:

// 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(); 
     } 
    } 

fichier script:

# 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

Vous avez une boucle borked quelque part. Le code que vous postez n'est pas suffisant pour le reproduire, j'en ai bien peur ... aussi: faites-vous quelque chose d'amusant avec les threads? Peut-être lié à une «capture» douteuse? –

+0

Vous devez ajouter plus de détails, par exemple le code qui appelle cette fonction. Et potentiellement aussi du traitement - le traitement est-il asynchrone par hasard? –

+0

Je n'utilise pas de threads. Je lis simplement des fichiers et je fais des calculs. Je posterai le code bientôt. – blahbaa

Répondre

4

Il semble que quelque chose appelle la méthode plus souvent que prévu.

Placez un point d'arrêt sur la première ligne de la méthode et voyez quand et pourquoi elle est appelée. Le bug est presque lié au code appelant plutôt qu'à la méthode elle-même, ce qui signifie que nous ne pouvons pas vraiment vous aider à suggérer des points d'arrêt, enregistrer des traces de pile, etc ...

+0

J'ai fait ce que vous dites mais le problème ne s'est pas produit pour la deuxième fois depuis. Il n'y a également qu'un seul endroit où la fonction ci-dessus est appelée. Il me rend fou. – blahbaa

+0

Donc, mettez la connexion à cet endroit d'appel (avec l'information appropriée qui vous dira pourquoi il l'appelle) - alors la prochaine fois que ça ne va pas, vous obtiendrez plus d'informations. –

+0

La journalisation est une bonne idée, mais je ne suis pas sûr de savoir comment le faire. Je suis vraiment confus. Je vais essayer cela maintenant, mais encore une fois je dois attendre beaucoup d'heures pour voir le résultat qui craint. – blahbaa