Programiranje nasveti
Nextranks

Programiranje nasveti

C

1. C vam omogoča, da ugotovi, spremenljivke zunaj kakršnega koli postopka. Te spremenljivke se imenujejo globalne spremenljivke.
  1. Globalna spremenljivka je enkrat dodeljena, ko se program zažene in ostane v pomnilniku, dokler program konča.
  2. Globalna spremenljivka je vidna v vseh postopkih v isti datoteki.
  3. Lahko bi globalno spremenljivko prijavljeni v datoteko Ac vidne v vseh postopkih v nekaterih drugih datotek Bc, Cc, DC, ... tako, da jo razglasi z modifikator extern v datotekah Bc, Cc, DC, ... kot v tem primeru:
extern int theVariable
Če imate veliko datotek, ki si delijo spremenljivko, morate razglaša extern v glavi datoteke foo.h (opisano spodaj) in uporabo # include foo.h v datotekah Bc, Cc, DC, .... Morate prijaviti spremenljivko natanko eno datoteko brez

4.Terenec modifikator, ali pa nikoli ne postane dodeljena na vse.

2.To ni dobra ideja za uporabo preveč globalnih spremenljivk, saj ne morete lokalizirati krajev, v katerih se dostop do njih. Vendar pa obstajajo primeri, ko so globalne spremenljivke vam omogočajo, da bi se izognili poteka

a. veliko parametrov funkcij. b. Strune so kazalci na ničelni zaključni nizi znakov.

Če ugotovi niz kot char *variableName.

c. Če je vaš niz je konstantna, lahko samo določite niz dobesedno z njim:

myString = ""; // empty string, length 0, containing null
d. Null kazalec ni veljavna vrednost niza:
myString = NULL; // invalid string
Lahko uporabite to vrednost, ki označuje konec array nizov:
argv[0] = "progName"; argv[1] = "firstParam"; argv[2] = "secondParam"; argv[3] = NULL; // terminator
e. Če je vaš niz izračunana na runtime, morate rezervirati dovolj prostora, da jo imajo.Prostor mora biti dovolj, da imajo nične na koncu:
char *myString; myString = (char *) malloc(strlen(someString) + 1); // allocate space strcpy(myString, someString); // copy someString to myString
f. Da bi se izognili spomin razpoka, naj bi sčasoma vrnitev prostor, ki ga dodeli z knjižnične funkcije malloc z uporabo brezplačno. Njegova parameter mora biti začetek prostora, ki jo vrne knjižnične funkcije malloc:
free((void *) myString);

Če želite, da vaša koda čist in berljiv, morate pokličite brezplačno () v istem postopku, v katerem kličete malloc (), lahko pokličete ostale postopke teh dveh točk na manipulirati niz. g. Če kopirate strune, morate biti zelo previdni, ne da bi kopirali več zlogov, kot destinacija struktura podatkov lahko imajo. Varovalni preplavlja so najpogostejši vzrok varnostnih pomanjkljivosti v programih. Še zlasti, razmislite o uporabi strncpy () in () strncat namesto strcpy () in strcat ().

h. Če uporabljate C + +, boste morali spremeniti svoje niz predmetov v nizih C-style pred njihovo posredovanje v sistem klic.

string myString // This declaration only works in C++ ... someCall(myString.c_str())
Žal c_str () vrne niz nespremenljiva. Če potrebujete spremenljivo niz, jih lahko kopirate podatke z strcpy () (kakor je opisano zgoraj), lahko odda vrsto:
someCall(const_cast<char *>(myString.c_str()))

Casting ni tako varna, kot kopiranje, saj lahko someCall () dejansko spremeniti niz, ki bi zamenjal vsak del programa, ki predpostavlja, da myString je konstanta, ki je običajno vedenje C + + strune.

3. Varovalni regija pomnilnika, ki deluje kot vsebnik za podatke. Čeprav bi se podatki morali razlago (kot array konstrukti s številnih področij), programe, ki berejo in pišejo odbojniki jih pogosto obravnavajo kot nizi bajtov.Množica bajtov ni isto kot niz, čeprav sta oba razglasila char * ali char [].

a. Ti morda ne vsebuje ASCII znakov in ne sme biti nič-terminirani. b. Ne morete uporabljati strlen (), da bi našli dolžino podatkov v pufru (saj lahko vsebuje pufer ničelnih bajtov). Namesto tega je treba ugotoviti, koliko podatkov vrnjene vrednosti od sistemskega klica (običajno branje), ki je ustvarila podatke. c. Ne morete uporabljati strcpy (), strcat (), ali z njimi povezane rutino za bajtne rezerv, namesto tega morali uporabiti memcpy () ali () bcopy. d. Pišete varovalnega pasu 123 bajtov datoteke s kodo, kot je ta:

char *fileName = "/tmp/foo" #define BUFSIZE 4096 char buf[BUFSIZE]; // buffer containing at most BUFSIZE bytes ... int outFile; // file descriptor, a small integer int bytesToWrite; // number of bytes still to be written char *outPtr = buf; ... if ((outFile = creat(fileName, 0660)) < 0) { // failure // see file permissions to understand 0660 perror(fileName); // print cause exit(1); // and exit } bytesToWrite = 123; // initialization; 123 is just an example while ((bytesWritten = write(outFile, outPtr, bytesToWrite)) < bytesToWrite) { // not all bytes have been written yet if (bytesWritten < 0) { // failure perror("write"); exit(1); } outPtr += bytesWritten; bytesToWrite -= bytesWritten; }
e. Da bi dobili prevajalnik za dodelitev prostora za odbojnike, morate prijaviti pufer z velikostjo, ki lahko prevajalnik izračunati, tako kot v
#define BUFSIZE 1024 char buf[BUFSIZE];
Če ste pravkar razglasi za varovalni brez velikosti:
char buf[];
potem je neznano velikosti in C se ne dodeli nobenega prostora. To je sprejemljivo, če je BUF formalni parameter (kar pomeni, da se pojavi v postopku glavi), dejanski parameter (ki jih klicalec) ima velikost. Ampak to ni sprejemljivo, če BUF je spremenljiva. Če ne veste, velikost pomnilnika v času prevajanja, bi morali uporabiti kodo takole:
char *buf = (char *) malloc(bufferSize);

kjer je bufferSize teka posledica nekaterih računanja.

4. Lahko dinamično dodeljevanje in Drugače pridijeliti spomin.

a. Posamezni primeri katero koli vrsto:

typedef ... myType; myType *myVariable = (myType *) malloc(sizeof(myType)); // you can now access *myVariable. ... free((void *) myVariable);

Spet je dobra praksa za izbiro programov prosto () v isti rutini, ki jo imenujemo malloc (). b. Eno-dimenzionalni nizi katero koli vrsto:

myType *myArray = (myType *) malloc(arrayLength * sizeof(myType)); // myArray[0] .. myArray[arrayLength - 1] are now allocated. ... free((void *) myArray);

c. Dvodimenzionalni nizi so predstavljeni z vrsto kazalcev, ki kažejo, da vsako matriko:

myType **myArray = (myType **) malloc(numRows * sizeof(myType *)); int rowIndex; for (rowIndex = 0; rowIndex < numRows; rowIndex += 1) { myArray[rowIndex] = (myType *) malloc(numColumns * sizeof(myType)); } // myArray[0][0] .. myArray[0][numColumns-1] .. myArray[numRows-1][numColumns-1] // are now allocated. You might want to initialize them. ... for (rowIndex = 0; rowIndex < numRows; rowIndex += 1) { free((void *) myArray[rowIndex]); } free((void *) myArray);

d. Če uporabljate C + +, ne mešajte novega / izbrisati z knjižnične funkcije malloc/prosti za isto strukturo podatkov.Prednost novega/brisati za razred primerih je, da se avtomatično poklical Constructors, ki bi lahko inicializacijo podatkov, in destruktorji, ki lahko dokonča podatke. Ko uporabljate malloc/free, morate inicializirati izrecno in dokončno.

5. Cela

a. C je navadno celih 4 bajte. Na primer, številka 254235 zastopali binarno število 00000000,00000011,11100001,00011011. b. Po drugi strani pa predstavlja ASCII številke, kot kateri koli drug znak, z eno bajt na znak z uporabo standardnega kodiranja. V ASCII, se številka 254235 zastopali 00110010 00110101, 00110110, 00110010, 00110011, 00110101,. c. Če želite napisati spis celih, je na splošno bolj učinkovita v prostoru in času, da napišete 4-byte različice, kot da jih pretvorimo v znakovnimi in pisati teh. Tukaj je, kako napisati en celo število do odprte datoteke:

write(outFile, &myInteger, sizeof(myInteger))
d. Si lahko ogledate na posameznih bajtov je celo, da ga vlivanje kot strukturo štirih bajtov:
int IPAddress; // stored as an integer, understood as 4 bytes typedef struct { char byte1, byte2, byte3, byte4; } IPDetails_t; IPDetails_t *details = (IPDetails_t *) (&IPAddress); printf("byte 1 is %o, byte 2 is %o, byte 3 is %o, byte 4 is %o\n", details->byte1, details->byte2, details->byte3, details->byte4);

e. Multi-byte cela se lahko drugače predstavljal na različnih strojih. Nekateri (kot ne SparcStation) dal najpomembnejšo bajt prvi, drugi (kot so Intel i80x86 in njegovih potomcev), je dal najmanj pomemben bajt prvi. Če pišete celih podatke, ki jih lahko preberete na drugih napravah, pretvarjanje podatkov, da "omrežje", da bajt po htons () ali () htonl. Če berete celih podatke, ki bi lahko bile zapisane na drugih napravah, pretvoriti podatke iz "omrežje", da bi vaš lokalni da bajta z ntohs () ali () ntohl.

6. Lahko napovedati, koliko pomnilnika postavitev konstrukti in vrednost, ki bo sizeof () vrne. Na primer,
struct foo { char a; // uses 1 byte // C inserts a 3-byte pad here so b can start on a 4-byte boundary int b; // uses 4 bytes unsigned short c; // uses 2 bytes unsigned char d[2]; // uses 2 bytes };

Zato, sizeof (struct foo) vrne 12. Ta predvidljivost (za dani arhitekturi), zato nekateri imenujejo C "prenosni monter jezik". Moraš napovedati struct postavitev pri ustvarjanju podatkov, ki jih morate upoštevati posebno obliko, kot v glavi omrežja paketu.

7. Lahko razglasi napotke v C za vse vrste in dodeliti jim vrednosti, ki kažejo na objekte te vrste.

a. Zlasti C vam omogoča, da navodila o števil:

int someInteger; int *intPtr = &someInteger; // declares a pointer-valued variable and assigns an appropriate pointer value someCall(intPtr); // passes a pointer as an actual parameter someCall(&someInteger); // has the same effect as above

b. AC knjižnica postopek, ki se kazalec na vrednosti najbolj verjetno, da se spreminja vrednost (postane "out", ali "v out" parameter). V zgornjem primeru je zelo verjetno, da someCall spreminja vrednost celo someInteger. c. Lahko graditi kazalec na matriko celih števil in jo uporabite za korakom skozi ta niz.

#define ARRAY_LENGTH 100 int intArray[ARRAY_LENGTH]; int *intArrayPtr; ... int sum = 0; for (intArrayPtr = intArray; intArrayPtr < intArray+ARRAY_LENGTH; intArrayPtr += 1) { sum += *intArrayPtr; }
d. Lahko graditi kazalec na matriko z konstrukti in ga uporabi za korakom skozi ta niz.
#define ARRAY_LENGTH 100 typedef struct {int foo, bar;} pair_t; // pair_t is a new type pair_t structArray[ARRAY_LENGTH]; // structArray is an array of ARRAY_LENGTH pair_t elements pair_t *structArrayPtr; // structArrayPtr points to a pair_t element ... int sum = 0; for (structArrayPtr = structArray; structArrayPtr < structArray+ARRAY_LENGTH; structArrayPtr += 1) { sum += structArrayPtr->foo + structArrayPtr->bar; }

e. Ko dodate celo število, da kazalec je kazalec, ki pospešujejo številne elemente, ne glede na to, kako velika so elementi.Prevajalnik ve, velikosti in naredi pravo stvar.

8. Izhod

a. Ti format izhod z printf ali njegova različica, ovrednotenj. b. Oblikovni niz porabi% d% s,% f kar pomeni, da celo, niz ali realno je, da jih dajejo v proizvodnjo. c. Oblikovni niz porabi \ t in \ n navesti kartico in novo vrstico. d. Primer:

printf("I think that the number %d is %s\n", 13, "lucky");

e. Mešanje printf (), ovrednotenj in ne cout lahko natisnete elemente v vrstnem redu, kot jih pričakovali. Uporabljajo neodvisnih področja počivališča ("odbojniki"), ki se tiskajo, ko so polne.

9. Glavni () rutina se funkcija parametrov, ki predstavljajo parametrov iz ukazne vrstice.

a. Eno skupno pot, da napišete glavno rutino, je to:

int main(int argc; char *argv[]);

Tu argc je število parametrov in argv je množica nizov, da se je množica kazalcev na ničelni zaključni nizi znakov. b. Po dogovoru prvi element argv je ime programa samega.

int main(int argc; char *argv[]); printf("I have %d parameters; my name is %s, and my first parameter is %s\n", argc, argv[0], argv[1]);
10. Priročne funkcije jezika

a. Lahko prirastek celo število ali imajo kazalec točko na naslednji objekt z uporabo + + operaterja. Običajno je najbolje, da se ta subjekt po spremenljivi: Myint + +. Če si dal + + pred spremenljivko, nato pa se poveča spremenljivko, preden so ga tudi ocenjevali, kar je redko, kaj hočeš. b. Lahko graditi nalogo, kadar leva stran spremenljivka sodeluje kot prvi del izraza na desni strani:

myInt -= 3; // equivalent to myInt = myInt - 3 myInt *= 42; // equivalent to myInt = myInt * 42 myInt += 1; // equivalent to and maybe preferable to myInt++

c. Lahko izrazite število v decimalni, osmiški (za prefixing z mestno 0, tako kot v 0453), ali hex (za prefixing z 0x, kot v 0xffaa). d. Si lahko zdravi celo število kot niz bitov in izvajanje bitni dejavnosti:

myInt = myInt | 0444; // bitwise OR; 0444 is in octal myInt &= 0444; // bitwise AND with an assignment shorthand myInt = something ^ whatever; // bitwise XOR
c. C in C + + ima pogojnih izrazov. Namesto pisanja
if (a < 7) a = someValue else a = someOtherValue;
lahko napišete
a = a < 7 ? someValue : someOtherValue;
f. Naloge vrne vrednost na levi strani, tako da boste lahko tudi nalogo v večjih izrazi, kot so pogojnike. Vendar pa morate upoštevati konvencijo, da se takšne naloge je vedno obkrožen z oklepaji, ki navajajo tako, da nekdo bere kodo in prevajalnik, ki res pomeni nalogo, ne pa enakost test. Na primer, napišite
if ((s = socket(...)) == -1)
ne
if (s = socket(...) == -1)

Druga različica je tako težje brati, in v tem primeru nepravilna, ker enakost operator == ima večjo prednost in ne zaradi odstopa upravljavca =.

11. Programi, ki ne površno kratek, običajno treba razčleniti na več izvornih datotek, vsaka z imenom, ki se je končal leta. C (za programe C) oz. (CPP za C + + programi).

a. Poskusite skupino funkcij, ki manipulirajo enake strukture podatkov ali pa so povezane namene, v isti datoteki. b. Vse vrste, funkcije, globalne spremenljivke in konstante očitno, da so potrebne za več kot eno izvorno datoteko je prav tako treba razglasiti v glavi datoteke z imenom do konca. H. c. Razen za inline funkcije, ne morejo prijaviti funkcij organov (ali karkoli, ki povzroča prevajalnik za pridobivanje kodo ali dodelitev prostora) v glavo datoteke. d. Vsak vir Datoteka bi se morala nanašati na tiste glave datoteke, ki jih potrebuje pri # include linijo. e. Nikoli # vključujejo c datoteko..

12.  Če imate več datotek vir, se morate povezati vse datoteke, ki jih izračunamo predmetov, skupaj z vsemi knjižnicami, da vaš program potrebuje.

1. Najlažji način je, da uporabite prevajalnik za C, kar ve o knjižnicah C:

gcc *.o -o myProgram

Ta ukaz zahteva prevajalnik za povezavo vseh datotek predmeta s knjižnico C (ki je posredno vključen) in postavite rezultat v myProgram dokumentacije, ki postane izvršljiva. 2. Če je vaš program potrebuje druge knjižnice, jih natančno po tem, vaših predmetov datotek, saj povezovalnik zbira samo rutine iz knjižnice, ki že pozna jo potrebuje, in se povezuje datotek v vrstnem redu, ki ga določite. Torej, če potrebujete knjižnico kot libxml2, mora vaš povezovanje ukaz nekako takole:

gcc *.o -lxml2 -o myProgram

Prevajalnik ve, kako iskati različne standardne imenike za trenutni različici libxml2.

13.  Debugging programi C

a. Če dobite napako segmentacije, imate najverjetneje indeks zunaj dosega neinicializiranega kazalec, ali null kazalec. b. Vi lahko postavite tiskanja izjave v svoj program, ki vam pomaga lokalizirati napako. c. Debugging je verjetno najbolj uspešen, če boste uporabili gdb (opisano spodaj), da ugotovimo, kje je vaš napaka. d. Programi, ki se izvajajo dlje časa, mora biti previden, da osvobodi vse spomin jih dodeli, ali na koncu jim zmanjka pomnilnika. Za debug spomin razpoka boste morda menijo, da te članke o razhroščevanju C spomin razpoka in C + + spomin razpoka.

Unix

1. Po dogovoru, vsak postopek se začne s tremi standardnih datotek Odprto: standardni vhod na standardni izhod in standardna napaka, povezanih z datoteko deskriptorjev 0, 1, 2 in.

a. Standardni vhod je navadno povezan z tipkovnico. Karkoli tip gre za program. b. Standardni izhod je običajno povezana z zaslona. Ne glede na rezultate programov viden. c. Standardna napaka je tudi ponavadi priključena na zaslonu. d. Lahko uporabite lupino za izbiro programov, tako da se standardni izhod en program neposredno povezana ("priključka") na standardni vhod drugega programa:

ls | wc

e. Lahko uporabite lupino za izbiro programov, da se standardni vhod in / ali izhodno povezan datoteke:

ls > lsOutFile wc < lsOutFile sort -u < largeFile > sortedFile

f. Na splošno, programi, ne vem, ali je vseeno, če je lupina preuredili pomen svojih standardnih datotek.

2.  Unix ukazi

a. Ukazi so le imena izvedljivih datotek.PATH spremenljivko okolja pove lupini, kje iskati za njih. Značilno je, da ta spremenljivka ima svojo vrednost, kot / bin :/ usr / bin :/ usr / local / bin: .. b. Da bi videli, kje lupina najde določen program, na primer, vim, kjer pravijo vim.

3.  Sistemski klici in klici knjižnica upoštevati nekaj pomembnih konvencij.

a. Vrnjena vrednost razpisa običajno kaže, ali je razpis uspel (običajno vrednost 0 ali pozitivno) ali ne (običajno vrednost je -1). b. Vedno preverite vrnjeno vrednost knjižnice klicev. Ko sistem klic ne uspe, lahko perror () funkcija tiskanje, kar je bila napaka (s standardno napako):

int fd; char *filename = "myfile"; if ((fd = open(filename, O_RDONLY)) < 0) { perror(filename); // might print "myfile: No such file or directory" }

c. Stran priročnika za sistem klica ali knjižnico rutina bi seznam vrsto podatkov, ki se ne opredelijo, kot size_t ali time_t ali O_RDONLY. Te vrste se običajno opredeljena v glavi datoteke iz ročnega strani, morate vključiti vse tiste glave datoteke v C-ju.

4. Dovoljenja datotek v Unixu navadno s številkami, osmiško.

a. V primeru barja () zgoraj, 0666 je osmiško število (to je tisto, vodilni 0 pomeni), kar predstavlja binarno 110110000. To osmega število donacije brati in pisati dovoljenja, vendar pa ne izvaja dovoljenja, lastniku datoteke in skupini datoteke, vendar brez dovoljenja za druge uporabnike. b. Nastavite dovoljenja, ko ustvarjate datoteko s parametrom k odpi () klic. c. Ukaz ls-l prikaže dovoljenja datotek. d. Lahko spremenite dovoljenja za datoteko si lasti s programom chmod. e. Vsi vaši procesi imajo značilno imenovano umask, ki je običajno predstavlja kot osmiško število. Ko se ustvari datoteko, se bitov v umask odstraniti iz dovoljenj, določenih v razpisu odpi (). Torej, če vaš umask je 066, potem drugi ne morejo brati ali pisati datoteke, ki jih ustvarite, saj predstavlja 066 brati in pisati dovoljenja za svojo skupino in za druge ljudi. Lahko pregledati in spremeniti svoje umask z umask programa, ki jih po navadi sklicevanje v vašem skripte zagonu (odvisno od vaše lupine, ~ /. Prijava ali ~ /. Profil).

Programska oprema-razvojna orodja 1. Uporabite urejevalnik besedil za ustvarjanje, spreminjanje in preverite svoj program. Obstaja več upravičeni besedilo uredniki na voljo.

a. Urejevalnik vim z grafičnim vmesnikom, gvim, traja nekaj napora, da se naučijo, vendar pa zagotavlja zelo kakovostno niz orodij za urejanje programskih datotek, vključno z sintakso poudarjanja, oklepaju usklajevanje, dopolnjevanje besede, samodejno zamikali, ki iščejo z oznako (ki se giblje hitro iz mesta, kjer je program kliče funkcijo na kraj, kjer je opredeljena funkcija) in vgrajenim ročnim iskanjem strani. Vim je namenjen za uporabo tipkovnice, ne boste kdaj morali z miško, če ne želite. To je brezplačno na voljo tako za Unix in Microsoft Windows operacijskih sistemov. To je najbolj razvita različica urednik serije, ki vključuje ed, ex, VI in Elvis. Si lahko preberete spletne dokumentacije za VIM in dobili takojšen dostop do pomoči z VIM: Pomoč ukaz. b. Urejevalnik Emacs, če sploh kaj, bolj značilnost obremenjeno kot vim. Prav tako je potrebno veliko truda za učenje. Prav tako je na voljo brezplačno tako za Unix in Microsoft Windows operacijskih sistemov. Tu lahko najdete dokumentacijo tukaj. c. Obstaja veliko drugih tekstov na voljo, vendar se na splošno ne dam dve najbolj uporabne funkcije, ki jih potrebujete za ustvarjanje programov: samodejno zamikali in datoteko zaznamkov. Vendar pa ti besedilo uredniki imajo pogosto prednost, da je lažje, da se naučijo, v skladu s svojimi omejenimi zmožnostmi. Med temi nižje kakovosti besedilom uredniki (za Unix) pico, gedit in Joe in (za Microsoft) beležko in besedo. d. Morda ste seznanjeni z integrirano razvojno okolje (IDE), kot so Eclipse, Code Warrior ali. NET. Ta okolja na splošno urejevalnikov, ki so integrirane z razhroščevalniki in prevajalniki. Če uporabljate to IDE, je smiselno uporabljati s tem povezane urejevalnikov besedil.

2. gdb je razhroščevalnik, ki razume vaše spremenljivke in programsko strukturo.

a. Tu lahko najdete dokumentacijo tukaj. b. Če želite uporabiti gdb učinkovito, morate opraviti, g zastavo, C ali C + + prevajalnik. c. Če je vaš program myProgram ne pusti datoteko, imenovano jedro, nato poskusite gdb myProgram jedro. d. Prav tako lahko vodijo svoj program od začetka pod nadzorom gdb: gdb myProgram. e. Vsi ukazi za gdb lahko okrajšano z edinstveno predpono. f. Pomoč ukaz je zelo koristno. g. Kjer je ukaz prikazuje klicno sveženj, vključno s številkami vrstic, ki kažejo, kjer je vsak rutinsko. To je prva zapoved, morate poskusiti, če ste debug osnovni datoteko. h. Če želite natisniti vrednosti nekaterih izražanja (lahko tudi vaše spremenljivke in običajne za C), tip tiskanja izraz, kot je v

print (myInt + 59) & 0444;

i. Če si želite ogledati svoj program, poskusite seznam myFunction oziroma seznama myfile.c: 38. j. Če želite določiti drugačno evidenco aktivacijsko kot sedanja, uporabite gor (za mlajše) ali navzdol (manj opravljena) ukaz. k. Lahko nastavite prekinitveno točko na vsako vrstico vsake datoteke. Na primer, lahko rečete prekinil foo.p: 38 nastavite prekinitveno točko na liniji 38 v datoteki foo.p. Vsakič, ko vaš program, da zadane linije, medtem ko izvaja, se bo ustavil in gdb vas bo prosil za ukaze. Si lahko ogledate na spremenljivke, na primer, ali korak naprej v okviru programa. l. Naslednji ukaz korakov naprej za eno izjavo (kliče in se vračajo iz vseh postopkih, če je to potrebno). m. Korak Ukaz korake naprej za eno izjavo, če pa je izjava vključuje klica procedure, vstopi v postopek in se ustavi pri prvem izjave tam. n. Če vnesete ukaz set nadaljnje vilice-mode otroka, potem, ko bo program izvaja vilice () klic, bo gdb še debug otroka in ne staršev. o. Pustite gdb z vnosom Quit ukaz. p. Morda boste raje uporabil DDD grafičnim vmesnikom za gdb.

3. Seveda bi prevajalnik gcc programov ali g+ +-Wall zastave obrniti na visoki ravni opozoril. Podobno bi se javac-Xlint: vse zastave. Ne pa v programu, ki ustvarja nobenih prevajanju čas opozorila. 4. Si lahko preberete navodila za uporabo, da bi dobili podatke o programih, C knjižnica rutine in Unix sistem klicev z uporabo programa človek, kot človek ali človek printf gcc.

a. Včasih je funkcija želite nahaja v posebnem poglavju priročnika Unix in ga je treba izrecno zahteva, da človek: 2 odprto ali man 3 printf. Oddelek 1 zajema programe, področje 2 zajema sistemske klice in področje 3 zajema knjižnico C in oddelek 8 zajema upravljanje sistema. Vi verjetno ne potrebujete druge odseke. b. Tu lahko najdete, če kateri koli program, C knjižnico rutina, ali pokličite Unix sistem, je pomembno, da neki predmet, ki ga uporablja-K zastavo, kot človek-k tisku.

5. Izvedi program organizirajo recepte za prevajanjem in relinking svoj program, ko spremenite izvorno datoteko.

a. Oglejte si ta tutorial ali ta navodila za podrobnosti. b. Če je vaš program sestavljen iz več datotek, jih lahko zbere ločeno in jih nato povezati. Prevedete z zastave-C in uporabite zastavico-o navesti izhodno datoteko.Razumen makefile lahko videti takole:

SOURCES = driver.c input.c output.c OBJECTS = driver.o input.o output.o HEADERS = common.h CFLAGS = -g -Wall program: $(OBJECTS) $(CC) $(CFLAGS) $(OBJECTS) -o program $(OBJECTS): $(HEADERS) testRun: program program < testData

Ta makefile uporablja vgrajeni v opredelitvi CC in vgrajeno pravila za pretvorbo C izvorne datoteke, kot driver.c v svojo datoteko objekta. Če spremenite samo input.c, nato testRun bo povzročilo prevajalnik za obnovo input.o, nato povzroči prevajalnik relink predmete, ki ustvarja program in nato zaženite program s standardnega vhoda preusmerjeno iz spisa testData. c. Če imate veliko datotek izvorne datoteke in veliko glavo, boste morda želeli uporabiti makedepend program za samodejno izgradnjo Makefile pravila, ki določajo, kako se izvorne datoteke odvisni od glave datotek.Zgornji primer predpostavlja, da vse izvorne datoteke odvisna od vseh header datotek, ki pogosto ni tako.

6. Program grep lahko hitro poiščete definicije ali spremenljivo, zlasti vključujejo datoteke:
grep "struct timeval {" /usr/include/*/*.h
Vaje Ali te vaje v C.
  1. Napišite program, imenovan atoi, ki se odpre podatkovno zbirko z imenom v ukazni vrstici in bere iz njega eno vhodno linijo, ki naj vsebuje celo število zastopane v znakih.Program pretvarja, da je niz v celo število pomnoži s celo število 3, in natisne rezultat na standardni izhod.Program ne sme uporabljati atoi () funkcijo. Morate uporabiti make program. Your Makefile morala imeti tri pravila: atoi, tek (ki vodi svoj program na vaših standardnih testnih podatkov in preusmeri izhod v novo datoteko) in čisti (ki odstrani začasne datoteke). Poskrbite, da vaš program deluje pravilno na slabih podatkov in izhodih z koristen sporočilo, če podatki datoteka manjka ali je nečitljiv. Stopite skozi svoj program tako, da se začne z gdb, dajanje odmerka na main (), in z uporabo ukaza korak večkrat.
  2. Poišči stran priročnika za mačke programa. Zakonika svojo različico mačk. Vaša različica mora sprejeti več (ali ne) datotek imena parametrov. To ni potrebno sprejeti nobenih izbirnih parametrov.
  3. Napišite program, ki bo removeSuffix en parameter: ime s pripono datoteke.Končnica datoteke je ena vrstica na začetku.Vnos ni prazen niz, ki smo ga poimenovali s pripono, ki ji sledijo> znaka, ki mu sledi drugi (morda prazen) niz, ki mu pravimo zamenjavo. Vaš program mora hraniti vse pripone in njihovih zamenjav v hash tabelo. Uporaba zunanjega veriženje. Vaš program mora potem beremo s standardnega vhoda. Za vsak prostor razmejeni w beseda v prispevku, je bil najdaljši S končnico, ki se pojavi v w in spreminjanje w po odstranitvi s in vstavljanje S je nadomestilo, ki ustvarja w ". Izhod ena vrstica na spremenjene besede, v obliki w> w ". Ne oddaja nobene besede, ki se ni spremenil.
  Prevedeno iz http://www.cs.uky.edu/~raphael/programming.html#C_globals Domača stran
...