Jak to zrobić? Wystarczy dawać takie zadania egzaminacyjne:
#include<stdlib.h> //1 int *bb, aa[2][3], cc, dd, ee; //2 main(){ //3 long int aa, *hh[2],*cc; //4 for(aa=1;aa<=4;aa++){ //5 M0 long int *dd=&aa; //6 hh[aa%2]=(int*)malloc(3*sizeof(int)); //7 M1 switch(*dd){ //8 case 1: bb=hh[1]; //9 M2 case 2: cc=hh[0]; //10 } //11 } //12 if(1){ //13 char bb=’a’, cc[2]={bb++}; //14 dd=(bb+cc[1])/(*cc); //15 M3 while(0){ //16 static int bb=1, cc, dd; //17 double ff=aa; //18 cc=(int)ff; //19 M4 } //20 } //21 //22 M5 } //23 |
Egzaminujący postarał się zastosować wszystkie możliwe złe praktyki o jakich słyszał. Ciężko będzie się dziwić, jeśli widząc taki kod nowicjusz stwierdzi, że on tu nic nie rozumie i programowanie musi być trudne.
Hehe
Zanim zostanę oskarżony o kłamliwy clickbait, tutaj są obiecane memy:
Mem
Mem
Mem
Czy umieszczanie na końcu linii komentarza z numerem linii to jeszcze zła praktyka? Czy już zwyczajny idiotyzm? 😉
Akurat to może mieć sensowne wytłumaczenie:
1) mogło być dodane aby nie było wątpliwości która linia jest która na kartce,
2) mogło być dodane przez pytającego na forum z tego samego powodu
Chociaż fakt faktem, wystarczyło zaznaczyć linię 22., bo tylko do niej tyczyło się pytanie.
a co wolisz w jednej lini ?
i tak musisz to przeformatować więc ja bym ci dał w jedej lini
bardziej zastabawia przypisywanie do cc który może, ale nie musi być zgdonego rozmiaru by daleko nie szukać na x86_64 sizeof(int)=4, a sizeof(int*)=8 więc pomijawszy implicit casty i to, że kompilator powinien pacnąć w łeb za ten kod to, wasz ziutek powinien dostać karnego ku**sa bo jak zwolnicie cc to będziecie zwalniać likly nie zmapowany adres i SEG FAULT na klatę macie
Po za tym to dobry przykład i nie marudźcie to nie c# gdzie kompilator krzyczy jak jest przysłanianie zmiennych lokalnych. To zadanie ma was nauczyć oczywistej oczywistości formatowanie kodu ma znaczenie, a przysłanianie może komuś uprzykrzyć życie, nie znaczy iż nie należy go używać. To jak z goto które jest najlepszym sposobem by gdzieś iść w C w C++ uwaga na scope i auto variables bo mogą być nie zaincializowane przy nader-śmiałym jump’ie.
Przykład z C – cleanup i if (messed_state) goto cleanup; … cleanup: if(resource1) // clean resource1
jak ktoś widzi
do {
…
if (…) break;
while(0);
to to jednoznazczne z prostszym (które w dodatku może być opisane labelką)
…
if (…) goto somewhere;
somewhere:
….
konceptualnie proponuje w dowolnym języku pilnować zasobów, bo to pic na wodę, że ktoś zrobi to za was. Nie zrobi tego lepiej, ale raczej się nie pomyli i nie zapomni w C++ macie do tego RAII, a w C# macie IDisposable
Resource to nie tylko pamięć, plik, ale i obiekt zdalny (względem waszej aplikacji / wątku – jak np. thread, inny proces, inne urządzenie jak np. GPU, …)
co do aplikacji użytkowych o krótkim etapie życia, lub jednorazowym przebiegu zwalnianie większości zasobów to strata czasu bo system sam wie co zaalokował chyba że teo jakiś bardzo prosty system jak embeded, lub windows 9x