== Auszug aus Timon Gehr (timon.g...@gmx.ch)'s Artikel
> On 08/19/2011 02:01 PM, useo6 wrote:
> > Hi,
> >
> > I've create a little example of my problem:
> >
> > module example;
> >
> > class ExampleClass {
> >
> >     public {
> >
> >             int mi;
> >
> >             this(int i) {
> >                     mi = i;
> >             }
> >
> >     }
> >
> > }
> >
> > int main(string[] args) {
> >
> >     ExampleClass[hash_t] exp;
> >
> >     ExampleClass cex = new ExampleClass(1);
> >     exp[cex.toHash()] = cex;
> >
> >     cex = new ExampleClass(2);
> >     exp[cex.toHash()] = cex;
> >
> >     cex = new ExampleClass(3);
> >     exp[cex.toHash()] = cex;
> >
> >     foreach (ExampleClass c; exp) {
> >             if (c.mi == 2) {exp.remove(c.toHash()); }
> >     }
> >
> >     return 0;
> >
> > }
> >
> > When I run this small example-app, I get an "Access Violation".
When
> > I insert a break into my foreach-loop like:
> >
> >     foreach (ExampleClass c; exp) {
> >             if (c.mi == 2) {exp.remove(c.toHash()); break; }
> >     }
> >
> > it works, but this means, I leave the foreach-loop. What I'm doing
> > wrong by using the foreach-block?
> >
> > Thanks for any help!
> The problem is that you change the AA while iterating over it. You
could
> eg iterate over it and save all keys you want to remove into an
array
> and then iterate over the array to remove the keys from the AA.
> This works:
> module example;
> class ExampleClass {
>       public {
>               int mi;
>               this(int i) {
>                       mi = i;
>               }
>       }
> }
> int main(string[] args) {
>       ExampleClass[hash_t] exp;
>       ExampleClass cex = new ExampleClass(1);
>       exp[cex.toHash()] = cex;
>       cex = new ExampleClass(2);
>       exp[cex.toHash()] = cex;
>       cex = new ExampleClass(3);
>       exp[cex.toHash()] = cex;
>       hash_t[] toRemove;
>       foreach (c; exp) {
>               if (c.mi == 2) { toRemove~=c.toHash(); }
>       }
>       foreach (h; toRemove) {
>               exp.remove(h);
>       }
>       return 0;
> }

I already thought about that situation, but some explained the
removing/clearing of an array by iterate over each element and remove
it from the AA. I just solved the problem by using the HashSet-class
from the dcollection's.

Reply via email to