C# objektum elérése minden eljárásban

C# objektum elérése minden eljárásban
2012-10-28T03:50:40+01:00
2012-10-28T10:55:01+01:00
2022-11-27T05:42:09+01:00
snowmaker
Tiszteletem!
Sosem tanultam kifejezetten programozni, ahogy sosem volt alkalmam a C# szintaxisához, bármilyen ostoba kérdésem merüljön is fel, legyetek türelmesek :)
Bár komolyabban is érdekelni a téma, eddig nem volt se lehetőségem, se anyagi hátterem komolyabban szemügyre venni a dolgokat.
Írtam annak idején egy programot ami előre létrehozott X elemű (ahol X 4-5 ezer körül mozgott) tömbökkel tárolt adatokat, de a kiértékelése a végére igen csak átláthatatlan lett. Most szeretném újra alkotni az egészet külön eljárásokkal, és objektumként kezelni az egyes "falukat".
Ha valaki véletlen hallott volna már róla ez egy böngészős játék "falvait" hivatott koordinálni. Fölösleges is a részletekbe beleugrani hiszen már az elején problémáim adódtak.

Adott egy txt ami tartalmazza a saját "falukat" amiknek a tulajdonságait szeretném falvanként külön objektumokba pakolni (és később így hivatkozni rájuk). A beolvasás azért így van hogy bármilyen zagyva szövegből ki tudjam olvasni a "falukat". Mivel nem tudom előre hány "falu" lesz, így azt sem hány objektum fog kelleni.

Forráskód következik:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConsoleApplication1 { class Program { public class Nuke { public int koord_x, koord_y, sorszam=0; } static public int nuke_darab; public static void Nuke_Darab() { FileStream nukefeltoltes_fs = new FileStream("nukelist.txt", FileMode.Open); StreamReader nukefeltoltes_rs = new StreamReader(nukefeltoltes_fs); string nuke_s = nukefeltoltes_rs.ReadLine(); int nukefeltoltes_darab = 0; while (nuke_s != null) { if (nuke_s.Contains("|")) nukefeltoltes_darab++; nuke_s = nukefeltoltes_rs.ReadLine(); } nuke_darab = nukefeltoltes_darab; Console.WriteLine("Beolvasva {0} darab nuke",nuke_darab); nukefeltoltes_rs.Close(); nukefeltoltes_fs.Close(); } static public void Nuke_Feltolt() { for (int i = 0; i < nuke_darab; i++) { Nuke[] nuke = new Nuke[nuke_darab]; nuke[i] = new Nuke { sorszam = i }; Console.WriteLine(nuke[i].sorszam); } } public static void Main(string[] args) { Nuke_Darab(); Nuke_Feltolt(); // for (int i = 0; i < nuke_darab; i++) Console.WriteLine(nuke[i].sorszam); // Console.WriteLine(nuke[1].koord_x); // Console.WriteLine(nuke[1].koord_y); Console.ReadLine(); } } }

Valószínűleg fölöslegesen van minden eljárás static publicozva, ezt már csak végelkeseredésemben biggyesztettem oda hátha így látni fogja.

A probléma:
Mivel az objektumokat az egyik eljárásban (akár a mainban is) hozom létre, a többi eljárás (vagy a main) nem fogja őket látni. Hasonló problémára lenne megoldás (egy 10 elemű tömbnél például) ha nem az eljárásban hanem a class program{} ban deklarálnám, ezzel a problémám hogy nem tudom előre hány objektum kell majd, így nem is adhatom meg ott (gondolom én).
A commentezett rész nem látja a nuke-t mert nem létezik ilyesmi abban a kontextusban.

Kérdés: Hogyan tudnék (nuke_darab) darab objektumot létrehozni úgy, hogy azt utána minden eljárás (main is) lássa?

Válaszokat előre is köszönöm: Snowmaker
Mutasd a teljes hozzászólást!
Ahogy a nuke_darab public static, úgy lehet a tömböd is az:


namespace ConsoleApplication1 { class Program { public class Nuke { public int koord_x, koord_y, sorszam=0; } public static int nuke_darab; public static Nuke[] nuke = null; public static void Nuke_Darab() { ... } static public void Nuke_Feltolt() { nuke = new Nuke[nuke_darab]; for (int i = 0; i < nuke_darab; i++) { nuke[i] = new Nuke { sorszam = i }; Console.WriteLine(nuke[i].sorszam); } } public static void Main(string[] args) { Nuke_Darab(); Nuke_Feltolt(); ... } } }
Mutasd a teljes hozzászólást!

  • Nuke[] nuke = null;

    Ezt nem ismertem, köszönöm hogy megmutattad :)

    Azóta megoldottam a problémát máshogy, létrehoztam a public static Nuke[] nuke = new Nuke[1]; és a main on belül resizeoltam nuke_darab-ra így:


    class Program { public class Nuke { public int koord_x, koord_y, sorszam_felvetel; } static public int nuke_darab; public static Nuke[] nuke = new Nuke[1]; public static void Nuke_Darab() { FileStream nukefeltoltes_fs = new FileStream("nukelist.txt", FileMode.Open); StreamReader nukefeltoltes_rs = new StreamReader(nukefeltoltes_fs); string nuke_s = nukefeltoltes_rs.ReadLine(); int nukefeltoltes_darab = 0; while (nuke_s != null) { if (nuke_s.Contains("|")) nukefeltoltes_darab++; nuke_s = nukefeltoltes_rs.ReadLine(); } nuke_darab = nukefeltoltes_darab; Console.WriteLine("Beolvasva {0} darab nuke",nuke_darab); Console.WriteLine("Nuke_Darab() vége. \n"); nukefeltoltes_rs.Close(); nukefeltoltes_fs.Close(); } static public void Nuke_Feltolt() { for (int i = 0; i < nuke_darab; i++) nuke[i] = new Nuke { sorszam_felvetel = i }; FileStream nukefeltoltes_fs = new FileStream("nukelist.txt", FileMode.Open); StreamReader nukefeltoltes_rs = new StreamReader(nukefeltoltes_fs); string nuke_s = nukefeltoltes_rs.ReadLine(); int a=0; while (nuke_s != null) { if (nuke_s.Contains("|")) { int i = nuke_s.LastIndexOf("|"); nuke[a].koord_x = (Convert.ToInt32((nuke_s[i - 3] - 48) * 100) + Convert.ToInt32((nuke_s[i - 2] - 48) * 10) + Convert.ToInt32(nuke_s[i - 1] - 48)); nuke[a].koord_y = (Convert.ToInt32((nuke_s[i + 1] - 48) * 100) + Convert.ToInt32((nuke_s[i + 2] - 48) * 10) + Convert.ToInt32(nuke_s[i + 3] - 48)); Console.WriteLine("{0}|{1} Koordinataju nuke felveve az adatbazisba.", nuke[a].koord_x, nuke[a].koord_y); a++; } nuke_s = nukefeltoltes_rs.ReadLine(); } nukefeltoltes_rs.Close(); nukefeltoltes_fs.Close(); Console.WriteLine("Nuke_Feltolt() vége. \n"); } public static void Main(string[] args) { Nuke_Darab(); Array.Resize(ref nuke, nuke_darab); Nuke_Feltolt(); for (int i = 0; i < nuke_darab; i++) Console.WriteLine(nuke[i].sorszam_felvetel);

    Ettől független a te megoldásod szimpatikusabb, a jövőben megpróbálom alkalmazni :)
    Mutasd a teljes hozzászólást!
  • Valószínűleg fölöslegesen van minden eljárás static publicozva, ezt már csak végelkeseredésemben biggyesztettem oda hátha így látni fogja.


    Azért jobb lenne utánanézned/próbálgatnod(attól függően, hogy könyvből vagy tapasztalás útján szoktad-e), hogy mit csinál a static és a public, mert ebben a konkrét esetben működőképes, de bizonyos esetekben bizony érhetnek meglepetések.

    Pl. a Program{}-on belül szerintem ebben az esetben felesleges a public használata(hacsak nem akarod példányosítani a Program{}-t, vagy külső osztályból is elérni a Program{}-t).

    A Nuke{}-n belül már nem felesleges a public, mert az már egy külön osztály/objektum(bár jobb lenne property).

    A static elsőre egy kicsit bonyolultabb ennél(viszont a public-al ellentétben a működést közvetlenül is befolyásolja), de talán a legfontosabbak, amit vele kapcsolatban érdemes szem előtt tartani:
    1. a program futása során csak egyszer jön létre a memóriában, míg a nem static annyiszor, ahány példány van.
    2. static metódusból csak static változót/metódust tudsz elérni.
    3. Nem static metódusból el tudsz érni static és nem static metódust/változót is.
    4. A Main()-nek mindenképpen static-nek kell lennie.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd