Probleme şi alte dureri de cap

De la Wiki.lug.ro
Versiunea din 24 februarie 2006 16:31, autor: Lc (Discuție | contribuții)

Salt la: navigare, căutare

Job interview, not again!!! Stai cu patru inşi în jurul unei mese. Întrebările abundă, tir încrucişat. La un moment dat unul începe să se scuze amarnic: "Ştim ca aveţi experienţă grămadă în C/C++, totuşi noi avem o mică problemă pentru dumneavoastră." Cu cât scuzele sunt mai elaborate, cu atât balamucul ce urmează este mai mare. Soluţii/comentarii pe pagina de discuţii.


P1

Se dă o listă simplu-înlănţuită. Să se scrie o funcţie sau un bloc de cod care să parcurgă lista în ambele direcţii. Începe de la primul element, se duce până la sfârşitul listei, iar apoi vine înapoi la primul element.


P2

Următoarea problemă apare în tot felul de forme şi variante. Un programator începător are o ocazie unică de a-şi etala cunoştinţele, în timp ce un programator experimentat are o ocazie unică de a o da în bară:

Să se definească structura unei liste simplu-înlănţuite de întregi şi să se implementeze o funcţie care returnează void şi primeşte ca parametrii un pointer la primul element al listei şi un întreg. Se presupune că lista a fost ordonată crescător în prealabil. Funcţia va introduce întregul în listă la locul lui, păstrând ordonarea crescătoare a elementelor listei.


P3

Scurt şi la obiect: ce este un destructor virtual şi la ce se foloseşte.


P4

Doi programatori învaţă C/C++. După lupte îndelungate au ajuns la celebrul "Hello, world!". Primul programator începe cu un tablou:

int main() {
	char ptr[50] = "Hellow world!\n";

în timp ce al doilea preferă un pointer:

	char *ptr = "Hellow world!\n";

Apoi, indivizii se prind că au probleme de spelling şi încearcă să le corecteze:

	ptr[5] = ',';

Urmează printf-ul şi un simplu exit:

	printf(ptr);
	return 0;
}

Întrebare: care este diferenţa dintre un pointer şi un tablou?

Notă: echipa de intervievare este umilită în mod regulat de câte un candidat care are o înţelegere mai profundă a standardele C/C++. Procesul de contrazicere este parte componentă a interviului, şi va fi urmărit cu deosebită atenţie!


P5

Se dă următoarea declaraţie:

	int (*a)[15];

Ce este variabila a, care este sizeof(a), ce face a++.

Follow up: aceleaşi întrebări despre:

	int (*(*b)[15])(char *);


P6

Se dă un dispozitiv de 16 biţi mapat în memorie pe 32 de biţi (fiecare registru de 16 biţi al dispozitivului este mapat în memorie într-un uint32). Regiştrii pornesc în memorie de la adresa:

#define BASE_ADDR 0xf3000000

Să se scrie o funcţie sau un bloc de cod care toggle valoarea bitului 5 în registrul 7 (dacă avea valoarea 1 o modificăm în 0 şi invers). Follow up: modificaţi codul pentru a face două toggle succesive.


P7

Se dă un dispozitiv mapat în memorie precum cel de la P6. Avem apoi două funcţii care încearcă ambele să scrie în acelaşi registru (de exemplu registrul 7). Prima funcţie este chemată de program în mod periodic şi modifică bitul 0 al registrului. A doua funcţie este un handler al unei întreruperi asincrone şi modifică bitul 5. Există vreo problemă cu acest aranjament, şi dacă da cum s-ar putea rezolva.