| | |
Autor | Správa |
---|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 30.04.2013 11:16 | |
|
Som Ti nesmierne vďačný. Mám už aj metódy na sčítanie, odčítanie a násobenie Polynomial objektov, takisto som už preťažil operátory pre tieto matematické funkcie a všetko funguje ako má. Len jedna vec by ma potešila. Len neviem, či sa vôbec dá nejako jednoducho riešiť. Potrebujem inicializovať nový objekt triedy Polynomial, ale neviem, akú bude mať dĺžku (počet prvkov). Keďže ide vlastne o pole, ktoré nie je dynamické, dá sa to vôbec nejako?
Viem, že int sa dá použiť ako ?int - potom môže nadobúdať "null" Môj objekt triedy Polynomial nemôže byť null, ale ak by mohol, to by možno bolo riešením.
Nechápem, skúsil som: Polynomial p4 = null; nešlo, vypísalo, že nemôže byť null. Ale zrazu to ide. Nejako mi blbne ten MS Visual C# 2010 Express - chvílami nekontroluje priebežne chyby. Asi by to chcelo reštart PC (9 dní nereštartovaný ) A ešte, či by bolo možné (neviem, či sa správne vyjadrím) preťažiť "=" (ako priradenie), teda ak napíšem poly1 = poly2, aby nerobil kópiu odkazu, ale kópiu celého objektu. Mohol by som to teoreticky okašľať, tak že by som vytvoril objekt nulovyPolynom, kde by bol polynom prveho stupna (nulovyPolynom), ktorého jediny clen by bol s parametrom 0 (0 * x^0), a potom by som mohol poly1 = poly2 + nulovyPolynom; Si ma dosť toho naučil, ale veď to určite vieš
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
IClonable sa moc neodporúča používať, pretože ako si si mohol sám vyskúšať, nie je jednoznačné o akú kópiu ide. Ideálne je vytvoriť si nejakú pomocnú triedu (prípadne extension, aby si nemusel volať triedu ale mohol to zavolať jednoducho "mojObjekt.DeepCopy()"). Vtedy to bude hneď očividné pre všetkých. this.MemberwiseClone(); totižto vracia plytkú kópiu... Citácia: Potrebujem inicializovať nový objekt triedy Polynomial, ale neviem, akú bude mať dĺžku (počet prvkov). Keďže ide vlastne o pole, ktoré nie je dynamické, dá sa to vôbec nejako? Kedy sa dozvieš finálnu veľkosť? Nejaké zväčšovanie poľa moc neprichádza do úvahy, keďže sa to vždy rieši pomocou kopírovania prvkov do nového poľa.. Ideálne je si zistiť veľkosť dopredu. Keby išlo o normálne pole, asi by som ti odporučil Dictionary alebo List, ale pri dvojrozmernom poli by si sa s tým natrápil...Minimálne ma teraz nenapadá jednoduchšie riešenie. Citácia: A ešte, či by bolo možné (neviem, či sa správne vyjadrím) preťažiť "=" (ako priradenie), teda ak napíšem poly1 = poly2, aby nerobil kópiu odkazu, ale kópiu celého objektu. Toto by som určite nerobil, ani keby to bolo možné. Problém s tým je v tom, že keď programátor vidí priradenie medzi dvoma triedami, vie, že ide o priradenie pomocou odkazu. Nič by ho nevarovalo, že sa to bude správať úplne inak. Najjednoduchšie a najvhodnejšie je urobiť len nejakú metódu povedzme so syntaxou mojObjekt.DeepCopyTo(druhyObjekt); alebo druhyObjekt = mojObjekt.DeepCopy();
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 30.04.2013 12:20 | |
|
Všetko vyriešené, díky. Len tak skúšobne som preťažil operátor ^ a teraz funguje p2 = p2 ^ p1; //spraví kópiu objektu p1 do p2 Ale to je nezmysel, ten operátor síce nebudem potrebovať pri polynómoch, ale je to brutálne mätúce. Takže to som si len chcel overiť, či to funguje. Škoda, že C# neumožňuje vytvoriť vlastné (custom) operátory. Aspoň 2 - 3 znaky na to mohli vyhradiť Tak teraz idem riešiť matice. Dúfam, že to už pôjde hladšie. S maticami nebudem robiť veľa operácií - až na ten determinant Dík.
|
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 02.05.2013 20:16 | |
|
Jupee, už som napísal algoritmus na výpočet determinantu matice, ktorej prvky sú polynómy. A funguje. Síce som to riešil asi 8 hodín, ale robí to to, čo má Dal som maticu 10 x 10 a trvalo mu to 13 sekúnd Veď vyše 360000-krát musí spustiť tú istú metódu Urobil som to cez rekurzívnu metódu (funkciu). Uvedomujem si, že je to dosť pomalé. Ale mne stačí, keď vyráta determinant matice max. 5. rádu. A to je v stotinách sekundy. Kód: 5 9 5 1 5 6 1 7 8 9 0 2 5 9 6 8 7 4 1 2 9 8 5 2 1 4 7 7 8 6 1 2 3 6 9 8 7 4 5 6 5 8 9 5 4 1 7 8 5 9 9 5 8 5 8 2 1 5 3 2 7 8 9 6 5 4 1 2 3 0 8 7 4 5 6 3 2 1 5 9 5 5 5 5 5 8 9 6 3 2 8 8 8 7 4 1 2 5 9 8
Od zadanej matice bola odrátaná jednotková matica vynásobená λ
-λ+5 9 5 1 5 6 1 7 8 9 0 -λ+2 5 9 6 8 7 4 1 2 9 8 -λ+5 2 1 4 7 7 8 6 1 2 3 -λ+6 9 8 7 4 5 6 5 8 9 5 -λ+4 1 7 8 5 9 9 5 8 5 8 -λ+2 1 5 3 2 7 8 9 6 5 4 -λ+1 2 3 0 8 7 4 5 6 3 2 -λ+1 5 9 5 5 5 5 5 8 9 6 -λ+3 2 8 8 8 7 4 1 2 5 9 -λ+8
Determinant matice je: λ^10-37λ^9-720λ^8-4665λ^7-35022λ^6-144049λ^5-176136λ^4-1424819λ^3-11369883λ^2-4288856λ-28890926 Ešte raz díky. Neskôr ešte asi budem mať pár otázok.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Nie je začo, som rád, že funguje A kľudne napíš, o C# vždy rád pokecám.
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 02.05.2013 22:33 | |
|
Jeden problémik by sa našiel. Chcem sa opýtať. Keď konvertujem text na číslo, tak používa ako desatinný oddelovač ".", ale ak vo Windowse nastavím ako oddelovač ",". Tak to mi to prestane fungovať, rozoznáva iba čísla s oddelovačom ",". Ako nastavím, aby vždy rozoznával len desatinnú bodku? Niečo som našiel, ale neviem, či je to dobré riešenie, vlastne ani neviem, kam do projektu dať ten riadok. Skúšal som už všade, ale vždy ma pošle kade ľahšie :-o Kód: Thread.CurrentCulture.NumberFormat.NumberDecimalSeparator "."; Díky. Pozerám na internete, ale trošku som vychaosený z toho. Ja len potrebujem mať istotu, že program sa v ktoromkoľvek Windowse (s rôznymi nastaveniami Regional Settings) bude chovať rovnako. T. j. aby nemal problémy s desatinnou čiarkou ani oddeľovačom trojíc číslic. Jednoducho nech pracuje len s týmto formátom: -12333.4789 a nie napr. -12,333.4789 - to by bol priekak. Dík.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Čo ma teraz v rýchlosti napadne, máš hneď pár možností... 1.) nastaviť CurrentCulture na takú Culture, ktorá bude vyhovovať tvojím požiadavkám na formát čísel, jazyk, menu... 2.) urobiť niečo takéto: Kód: NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberDecimalSeparator = "."; nfi.NumberGroupSeparator = "";
string number = "15424.23"; Decimal decimalNumber = Decimal.Parse(number, nfi); Samozrejme by bolo asi ideálne to obaliť do metódy, aby si sa neopakoval ak to potrebuješ na viacerých miestach. Ten tvoj spôsob nešiel preto, lebo bohužiaľ je z nejakého dôvodu Thread.CurrentCulture.NumberFormat "read-only"...
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 03.05.2013 0:42 | |
|
Ďakujem, implementované.
Ale teraz veľmi dôležitá otázka. Nainštaloval som si vo VirtualPC Windows XP sp1 cz. Samozrejme exe súbor z diru "Release" v tomto Windowse nebeží. Je to tým, že tam nie je nainštalovaný .NET 4.0, resp. potrebné knižnice, teda si myslím. Môžem skompilovať projekt do exe tak, že pobeží aj tam? Nemusí byť len exáč, kľudne aj nejaké dllky.
Proste, ako zabezpečím, aby aplikácia fungovala aj tam, kde nie sú všetky potrebné knižnice?
Dík.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Jedine tak, že prekonvertuješ aplikáciu tak, že bude používať nižšiu verziu frameworku... To si nastavíš bez problému cez vlastnosti projektu.. Problém nastane vtedy, ak si sa spoliehal na niektorú z novších funkcií Na danom pc totižto musia byť všetky knižnice, ktoré aplikácia vyžaduje, inak to nejde.
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 03.05.2013 13:09 | |
|
Skúsil som 3.0, ale použil som už prvky, ktoré v tej verzii nie sú. Ale 3.5 ide. Takže, ak to skompilujem ako .Net 3.5, pobeží to na mašinách, kde je .Net 3.5 a .Net 4.0.
Ale ak by som to skompiloval ako .Net 4.0, tak to pobeží len tam, kde je .Net 4.0. V OS, kde je .Net 3.5 to nepobeží, aj keď sa nevyužívajú nové prvky z .Net 4.0, že?
Dík.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Ak chceš čo najvyššiu kompatibilitu, musíš proste na nové veci zabudnúť, čo je v mnohých situáciách dosť problém.. Napríklad taký Entity framework v starších .NET verziách stál za veľké Pri desktop aplikáciách to väčšinou až tak nevadí, lebo nie je problém do inštalátora zahrnúť inštalačku potrebnej .NET verzie. (samozrejme ak nejde o podporu prehistorických OS ako je XP ) Najhoršie je to ale pri webových aplikáciách, keďže buď daný hosting má potrebnú .NET verziu alebo nie, tam si moc nenavyberáš. Teoreticky ale môže byť problém v tom prípade, ak sa na danom PC nenachádza potrebná verzia... Mám taký dojem, že bol problém, ak sa povedzme targetuje 4.0 a dotyčný nemá žiadnu predchádzajúcu verziu... Aj keď je pravda, že to je dosť ojedinelá situácia.. Ak máš najnovšiu, väčšinou to znamená aj to, že máš aj tie staršie. 2.0, 3.0 a 3.5 používali pokiaľ viem rovnaký základ, čiže tam bola kompatibilita relatívne fajn. Horšie je to teraz pri najnovších, to prerobili už zásadnejšie a beží to na novej verzii. Treba proste vyskúšať a uvidíš.. Pri xp si ale dosť obmedzený, čiže tam by som proste len targetoval 3.5 a podľa potreby priložil inštalačku .NET frameworku. Už je inak vonku aj .NET 4.5
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 05.05.2013 8:49 | |
|
Ahoj, zasa otázka, vlastne až 2 (asi aj viac). 1. Výpočet koreňov polynómu budem robiť v novom formulári. Môžem používať Class Polynomial, ktorú mám v starom formulári, aj v novom formulári, bez toho aby som musel písať Kód: staryformular.Polynomial p1 = new staryformular.Polynomial(); ? S týmto nemám žiadnu skúsenosť. Ale si by sa to dalo spraviť tak, že trieda Polynomial by bola v inom súbore, že? Ako sa dostanem k dátam zo starého formulára? Dajú sa vytvárať premenné aj mimo formulára? Napr. nad nimi? Lebo to mi nešlo. 2. Pokiaľ program robí výpočty a trvá mu to dlhšie, ako zabezpečiť, aby užívateľ mohol výpočet prerušiť? Napr. klávesou, alebo kliknutím na button. Ďakujem.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
1.) každá trieda by mala byť vo vlastnom súbore. Ty si pravdepodobne vnoril jednu do druhej... Citácia: Ako sa dostanem k dátam zo starého formulára? Dajú sa vytvárať premenné aj mimo formulára? Napr. nad nimi? Lebo to mi nešlo. Nie, mimo nie, ale dajú sa vytvárať statické premenné/metódy, ku ktorým sa dá ľahko dostať. Pokiaľ je ale možné, statickým premenným sa vyhýbaj, len si skomplikuješ situáciu. Čo je v tomto prípade vhodné je definovať premenné priamo v triede formuláru a potom ich inicializovať pomocou konštruktoru, dačo takéto: Kód: public class Formular1 : Form { private string _nejakaHodnota;
public Formular1(string hodnota) { NejakaHodnota = hodnota; } } Keby si mal rodičovský formulár, mohol by si to urobiť napríklad takto: Kód: public class Rodic : Form { private Formular1 _formular1; ...
public void NejakaMetoda() { _formular1 = new Formular1("nejaka hodnota"); _formular1.Show(); } } Prípadne opačne, ak chceš, aby mal child formulár odkaz na rodiča... Hádam chápeš.. Alebo keby si chcel sprístupniť nejaké hodnoty z formuláru (napr text box) Kód: public class Formular1 : Form { public string NejakaHodnota { get { return txtBox1.Text; } set { txtBox1.Text = value; } }
... } 2.) Musíš robiť výpočty vo vlastnom vlákne. V najnovšej verzii C# na to existujú parádne mechanizmy, pri 3.5 si budeš musieť vystačiť s BackgroundWorker-om. http://msdn.microsoft.com/en-us/library ... er(v=vs.90).aspx
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 08.05.2013 17:53 | |
|
Ďakujem za vysvetlenie. Ja to mám riešené takto: Kód: public partial class Form1 : Form . . . { public Class Polynomial {...} public Class Matrix {...} public struct resultOfDivisionPolynoms { public Polynomial Integral; public Polynomial Remainder; } } . . . Mne išlo o to, aby to nebolo všetko napchaté v jednom súbore. Ale už to neriešim, to je pre môj projekt teraz irelevantné. V ďalšom projekte to určite budem riešiť. Aj zapúzdrovanie a veci okolo toho. Lebo tu som sa na to vykašľal. Už som naučil môj počítač deliť polynóm polynómom Dík.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Nabudúce skús rovno riešiť WPF, s winforms sa už moc do budúcnosti nepočíta... Ideálne potom aj nejaký architektonický návrhový vzor ako MVVM, tam máš peknú separáciu. A takisto by som odporučil aj knihu Čistý kód od Robert C. Martina, ak to myslíš s programovaním vážnejšie.
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 08.05.2013 19:43 | |
|
Ďakujem, určite si nechám poradiť, tú knihu si kúpim. Stala sa mi dosť čudná vec: Mám kód: Kód: static public Polynomial Derive(Polynomial p1, int n) { for (int i = 1; i <= n; i++) { int p1L = p1.Body.Length; if (p1L <= 1) { //pDerived = new Polynomial(new Decimal[] { 0 }); p1 = new Polynomial(new Decimal[] { 0 }); break; } //pDerived = new Polynomial(new Decimal[p1L - 1]); for (int j = 1; j < p1L; j++) { p1.Body[j - 1] = j * p1.Body[j]; } p1.Body[p1L - 1] = 0; //MessageBox.Show("pred: " + p1.Body.Length); p1 = Polynomial.Opt(p1); //MessageBox.Show("po: " + p1.Body.Length); } return p1; }
static public Polynomial Opt(Polynomial p1) { Decimal[] d1 = p1.Body; int dec = 0; for (int i = p1.Body.Length - 1; i >= 0; i--) { if (d1[i] != 0) { break; } else { dec += (d1[i] == 0 ? 1 : 0); } } //MessageBox.Show("pred!: " + p1.Body.Length); Array.Resize(ref d1, d1.Length - dec); p1 = new Polynomial(d1); //MessageBox.Show("po!: " + p1.Body.Length); return p1; } A keď zavolám Kód: pd1 = Polynomial.Derive(p77, 1); pd2 = Polynomial.Derive(p77, 2); pd1 bude 1. derivácia polynómu pd2 bude 3. derivácia polynómu ale ak zavolám len pd2 = Polynomial.Derive(p77, 2); Kód: tak pd2 bude 2. derivácia polynómu Jednoducho v tom prvom prípade, keď volám metódu Derive druhýkrát: pd2 bude 3. derivácia polynómu On si pamätá, to p1 z predošlého volania (takže napriek tomu, že mu odovzdám polynom p77 on použije p1 čo už tam ma (ten uz bol raz zderivovany)) Krok po kroku som to debugoval, ale nech robím čo robím. Nejde mi do hlavy, to, že veď keď volám metódu, tak by mala mať čerstvé údaje a nie nejaké z minulého volania :-( Nemusíš to riešiť, len som sa chcel posťažovať. Určite je tam niekde chybička, ktorú nevidím. Budem to musieť nechať na zajtra, lebo dnes už toho bolo moc.
|
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 08.05.2013 19:50 | |
|
Jáj, ja som blb - ja som kopíroval referenciu - už to riešim, ja musím v tej metóde vytvoriť nový objekt triedy Polynomial a ten meniť a odovzdať, inak mením ten pôvodný - vstupný. No, mal som tam Kód: Polynomial pOut = p1; //:-(((( Takže som použil toto: Kód: Polynomial pOut = Polynomial.Clone(p1); //Polynomial pOut = p1 + new Polynomial(new Decimal[] { 0 }); Aj ten druhý riadok funguje, ale z toho prvého je jasné hneď o čo ide
|
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 09.05.2013 18:15 | |
|
Mám jednu otázočku, ale skôr matematického rázu.
Mám polynóm s reálnymi koeficientami (4. stupeň a vyššie). Potrebujem zistiť všetky korene polynómu. Interval v ktorom sa nachádzajú všetky korene viem určiť. Takisto viem čiastočne určiť počet kladných a záporných koreňov.
Neviem ako určiť presný počet reálnych koreňov a tým pádom aj komplexných koreňov. Takisto neviem, ako separovať koreň, t. j. určiť interval, na ktorom je práve jeden koreň.
Ďalej už viem ako pokračovať.
Zohnal som si aj literatúru (4 knihy), ale v každej to berú tak, že koreň už je separovaný :-o
Tak len náhodou, či máš nejaký zdroj, kde je to popísané.
Dík.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Obávam sa, že s matikou ti nepomôžem... Brali sme to síce na výške, ale nikdy ma to nejako extra nebralo Skús to hodiť sem: matematicky-kruzok-vt104376.html
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 17.05.2013 18:43 | |
|
Ahoj, zasa mám problém. Ale už som si myslel, že tomu rozumiem, ale toto ma zasa zaskočilo. príklad: Mám Kód: public struct PolynomRoots {} Mám metódu a v nej inicializujem: Kód: PolynomRoots AllRoots; (skúšal som to aj vo Form1 : Form) Z tejto metódy volám inú metódu, ktorá má zistiť, koľko koreňov je na intervale. Počas testovania sa môže stať, že hranica intervalu je koreň. Problém je, že našiel som koreň a neviem ho uložiť do AllRoots, dá sa vôbec nejako pristúpiť k AllRoots. Toto je vec, ktorá mi v C# robí obrovské problémy, potrebujem globálnu premennú, ktorú môžem použiť všade. Predpokladám, že problém je niekde v Kód: public struct PolynomRoots {} skúšal som tam pridať static, ale... no úprimne, mám sa ešte čo učiť. Dík.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Ten struct máš definovaný len takto? Ako/kde sa k nemu snažíš pristupovať? Statickým/globálnym premenným sa treba vyhýbať v každom programovacom jazyku, to nie je problém len v c#.
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 17.05.2013 23:27 | |
|
No som sa s tým boril. PolynomRoots mám definovaný takto: Kód: public struct PolynomRoots { public int index_r; public int index_c; public Decimal[] realRoots; public ComplexNumber[] complexRoots; } Nakoniec som to vyriešil tak, že som tú inštanciu (AllRoot) triedy inicializoval v metóde: Kód: //Metóda zistenia počtu reálnych a komplexných koreňov static public PolynomRoots FindRoots(Polynomial p) { PolynomRoots AllRoots; AllRoots.index_r = 0; AllRoots.index_c = 0; AllRoots.realRoots = new Decimal[p.Body.Length]; AllRoots.complexRoots = new ComplexNumber[p.Body.Length]; a keď z tejto metódy volám metódu na zistenie počtu koreňov v intervale, tak jednoducho predám tú inštanciu ako parameter, a tam ju použijem. Mi nedocvaklo hneď, že nerobí kópiu objektu, iba referenciu: Kód: //Zistí počet reálnych koreňov v každom intervale CountOfRoots[] countOfRoots = Polynomial.ComputeCountOfRoots(p, Interval, SturmSeries, AllRoots); Takto to riešiť je asi úplne zle, ale čas ma tlačí, takže teraz som rád, že to ide. Dík. P.S.: Ja som kedysi ešte na osembiťákoch fičal na BASICu a vyryté koridory v mozgu sa ťažko rekonštruujú na nové koridory Robil som aj čosi v strojáku na ZX Spectre (Loadery a miniprogramíky, vrátane kompresora a dekompresora). Na PC som len jeden jediný jednoúčelový programčičoček spravil. Potreboval som z jedného súboru spraviť db. Celý program mal iba okolo 200 bytes (s príponou .com v DOSe) V dobe, keď som ešte nemal prístup na internet, som nevedel, že existuje aj vývojové prostredie na písanie v strojaku (Assembler), som to písal ručne.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Bolo by treba vidieť celý zdroják, možno by sa potom dalo niečo poradiť.. Ale tak niekedy je lepšie sa učiť na vlastných chybách, človek si to lepšie zapamätá... Inak aj u mňa bol BASIC prvým kontaktom s programovaním, ešte na PMD
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 21.05.2013 10:52 | |
|
Och, PMD 85-1, to bolo moje prvé stretnute s počítačom, och. Mám jeden problémik. Mám triedu: Kód: public class BigNumbers { public Byte[] body { get; set; } public int DecimalSeparator { get; set; } public Boolean Sign { get; set; } //true = <0, inf>; false = <-inf, 0)
public BigNumbers(String iNumber) { Regex rgx = new Regex("[^0-9-\\.]"); String siNumber = rgx.Replace(iNumber, ""); if (siNumber == "" || siNumber.Substring(0, 2) == ".-" || siNumber.Length - siNumber.Replace(".", "").Length > 1) { siNumber = "n/a"; } else { //Je číslo záporné? Sign = true; if (siNumber.Substring(0, 1) == "-") { Sign = false; } siNumber = siNumber.Replace("-", "");
//Je desatinná bodka na prípustnom mieste? int DecSep = siNumber.IndexOf("."); if (DecSep == 0) { siNumber.Replace(".", "0"); DecimalSeparator = siNumber.Length - 1; } else if (siNumber.IndexOf(".") == -1) { DecimalSeparator = 0; } else { DecimalSeparator = siNumber.Length - DecSep - 1; siNumber = siNumber.Replace(".", ""); }
//Odstráni neplatné nuly zo začiatku a konca čísla while (siNumber.Substring(0, 1) == "0" && siNumber.Length - DecimalSeparator > 1) { siNumber = siNumber.Substring(1, siNumber.Length - 1); }
while (siNumber.Substring(siNumber.Length - 1, 1) == "0" && DecimalSeparator > 0) { siNumber = siNumber.Substring(0, siNumber.Length - 1); DecimalSeparator--; } //Skonvertuje String do poľa Byte Byte[] sbody = new Byte[siNumber.Length * sizeof(char)]; body = new Byte[siNumber.Length]; System.Buffer.BlockCopy(siNumber.ToCharArray(), 0, sbody, 0, sbody.Length); for (int i = 0; i < sbody.Length / 2; i++) body[i] = (Byte)(sbody[i * 2] - 48); return; } } a keď vytvorím číslo: Kód: BigNumbers c2 = new BigNumbers("-12.4553"); tak ho mám uložené ako: Kód: Byte[] c2.body = Byte[]{1, 2, 4, 5, 5, 3}; Boolean c2.Sign = false; int c2.DecimalSeparator = 4; a problém je, že keď s nimi pracujem stane sa mi napríklad, že mi ostane číslo 12.240 Tú nulu chcem odstrániť, ale nedá sa spraviť: Kód: Array.Resize(ref c2.body, c2.body.Length - 1); vypíše chybu: A property, indexer or dynamic member access may not be passed as an out or ref parameterAko môžem znížiť dĺžku tohto poľa? Dík.
|
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 21.05.2013 10:59 | |
|
Och prepáč. Ja keď som to skúšal, urobil som fatálnu chybu. Kód: Byte[] tst = c2.body; Array.Resize(ref tst, tst.Length - 1); c2.body = tst; Toto už ide, len dúfam, že tam nebude zradnosť s referenciami. Ale nemalo by to byť, keďže ide o obyčajné pole. Veď to o chvíľku zistím. Ďakujem. :-( foo, a predsa ide o refrenciu. Oh, to je tak, keď idem na to hŕŕ. Veď Kód: tst zanikne a nie je čo riešiť. Och.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Pomaly tu už začínaš viesť monológ... Funguje ti to už?
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 21.05.2013 15:24 | |
|
Zatiaľ funguje všetko, čo som spravil. Díky. Dúfam, že nevadí sčasti vediem monológ Zasa sa mi vynorila jedna vec, ale nemám čas ju riešiť, ak by si len tak z voleja mi vedel poradiť, tak budem rád. Preťažil som operátory != a == a pri hlavičke triedy Kód: public class BigNumbers mi vypisuje 2 varovania: Warning 1 'Test0004.Form1.BigNumbers' defines operator == or operator != but does not override Object.GetHashCode() Warning 2 'Test0004.Form1.BigNumbers' defines operator == or operator != but does not override Object.Equals(object o)Kód: static public Boolean operator ==(BigNumbers n1, BigNumbers n2) { if (n1.body.Length != n2.body.Length) return false; for (int i = 0; i < n1.body.Length; i++) if (n1.body[i] != n2.body[i]) return false; return n1.DecimalSeparator == n2.DecimalSeparator && n1.Sign == n2.Sign; }
static public Boolean operator !=(BigNumbers n1, BigNumbers n2) { return !(n1 == n2); } Ale program funguje.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Vypisuje, lebo si neoverridol GetHashCode ani Equals... Teoreticky to robiť nemusíš (hlavne ak to nie je dôležitý projekt a funguje ako má), ale normálne by si to mal implementovať, aby si predišiel nečakaným situáciám Pozri napríklad sem http://stackoverflow.com/questions/5144 ... g-operatora http://msdn.microsoft.com/en-us/library ... 47(v=vs.80).aspx Osobne moc preťažovanie operátorov nemám rád, lebo nie je okamžite očividné, čo sa deje.. Tvári sa to navonok ako jedna vec, ale v skutočnosti sa to správa inak. Preferujem skôr na takéto úlohy dedikované triedy/metódy.
_________________ C#, PHP, ... |
|
Registrovaný: 25.11.07 Prihlásený: 02.07.21 Príspevky: 101 Témy: 21 Bydlisko: Bratislava | Napísal autor témy SuchSoft: 26.05.2013 18:18 | |
|
No, bez preťažovania by som to nedal, v tom by som sa vôbec nevyznal Zasa mám môj klasický problém. Mám formulár, v ňom mam TextBox "mojtextbox". Napr. v: Kód: private void CheckMatrix_Click(object sender, EventArgs e) bez problémov mám prístup, ale v: Kód: static public PolynomRoots FindRoots(Polynomial p) nie. Za prvé, zasa mi nedopína prečo, ale hlavne za druhé, potrebujem prístup k tomu prvku. Potrebujem doňho vkladať text. Kokos, sa z toho nevymotam Ako nastaviť ten prvok, aby bol viditeľný aj v metódach? Dik.
|
|
Registrovaný: 24.01.08 Prihlásený: 13.09.17 Príspevky: 14572 Témy: 66 Bydlisko: Žilina |
Ide o to, že ten UI prvok (textbox) je premenná tej konkrétnej inštancie. Ak chceš mať prístup zvonku, potrebuješ jednak referenciu na danú inštanciu formu a druhak musíš mať ten textbox ako public. Potom by to malo ísť
_________________ C#, PHP, ... |
|
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|