Browse Source

:bug: Retrait pointeur subdiv

Loquicom 6 years ago
parent
commit
b9285d5e01
2 changed files with 54 additions and 19 deletions
  1. 52 17
      subdiv.c
  2. 2 2
      subdiv.h

+ 52 - 17
subdiv.c

@@ -96,16 +96,16 @@ boolean div_node(subdiv* sd, node* n) {
     newn->end = n->end;
     newn->length = n->length / 2;
     newn->type = MEMEMPTY;
-    newn->prev = n;
+    newn->prev = n->index;
     newn->next = n->next;
     //Modifie node suivant la nouvelle
-    if (n->next != NULL) {
-        n->next->prev = newn;
+    if (n->next != -1) {
+        sd->mem[n->next].prev = newn->index;
     }
     //Modifie node origine
     n->end = n->start + (n->length / 2);
     n->length /= 2;
-    n->next = newn;
+    n->next = newn->index;
     //Indique que la node est utilisé
     sd->use[i] = true;
     return true;
@@ -113,10 +113,10 @@ boolean div_node(subdiv* sd, node* n) {
 
 boolean fusion_node(subdiv* sd, node* n) {
     //Verif que la node et la node suivante sont vide
-    if (!(n->type == MEMEMPTY && n->next != NULL && n->next->type == MEMEMPTY)) {
+    if (!(n->type == MEMEMPTY && n->next != -1 && sd->mem[n->next].type == MEMEMPTY)) {
         return false;
     }
-    node* n2 = n->next;
+    node* n2 = &sd->mem[n->next];
     //Verif qu'elles ont la meme taille
     if (n->length != n2->length) {
         return false;
@@ -125,8 +125,8 @@ boolean fusion_node(subdiv* sd, node* n) {
     n->end = n2->end;
     n->length *= 2;
     n->next = n2->next;
-    if (n2->next != NULL) {
-        n2->next->prev = n;
+    if (n2->next != -1) {
+        sd->mem[n2->next].prev = n->index;
     }
     //Indique que l'autre node n'est plus utilisée
     sd->use[n2->index] = false;
@@ -136,7 +136,7 @@ boolean fusion_node(subdiv* sd, node* n) {
 /* --- Fonctions publiques --- */
 
 void ini_subdiv(subdiv* sd) {
-    sd->mem[0] = (node){0, 0, MEM_SIZE, MEM_SIZE, MEMEMPTY, NULL, NULL};
+    sd->mem[0] = (node){0, 0, MEM_SIZE, MEM_SIZE, MEMEMPTY, -1, -1};
     sd->use[0] = true;
     for (int i = 1; i < MEM_SIZE / 2; i++) {
         sd->use[i] = false;
@@ -152,7 +152,12 @@ boolean add_data_subdiv(subdiv* sd, char* mem, char* key, char* data) {
         if (n->type == MEMEMPTY && n->length >= length) {
             break;
         }
-        n = n->next;
+        //Charge le prochain noeud
+        if(n->next == -1){
+            n = NULL;
+        } else {
+            n = &sd->mem[n->next];
+        }
     }
     //Si plus de place
     if (n == NULL) {
@@ -191,7 +196,12 @@ boolean add_fdata_subdiv(subdiv* sd, char* mem, char* data) {
         if (n->type == MEMEMPTY && n->length >= length) {
             break;
         }
-        n = n->next;
+        //Charge le prochain noeud
+        if(n->next == -1){
+            n = NULL;
+        } else {
+            n = &sd->mem[n->next];
+        }
     }
     //Si plus de place
     if (n == NULL) {
@@ -242,16 +252,31 @@ boolean remove_data_subdiv(subdiv* sd, char* mem, char* key) {
             if (fusion_node(sd, n)) {
                 n = &sd->mem[0];
             } else {
-                n = n->next;
+                //Charge le prochain noeud
+                if(n->next == -1){
+                    n = NULL;
+                } else {
+                    n = &sd->mem[n->next];
+                }
             }
-        } else if (n->prev->length != n->length) {
+        } else if (sd->mem[n->prev].length != n->length) {
             if (fusion_node(sd, n)) {
                 n = &sd->mem[0];
             } else {
-                n = n->next;
+                //Charge le prochain noeud
+                if(n->next == -1){
+                    n = NULL;
+                } else {
+                    n = &sd->mem[n->next];
+                }
             }
         } else {
-            n = n->next;
+            //Charge le prochain noeud
+            if(n->next == -1){
+                n = NULL;
+            } else {
+                n = &sd->mem[n->next];
+            }
         }
     }
     return true;
@@ -261,7 +286,12 @@ void show_subdiv(subdiv* sd) {
     node* n = &sd->mem[0];
     while (n != NULL) {
         printf("Deb : %d, Fin : %d, Length : %d, Real length : %d, Use : %d\n", n->start, n->end, n->length, n->end - n->start, (int) n->type);
-        n = n->next;
+        //Charge le prochain noeud
+        if(n->next == -1){
+            n = NULL;
+        } else {
+            n = &sd->mem[n->next];
+        }
     }
 }
 
@@ -278,7 +308,12 @@ void show_data_subdiv(subdiv* sd, char* mem){
             printf("%s\n", str);
             free(str);
         }
-        n = n->next;
+        //Charge le prochain noeud
+        if(n->next == -1){
+            n = NULL;
+        } else {
+            n = &sd->mem[n->next];
+        }
     }
     //Si vide
     if(vide){

+ 2 - 2
subdiv.h

@@ -16,8 +16,8 @@ struct node{
 	int end; //Pos fin (non incluse)
 	int length; //Taille réellement utilisée
 	unsigned char type;
-	node* prev;
-	node* next;
+	int prev; //Position de noeud d'avant
+	int next; //Position du prochain noeud
 };
 
 typedef struct{