Programiranje u C jeziku
(1 korsinik/a gleda/ju temu) (1) Gost

Programiranje u C jeziku


18.12.2010 | 21:18
Nego, ako sam dobro skužio, submatrica m se dinamički alocira kao niz pointera koji pokazuju na nizove od po n elemenata, red po red. Da? Ne? Ako da, zašto tako, a ne kao pointer na niz od n x n elemenata?

Niz od n x n elemenata je jednodimenzionalan i referenciraš ga preko jednog pointera (na taj niz).

Kad imamo više od jednog "subscript operatora" (uglate zagrade), čime označavamo višedimenzionalnu matricu, da bi mogli koristiti referenciranje kroz više dimenzija, moramo imati (u slučaju 2D matrice) niz pointera na niz pointera. To nam u konačnici omogućava pisanje nečeg poput A[x][y]. Naravno, uvijek možemo zavrzlamu svesti na jednodimenzionalni niz pa pisati nešto poput A[x*broj_stupaca+y]. U praksi, potonje rješenje znači da za pristupiti pojedinom elementu matrice moramo obaviti jednu računsku operaciju više (množenje), što znači da je sporije.

I da, znam, još jedno golublje govno. Ali golub po golub pa više ni Lt. Gruber ne bi znao gdje je parkirao svoj dragi tenk.
18.12.2010 | 21:31
Nego, ako sam dobro skužio, submatrica m se dinamički alocira kao niz pointera koji pokazuju na nizove od po n elemenata, red po red. Da? Ne? Ako da, zašto tako, a ne kao pointer na niz od n x n elemenata?


Dobro si shvatio. Ispravnije bi bilo ovako kako si napisao malloc ((n-1)*(n-1)*sizeof(double), ali tada gubiš mogućnost korištenja [i][j] notacije, već moraš preći na [i*n+j], odnosno "simuliranje" dvodimenzionalne korištenjem jednodimenzionalne.

Pristup je (teoretski) neispravan, jer u nastavku rekurzivno uredno prenosi samo m, odnosno adresu prvog elementa polja. Teoretski, svaki malloc može zauzeti komad memorije nepovezan sa onim prijašnjim, i na opterećenom stroju sa malo memorije to će se dogoditi, a tada prenošenjem polja napravit će katastrofu. U praksi će sva memorija biti lijepo posložena jedna za drugom i nema problema.


Recikliraš. Već sam ti odgovorio na to. Golublje govno koje kvari aerodinamiku tenka. Prije 20 godina bi se apsolutno složio s tobom. Danas je to teoretski točno, ali je u praksi nebitno.


Stjecajem okolnosti neko vrijeme sam dosta programirao web aplikacije. I dobivao probleme koji su se lako mogli riješiti rekurzijom. Problemi koji, kad se skalira broj korisnika i broj rekurzivnih poziva (jer ono što testiraš na testnom stroju nikad nije jednako onome u produkciji) završe na ponovnom programiranju, bez rekurzije, sa cachiranjem sličnih međurezultata (što se u slučaju determinante može napraviti) itd.

Rekurzija se, ako je moguće, treba izbjegavati. Naravno da je nećeš izbjegavati ako si u cajtnotu, ali korisnik će i za 100ms biti sretan ako se isti algoritam obavlja 100-200-1000 puta. Zato postoje verzije 2.0, 3.0 itd
18.12.2010 | 21:38
Naravno, uvijek možemo zavrzlamu svesti na jednodimenzionalni niz pa pisati nešto poput A[x*broj_stupaca+y]. U praksi, potonje rješenje znači da za pristupiti pojedinom elementu matrice moramo obaviti jednu računsku operaciju više (množenje), što znači da je sporije.


Pointerska aritmetika ne radi ništa bolje množenje i zbrajanja od obične aritmetike, a nekak se mora doći do m[i][j]-tog polja što će interno isto dati i*max+j. Teza o množenju tu pada o vodu. A da ne kažem kako je sporije napraviti x (npr 10) malloca nego 1

Golub po golub . .

Primjer je takav kakav je jer je školski da ga svi kuže. Da je optimalan - daleko od toga, ali očito autor zna objasnit svojim studentima kako to radi pa bi mu zbog toga nabacio karmu
18.12.2010 | 21:58
a nekak se mora doći do m[i][j]-tog polja što će interno isto dati i*max+j. Teza o množenju tu pada o vodu.

Zašto bi palo u vodu ako govorimo o pointerima na pointere (za 2D matricu)? Svaki redak (ili stupac, nebitno) je pohranjen u jedan niz. I imamo pointer na njega. A imamo i pointer na niz tih pointera. Dakle, do svakog elementa možemo doći bez množenja. Sve to skupa pod pretpostavkom da imamo valjani razlog za uopće čuvati toliko pointera, u što ne ulazim.
18.12.2010 | 22:16
stajpZg je napisao:
Stjecajem okolnosti neko vrijeme sam dosta programirao web aplikacije. I dobivao probleme koji su se lako mogli riješiti rekurzijom. Problemi koji, kad se skalira broj korisnika i broj rekurzivnih poziva (jer ono što testiraš na testnom stroju nikad nije jednako onome u produkciji) završe na ponovnom programiranju, bez rekurzije, sa cachiranjem sličnih međurezultata (što se u slučaju determinante može napraviti) itd.

Rekurzija se, ako je moguće, treba izbjegavati. Naravno da je nećeš izbjegavati ako si u cajtnotu, ali korisnik će i za 100ms biti sretan ako se isti algoritam obavlja 100-200-1000 puta. Zato postoje verzije 2.0, 3.0 itd


To su svakako okolnosti u kojima već ta razlika u utrošku resursa i vremena više nije ni u praksi beznačajna. Onda je tu netko tko će odlučiti što je jeftinije - platiti vrijeme potrebno za razvoj optimalnog rješenja jednokratno, ili plaćati potrebu za jačim resursima stalno. Ako je jeftinije dati stvar na ponovno programiranje (odnosno potrošiti 2, 5, 10 ili 20x više vremena na razvoj), napravit će se tako, naravno. Web aplikacije s ogromnim brojem korisnika svakako jesu dobar praktičan primjer za takvu situaciju. Ono što sam ja radio nisu bile mrežne, nego single user aplikacije koje su korisniku štedjele 95% vremena u odnosu na utrošak vremena pri korištenju Excela ili nekog sličnog (za tu svrhu) polualata. Tim će korisnicima zauvijek ostati nevažno da li su sa 1h utrošak vremena sveli na 2'30" ili na 2'31".

To je taj praktični aspekt kojem bi trebao poučiti svoje studente. Bezuvjetno reći "izbjegavajte rekurziju ako se može ikako drugačije" znači stvoriti im ogradu u razmišljanju, a to znači stvoriti od njih loše inženjere.

Predavao sam i ja na faksu. Znao sam jako dobro da studenti dobivaju i previše teorije i zato sam se trudio dati im što više praktičnih pogleda na tu teoriju. Mnogi su me upravo zbog toga zapamtili po dobrom.
18.12.2010 | 22:22
Djipi je napisao:
a nekak se mora doći do m[i][j]-tog polja što će interno isto dati i*max+j. Teza o množenju tu pada o vodu.

Zašto bi palo u vodu ako govorimo o pointerima na pointere (za 2D matricu)? Svaki redak (ili stupac, nebitno) je pohranjen u jedan niz. I imamo pointer na njega. A imamo i pointer na niz tih pointera. Dakle, do svakog elementa možemo doći bez množenja. Sve to skupa pod pretpostavkom da imamo valjani razlog za uopće čuvati toliko pointera, u što ne ulazim.


To ovisi o tome kako compiler prevodi taj kôd, zar ne? Da li se to prevodi kao indirektno relativno adresiranje ili kao množenje, zbrajanje i onda direktno apsolutno adresiranje?

I to je jedan od razloga zašto mi je C bljak. Glumi neki sistemaški low level i kenja s tim polurješenjima (kao ovo s prosljeđivanjem matrice), a s druge strane zapravo nemaš pojma kako se to prevodi na jezik procesora. Ti se možeš ubiti od optimiranja, a što na kraju ispadne - nitko ne zna.
19.12.2010 | 01:11
Djipi je napisao:
a nekak se mora doći do m[i][j]-tog polja što će interno isto dati i*max+j. Teza o množenju tu pada o vodu.

Zašto bi palo u vodu ako govorimo o pointerima na pointere (za 2D matricu)? Svaki redak (ili stupac, nebitno) je pohranjen u jedan niz. I imamo pointer na njega. A imamo i pointer na niz tih pointera. Dakle, do svakog elementa možemo doći bez množenja. Sve to skupa pod pretpostavkom da imamo valjani razlog za uopće čuvati toliko pointera, u što ne ulazim.


Da, teoretski - originalno polje m[i] sadrži adrese na prve (nulte) elemente svakog pojedinog retka. Što bi bila pointerska aritmetika sa zbrajanjem. Onda uzme taj broj, i od njega ponovno napravi pointersku aritmetiku sa zbrajanjem. U praksi, sve je nakalemljeno jedno na drugo, i svaki bolji optimizator koda (a nažalost, svaki C kompiler ima takvo što u sebi) će pretvoriti to u preračunavanje koje bi obavili ručno. A ako i ne bi, i dalje je jedan malloc brži od 10 malloca, i to puno brži nego što bi netko mogao reći da je i*max + j sporo
19.12.2010 | 01:16
smayoo je napisao:

To je taj praktični aspekt kojem bi trebao poučiti svoje studente. Bezuvjetno reći "izbjegavajte rekurziju ako se može ikako drugačije" znači stvoriti im ogradu u razmišljanju, a to znači stvoriti od njih loše inženjere.


Studenti su zato dobili uvid u kojim situacijama je rekurzija dobra. Naravno da im je, u realnom svijetu sa realnim rokovima i realnim ograničenjima njihovog znanja i ideja, rekurzija još jedan od alata na raspolaganju - zato rekurziju i uče i dani su im primjeri. Ali ako mogu birati, ako je mogu izbjeći - neka je izbjegavaju. Lakše je napraviti hummer nego tenk. OK, tenk će ići svugdje, raznijet skoro svakog neprijatelja, ali hummer je brži, pokretljiviji, i u većini slučajeva - posve dostatan da razvali neprijatelja.
19.12.2010 | 02:06
To ovisi o tome kako compiler prevodi taj kôd, zar ne?

Da, a ako nam se ne svidi ono što dobijemo, uvijek možemo ubaciti vlastiti asm blok u C kod pa imati potpunu kontrolu. Siguran sam da te ideja veseli.

Da li se to prevodi kao indirektno relativno adresiranje ili kao množenje, zbrajanje i onda direktno apsolutno adresiranje?

Svakako bih očekivao ovo prvo. Ali s obzirom da nisam siguran bih li znao ispravno pročitati asemblirani kod za x86, neću se truditi testirati. Mogu jedino pojasniti zašto bih uopće očekivao to što bih očekivao - "pointerska aritmetika" (točnije, zbrajanje) iz perspektive opcodova je "besplatna" utoliko što adresnom registru (a pointer u jednom trenutku seli u njega) možemo pristupiti s "displacementom" - neki opcod tipa "move #42,8(a0)" u samo jednoj instrukciji upiše vrijednost 42 na adresu pohranjenu u adresnom registru a0 (naš pointer na niz), uvećanu za 8 bajtova (što bi bio neki index [1], za double). Zato očekujem da u adresnom registru završi pointer i isto tako očekujem da se konkretnom indexu pristupi s displacementom unutar jednog jedinog opcoda. Alternativa s korištenjem niza za n x n povlači za sobom kalkulaciju finalne adrese koju MC68000 ne bi mogao obaviti u jednom koraku. Možda x86 ima instrukciju i za to (tipa "pomnoži i pribroji" ) - ne bi me iznenadilo. Što nas već vodi k zaključku da je u konačnici bitno i za koju arhitekturu kompajler uopće optimizira kod. Pa je najbolje s tim se previše ne zamarati.
19.12.2010 | 02:10
i dalje je jedan malloc brži od 10 malloca, i to puno brži nego što bi netko mogao reći da je i*max + j sporo

Istina.
19.12.2010 | 12:25
Djipi je napisao:
To ovisi o tome kako compiler prevodi taj kôd, zar ne?

Da, a ako nam se ne svidi ono što dobijemo, uvijek možemo ubaciti vlastiti asm blok u C kod pa imati potpunu kontrolu. Siguran sam da te ideja veseli.




Ali zapravo ne. Ne veseli me. Ili programiram u ASM-u, ili u nekom normalnom jeziku. Ne volim hibridna rješenja.

I, BTW, ubacivanje ASM kôda se može i u Pascalu (Borlandovom, za druge ne znam).

"move #42,8(a0)"


Odgojen na Motoroli, kao i ja Zadnji puta kad sam proučavao (što je bilo još u vrijeme 80486), Intelov procesor nije imao takvo što. A kamoli 8 32-bitnih adresnih registara. Pa su me mentor i kolege nagovarali da diplomski napišem u C-u, na MC68030 platformi. Fuj! Odupro sam se toj inicijativi i napisao cijeli program (adaptivni fuzzy regulator brzine motora) u ASM-u, a oni su se poslije čudili kako je to na Motoroli lako. Jer je na Intelu bilo mission impossible
Moderatori: Bertone

Vikalica™

Zadnja poruka: pred 6 sati, 5 minuta
  • Kloba: Na Bačvicama, sorry
  • Kloba: Sjećam se. Spavali su u onom hotelu na Žnjanu. I ja sam tamo noćio jednom. Jako dobar hotel. Ko jučer da je bilo. Kako je Laušević rekao "Godine prođe, dan nikako". :)
  • drlovric: Prvi i zadnji put sam HR reprezentaciju gledao na Poljudu protiv Brazila. Davno je to bilo.
  • Kloba: I zaključno da se i ja priljučim - samo da se nešto novo i zanimljivo događa! :D
  • Kloba: Ma što se atmosfere tiče, nema do Poljuda. Još samo da nisu u svađi s HNS-om, svaka reprezentacija tamo se smrzne kada dođe. Samo šta ćeš kada kafići u koju zalaze Torcidaši otvoreno stavljaju znakove "ne poslužujemo osobe koje su došle gledati reprezentaciju". U tom stilu. Ne vole HNS nikako.
  • Kloba: Evo link [link]
  • Kloba: drlovric, pa spomenuo sam to ako ti je promaklo. Točnije, zacrtali su si da za 112. rođendan Hajduka (11. 02. 2023.) dosegnu probjku od 112 tisuća članova. A kako su ranije stigli sa 60 preko sto, nije bilo nerealno to očekivati. A po podacima za 2022., ako ne griješim, Real je imao 120 tisuća članova
  • drlovric: Ma nema veze, samo nek se nesto desava :D
  • cariblanco: Badava će trčati bili i plavi, kad će bijeli biti prvi ;)
  • drlovric: Poljud bi bio pun da je i duplo veci. Ne postoji na daleko losiji klub sa lojalnijim navijacima :)
  • drlovric: @Kloba: Hajduk ima 100 K clanova. Neki dan su pustili ulaznice u prodaju. Otvorio sam na 3 racunala, 7 browsera, logirao se u svaki (kao clan) da uspijem ugrabiit ulaznicu. I nisam uspio. Srecom je brat raido istu stvar u Njemackoj, pa nam je kupio on. Za 2h rasprodat stadion, serrver padao......lista cekanja po sat i po da udjes u sucelje da bi kupio kartu. I to sve ako si clan. Ostali nisu mogli
  • Kloba: Aha, hvala ti na informaciji!
  • Borisone: Ako imaš i LAN i WIFi aktivan na Mac-u, prioritet ti je po defaultu da promet ide prvo po LAN-u.
  • Borisone: To ti je propusnost WiFi-a usko grlo.
  • Kloba: Što se brzine neta tiče, kada laptop spojim LAN-om na ruter, iako mi je u postavkama i dalje Wi-Fi mreža kao opcija spajanja - brzina je 950 Mbps. Kada iskopčam LAN kabel, doslovno deset sekundi nakon ovog rezultata - brzina padne na 200 do 300 Mbps-a. Nije nam jasno! :D
  • Kloba: A Hajduk je ipak najtrofejniji i najstariji hrvatski klub. Bio bi red da se i oni vrate na staze stare slave. Zanimljivost mi je da imaju registriranih navijača više od 110 tisuća, u rangu Real Madrida. Respect, u svakom slučaju. :)
  • Kloba: Štose nogometa tiče, nisam pratio HNL osim u tekstovima pa ne znam tko je više zaslužio ove godine. Rijeka ili Hajduk. Ako je Rijeka dala više, neka bude Rijeka. Zarad one krađe kada ih je Gračan trenirao, ako se dobro sjećam.
  • Kloba: Star možda godinu dana, refurbished kupljen od A1.
  • Kloba: Mobitel je iPhone SE 2022.
  • Kloba: Ljudi, imam pitanje u vezi brzine interneta. Kako sada imam gigabit download u teoriji, u praksi mi je to na laptopu oko 940 Mbps. No na mobu, koji je spojen na isti Wi-Fi (5G) ne pokazuje više od 450 Mpbs download. Ima li neki razlog tomu?
  • cariblanco: I ja kao Dinavovac, bi Volvo da Rijeka osvoji naslov, jer je to zaslužila
  • drlovric: Dinamo j ezapoceo kao drzavni projekt, da se podigne nacionalna svijest u novonastaloj drzavi. Kasnije je prepusten kriminalnoj skupini na upravljanje, koja je radi osobnih interesa obesmislila cijelu ligu. Srecom ta vremena su iza nas. Mislim da je ove godine Rijeka najvise zasluzila da bude prvak, jer igraju najbolji nogomet.
  • Kloba: Iskreno, radi dobrobiti hrvatskog klupskog nogometa, htio bih da ili Hajduk ili Rijeka ili Osijek osvoje ovu sezonu. Da se stvori nova velika četvorka u ovoj maloj zemlji.
  • Kloba: Pa valjda ćeš ove godine slaviti. Dugo niste bili ovako blizu. ;)
  • drlovric: Za Hajduk. Zato sam ovako mlad i pogubio zivce :D
  • cariblanco: za koga navijaš...naše ;)
  • drlovric: Za vikend sam u Splitu. Ostajem par dana. Ako neko od Jabucara dolszi gledati najveci nogometni derbi u Hrvata, tu sam za pice, kavu, rucak…
  • smayoo: Nažalost, je... :(
  • Djuro genijalac: [link]
  • Djuro genijalac: Kaj je umrla Slađana Milošević?
  • smayoo: RIP Slađana Milošević :(
  • Yonkis: [link] iPhone prodan na aukciji za 130.000 dolara
  • Yonkis: macOS Sonoma 14.4.1: fixes USB hubs connected to external displays may not be recognized; Apps that include Java may quit unexpectedly
  • Soffoklo: Fora. Creating a Macintosh-inspired Mac Studio iPad dock. [link]
  • abajo: Kloba: [link]
  • Kloba: Ekipa, može li me neko upititi n stranicu da si skinem macOS Catalina kako bih nanovo reinstalirao komjuter? Taj OS mi je najnovji koji ovaj moj Retina iz 2013. može "progutati". Kako se svi razumijete u ove stvari više od mene, bio bih zahvalan!
  • cariblanco: Na kraju sam skužio koliko je sati, po svitanju...ono fakat čudno ?
  • cariblanco: Istina je da Paragvaj mjenja vrijeme koji je blizu, ali ja imam Argentinski sim :D
  • cariblanco: Sad na mobu s našim sim_om je 7.25 a na mobu s Argentinskim sim_om je 8.25 ! S tim da Argentina nema promjenu verbena ?
  • cariblanco: Jurors imam dilemma, koliko je sati ? koliko mi je poznato mi nismo premjenili vrijeme, mjenjamo ga sljedeći vikend
  • Zdravac: MKBHD pratim i ja, ok je lik, realno recenzira, ne sipa hvalospjeve
  • Kloba: Ma bez daljnjeg. Čovjek si je osigurao egzistenciju, pa i vrlo luksuzan stil života već sada. Ima video u kojem pokazuje svoj studio, linkao sam ga tu svojevremeno. Ma preludo. A tek onaj Mr. Beast? Taj živi u studiu. Opsjednut YT-om.
  • drlovric: Zaradio j eon puno vise na otm videu. Pogledaj samo broj pregleda :)
  • Kloba: NIsam ni ja znao. A šta ćeš, cijena napretka. Za šta je dao 40 somova, sliku CD-a i iTunesa... :)
  • Yonkis: Kloba, što nisi odmah rekao kako je završio unboxing i aktiviranje iPhonea :)
  • Kloba: MKBHD kupio originalni, nikada otvoreni first gen iPhone na aukciji u Chicagu za 32 tisuće dolara. Sa dostavom, porezima, i dodacima na sve ispalo ga je 40 tisuća. Video je tu: [link]
  • Yonkis: [link] - Justice Department sues Apple, alleging it illegally monopolized the smartphone market
  • Kloba: I ja brže na net, nađem video naslova 7 Ways To Fix PS5 Error Code CE-117773-6 :) I prvi "way2 mi pomogne, skužim da je do njih
  • Kloba: Uglavnom, kada sam htio skinuti save sa clouda PS Plua za Horizon 2, javi mi grešku Error Code CE-117773-6
  • Kloba: EON Premium sam uzeo, ne vjerujem koje sve kanale imam. Ruske, Ukrajinske, pa klasika CNN, BBC, Sky, ovo ono. Ali i puno iz regije

Za vikanje moraš biti prijavljen.

Prijava

Prisutni jabučari

Novo na Jabučnjaku

Teme

Poruke

Anketa

Kupujete li profesionalni Mac?

Čekam novi modularni Mac Pro - 48.5%
Novac nije problem, kupujem iMac Pro - 0.7%
Kupujem Valjak, baš je lijep i tih! - 0%
Kupujem polovni Mac Pro tower - 11.8%
Nadogradit ću postojeći Mac Pro tower - 2.9%
Običan iMac 27" mi je dovoljan za posao - 5.9%
Skromnih sam potreba, Mac mini je zakon! - 7.4%
Radim na terenu, mora biti MacBook Pro - 3.7%
Ne diram ništa, stari Mac služi me odlično - 10.3%
Kupujem PC kantu i prelazim na Windowse! - 8.8%

Ukupno glasova: 136
Anketa je završena dana: 08 Svi 2018 - 12:17
Page Speed 1.08 Seconds

Provided by iJoomla SEO