Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
public:memdebug1 [2015/02/05 23:53]
Jiří Weiser odstraněno
public:memdebug1 [2018/02/24 19:10] (aktuální)
Řádek 1: Řádek 1:
-====== Ladění nefunkčního programu - zásobník ====== +<code c stack.c>
- +
-Níže uvedený program implementuje často používanou strukturu [[http://​simple.wikipedia.org/​wiki/​Stack_%28data_structure%29 | Zásobník]] (LIFO). Přestože jej lze zkompilovat,​ tak tento program obsahuje celou řadu záměrně vložených chyb. Vašim úkolem je jeho oprava tak, aby: +
-  - nepadal se SIGSEGV (nekorektní zápis do paměti) +
-  - korektně implementoval strukturu Zásobník +
-  - vypisoval všechny vložené položky +
-  - neměl žádné memory leaks  +
- +
-Tento nekorektní program vznikl drobnými úpravami korektního kódu. Program tedy celý nepřepisujte,​ pouze se snažte nalézt chyby a opravte je. Není nutné přidávat žádné dodatečné funkce, pouze upravujte existující. K řešení využijte debugger, dodatečné ladící výstupy a tužku a papír. +
- +
-Očekávaný výstup programu je (pozor, konkrétní čísla jsou generována pomocí rand, mohou se tedy lišit): +
- +
-     ​Pushing elements to stack: +
-     - element 41 +
-     - element 18467 +
-     - element 6334 +
-     - element 26500 +
-     - element 19169 +
-     - element 15724 +
-     - element 11478 +
-     - element 29358 +
-     - element 26962 +
-     - element 24464 +
-     +
-    Dumping elements: +
-     ​24464 +
-     ​26962 +
-     ​29358 +
-     ​11478 +
-     ​15724 +
-     ​19169 +
-     ​26500 +
-     ​6334 +
-     ​18467 +
-     41 +
-     +
-     +
-    Poping elements from stack: +
-     - element 24464 +
-     - element 26962 +
-     - element 29358 +
-     - element 11478 +
-     - element 15724 +
-     - element 19169 +
-     - element 26500 +
-     - element 6334 +
-     - element 18467 +
-     - element 41 +
- +
-<code c stack_problems1.c> +
-/** @file stack_problems.cpp +
-*/ +
 #include <​stdio.h>​ #include <​stdio.h>​
 #include <​stdlib.h>​ #include <​stdlib.h>​
 +#include <​string.h>​
  
-/** Basic structure representing single node in stack. +typedef struct ​t_item
-+   char *value; 
-*/ +   ​struct ​t_item ​*next
-typedef struct ​_node +}t_item;
-    int data;                   /**< data variable storing node value */ +
-    struct ​_nodenextBelow   /​**<​ pointer to next node in stack */ +
-node;+
  
-/** Initialize single node structure. +int push(t_itemstack,​char ​*value); 
-  @param pTargetNode ​  ​pointer to node structure to be initialized +charpop(t_itemstack); 
-  @return nothing +void list(t_item* stack);
-*/ +
-void init(node targetNode)+
-    targetNode.data = 0; +
-    targetNode.nextBelow = NULL; +
-}+
  
-/** Insert new node structure with given data and connect it to given existing given node. +int main() 
-  New node structure is dynamically allocated. Existing given node pTargetNode below newly created node and pointer to newly created node +
-    is returned ​(new head of the stack). +  char *text; 
-*   ​@param pOldHeadNode ​    ​ pointer to existing node structurecurrent top of the stack +  ​t_item ​*stack; 
-*   ​@param data data value to be set into new node structure +  text = calloc(250,​sizeof(char)); 
-*   ​@return pointer to newly created node structure ​(will be used as new head of the stack+  text = fgets(text,250,stdin); 
-*/ +  while(strlen(text)>​1
-node* push(node* pOldHeadNodeint data{ +  { 
-    ​node* tmp = (node*)malloc(sizeof(node)); +    push(stack,text); 
-    ​if(tmp == NULL) { +    ​text calloc(250,sizeof(char)); 
-        // no memory available +    ​fgets(text,​250,​stdin); 
-        exit(0); +  }
-    }+
  
-    init(*tmp); +  list(stack); 
-    ​tmp->​data ​data+  char *c; 
-    return ​tmp;+  while((c=pop(stack))!=0) 
 +  { 
 +     ​puts(c)
 +  } 
 +  ​return ​0;
 } }
  
-/** Remove one node structure from stack, ​return its value and repair internal connections inside stack. +int push(t_item* stack,char *value) 
-*   ​Removed node structure is deallocated from memory. +{ 
-*   ​@param pTargetNode pointer to existing node structure that will be removed (stack head+  ​t_itemitem = malloc(sizeof(t_item)); 
-*   ​@param pElement pointer to variable that will store data content of target node +  if(item==NULL)return 0; 
-  @return pointer to next node structure after (belowremoved node +  ​item->​value=value
-*/ +  item->next = stack
-node* pop(node *pTargetNode,​ int *pElement{ +  stack=item
-    node* tmp pTargetNode+  return ​1;
-    ​*pElement = pTargetNode->data+
-    ​pTargetNode ​pTargetNode->​nextBelow+
-    return ​pTargetNode;+
 } }
- +charpop(t_item* stack)
-/** Print content of the stack+
-*   ​@param pTargetNode pointer to existing node structure from which stack content will be printed. +
-*   ​@return nothing +
-*/ +
-void list(node *pTargetNode)+
 { {
-    printf("​\nDumping elements: \n")+   char* value
-    while(pTargetNode->​nextBelow) { +   if(stack != NULL) 
-        ​printf("​ %i\n",​pTargetNode->data)+   
-        ​pTargetNode ​pTargetNode->nextBelow+      value = stack->value
-    }+      ​stack ​stack->next
 +   ​} 
 +   ​return value;
 } }
  
-/** Test if given node structure is empty (allocatedor not. +void list(t_itemstack
-*   ​@param pTargetNode pointer to existing node structure that will be tested +{ 
-*   @return 1 if node is empty (not allocated), 0 otherwise +   t_item ​*actual = stack; 
-*/ + 
-int is_empty(node* pTargetNode{ +   ​while(actual!=NULL
-    ​return (pTargetNode =NULL) ? 1 : 0;+   { 
 +      puts(actual->​value); 
 +      ​actual ​actual->​next; 
 +   }
 } }
  
- 
-/** Entry point for stack structure demostration function. 
-*   ​@return nothing 
-*/ 
-const int STACK_SIZE = 10; 
-int main() { 
-    node* head = NULL; 
-    int i = 0; 
-    int element = 0; 
- 
-    list(head); 
- 
-    printf("​Pushing elements to stack:​\n"​);​ 
-    for (i=0; i < STACK_SIZE; i++) { 
-         ​element = rand(); 
-         ​printf("​ - element %d\n", element); 
-         head = push(head,​element);​ 
-    } 
- 
-    list(head); 
-    printf("​\n\nPoping elements from stack:​\n"​);​ 
- 
-    while(!is_empty(head)) { 
-        head = pop(head, &​element);​ 
-        printf("​ - element %d\n", element); 
-    } 
- 
- 
-    return 0; 
-} 
 </​code>​ </​code>​
- 
- 
- 
- 
QR Code
QR Code public:memdebug1 (generated for current page)