Új hozzászólás Aktív témák
-
dabadab
titán
A main() az definicio szerint int-et ad vissza, ez eppen olyan resze a C specifikacionak, mint az, hogy az utasitasok vegere pontosvesszo kell.
Tortenelmileg onnan ered a dolog, hogy UNIX-on (de egyebkent ez jelenleg is igy van gyak. minden OS-nel, amivel talalkozhatsz) a programoknak van egy u.n. visszateresi erteke, ami egy egyszeru integer. Ennek GUI-s, interaktiv programoknal tul sok szerepe nincs, viszont olyan esetekben, amikor pl. scriptbol hiv meg az ember programokat, nagyon hasznos: ugyanis ezt szokas annak jelzesere hasznalni, hogy a program jol futott-e le v tortent vmi hiba. A konvencio az, hogy ha nincs gond, akkor a visszateresi ertek 0, ha pedig van, akkor nem nulla (a konkret ertekek es jelenteseik program-specifikusak mar).
Egyszeruen osszefoglalva: ha a programod szepen lefut, akkor egy "return 0" kell, ha meg vmi hiba miatt szakad meg a futasa, akkor meg -1 (ezt szoktak altalanos "problema van" ertekkent hasznalni) legyen a main() altal visszaadott ertek.
DRM is theft
-
dabadab
titán
válasz cellpeti #535 üzenetére
Amikor utoljara lattam, akkor pont ezustszurke volt, de lehet, hogy mostanaban kek.
Nem tul vastag, raadasul kb az utolso harmada a nyelv referencialeirasa, szoval eleg gyorsan vegig lehet rajta menni (Dennis Ritchie meg a C nyelv (es mellesleg a Unix) egyik alkotoja).DRM is theft
-
dabadab
titán
válasz Fire/SOUL/CD #541 üzenetére
Egyszeruen stdinen be kell adni a programnak. Semmi ellenorzes nincs arra nezve, hogy nem jon be 255-nel tobb karakter, siman felul lehet irni az egesz stacket.
DRM is theft
-
dabadab
titán
válasz Sk8erPeter #1447 üzenetére
A goto azert nem jo, mert tonkrevagja a program strukturajat, ami nehezebbe teszi a hibakeresest, a kod karbantarsat es megerteset is.
Azt mondjuk nem art nem elfelejteni, hogy Dijsktra '68-ban irta "Go To Statement Considered Harmful" cimmel megjelent levelet, amikor a strukturalt programozas meg nem volt igazan mainstream es teljesen hetkoznapi volt a spagettikod, amiben gotoval ugraltak ossze-vissza. Bizonyos helyzetekben azon a goto hasznos lehet, mert eppen pont az adja a leghatekonyabb vagy a legattekinthetobb kodot - annak idejen a Kandon is belefutottam abba, hogy gyakorlaton instantegyes volt a goto, eloadason meg a quicksortbol egy gotos verziot prezentalt a tanar, mert az volt a legegyszerubb.
Mindent osszefoglalva, a goto elleni liheges mara nagyreszt okafogyotta valt (ma mar senki nem hasznalja ugy, ahogy a hatvanas evekben), az ellene valo horges mogott pedig ritkan talalni ertelmes okokat.DRM is theft
-
dabadab
titán
válasz Sk8erPeter #1454 üzenetére
"miért használsz mindenhol exit(0)-t?"
Mert kezdő (Mondjuk a voidra definiált main()-re azért sikoltoznia kellene a fordítónak.)
Az exit() használata tulajdonképpen ugyanannyira problémás, mint a goto, ugyanazon okok miatt.[ Szerkesztve ]
DRM is theft
-
-
dabadab
titán
"Egyébként nem úgy volt, hogy stacken tömböt csak fix méretben lehet létrehozni?"
Én nem tudok ilyenről és nekem ez teljesen jól működik:
#include <stdio.h>
void f(int size)
{
int x[size];
printf("%d\n",sizeof(x));
}
int main()
{
int c;
for ( c = 1 ; c < 10 ; c++ ) f(c);
return 0;
}./x
4
8
12
16
20
24
28
32
36szerk: látom, neked volt lelkierőd elolvasni a dokumentációt
[ Szerkesztve ]
DRM is theft
-
dabadab
titán
válasz Jester01 #2509 üzenetére
"Mivel semmi garancia nincs cast esetén, ezért ez semmivel sem jobb mintha az argumentum típusa egyszerűen void* lenne"
De, annyival azért jobb, hogy a függvény deklarációjából látszik, hogy ott valamiféle sockaddr struktúrát vár: ne felejtsd el, hogy a kódot nem csak a fordítóprogram, hanem a programozó is olvassa
DRM is theft
-
dabadab
titán
válasz bandi0000 #3560 üzenetére
Miert egyre inicializalod az x-et? A tmb-ben meg karaktereket nezel, nem szamokat, ezert az egyenloseg jobb oldalar nem 1, hanem '1' kell (ami ASCII eseten egyebkent 49).
x=0;
for ( int c=0 ; tmb(c) != 0 ; c++ )
{
x <<= 1;
if ( tmb(c) == '1' ) x|=1;
}Ja, meg azt azert vegyuk eszre, hogy a tizes szamrendszerbe valo konvertalast az printf()-re biztad
[ Szerkesztve ]
DRM is theft
-
dabadab
titán
Mondjuk abszolut nem ertem, hogy a scanf() miert ilyen nagy liebling a C hazikat felado tanarok kozott - csak a nyug van vele, amugy tok felesleges, nem tanit igazan semmilyen koncepciot meg a valos eletben sem hasznalja a kutya sem. Akkor mar inkabb hasznalnak az argc-t meg az argv-t, ha mar valamit.
DRM is theft
-
dabadab
titán
válasz overclockerr #3948 üzenetére
Lenyegtelenek.
Mondjuk nem tudom, hogy mennyire jo otlet Javat meg C-t parhuzamosan tanulni, mert annyira szogesen eltero nyelvek.
DRM is theft
-
dabadab
titán
válasz PumpkinSeed #4009 üzenetére
"van egy n elemű szo[20] karaktertömböm"
Most akkor n vagy 20?
Amugy igazan at se kell rakni, hiszen a szo[20]-ban eleve a betuk ascii kodja van benne.DRM is theft
-
dabadab
titán
válasz PumpkinSeed #4013 üzenetére
"Azt tudom, hogy egy pl egy string(i) helyre max 2 karaktert lehet tenni"
Ezt hogy?... Vagy arra gondolsz, hogy az a string tomb intekbol all es azoknak a kulonbozo byte-jait hasznalod fel?
Igazabol nem ertem az egesz felvetest, hogy mit akarsz csinalni es az miert jo[ Szerkesztve ]
DRM is theft
-
dabadab
titán
válasz PumpkinSeed #4015 üzenetére
"egy string elem helyére max 2 darab karaktert lehet betenni,"
Ezt tovabbra sem ertem. Ha az a string[] char tipusu, akkor ott egy elem helyere csak egy karakter fer be. Ha mas a tipusa, akkor meg a konkret tipustol fug, hogy mennyit tudsz oda bezsufolni es mondjuk a logikusan adodo int meg barmilyen modern rendszeren 4 byte-os.
Ha valami olyan kodolast akarsz csinalni, ami fixen egy karakter -> n karakter, akkor a kezdeti char cleartext[20]-at egy char encoded[20*n] tombbe rakd at, semmi ertelme az ilyen trukkozesnek.
DRM is theft
-
dabadab
titán
válasz PumpkinSeed #4017 üzenetére
Aha, gondoltam, hogy itt valami felreertodott.
Egy char tomb egy helyere csak egy betu fer. Amit te megprobaltal, az a "multicharacter constant", ami igazabol int tipusu, a konkret erteke implementaciotol fugg es eroteljesen ellenjavallott az alkalmazasa (a maximum merete meg szinten implementaciofuggo, van, ahol negy karakterbol is allhat). Ha egyebkent levitted volna ket karakterre, akkor se azt csinalna, amit akarnal, hanem minden bizonnyal a kettobol vagy az egyik vagy a masik karakter kerulne a char tombodbe, nem mind a ketto.[ Szerkesztve ]
DRM is theft
-
dabadab
titán
válasz PumpkinSeed #4019 üzenetére
Az, amit irtam: a kodolt szoveget haromszor akkora karaktertombben tarolod, mint amekkora az eredeti szoveg volt.
DRM is theft
-
dabadab
titán
válasz PumpkinSeed #4021 üzenetére
Miert, amugy hogy dekodolnad? Na, teljesen ugyanugy Csinalsz valami ilyen fuggvenyt, hogy:
char decode(char x[3])
es ezt hivogatod:
for (c=0; c < length; c++)
{
decoded_str[ c ] = decode( &encoded_str[c*3] );
}[ Szerkesztve ]
DRM is theft
-
dabadab
titán
válasz PumpkinSeed #4024 üzenetére
De hat ezt kb. ranezesre lehet torni, ennel az is durvabb lenne, ha minden karaktert az elozovel xorolnad.
DRM is theft
-
dabadab
titán
válasz stranger28 #4193 üzenetére
Par dolog:
0. Az egesz cuccban egy darab komment sincs, pedig azt erdemes gyakorolni, mert kulon tudomany.
1. "magic value"-ket a kodba irni nem tul jo gyakorlat, jobb konstanskent kezelni oket, illetve C-ben makrokent, szoval "#define MIN100_NOT_FOUND -1"
2. A free()-ket erdemes pont forditott sorrendben meghivni, mint a malloc()-ot, egyreszt, mert ugy maradnak meg szepen a blokkok, masreszt meg lehet, hogy egy kesobb malloc()-olt strukturaban egy pointer egy elozoleg lefoglalt memoriateruletre mutat - es ha az elso free()-zed, a masodikrol meg azt gondolod, hogy az meg ervenyes adatokat tartalmaz, abbol baj lesz.
3. A valtozoneveket (konstansokat, makrokat, file-okat, kommenteket) angolul tessek irni.
4. A nemsi_index teljesen felesleges. Lehetne mondani, hogy azert van igy, hogy meglegyen a funkcionalis tagolas (beolvasas, feldolgozas, kiiras), de ez egyebkent sincs meg (amire teljesen elfogadhato magyarazat, hogy igy hatekonyabb a kod - leszamitva ezt a franya nemsi_indexet).
5. Ha megis a tagolas mellett dontenel, akkor erdemes lenne azt harom fuggvenybe kirakni.
DRM is theft
-
dabadab
titán
válasz skylaner #4202 üzenetére
Mivel defaultban ugyis aligned az egesz, igy aztan abszolut semmit nem takaritasz meg azzal, hogy chart hasznalsz, csak egy plusz korlatot vezetsz be, ami aztan a kesobbiekben problemassa valhat (ugyanez vonatkozik az unsigned-ra is).
Es ha mar kapcsos zarojelek: igazabol erdemes mindig kirakni oket, szemleltetem.
Kiindulasi allapot:
for(i=0;i<n;i++)
if (palyak[i]==0)
{
nemsi_index[a]=i;
a++;
}Aztan az ember debuggol:
for(i=0;i<n;i++)
DEBUG("qweqwe");
if (palyak[i]==0)
{
nemsi_index[a]=i;
a++;
}Es maris kesz a katasztrofa, amihez raadasul az IDE-k boldogan asszisztalnak (true story ).
[ Szerkesztve ]
DRM is theft
-
dabadab
titán
válasz Jester01 #4205 üzenetére
Kenytelen vagyok visszakozni: megtakaritana, mivel itt csupa char lenne. Ha amugy egy csomo intje meg pointere lenne, es akoze rakna be egy-egy chart, akkor nem lenne megtakaritas, mert ott azoknak a 4 / 8 byte-os alignmentje bekavarna, de ha tenyleg mindenki char, akkor nincs ilyen gond.
DRM is theft
-
dabadab
titán
válasz skylaner #4230 üzenetére
"Dehát ez nem az strlen hibája."
De. Nem veletlenul talaltak ki az strnlen()-t.
"Most azért ne használjak egy már megírt fgv-t mert lehet, hogy hibás paraméterrel hívom meg?"
Igen, foleg ilyen esetekben, ahol a parameter jo esellyel nem magabol a programbol, hanem inputbol szarmazik, mivel ezzel hatalmas kaput nyitasz a buffer overflow exploitoknak.
"Tessék gondoskodni arról, hogy helyes paramétert adunk át a fgv-nek."
Hat, ha 100%-ra meg tudsz eskudni arra, hogy az strlen csak es kizarolag rendesen null-terminated stringet kap (es ha barhol, barmikor, barki megvaltoztat valamit a programban, ami miatt ez majd nem all fenn, akkor abban a pillanatban lecsereled), akkor csinald, de nekem joval egyszerubbnek tunik az strnlen() hasznalata.
[ Szerkesztve ]
DRM is theft
-
dabadab
titán
válasz tototos #4233 üzenetére
mennyire jo megoldasod van?
en valami ilyesmit csinalnek:
uint16 array[4];
void insert(uint16 value, uint address)
{
uint pos;
uint shift;
pos = address >> 4;
shift = address & 0x0f;
array[pos] = value << shift;
array[++pos] = value >> ( 0x0f - shift);
}Mondjuk ezt erosen endian-fuggo, szoval inkabb at kellene irni unit8-as tombre, de a lenyeg ez, meg kinullazza a byte-ok szelet, szoval ott valami maszkolni meg orozni kell, ha ez baj.
[ Szerkesztve ]
DRM is theft
-
dabadab
titán
-
dabadab
titán
válasz TheProb #4390 üzenetére
A fobb gondok:
1. A visszateresi ertek.
A char az egyetlen egy darab karakter. Ha tobb karakterre (stringre) van szukseged (marpedig itt arra van) akkor char*-ot kell visszaadnod, mert jelenleg a fuggveny csak a szam legelso karakteret adja vissza.
2. Memoriafoglalas
Annyi memoriat foglalsz a romai szamoknak, amennyibe pont belefer a szam arab szamokkal. Ezzel egyreszt ket gond is van:
1. a romai szamoknak jo esellyel tobb hely kell
2. a string vegere meg oda kellene fernie a lezaro nullanak. Ugyanis C-ben ugy neznek ki a stringek, hogy van a szoveg es a vegen ott ven egy 0 erteku byte (nem egy '0' karakter!), hogy lehessen tudni, hogy hol a vege3. Stringkezeles
Az elejen a nullat a legelso helyre kell beirni (romai[0]=0), onnan kezdve az strcat az gondjat viseli. A te megoldasodnal meg ott marad az elso n darab helyen valami memoriaszemet es az strcat az utan fogja irni a dolgait.
4. nullas szamjegyek
Gondold vegig, hogy mit ir ki ez az ezresnel kisebb helyiertekeken, ha mondjuk 1000-et konvertalsz at vele
5. Az else ag
Ha legalabb ketjegyu a szam, akkor nem fogja kiirni az egyes helyierteku szamokat
6. Memoriafelszabaditas
Ha azt akarod, hogy a hivo lassa is, hogy mit irtal, akkor semmikeppen se szabaditsd fel azt a memoriat, amit eppen vissza akarsz adni neki.
A freenek hiba eseten lenne ertelme (mivel akkor nem adnad neki vissza a romai pointert, igy "elveszne" az a memoria (memory leak)), de itt mondjuk jobb, ha csak akkor foglalod le, ha mar eldontotted, hogy at tudod konvertalni a szamot.Igy hirtelen ennyi.
DRM is theft
-
dabadab
titán
válasz buherton #4416 üzenetére
"vagy ott a Minecraft. Amilyen egyszerű a grafikája olyannyira erőforrás zabáló."
Nekem nagyon ugy tunik, hogy a Minecraft grafikaja leginkabb amiatt zabalja az eroforrasokat, mert rengeteg poligont hasznal (es ezt nem nagyon lehet megkerulni).
[ Szerkesztve ]
DRM is theft
-
dabadab
titán
válasz TheProb #4419 üzenetére
A C az gyakorlatilag platformfuggetlen assembler, ami tamogat strukturalt programozast is, manapsag mar leginkabb csak par specialis helyen hasznaljak.
A C++ ennek eggyel jobban elvont valtozata, ami tamogatja a nyolcvanas meg kilencvenes evek, sot, a 2011-es C++11 szabvany (amit olyan nagyon sok helyen meg nem hasznalnak) egyre inkabb a XXI. sz. elejenek mindenfele dolgait (objektumorientalt programozas, template-ek, ill. parhuzamos programozas, stb), de meg mindig nativ kodot futtat. Nekem ugy tunik, hogy manapsag ez a fo nyelv, ha nagy projekteket csinalnak.
A C# meg tulajdonkeppen a Java Microsoft-fele valtozata, meg egy fokkal elvontabb, virtualis gepek programozasara szantak es persze a Microsoft-vilagon kivul nem nagyon mukodik.
DRM is theft
-
dabadab
titán
válasz alapz@j #4423 üzenetére
Amit nem ertek, az az, hogy hogy a csudaba lesz a java gyorsabb. Megneztem magamnal is, a konkret loop, amit mer, arra ezt a kodot generalja a gcc:
.L14:
movsd 0(%rbp,%rdx), %xmm1
ucomisd %xmm2, %xmm1
jbe .L11
addsd %xmm1, %xmm0
.L11:
addq $8, %rdx
cmpq $800000000, %rdx
jne .L14Hogy ennel mi lehet gyorsabb, arrol fogalmam sincs, marpedig a java (legalabbis a rendezetlen tombnel) tenyleg gyorsabb egy jo 7-8%-kal.
DRM is theft
-
dabadab
titán
válasz buherton #4441 üzenetére
"C a beágyazott rendszerek egyeduralkodó nyelve."
Mondjuk en foleg nagyobbfajta rendszereket bizergaltam (nem kis dobozba, hanem nagyobbfajta szekrenyekbe voltak beagyazva ), de ott a regebbi cuccokon CHILL, ujabbakon meg C++, sot, Java volt.
"Honnan tudja futás közben, hogy hogyan lehet optimalizáltabb?"
Az ilyen dinamikus cuccok futas kozben is profilozzak a kodok es folyamatosan a bejovo adatokhoz tudjak optimalizalni, a Transmeta CPU-ja is ezt csinalta (mondjuk hogy most a konkret esetben tenyleg ujraforditja-e es ha igen, akkor mire, azt passzolom).
[ Szerkesztve ]
DRM is theft
-
dabadab
titán
"Pont nem latszik, mit csinal a programreszlet"
// count how many bits are set in num
Egyebkent pl. a quicksort meg egy csomo minden mas algoritmus sem arrol hires, hogy elso ranezesre latszik, hogy mit csinal.
"mert a shift es also bit szamolasanal se nem gyorsabb, se nem mellekhatas-mentesebb"
Fogadunk?
DRM is theft
-
dabadab
titán
válasz buherton #4492 üzenetére
"Következő példád az emberi gyarlóságra vezethető vissza."
Meg arra, hogy nem volt rendes verziokezeles meg kodreview meg unit test. Eddigi palyafutasom alatt nagyobbreszt ugy dolgoztam, hogy csak ugy lehetett valamit becheckelni, hogy azt valaki review-zta, ott meg kibukott volna az ilyen idetlenkedes. Vagy ha ott nem, akkor unit testen.
DRM is theft
-
dabadab
titán
válasz don_peter #4500 üzenetére
Igazabol oktalisat meg hexat a binarisbol eleg egyszeru atszamolni, mivel (a tizes szamrendszerrel szemben) egy-egy helyiertekre fix mennyisegu bit esik: oktalisnal harom bit ad ki egy oktalis szamjegyet, hexadecimalisnal meg negy.
Szoval ha van egy olyan szamod, hogy 10101101001011, akkor ki se kell szamolnod, hogy az mennyi is valojaban, hanem anelkul at tudod valtani.
Oktalisba harmasaval csoportositva (az elejere raktam plusz nullakat, hogy mindenhol meglegyen a harmas csoport):
010|101|101|001|011 = 25513Hexadecimalisba meg negyesevel:
0010|1011|0100|1011 = 2B4BDecimalisnal persze kenytelen vagy tenylegesen vegigszamolni (2048 jatekosok elonyben ):
10101101001011 = 1+2+8+64+256+512+2048+8192 = 11083DRM is theft
Ú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!
- Star Trek
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Lakáshitel, lakásvásárlás
- Vodafone mobilszolgáltatások
- GoPro Topic
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- Milyen okostelefont vegyek?
- Rövid előzetesen a S.T.A.L.K.E.R. 2: Heart of Chornobyl
- Futás, futópályák
- További aktív témák...