URL: https://linuxfr.org/forums/programmation-c--2/posts/gal%C3%A8re-de-pointeurs-avec-les-garrays Title: Galère de pointeurs avec les GArrays Authors: jve Date: 2007年07月10日T20:36:28+02:00 Tags: Score: 0 Bonjour à tous, J'ai besoin de stocker les paquets que composent une communications dans un programme C. Comme j'ai beaucoup de communications, j'ai commencé par faire un B-Tree dans lequel chaque valeur (associée à une clé) est un GArray qui contient les paquets de la communication. Le soucis, c'est que ça bug... les 2 premiers paquets de chaque com. sont bien enregistrés et repris, mais pour les suivants j'ai des résultats bizarres... voilà mon code : £spaces£ £/spaces£/*!****************************** £spaces£ £/spaces£* * £spaces£ £/spaces£* search the entry * £spaces£ £/spaces£* * £spaces£ £/spaces£* ******************************/ £spaces£ £/spaces£if ( £spaces£ £/spaces£TRUE != g_tree_lookup_extended(Storing_B_Tree, key_one->str, NULL, NULL) £spaces£ £/spaces£&& £spaces£ £/spaces£TRUE != g_tree_lookup_extended(Storing_B_Tree, key_two->str, NULL, NULL) £spaces£ £/spaces£) £spaces£ £/spaces£{ £spaces£ £/spaces£/*! if doesn't exist, create it and init the GArray £spaces£ £/spaces£* as a value for this entry £spaces£ £/spaces£*/ £spaces£ £/spaces£GArray *value; £spaces£ £/spaces£/*! Creates a new GArray as a B-Tree value to store the packets of this connection £spaces£ £/spaces£*/ £spaces£ £/spaces£value = g_array_new(FALSE, FALSE, 1500); £spaces£ £/spaces£g_array_append_val(value, m->payload); £spaces£ £/spaces£/*! add it to the tree, value contain the address of the pointer to the array in the memory £spaces£ £/spaces£*/ £spaces£ £/spaces£g_tree_insert(Storing_B_Tree, key_one->str, value); £spaces£ £/spaces£ £spaces£ £/spaces£g_print("STORING FUNCTION : entry created and packet %s stored in memory\n",key_one->str); £spaces£ £/spaces£} £spaces£ £/spaces£else { £spaces£ £/spaces£/*! the tuple exist in the B-Tree, so add the packet at the end of the £spaces£ £/spaces£* existing GArray table £spaces£ £/spaces£*/ £spaces£ £/spaces£GString *key; £spaces£ £/spaces£key = key_one; £spaces£ £/spaces£GArray *P_to_Array; £spaces£ £/spaces£/*! get @ of the array in memory */ £spaces£ £/spaces£if (TRUE != g_tree_lookup_extended(Storing_B_Tree, key_one->str, NULL, (gpointer *) &P_to_Array)) £spaces£ £/spaces£{ £spaces£ £/spaces£/*! if key_one is not the good key, try with key_two */ £spaces£ £/spaces£g_tree_lookup_extended(Storing_B_Tree, key_two->str, NULL,(gpointer *) &P_to_Array); £spaces£ £/spaces£key = key_two; £spaces£ £/spaces£} £spaces£ £/spaces£ £spaces£ £/spaces£/*! store the value at the end of the GArray table £spaces£ £/spaces£*/ £spaces£ £/spaces£g_array_append_val(P_to_Array, m->payload); £spaces£ £/spaces£ £spaces£ £/spaces£g_print("STORING FUNCTION : %dst packet of %s stored in memory\n",P_to_Array->len, key->str); £spaces£ £/spaces£/*! TEST PURPOSE £spaces£ £/spaces£* £spaces£ £/spaces£* print all the entries from the corresponding array £spaces£ £/spaces£*/ £spaces£ £/spaces£int i; £spaces£ £/spaces£for (i=0; i < P_to_Array->len; i++) £spaces£ £/spaces£{ £spaces£ £/spaces£struct iphdr *iph2; £spaces£ £/spaces£ £spaces£ £/spaces£iph2 = & g_array_index(P_to_Array, struct iphdr *, i); £spaces£ £/spaces£g_print("IP table: %s; length : %u\n",(char *) inet_ntoa(iph2->saddr), ntohs(iph2->tot_len)); £spaces£ £/spaces£} £spaces£ £/spaces£} et voila ce que donne une exécution, les 2 premières IP sont bien reprises mais les suivantes ne sont pas bonnes dans le second paquet, la "length" est également fausse... STORING FUNCTION : 4st packet of 128.8.37.122:56107:130.92.6.40:80 stored in memory IP table: 128.8.37.122; length : 52 IP table: 130.92.6.40; length : 16384 IP table: 219.43.0.80; length : 52160 IP table: 15.53.67.83; length : 9594 Alors j'essaie de comprendre pourquoi je ne récupère pas bien mes paquets.... Il me semble que GArray attribue un nouvel index pour chaque entrée, je ne devrais donc pas dépasser sur les autres index lorsque je récupère mon entrée...