2016-04-07 15 views
5

Ho un problema. Sto facendo un'utilità per fare mappe generate procedurali. Ho una piscina in camera e ogni camera è sistemata in un tavolo della stanza. Ho un metodo per collegare tutte le stanze insieme che camminano sul tavolo e collegano le stanze adiacenti.Se la proposizione è sempre vera con enum nel confronto

Ho un enum che contiene il tipo di camere:

public enum RoomType 
{ 
    Default = 0, 
    Building, 
    Boss, 
    Item, 
    Standard, 
    Start, 
} 

Nel metodo di connessione Controllo il quartiere per vedere che tipo di camera che è:

if (neighbourhood[2, 1] != null) 
{ 
    if (firstLevel.isOn) 
    {      
     if (neighbourhood[2,1].TypeOfRoom == RoomType.Start) 
     { 
      roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT) 
     } 
    } 
    else if (neighbourhood[2,1].TypeOfRoom != RoomType.Boss) 
     roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT); 
} 

Ma quando controllo se il tipo di camera è Start, è sempre true e la connessione viene aggiunta.

img img2

Non so il motivo per cui questo accade.

in cui ho impostato il TypeOfRoom: img3

+0

Hai provato il debug?Guarda a cosa sono impostati i valori e vedi se il codice va dove ti aspetti. –

+0

L'unica spiegazione è che qualcosa ha cambiato 'TypeOfRoom' * dopo * il confronto. – CodingGorilla

+0

Come appare 'TypeOfRoom'? È una proprietà? Avete più di un thread per accedere a "vicini"? – Sinatr

risposta

4

Il problema è molto probabilmente dovuto a una condizione di gara. Si può facilmente verificare se questo è il caso, come segue:

if (neighbourhood[2, 1] != null) 
{ 
    if (firstLevel.isOn) 
    { 
     var typeOfRoom = neighbourhood[2,1].TypeOfRoom; //store type in a local variable 

     if (typeOfRoom == RoomType.Start) //check against local copy 
     { 
      roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT) 
     } 
    } 
    ... 
} 

Si vedrà ora che la condizione if funziona perfettamente soddisfacente ma neighbourhood[2,1].TypeOfRoom non sarà uguale typeOfRoom che significa che viene modificato in un altro thread.

Se non si è consapevoli di come o dove i propri oggetti sono modificati da altri thread, si hanno problemi più grandi da risolvere in quanto non sembra comprendere il codice o il framework che si sta utilizzando.

Se o quando si do do capire perché e quando ciò accade, è necessario implementare un meccanismo di sincronizzazione o uno sterzo (preferibile) verso implementazioni immutabili.

3

Cosa si sta mostrando nel vostro screenshot e quello che stai descrivendo i suoni impossibile. Quando ciò accade, è spesso perché l'applicazione è multithread. È impossibile su un thread. Ma mentre sta eseguendo un altro thread sta modificando i valori.

Allo stesso tempo si potrebbero anche passare involontariamente riferimenti allo stesso oggetto a più funzioni.

Ma sicuramente controllare qualsiasi cosa coinvolga discussioni, attività o chiamate di funzioni parallele. O se questo è in esecuzione in un ambiente Web, vedere se più richieste potrebbero accedere ai dati condivisi.

+0

Poiché questo è un progetto Unity, immagino ci siano molti modi in cui il multithreading potrebbe accadere. –

-1

Per RoomType.Standard, sarà sempre aggiunto il collegamento - come l'avete trovato:

if (firstLevel.isOn) 
    {      
     if (neighbourhood[2,1].TypeOfRoom == RoomType.Start) // FALSE 
     { 
     // add connetion 
     } 
    } 
    else if (neighbourhood[2,1].TypeOfRoom != RoomType.Boss) // TRUE 
    { 
    // add connection 
    } 

standard non è Boss, in modo che il collegamento si aggiunge in ogni caso.

Con enumerazioni, si ottiene un minor numero di bug con istruzioni switch:

switch (neighbourhood[2,1].TypeOfRoom) 
    { 
     case RoomType.Start: 
      // add connection 
      break; 

     case RoomType.Boss: 
      // something 
      break; 

     case RoomType.Standard: 
      // something else 
      break; 

     default: 
      // all other room types 
      break; 
    } 
+0

Gli screenshot mostrano che la linea viene eseguita (sfondo giallo) anche se l'affermazione è chiaramente falsa. Il problema non è nel codice visibile nella domanda. –

+0

La visualizzazione della riga errata eseguita può verificarsi quando il codice viene modificato durante l'esecuzione. Indipendentemente dallo screenshot, il codice ha chiaramente un bug. – buffjape

Problemi correlati