NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Neaktivní uživatel:19.10.2017 17:04

Ahoj chtěl jsem si vyzkoušet Genetický algoritmus nebo jak bych to měl nazvat.. Pro mě naprosto bezdůvodně mi to hlásí výjimku a varování proto prosím o vysvětlení chyby nebo případné opravení kódu :) kód je tu:

namespace GeneticAlgoritm
{
    class Unit
    {
        public byte IQ { get; private set; }
        public byte Strenght { get; private set; }

        /// <summary></summary>
        /// <param name="iq">Inteligence of the unit</param>
        /// <param name="strenght">Chance to kill other units</param>
        public Unit(byte iq, byte strenght)
        {
            IQ = iq;
            Strenght = strenght;
        }
    }
    class Generator
    {
        private List<Unit> Units; // Zde mi to hlásí CS0469   Do pole Generator.Units se nikdy nic nepřiřadí.
        private Random r = new Random();
        private byte[] pars = new byte[2];
        public Generator()
        {
        }
        /// <summary>
        /// Adds units with random IQ & Strenght values
        /// </summary>
        /// <param name="Count">Count of units that would be added (max 255)</param>
        public void Add(byte Count)
        {
            if (Count >= 10)
            {
                for (byte a = 0; a <= Count; a++)
                {
                    pars[0] = Convert.ToByte(r.Next(40, 160));
                    pars[1] = Convert.ToByte(r.Next(10,90));
                    Units.Add(new Unit(pars[0], pars[1])); // Zde mi to hlásí NullReferenceException
                }
            }
        }
        public void Cycle()
        {
            if (Units.Count() >= 10)
            {
                Unit[] a = new Unit[2];
                for (byte b = 0; b <= Units.Count() - 1; b++)
                {
                    a[0] = Units.ElementAt(b);
                    a[1] = Units.ElementAt(b + 1);

                    if (a[0].Strenght > a[1].Strenght)
                    {
                        Units.RemoveAt(b + 1);
                    }
                    else if (a[0].Strenght < a[1].Strenght)
                    {
                        Units.RemoveAt(b);
                    }
                    else if (a[0].Strenght == a[1].Strenght)
                    {
                        b++;
                    }
                }
            }
        }
        public List<Unit> ReturnList()
        {
            return Units;
        }
    }
}

Předem díky za odpovědi :)

Editováno 19.10.2017 17:07
Odpovědět
19.10.2017 17:04
Neaktivní uživatelský účet
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Ondřej Štorc:19.10.2017 17:07

Hmm, co přesně máš za problém, nebo se chceš akorát dostat nějaký tipy a triky k tvému kódu?

Edit: Jsem blbec, nějak jsem přehlídl druhej řádek...

Editováno 19.10.2017 17:08
Nahoru Odpovědět
19.10.2017 17:07
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Ondřej Štorc:19.10.2017 17:12

Tak ten tvůj problém vyřeší buď pomocí konstruktoru:

public Generator()
{
        Units = new List<Unit>();
}

A nebo prostě takhle:

private List<Unit> Units = new List<Unit>(); // Zde mi to hlásí CS0469...
Nahoru Odpovědět
19.10.2017 17:12
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
nickname01
Člen
Avatar
nickname01:19.10.2017 17:28

Ta vyjímka spočívá v tom, že přidáváš položky do listu, který nemá přiřazenou hodnotu, takže Units=null. Na takovém listu metodu Add() volat nemůžeš. Musíš mu nejdříve přiřadit hodnotu, tím způsobem jak už napsal Ondřej Štorc.

 
Nahoru Odpovědět
19.10.2017 17:28
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
gcx11:19.10.2017 19:58

Dotaz, proč používáš:

a[0] = Units.ElementAt(b);

místo

a[0] = Units[b];

Pro List ta extension metoda stejně vnitřně volá indexer.

 
Nahoru Odpovědět
19.10.2017 19:58
Avatar
Neaktivní uživatel:23.10.2017 15:28

Díky moc :)

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
23.10.2017 15:28
Neaktivní uživatelský účet
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
gcx11:23.10.2017 15:48

Bylo by pěkné, kdybys příště označil za řešení ten příspevěk, který skutečně pomohl, v tomto případě Ondřej Štorc

 
Nahoru Odpovědět
23.10.2017 15:48
Avatar
nickname01
Člen
Avatar
Odpovídá na gcx11
nickname01:23.10.2017 16:09

Souhlasím s tebou. Takovejch lidí je tady i víc, kteří označují jako řešení svůj příspěvek, bez ohledu na to kdo mu skutčně pomohl.

 
Nahoru Odpovědět
23.10.2017 16:09
Avatar
Neaktivní uživatel:23.10.2017 17:53

Jo pardon já myslel že to je jako který příspěvek téma ukončil na jednom fóru to tak bylo, jsem tu nový tak si zvykám :)

Nahoru Odpovědět
23.10.2017 17:53
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.