2009-04-21 4 views
1

mon problème est que l'assignation de decodedProxyExcerpt2 ci-dessous écrase decodedProxyExcerpt1 et je ne sais pas pourquoi.Problème d'intégrité des données C#

Des indices?

Merci d'avance.

 DecodedProxyExcerpt decodedProxyExcerpt1 = new DecodedProxyExcerpt(stepSize); 
     if (audiofactory.MoveNext(stepSize)) 
     { 
      decodedProxyExcerpt1 = audiofactory.Current(stepSize); 
     } 
     // At this point decodedProxyExcerpt1.data contains the correct values. 

     DecodedProxyExcerpt decodedProxyExcerpt2 = new DecodedProxyExcerpt(stepSize); 
     if (audiofactory.MoveNext(stepSize)) 
     { 
      decodedProxyExcerpt2 = audiofactory.Current(stepSize); 
     } 
     // At this point decodedProxyExcerpt2.data contains the correct values. 
     // However, decodedProxyExcerpt1.data is overwritten and now holds the values of decodedProxyExcerpt2.data. 


public class DecodedProxyExcerpt 
{ 
    public short[] data { get; set; } // PCM data 

    public DecodedProxyExcerpt(int size) 
    { 
     this.data = new short[size]; 
    } 

} 

De AudioFactory:

public bool MoveNext(int stepSize) 
    { 
     if (index == -1) 
     { 
      index = 0; 
      return (true); 
     } 
     else 
     { 
      index = index + stepSize; 
      if (index >= buffer.Length - stepSize) 
       return (false); 
      else 
       return (true); 
     } 
    } 

    public DecodedProxyExcerpt Current(int stepSize) 
    { 
     Array.Copy(buffer, index, CurrentExcerpt.data, 0, stepSize); 
     return(CurrentExcerpt); 
    }} 
+0

Il n'y a pas vraiment assez d'informations ici pour savoir ce qui se passe - votre problème pourrait bien être dans audioFactory. – cjk

+1

Post le code de audiofactory.Current (stepSize), évidemment l'erreur se trouve là; –

+0

+1 sur l'emplacement du bogue. Il est assez difficile d'imaginer un problème d'intégrité des données en C# ou .NET après sept ans. Profondément à l'intérieur du CLR ou dans le code de multitraitement, peut-être, mais pas dans un simple code à un seul thread. –

Répondre

1

Les instances de classes sont stockées en tant que références.

decodedProxyExcerpt1 et decodedProxyExcerpt2 sont tous deux des références au même objet - audiofactory.CurrentExcerpt.

4

De l'apparence de celui-ci audiofactory.MoveNext(stepSize) est logé à la même référence. Cela provoque audiofactory.Current(stepSize) à rester à la même adresse.

Pour cette raison, mais decodedProxyExcerpt1 et decodedProxyExcerpt2 pointent vers la même référence et changent donc pour se propager à l'autre. Donc, les problèmes résident dans votre classe AudioFactory.

0

J'ai demandé à un ami à ce sujet qui m'a donné l'indice que j'ai pu penser en C++ où l'assignation d'un tableau crée une copie, au lieu de C# où l'assignation d'un tableau crée une référence.

Si cela est correct et

decodedProxyExcerpt1 = audiofactory.Current (stepSize);

est de définir une référence (pas une copie) puis l'écrasement est complètement compréhensible.