Salut J'ai écrit un code basé sur une exigence.Code C - besoin de clarifier l'efficacité
(field1_6) (field2_30) (field3_16) (field4_16) (field5_1) (field6_6) (field7_2) (field8_1) ..... ceci est une benne (8 champs) de données. nous recevrons 20 seaux à la fois signifie totalement 160 champs. J'ai besoin de prendre les valeurs de field3, field7 & fields8 en fonction d'une condition prédéfinie. Si l'argument d'entrée est N alors prenez les trois champs du 1er seau et s'il est Y j'ai besoin de pour prendre les trois champs de tout autre seau autre que le premier. si argumnet est Y alors j'ai besoin de balayer tous les 20 seaux l'un après l'autre et de vérifier le premier champ du seau n'est pas égal à 0 et si elle est vraie puis récupérer les trois champs de ce seau et quitter. J'ai écrit le code et son fonctionne aussi bien ..mais pas si confiant que c'est effctive. J'ai peur d'un accident un peu de temps. S'il vous plaît suggérer ci-dessous est le code.
int CMI9_auxc_parse_balance_info(char *i_balance_info,char *i_use_balance_ind,char *o_balance,char *o_balance_change,char *o_balance_sign
)
{
char *pch = NULL;
char *balance_id[MAX_BUCKETS] = {NULL};
char balance_info[BALANCE_INFO_FIELD_MAX_LENTH] = {0};
char *str[160] = {NULL};
int i=0,j=0,b_id=0,b_ind=0,bc_ind=0,bs_ind=0,rc;
int total_bukets ;
memset(balance_info,' ',BALANCE_INFO_FIELD_MAX_LENTH);
memcpy(balance_info,i_balance_info,BALANCE_INFO_FIELD_MAX_LENTH);
//balance_info[BALANCE_INFO_FIELD_MAX_LENTH]='\0';
pch = strtok (balance_info,"*");
while (pch != NULL && i < 160)
{
str[i]=(char*)malloc(strlen(pch) + 1);
strcpy(str[i],pch);
pch = strtok (NULL, "*");
i++;
}
total_bukets = i/8 ;
for (j=0;str[b_id]!=NULL,j<total_bukets;j++)
{
balance_id[j]=str[b_id];
b_id=b_id+8;
}
if (!memcmp(i_use_balance_ind,"Y",1))
{
if (atoi(balance_id[0])==1)
{
memcpy(o_balance,str[2],16);
memcpy(o_balance_change,str[3],16);
memcpy(o_balance_sign,str[7],1);
for(i=0;i<160;i++)
free(str[i]);
return 1;
}
else
{
for(i=0;i<160;i++)
free(str[i]);
return 0;
}
}
else if (!memcmp(i_use_balance_ind,"N",1))
{
for (j=1;balance_id[j]!=NULL,j<MAX_BUCKETS;j++)
{
b_ind=(j*8)+2;
bc_ind=(j*8)+3;
bs_ind=(j*8)+7;
if (atoi(balance_id[j])!=1 && atoi(str[bc_ind])!=0)
{
memcpy(o_balance,str[b_ind],16);
memcpy(o_balance_change,str[bc_ind],16);
memcpy(o_balance_sign,str[bs_ind],1);
for(i=0;i<160;i++)
free(str[i]);
return 1;
}
}
for(i=0;i<160;i++)
free(str[i]);
return 0;
}
for(i=0;i<160;i++)
free(str[i]);
return 0;
}
@ DGNA, la première chose est que j'ai une confirmation que je ne pourrai jamais recevoir moins de 8 champs ina simple seau. la seule chose est ther peut être acse où je ne peux pas recevoir 20 seaux quelques fois. Deuxièmement info balnace ne sera jamais nulle. depuis que je le passe d'une autre fonction après avoir vérifié son non – Vijay
La nature du code est qu'il est réutilisé dans nouveaux contextes, et sous de nouvelles hypothèses. Le codage défensif vous protège des changements (et des bugs) dans la chose qui vous appelle. Si vous êtes concerné par les frais généraux de performance, alors utilisez ASSERT(), il peut être utilisé pendant le développement et compilé pour la production – djna