- Yettel topik
- One mobilszolgáltatások
- Xiaomi 15T Pro - a téma nincs lezárva
- Apple iPhone 17 - alap
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Google Pixel topik
- Honor 200 - kétszázért pont jó lenne
- Apple iPhone Air - almacsutka
- Nagyon apró félokos a HMD új mobilja
- Samsung Galaxy S23 Ultra - non plus ultra
Új hozzászólás Aktív témák
-
3man
csendes tag
Ezt fejtettem ki lentebb, csak valami miatt nem erti, miert akarunk mi raeroltetni struct-ot, mikor o csak egy char * -ot akar hasznalni.
Ezert jobb lenne c++ ban kezdeni, mert kisse mas es celravezetobb gondolkodasmod alakul ki.
Ott letrehozhatsz egy olyan osztalyt, amit te a "char *" helyett fogsz MINDENUTT hasznalni. Ez letarolhatja az aktualis meretet a stringnek, lehet operatorokat letrehozni, amelyek segitsegevel ugyan ugy kezelheted a valtozot, mintha char * lenne. Amikor a program a data [index] utasitashoz er, akkor meghivodik az osztaly [] operatora, amit te barhogy megirhatsz. Ellenorizheted, hogy az index nem negativ, es az eppen aktualis string mereten belul van vagy nem. Messze hatekonyabb lesz a program, es biztonsagosabb.De mar megint OFF voltam.
-
3man
csendes tag
Igen, igy mukodik a strlen(), megkeresi a string veget jelzo 0-at.
De lehet egy strukturat hasznalni tomboknel, ahol mindig tarolod a hosszat. /egy megjobb c++ modszert mar leirtam valahol itt./
Egy kezdonek ez bonyolitasnak tunik, de nem az. Csak azert latszik bonyolultnak, mert egy kezdo rovid programokban gondolkodik.
Egy nagyobb projectnel ez nagy terheket vesz le az ember valarol. /nem konkretan ez az egyszeru modszer, hanem a mar emlitett c++-os/ -
3man
csendes tag
Mivel nem en vok Chuck Norris, ezert nem fogom fejben debuggolni a progit.
A szokasos eljaras, hogy egy tesztelo reszt irsz hozza. Meghivod ket egyenlo stringgel, majd egyrovidebb/egyhosszabb es forditva stringgel. Ha eletben marad a kod, es az eredmeny amit kiir helyes, akkor kesz.
-
3man
csendes tag
Visszaterve a lancolt listara, az egyik lassito tenyezo , hogy az elemeket nem lehet kozvetlenul elerni. Erre vannak modszerek, amivel ez kikerulheto.
Ami igazan lassu, az a letrehozasanal a memoriafoglalas. Ha egy eleme int-et tartalmaz, es sok elem van, akkor igazan lassu az egesz folyamat. Erre is van kerulout, kell egy olyan memoriafoglalo modult beiktatni, ami egyszerre egy nagyobb szelet memoriat foglal le, es kis egyforma darabokat tud belole gyorsan kiosztani. Ezzel ismet jelentos sebessegnovekedes erheto el.
-
3man
csendes tag
int strcmp(char *a;char*b){
char res;
whil (1);
if ((res=(a-b++))|!a++)
break;
return res;
}Ha megtanulnad azt a par jelolest, ami ebben a rovid valamiben talalhato, mar tudnad mi a baja.
A 'res' 'char'-kent van definialva az 'a' es a 'b' 'char *'. Az = ertekadasnal legtobbszor a ket oldal tipusa egyenlo. Hogy lesz a 'char *a'-bol 'char'? Mar valahol leirtam, a definicio megmondja 'char , *a' -ra is fel lehet bontani, meg 'char* , a'-ra . Tehat az 'a' az mutato a '*a' az char. Egyszeru.
A c megengedi a nagyon tomor kod irasat, de ez nem celravezeto. Evek mulva ha eloveszed a kodot, egy eleg osszetett sornal gondolkozni kell, hogy hogyan is gondoltad ezt annak idejen. Atlathato egyszeru kodot kell irni, ami konnyen modosithato. Ilyen elemi szinten nem mindig kell modositani egy programot, de akkor is az a helyes ut. Es ugy kevesebb a hibalehetoseg is.
-
3man
csendes tag
A kinai nyelv, mint a tobbi is, egy olyan jelkeprendszer, amit az emberek kozosen elfogadtak.
A programnyelveket sem egy univerzalis "LOGIKA" alakitotta ki, hanem egy kompromisszum a gep hardver felepitese altal diktalt logika, es az emberi agy szavakra epulo logikajanak egy furcsa kevereke. Ez latszott a legoptimalisabbnak a feladatra. Vannak matematikai beutesei is, peldaul a for ciklus a matek szumma fogalmahoz kozelit. (nem az osszeadaas miatt ) .
Olyan kifejezeseket hasznal, amelyeket ebben a formaban lehet hogy mashol nem is talaljuk meg. Az = jel lehet ertekadas, de a == ket valami egyenloseget vizsgalja. Az & adhat cimet, lehet binaris ES, vagy megduplazva logikai ES.Ezt mint meg kell tanulni, mashogy nem megy.
-
3man
csendes tag
Errol a "megerteni" szorol mindig a kinai nyelv jut az eszembe.
Szerezz egy kinai konyvet, es probald "megerteni". Vajon hany szaz ev kellene hozza?Ha kiulsz a kinai piacra, az eselyed a szovegek megertesere megnovekednek. Hiszen latni fogod, mint csinalnak, mikozben beszelnek. Fel fogsz ismerni nehany szo ismetlodeseben valami logikat, amit egy adott cselekmenyhez lehet kapcsolni.
Ez az az eset, amikor minden tudas nelkul leulsz a gep ele egy c forditoval, es egy peldaprogramot modositol. Jarhato ut, de ez is lassu.Egy kinai-magyar szotar mar sokat segit, de ha valaki, aki kinaiul is tud meg magyarul is, es elmondja neked a nyelv alapszabalyait, akkor leszel hatekony igazan.
-
3man
csendes tag
Pontosan az egyik ilyen modszer, amit a katedra "profinak" tart, a lancolt lista.
Gyakorlatilag, ha az ember tudja, mit csinal a gep az adott esetben, tisztaban van azzal, hogy ugyanaz a feladat tombokkel sokkal gyorsabban lefut. Lancolt listat viszont konnyebb atrendezni, kivenni egy elemet, beszurni. Ebben profi, de ugyan ezt egy jol megirt tomb osztallyal is meg lehet tenni. Az eredmeny, "ganyolt" de gyorsabb program.
xd
-
3man
csendes tag
Az emberi agy viselkedes mintak alapjan mukodik. Ezek bevalt semak. Teljesen mindegy, hogy adott esetben a netrol szarmazik, az egyetemrol vagy sajat tapasztalatbol. A matek is egy sema, a szamitogep alaplogikaja kozel all a matekhoz.
Ha egy gyereknek 5-7 eves koraba a kezebe adsz egy gepet egy forditoval, es ERDEKLI /mert a motivacio mindennel fontosabb/, akkor tudni fog elobb utobb programozni akkor is, ha soha eleteben nem tanul matekot. Akar a vektorokra is "rajohet", csak epp nem fogja tudni, hogy azok a vektorok.A ganyolasrol csak annyit, ha egy program azt csinalja amit kell, az egy profi program, fuggetlenul attol, mit mond a kod formajara a katedra. Amit tanitanak azok elfogadott modszerek, de nem feltetlenul mindig a leghatekonyabb.
-
3man
csendes tag
.
-
3man
csendes tag
Az xml-re ra lehet epiteni egy olyan config-rendszert, ahol mar azzal sem kell foglalkozni, hogy az adott valtozo int, float vagy eppen string tipusu. Sot az xml definialhatja a valtozokat, a programban a valtozonak nem is kell jelen lenniuk alapbol.
Gondolom elso hallasra furcsan hangzik, de megoldhato egyszeruen.
Eloszor letre kell hozni egy altalanos "valtozo" osztaly. /bocs, megint c++, de itt merult fel a tema./
Az xml-ben egy definicio valahogy igy nez ki : valami="100.2".class altalanos_valtozo {
public:
char *nev;
int tipus;
char *ertek;
};A valtozo neve lesz a "valami", az erteke pedig a "100.2". A tipus egyszeruen meghatarozhato, ha csak szamokat es elojelet tartalmaz, akkor int, ha pontot is ,akkor float, a tobbi esetben string. De lehet egyenileg kialakitani tobb tipust is.
Meg nehany konvertalo operatort kell az osztalyhoz adni, es mar kesz is egy kenyelmesen hasznalhato altalanos valtozo, ami egy xml kezelovel kiegeszitve egy tokeletes config kezelest biztosit.
Konnyen bovitheto, mivel az xml-be letrehozva egy ilyen bejegyzest, az automatikusan a programban is azonnal "el".
Mas kerdes, hogy ezt valamire hasznalni is kell, amit "sajnos" bele kell irni a programba. -
3man
csendes tag
"Config" filet sokkal celszerubb valamilyen szabvanyos szoveges formaban letrehozni, es nem binarisan. Semmikepp nem binarisan. Az egyik legoptimalisabb az xml formatum.
Ekkor a problemad egybol eltunik, mivel nem kell azzal foglalkozni, hogy az adott gepen hogyan nez ki a float fizikailag. Ezt az xml kezelo elintezi. -
3man
csendes tag
Termeszetesen debuggerekkel es tarsaikkal helyettesitheto a modszerem.
De amikor 10 netalan 100 kulso tesztelod van, akkor nem biztos, hogy ez kenyelmes modszer.
Mi a legegyszerubb megoldas?
Az AddVectoredExceptionHandler() -el elkapsz minden nem tervezett esemenyt, es logolsz minden fontos dolgot. A lefoglalt teruletek mutatolistaihoz rendelt nev alapjan barmilyen memoria hiba pontosan lokalizalhato akar ugy, hogy nem is debug modban fut a program. Egy callstack-hez hasonlo kovetes is beepitheto ebbe a logba.
Ugyan a debug mod azert van, hogy ezt elvegezze, de megeshet, hogy igy tul lassu a program. Ha a programot a vegleges formajaban kell tesztelni, akkor a debug mod mar kiesik, de a hiba megis egyszeruen detektalhato. -
3man
csendes tag
válasz
Sk8erPeter #1435 üzenetére
Minel kevesebb dologra kell figyelni kodolaskor, annal kisebb az eselye a tevedesnek.
-
3man
csendes tag
válasz
Sk8erPeter #1435 üzenetére
Ha az osztaly tartalmazza a tomb meretet, akkor egy gonddal kevesebb, nem kell ra figyelni.
De ez ugyan az, mint amikor atadod kezzel. -
3man
csendes tag
"Igy kiszurheto olyan rejtett memoria hiba, ami akkor keletkezik ha lemasolok egy pointert, de az eredetit felszabaditom. "
Az kifelejtettem, hogy ennek a kiszuresehez minden [] operatornal ellenorizni kell, hogy az adott pointer benne van-e meg a listaban. Ez nagyon lelassitja a programot, de ezt eleg csak akkor futtatni, ha valamilyen bug van a programban.
Egy rutinos programozo mondhatna erre, hogy ilyen hibak nala nem fordulhatnak elo. En erre csak azt mondom, sose lehet tudni.
-
3man
csendes tag
Ha mar igy kiveseztetek a tomboket, erdemes megemliteni, hogy a legeldugodtabb bugokat a tombok tulindexelesevel lehet krealni.
Ugyanis az tortenik, hogy ha letrehozok egy int tomb[100] meretu tombot, es utanna beleirok mondjuk a tomb[234]=1 elemebe ezzel a sorral, akkor az a memoriaban utanna levo valamelyik valtozoba fog belebarmolni. Ez azutan vagy lathato hibat okoz, vagy lopakodo uzemmodban egyszercsak ertelmetlen dolgokat fog a program csinalni teljesen mashol, olyan helyen, aminek semmi koze a tomb[] hoz.
Erre mar jol kezelheto array osztalyok vannak, erdemes szetnezni es valogatni ezek kozt. A legegyszerubb, ha az ember egy sajat array osztalyt hoz letre, es minden tipusu tombot ezzel definial.
Ebben letre lehet hozni egy []-operatort, ahol az indexelesnel ellenorizni lehet, hogy az index a tomb merete alatt van-e. A tomb letrehozasanal pedig el lehet tarolni a meretet. Ezzel az apro dologgal rengeteg fejfajastol lehet megszabadulni.Ehhez kapcsolodik a memoria kezeles. Ha az ember meg kezdo, nem mindig tudja ugy felepiteni a programot, hogy minden lefoglalt memoria mindig jo helyen es jo idoben szabaduljon fel.
Minden new utasitast erdemes sajatra cserelni. Ez akar egy egyszeru makroval is megteheto. Egy mutato-listat letrehozva le kell tarolni minden lefoglalt cimet.
Amikor uj cimet hozok letre, erdemes vegignezni a listat, hogy nem esik bele valamelyik mar letrehozott memoria reszbe az uj kezdocim. Igy kiszurheto olyan rejtett memoria hiba, ami akkor keletkezik ha lemasolok egy pointert, de az eredetit felszabaditom. Ez kezdo hiba, de barki tevedhet. A program viszont eszre fogja venni a tevedest. Termeszetesen a delete-nel a a listabol torolni kell a mutatot.
Ezt a modszert kiegeszitve azzal, hogy minden sajat new hivasnak nevet adok, a nem felszabaditott memoriat barmikor ki lehet listazni.
Nevadas helyett lehet hasznalni a __line__ __file__ __function__ makrokat, amikkel a felszabaditatlanul maradt new utasitas pontos helyet vissza lehet kovetni.Ezzel az ket egyszeru modszerrel szinte az osszes memoria bug kiirthato egy akarmilyen bonyolult programbol.
-
3man
csendes tag
Ez nagyon alapszint, gondolom azert nem valaszolt senki.
Ha mar alapszint. Mikor mutato valami, es mikor char?
Ehhez csak a definiciot kell mindig megnezni.
Az str igy volt definialva
int strlen(char *str)
Ezt fel lehet bontani tobbfelekepp.
char * , str
char , * str
Ebbol mar latszik, mikor mit jelent a kifejezes. Ha csak str-t irok, akkor az char *
ha *str-t, akkor az char.Lehetne ilyen is a definicio
char **str
Ekkor tobb felbontasi lehetoseg kinalkozik. De a definiciobol mindig lehet tudni, mit jelent az adott kifejezes. Az utobbinal **str az char tipust ad, mig *str egy char *-ot.A c nyelvben a mutato egyben egy tomb elso elemere is mutat.
Tehat a char *str megegyezik a char str[] definicioval. Ebbol kovetkezik, hogy minden mutatot indexelhetunk, mint egy tombot, es minden tomb neve egyben mutato, ami egy cimet tarol. -
3man
csendes tag
Az utolso sor az esetek 99.99 szazalekaban jol mukodik, de..
A cim 32 bites lehet, ahogy az int is, de az int elojeles. Ez problemat okozhat, ha a str joval 0x7fffffff alatt van, mig a karakterlanc vege joval 0x8000000 folott.
Ekkor az int-re konvertalasnal az elso szam pozitiv lesz, mig a masodik negativ., es a kulombseguk is negativ, ha a karakterlanc eleg nagy. Gyakorlatilag nem lehet akkora karakterlancot letrehozni, hogy a hiba elojojjon, de ez akkor is hiba.
A visszateresi erteknek unsigned int-nek kellene lennie.erdemes probalgatni, mikor lesz negativ az eredmeny, es mikor nem.
int a=0xbfffffff;
a-=0x30000000;
printf("%d \n",a); -
3man
csendes tag
Adott a feladat:
int strlen(char*str){
char*tmp=*str;
if(!strt)
return 0;
while(str+#);
return*str-*tmp;
}Eloszor is
1.)tmp egy cim, mig *str egy char
2.)nincs olyan hogy strt
3.4) while(str+#); ebbol a sorbol hianyzik egy * es egy +
5.) a visszateresi ertek int,es nem charint strlen(char *str){
char *tmp=str;
if(!str)
return 0;
while(*str++);
return str-tmp;
}
vagy inkabb
return (int)(str-tmp);
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Playstation 5 lemezes 825GB CFI-1216A, újra fém pasztázva, 6 hónap garanciával, Bp-i üzletből eladó!
- MSI MEG Z-790 ACE alaplap + INTEL CORE I9 13900K proci + 32 GB DDR5 memória Félkonfig
- AFOX GTX 1050 Ti 4GB GDDR5
- Lenovo Tab P11 Pro 2. Gen. Billentyűzet és Tok - Szürke
- GLORIOUS Aura 145-KEY Mechanical Keycaps - White
- HP Probook i5-7th, 8/128 Notebook
- HIBÁTLAN iPhone 13 mini 128GB Midnight -1 ÉV GARANCIA - Kártyafüggetlen, MS3330
- ÁRGARANCIA! Épített KomPhone i5 13400F 16/32/64GB RAM RTX 5060 8GB GAMER PC termékbeszámítással
- Apple Macbook Air 13,6 M4 16GB/256GB - 7 Ciklus - 100% Akkumulátor - MAGYAR - Ezüst - 3 év garancia
- Lenovo Yoga Slim 7 i5-1135G7 8GB 512GB 14" FHD IPS
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest