This shows you the differences between two versions of the page.
ii:lab:laborator4 [2016/12/08 00:49] iulian_gabriel.radu [Comenzi de bază GDB] |
ii:lab:laborator4 [2016/12/08 10:03] (current) iulian_gabriel.radu [Exerciții și aplicații] |
||
---|---|---|---|
Line 7: | Line 7: | ||
GDB este folosit în principal pentru a depana programe scrise în C sau C++. Acesta poate fi folosit în două moduri pentru a depana un program: | GDB este folosit în principal pentru a depana programe scrise în C sau C++. Acesta poate fi folosit în două moduri pentru a depana un program: | ||
- | - rulându-l folosind comanda gdb | + | * rulându-l folosind comanda gdb |
- | - folosind fişierul core generat în urma unei erori grave (de obicei segmentation fault) | + | * folosind fişierul core generat în urma unei erori grave (de obicei segmentation fault) |
În acest laborator vom analiza doar prima modalitate de depanare. | În acest laborator vom analiza doar prima modalitate de depanare. | ||
Line 121: | Line 121: | ||
</code> | </code> | ||
- | * print - cu ajutorul acesteia se pot afişa valorile variabilelor din funcţia curentă sau a variabilelor globale. print poate primi ca argument şi expresii complicate (dereferenţieri de pointeri, referenţieri ale variabilelor, expresii aritmetice, aproape orice expresie C validă). În plus, print poate afişa structuri de date precum struct şi union sau evalua funcţii şi întoarcerea rezultatului lor. | + | * **print** - cu ajutorul acesteia se pot afişa valorile variabilelor din funcţia curentă sau a variabilelor globale. print poate primi ca argument şi expresii complicate (dereferenţieri de pointeri, referenţieri ale variabilelor, expresii aritmetice, aproape orice expresie C validă). În plus, print poate afişa structuri de date precum struct şi union sau evalua funcţii şi întoarcerea rezultatului lor. |
- | * list - afișează o parte din fișierul sursă al programulu debanat. | + | * **list** - afișează o parte din fișierul sursă al programulu debanat. |
- | * backtrace - afișează un backtrace. Un backtrace afișează, în ordine inversă, funcțiile ce au fost apelate pentru a se ajunge la linia curentă. | + | * **backtrace** - afișează un backtrace. Un backtrace afișează, în ordine inversă, funcțiile ce au fost apelate pentru a se ajunge la linia curentă. |
===== Exerciții și aplicații ===== | ===== Exerciții și aplicații ===== | ||
- | - Folosiți gdb pentru a depana următorul program C: <code c divide.c> | + | - <code c divide.c> |
#include <stdio.h> | #include <stdio.h> | ||
Line 150: | Line 150: | ||
return 0; | return 0; | ||
}</code> | }</code> | ||
- | - TODO | + | |
+ | - <code c quick.c> | ||
+ | #include <stdio.h> | ||
+ | #include <stdbool.h> | ||
+ | #define MAX 7 | ||
+ | |||
+ | #define MAGIC 100000 | ||
+ | int intArray[MAX] = {4,6,3,2,1,9,7}; | ||
+ | |||
+ | void printline(int count) { | ||
+ | int i; | ||
+ | |||
+ | for(i = 0;i <count-1;i++) { | ||
+ | printf("="); | ||
+ | } | ||
+ | |||
+ | printf("=\n"); | ||
+ | } | ||
+ | |||
+ | void display() { | ||
+ | int i; | ||
+ | printf("["); | ||
+ | |||
+ | // navigate through all items | ||
+ | for(i = 0;i<MAX;i++) { | ||
+ | printf("%d ",intArray[i]); | ||
+ | } | ||
+ | |||
+ | printf("]\n"); | ||
+ | } | ||
+ | |||
+ | void swap(int num1, int num2) { | ||
+ | int temp = intArray[num1]; | ||
+ | intArray[num1+MAGIC] = intArray[num2]; | ||
+ | intArray[num2] = temp; | ||
+ | } | ||
+ | |||
+ | int partition(int left, int right, int pivot) { | ||
+ | int leftPointer = left -1; | ||
+ | int rightPointer = right; | ||
+ | |||
+ | while(true) { | ||
+ | while(intArray[++leftPointer] < pivot) { | ||
+ | //do nothing | ||
+ | } | ||
+ | |||
+ | while(rightPointer > 0 && intArray[--rightPointer] > pivot) { | ||
+ | //do nothing | ||
+ | } | ||
+ | |||
+ | if(leftPointer >= rightPointer) { | ||
+ | break; | ||
+ | } else { | ||
+ | printf(" item swapped :%d,%d\n", intArray[leftPointer],intArray[rightPointer]); | ||
+ | swap(leftPointer,rightPointer); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | printf(" pivot swapped :%d,%d\n", intArray[leftPointer],intArray[right]); | ||
+ | swap(leftPointer,right); | ||
+ | printf("Updated Array: "); | ||
+ | display(); | ||
+ | return leftPointer; | ||
+ | } | ||
+ | |||
+ | void quickSort(int left, int right) { | ||
+ | if(right-left <= 0) { | ||
+ | return; | ||
+ | } else { | ||
+ | int pivot = intArray[right]; | ||
+ | int partitionPoint = partition(left, right, pivot); | ||
+ | quickSort(left,partitionPoint-1); | ||
+ | quickSort(partitionPoint+1,right); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int main() { | ||
+ | printf("Input Array: "); | ||
+ | display(); | ||
+ | printline(50); | ||
+ | quickSort(0,MAX-1); | ||
+ | printf("Output Array: "); | ||
+ | display(); | ||
+ | printline(50); | ||
+ | }</code> | ||