Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pokazivaču u jeziku C#

[es] :: .NET :: .NET Desktop razvoj :: Pokazivaču u jeziku C#

Strane: 1 2

[ Pregleda: 4097 | Odgovora: 21 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8298
*.dial.InfoSky.Net.



+2687 Profil

icon Pokazivaču u jeziku C#15.10.2004. u 08:19 - pre 185 meseci
Video sam više knjiga o jeziku C#, ali ni u jednoj nema ni pomena o pokazivačima. Da li to znači da taj jezik nema pokazivake, ili je jednostavno reč o šund literaturi?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+708 Profil

icon Re: Pokazivaču u jeziku C#15.10.2004. u 09:59 - pre 185 meseci
I ima i nema. Sve promenljive objektnog tipa su ustvari pokazivači, mada se to eksplicitno ne vidi.
C# ima valjda i klasične pokazivače, ali samo u unsafe modu (iskreno, ovo mi nikad nije trebalo).
Jel ti trebaju za nešto konkretno?

BTW, ne verujem da je ovo pravi forum za ovu temu.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8298
*.dial.InfoSky.Net.



+2687 Profil

icon Re: Pokazivaču u jeziku C#17.10.2004. u 21:53 - pre 185 meseci
Ja lično hoću da napravim nešto poput drveta matematičkog izraza. Za to mi trebaju pokazivači.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1324
194.106.171.*



+306 Profil

icon Re: Pokazivaču u jeziku C#18.10.2004. u 07:44 - pre 185 meseci
Za to ti ne trebaju klasični pokazivači. Ako napraviš instancu neke svoje klase i stavis je u neku promenljivu, onda ta promenljiva referencira instancu, ona je pokazivač na nju... mada se to eksplicitno ne vidi...
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+708 Profil

icon Re: Pokazivaču u jeziku C#18.10.2004. u 08:41 - pre 185 meseci
Drugim rečima, praviš nešto na foru:

Klasu Nod.
Klasu Operator koja nasleđuje Nod i ima dva atributa: Levi i Desni tipa Nod.
Klasu Vrednost koja nasleđuje Nod
Klasu Promenljiva koja nasleđuje Nod.

Kako parsiraš izraz, puniš stablo na taj način što instanciraš levi i desni nod. To ustvari, u pozadini, radi isto ono što si ti hteo sa pointerima, samo bez cimanja.

Pitaj dalje ako ti nije jasno.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8298
*.dial.InfoSky.Net.



+2687 Profil

icon Re: Pokazivaču u jeziku C#18.10.2004. u 10:33 - pre 185 meseci
Hvala na uloženom trudu oko mene, ali problem nisam uspeo da rešim.

Evo C++ koda koji sam napisao po uputstvima. Rezultat izvršavanja je (Zasad nista!*Zasad nista!). No, takav sam rezultat i očekivao, budući da su left i right tipa Node. Da su upućivanja ili pokazivači bilo bi drugo. Me]utim, upu'ivanja ne mogu ovde da upotrebim jer ne mogu da ih inicijaliyujem. Smatram da grešite tvrdnjom da se to može bez klasičnih pokazivača, ali bih voleo da se ispostavi da nisam u pravu.

Code:

#include <iostream>

using namespace std;


class Node
{
public:

    virtual void ispis() { cout << "Zasad nista!"; }
};

class Letter : public Node
{
    char letter;
    

public:

    Letter(char x)
    {
    letter = x;
    }
    
    virtual void ispis() { cout << letter; }
};

class Compound : public Node
{
    Node left, right;
    
public:


    Compound(Node &x, Node &y)
    {
    left = x;
    right = y;
    }
    
    void ispis()
    {
    cout << '(';
    left.ispis();
    cout << '*';
    right.ispis();
    cout << ')';
    }
};

int main()
{
    Letter a('a');
    Letter b('b');
    
    Compound t(a,b);
    
    t.ispis();
    
    cout << endl;
    
        
    return 0;
}


Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+708 Profil

icon Re: Pokazivaču u jeziku C#18.10.2004. u 11:46 - pre 185 meseci
Čekaj bre prvo pitaš za C# pa onda daš primer za koji se žališ da ne radi u C++-u.

Ajd ovako: napišeš zadatak, opišeš svoju ideju (koje klase i metode ti tu vidiš), probaš da napišeš kood u C#, sve to okačiš ovde na forum pa će ti neko možda i pomoći.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8298
*.dial.InfoSky.Net.



+2687 Profil

icon Re: Pokazivaču u jeziku C#18.10.2004. u 21:31 - pre 185 meseci
Evo o čemu se konkretno radi. Ja znam C++, ali ne znam C# i još nism odlučio da li uopšte da ga učim. Učio bih ga ako je podesniji za predstavljanje matematičkih struktura kioje meni trebaju. Zato pitam za ovaj problem. Ako bi neko priložio kod (što pojednostavljenjiji) na jeziku C# za opisani problem i kada bih ja to testirao i video da radi, ako je C# rešenje elegantnije od C++ rešenja, ja bih onda učio taj jezik iz literature koju mi preporučite. Ne znam ima li takve solidne literature na internetu. U principu sam zadovoljan aplikacijama bez GUI-ja, mada mi ni GUI ne smeta, ali ga ne smatram previše bitnim.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8298
*.dial.InfoSky.Net.



+2687 Profil

icon Re: Pokazivaču u jeziku C#18.10.2004. u 21:34 - pre 185 meseci
Još nešto. Da li je C# portovan na Linux i ako nije postoje li nagoveštaji o tome. Naravno, ne očekuje se da to uradi Microsoft.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

MAD-MAX
Marko Mitic

Član broj: 351
Poruke: 1060
195.252.107.*

Jabber: MAD-MAX@jabber.com
ICQ: 65811355


Profil

icon Re: Pokazivaču u jeziku C#18.10.2004. u 23:07 - pre 185 meseci
Jeste. Projekat se zove Mono.

Idi na www.mono-project.com za vise informacija.
"If you do what you always did! - You will get what you always got!"
 
Odgovor na temu

ZokiR
Zoran Radojković
Melburn, Australija

Član broj: 15986
Poruke: 109
*.nexnet.net.au.



Profil

icon Re: Pokazivaču u jeziku C#19.10.2004. u 06:34 - pre 185 meseci
Prevedeno na C#, to bi išlo ovako nekako, bez korišćenja pokazivača:

Code:
    public class Node
    {
        virtual public void Ispis()
        {
            Console.Write("Zasad ništa!");
        }
    }

    public class Compound : Node
    {
        private Node left, right;

        public Compound(Node x, Node y)
        {
            this.left = x;
            this.right = y;
        }

        public override void Ispis()
        {
            Console.Write("(");
            this.left.Ispis();
            Console.Write(" * ");
            this.right.Ispis();
            Console.Write(")");
        }
    }

    public class Letter : Node
    {
        private string letter;

        public Letter(string x)
        {
            this.letter = x;
        }

        public override void Ispis()
        {
            Console.Write(letter);
        }
    }

    class Test
    {
        static void Main(string[] args)
        {
            Letter a = new Letter("a");
            Letter b = new Letter("b");

            Compound compound = new Compound(a, b);

            compound.Ispis();
        }
    }
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+708 Profil

icon Re: Pokazivaču u jeziku C#19.10.2004. u 07:53 - pre 185 meseci
Hvala ZokiR.
Citat:
Nedeljko: Učio bih ga ako je podesniji za predstavljanje matematičkih struktura kioje meni trebaju.

Verovatno je podesniji i manje grešiš dok pišeš kood (između ostalog, baš zbog toga što se ne radi eksplicitno sa pointerima). Ali, ako pišeš aplikacije kod kojih je brzina kritična, verovatno je bolje da ostaneš pri C++-u. Po meni, svi ostali argumenti su na strani C#-a. Što se tiče literature, ja lično ne učim iz knjiga, ali ljudi preporučuju Wrox-ova izdanja. Siguran sam da je na forumu bilo reči o ovome, pretraži malo.
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.client.comcast.net.



+18 Profil

icon Re: Pokazivaču u jeziku C#19.10.2004. u 08:15 - pre 185 meseci
Ako hoces da se bavis matematikom, znaci ako te sam jezik u kome programiras ne interesuje preterano, onda definitivno radi u C#u. Nema svrhe da se maltretiras sa detaljima implementacije - isto kao sto danas ne bi nesto seo da radis u asembleru 'zbog brzine' (osim ako ti to nije vrlo, vrlo bitno). Jablan je potpuno u pravu.
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.dialup.xtra.co.nz.



+2 Profil

icon Re: Pokazivaču u jeziku C#19.10.2004. u 08:31 - pre 185 meseci
I ja se slazem u vezi sa stavovima o ucenju C#.
Citat:
jablan:
Ali, ako pišeš aplikacije kod kojih je brzina kritična, verovatno je bolje da ostaneš pri C++-u.

Pa za parsiranje teksta je retko kad potrebna tolika brzina. Sasvim lepo ce mu raditi C#. Ako posle treba nesto jako zahtevno da radi sa parsiranim vrednostima (npr. racunanje furijeove transformacije, lupam...) onda neka samo za taj deo napravi native dll koji ce da poziva. A sa C# spremi potrebni ulaz za taj native code.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8298
*.dial.InfoSky.Net.



+2687 Profil

icon Re: Pokazivaču u jeziku C#19.10.2004. u 11:49 - pre 185 meseci
Sinoć sam nešto guglao i našao. Što se ti;emono projekta, naišao sam na njega, ali tamo piše da rezultujući fajl nije Linux executable, već .NET executable, pa program pod Linux-om treba da se pokreće komandom

mono program.exe

Ni to nije loše, ali bih više voleo pravi Linux executable izlaz. Takođe, našao sam neke tutorijale za C# na internetu, i pom onome što sam video, to bi trebalo da je pravi programski jezik za mene. Ono što bih radio se bazira na algoritmima velike složenosti u pogledu vremena i memorije koje srču. No, ubrzanje od nekoliko desetina procenata nije nešto što bi presudilo, naročito ako je budućnost okrenuta ka C#-u i C++ već izlazi iz mode. No, i dalje me muči jedno pitanje.

Ja sam razvio pokazivačke C++ šablone koji daleko unapređuju rad sa pokazivačima. Bolji su u nekom smislu i od ugrađenih pokazivačkih šablona. Naime, imam šablon PC<tip> koji glumi pokayiva; na objekte tipa tip. Primerak te šablonske klase se automatski inicijalizuje na nulu. Kada se pokuša pristup adresi na koju ukazuje takav nulti pokazivač, automatski se rezerviše prostor za objekat tipa tip i rukuje se sa odgovarajućom adresom. Na primer:

PC<double> p;
*p = 73.8;

Korišćenje new i delete operatora za ove pokazivače niti je dozvoljeno niti je potrebno. Destruktor će automatski uništiti odgovarajuću dinamičku promenljivu. No, to imaju i ugrađene pokazivačke klase. Ova šablonska klasa takođe ima brojač referenci.

Evo gde sam ja odstupio. Kada se porede dva pokazivača tipa PC<T>, gde je T bilo koji tip (klasa) operatorom ==, zapravo se porede sadržaji na koje oni ukazuju. Tako, ako napravimo listu pomoću ovakvih pokazivača, za liste l1 i l2 će vrednost izraza l1==l2 biti true akko je reč o jednakim listama na moguće različitim mestima u memoriji. Slično važi i za operator !=. Operator dodele će iskopirati sadržaj (odnosno strukturu) itd. Za poređenje adresa na koje pokazivači pokazuju se koristi metod same().

Sve ovo lepo radi kada nemamo strukture sa ciklusima, a onda se ulazi u beskonačnu petlju pri kopiranju, dodeli, poređenju. No, tada se koristi makro klasa GPC(tip) koja rešava i taj problem. Naizgled, svi problemi su rešeni. Međutim...

Da bi računar na primer iskopirao takvu listu, na ovakav način primenjuje rekurzivan algoritam bilo da je u pitanju klasa PC (Pointer Class) ili GPC (General Pointer Class), pri čemu GPC ima nešto sporije algoritme. No, sve to opterećuje stek, što znači da pri radu sa iole veći strukturama može doći do "pucanja" steka. Drugim rečima, ne koristi se raspoloživa memorija računara, već samo jedan njen deo - onaj koji je rezervisan za stek.

Sve to ne bi bilo tako loše kada bi C++ kompajler malo optimalnije koristio stek, odnosno čistio stek destruktora kada više nije potrebno koristiti niti jednu njegovu lokalnu promenljivu (metod hvatanja za rep). E, zanima me šta se na računaru sa 512 MB RAM-a dešava kada se u jeziku C# na opisani način napravi lista od 10 miliona članova.


Hvala svima
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+708 Profil

icon Re: Pokazivaču u jeziku C#19.10.2004. u 13:44 - pre 185 meseci
Citat:
Da bi računar na primer iskopirao takvu listu, na ovakav način primenjuje rekurzivan algoritam bilo da je u pitanju klasa PC (Pointer Class) ili GPC (General Pointer Class)...

Hmm pričao si o pointerskom templejtu pa prešao na liste.
Ako te dobro razumem, imaš razgranatu strukturu koju kopiraš rekurzivno. S obzirom da se na steku pamte samo pointeri na objekte, koliko duboka ta struktura treba da bude da bi dobio overflow? Pretpostavljam prilično duboka. Ako je pominjanih 10 miliona dubina strukture, možda treba da razmotriš neki drugi vid obrade umesto rekurzije.

Ja lično ne znam nešto više o ograničenju veličine steka kod .NET programa, pretpostavljam da neko na forumu zna. Pretpostavljam samo da je priča različita od windows aplikacija zbog interpretirane prirode .NET aplikacija.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8298
*.dial.InfoSky.Net.



+2687 Profil

icon Re: Pokazivaču u jeziku C#19.10.2004. u 16:40 - pre 185 meseci
Ma ta klasa predstavlja nešto poput managed pokazivača. Dakle, kada definišeš listu na uobičajen način, samo što koristiš ove pokazivačke klase umesto običnih pokazivača, nema potrebe da redefinišeš podrazumevani konstruktor , konstruktor kopije, destruktor niti operatore poređenja i dodele. Sve radi samo baš onako kako treba, samo što će računar "ispod haube" korisiti rekurzije za sve to, i to se ne može sprečiti.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Sundance

Član broj: 7510
Poruke: 2559
*.sava.sczg.hr.

ICQ: 106979934


Profil

icon Re: Pokazivaču u jeziku C#21.10.2004. u 02:09 - pre 185 meseci
Izjave da je C# kod "spor", da se "interpretira" i da je "ogranicen" jednostavno ne stoje i odrazavaju temeljno nepoznavanje rada samog CLR.

C++ kod kad jednom kompajliras *uvijek* ostaje komajliran. S druge strane, IL kod generiran od strane bilo kojeg CLS-compliant jezika nema to ogranicenje!

Poanta cijelog CLR je apstrahirati ne samo interne stvari samog OS-a (win32API), vec i sam hardver. I to neovisno o jeziku koji koristis. Ako zelis u nekom .NET jeziku raditi komplicirane inzenjerske proracune - fine, koristi APL ili sl. jezik koji je portan pod .NET. Ako zelis samo slagati GUI i procesirati event-ove - fine, koristi C# ili VB.NET. Na kraju mozes koristiti oba modula jer oba sadrze IL a to je *jedini* jezik koji CLR razumije.

Naravno, postoji mogucnost da koristis Ngen.exe tool koji ce generirati nativni x86 kod, ali to je IMHO glupo rjesenje jer onda ni cijeli .NET nema smisla.

Assembly koji generiras pri pokretanju ima pocetni penalty jer CLR mora prevesti IL u nativni kod procesora pod kojim se izvodi. Ali za razliku od compile-ahead jezika koji moraju znati TOCNO na kojoj se platformi mora njihov executable izvrsavati (ako je i586+, onda ne smije biti i686 instrukcija), CLR moze generirati najbolji moguci nativni kod, sa podrskom za recimo SSE2/MMX2, te stovise, moze izvrsiti hrpu optimizacija ZA VRIJEME DOK SE KOD IZVODI, recimo eliminirajuci nepotrebno grananje, moze ponovno generirati kod koji ce na najbolji nacin iskoristiti branch prediction jedinicu i sve ostale moguce detalje koje su vezani za pojedinu arhitekturu. A tek kad se vrti na IA-64... Standardni kompajleri tu nemaju sanse!

Moze se doduse prigovoriti da sam postupak prevodjenja u nativni kod oduzima puno resursa/vremena, ali sam CLR se stalno optimizira za novije platforme i vec sad je taj execution penalty zamjetan iskljucivo na pocetku, mozda par sekundi. Kasnije za vrijeme izvodjenja programa sve leti "k'o da je kompajlirano" :)

Uostalom, ovo prevodjenje u nativni kod se moze recimo dogoditi kad se program instalira, dodatnih xy sekundi ne predstavlja nista, a beneficije su neusporedive.

Na kraju ispada da C++ uopce nema prednosti pred .NET osim multiple inheritence i jos nekih paradigma koje prakticno malo sta znace :))

I kao slag na kraju, za 2 godine kad dodje Longhorn, win32API ce postati obsoletan, a svi jezici/programi koji ne budu koristili CLR implementiran kroz winFX ce biti staro zeljezo. Zasad jedino MS C++ kompajler v13+ moze emitirati IL kod (preko /clr switcha), a sto ce biti sa drugim jezicima?

C++ -> DA, ali samo kroz IL/CLR :)

 
Odgovor na temu

Sundance

Član broj: 7510
Poruke: 2559
*.sava.sczg.hr.

ICQ: 106979934


Profil

icon Re: Pokazivaču u jeziku C#21.10.2004. u 02:18 - pre 185 meseci
PS: Na mono-u ako zelis da ti kernel sam "razumije" PE .NET executables u /etc/rc.d/rc.local dodaj sljedeci odlomak:
Code:

if [ ! -e /proc/sys/fs/binfmt_misc/register ]; then
    /sbin/modprobe binfmt_misc
    mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
fi

if [ -e /proc/sys/fs/binfmt_misc/register ]; then
    echo ':CLR:M::MZ::/usr/bin/mono:' > /proc/sys/fs/binfmt_misc/register
else
    echo "No binfmt_misc support"
    exit 1
fi


I to JEST pravi linux executable, samo sto nije u ELF formatu. Na linuxu je ovo jedino rjesenje, dok recimo na win, OS Loader (od winXP pa nadalje) je tweakan da sam provjeri li se radi o managed modulu ili je pravi nativni PE executable tako sto provjerava neke clanove PE File Headera (tzv. data directory #14) te eventualno import fje _CorExeMain()/_CorDllMain() iz mscoree.dll
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8298
*.dial.InfoSky.Net.



+2687 Profil

icon Re: Pokazivaču u jeziku C#21.10.2004. u 10:45 - pre 185 meseci
Ama jasno je meni zašto su uveli bajtkod. Bulja žvaće gaće zbog Open Source-a. Kada sa kupi neka ne .NET aplikacija u binarnom obliku, ona je prevedena za neki procesor, pa ako je taj procesor prejak, vlasnici slabijih procesora neće moći da ga koriste, a ako je preslab, onda neće koristiti prednosti naprednijih arhitektura kod vlasnika jačih procesora. Međutim, kada nabavite softver za Linux u vidu izvornog koda, vaš sistem će biti testiran, i kompajliranje će se optimizovati prema njemu, tako da program radi i na slabijim računarima, ali da na jačim mašinama koristi prednosti njene arhitekture. To je jednostavno prednost modela otvorenog koda nad modelom zatvorenog koda. Da bi se nešto takvo postiglo i kod softvera zatvorenog koda, uvedene su sve te zavrzlame.

No, sve je to lepo, ali je problem u tome što korisnik kada pokrene aplikaciju, ne može previše da čeka na njegovo prevođenje u klasičan kod. Stoga su optimizacije klasičnih kompajlera za istu arhitekturu bolje od CLR generisanog koda jer imaju na raspolaganju "više vremena" za optimizaciju. CLR je u prednosti nad klasi;nim kompajlerom kada se program prevodi na jednom, a izvršava na računaru sa drugom (kompatibilnom) arhitekturom, a nikako kada se prevođenje (iz sorsa) i izvršavanje dešavaju na istoj mašini.

Takođe, C++ program je često manje efikasan od C programa. Na primer, kada treba sabrati matrice (C=A+B) u C-u bi se napisala funkcija sa tri argumenta add)(A,B,C) koja bi osmah smeštala rezultat tamo gde treba. No, kada definišemo klasu matrix i u njoj operator +, prilikom izvršavanja naredbe

C=A+B;

Najpre će se napraviti kopija matrice B (što se doduše može eliminisati upotrebom referenci), potom će se kreirati nova matrica D (lokalna promenljiva operatora +), pa će se matrice sabrati i rezultat upisati u D, pa će se kreirati neka nova matrica E u koju će se iskopirati matrica D (jer ezultat neće moći da bude referenca jer bi morala da pokazuje na lokalni objekat), pa će se uništiti matrica D, pa će se (ako je kompajler pametan da izbegne još jedno suvišno kopiranje) matrica E iskopirati u A, da bi se na kraju uništila i matrica E. Dakle, barem dva suvišna konstruisanja stvaranja i kopiranja. Ne bi me čudilo da zbog naprednijih koncepata jezika C# u njemu dođe do dodatnog pada efikasnosti u odnosu na C++, mada to još uvek ne mogu da tvrdim.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Pokazivaču u jeziku C#

Strane: 1 2

[ Pregleda: 4097 | Odgovora: 21 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.