Bonjour,
j'aimerai savoir la signification de la syntaxe suivante :
le 2e cas en fait, tous ces symboles ?? 8-)Citation:
= (ulTmp < 0x80000000UL) ? ulTmp : (-(~((long) ulTmp)) -1);
merci ;)
Version imprimable
Bonjour,
j'aimerai savoir la signification de la syntaxe suivante :
le 2e cas en fait, tous ces symboles ?? 8-)Citation:
= (ulTmp < 0x80000000UL) ? ulTmp : (-(~((long) ulTmp)) -1);
merci ;)
En fait pour moi, ce code à l'air de prendre le complément du complément (ce qui a l'air d'être le nombre lui-même, en fait). Mais le calcul a peut-être bien un effet de bord sur le bit de poids fort.Code:
1
2
3
4
5
6
7
8
9
10
11 if(ulTmp < 0x80000000UL) { //ne rien changer } else { long lTmp = static_cast< long >(ulTmp);//Cast de unsigned à signed long notTmp = ~lTmp; //complément long negTmp = -notTmp; //négatif (complément à 2) ulTmp = negTmp - 1; //Annulation du +1 dû au complément à 2 }
Peut-être est-ce une extension de signe si tu as des long de 64 bits...
bah justement la 1ere fois que je fais ce calcul ca passe , et la 2e fois ca plante à cette ligne !
En quoi ça "plante" ??
Et quelles sont les lignes précédente et suivante?
ulTmp est bien une variable locale ?
quand i=0 ca passe, quand on passe à i=1 ca ne passe plus, même en essayant avec une autre variable (ulTmp2)Citation:
unsigned long ulTmp;
unsigned long ulTmp2;
long posChamp=0;
int temp1 = 0;
int temp2 = 0;
int temp3 = 0;
int temp4 = 0;
InfosFichier* psFichier = NULL;
unsigned short usCr = OK;
MC_TraceEcrire(TR_COM_COM,TR_MOD_TAB,TR_TYP_DEB, "usGTInitTabChp");
/* Allocation mémoire. */
if (usResultat == 0) {
g_stTabChp = (t_TabChp *) MC_Allouer(ulNombre * sizeof(t_TabChp));
if (g_stTabChp == NULL) usResultat = ERR_ALLOCATION_MEMOIRE;
else g_ulNbTabChp = ulNombre;
}
MC_TraceEcrire(TR_COM_COM,TR_MOD_TAB,TR_TYP_ECR, "g_stTabChp = %p, g_ulNbTabChp = %hu", g_stTabChp, g_ulNbTabChp);
/* Initialisation du contenu. */
for (i = 0; i < ulNombre && usResultat == 0; i++) {
usResultat |= MC_usLireSignedLong (usNumFichierTable, &g_stTabChp[i].bObligatoire); // suppression : usResultat |= MC_usLireSignedLong (usNumFichierTable, &g_stTabChp[i].bObligatoire); pour modification
usResultat |= MC_usLireUnsignedShort (usNumFichierTable, &g_stTabChp[i].usLgMin);
usResultat |= MC_usLireUnsignedShort (usNumFichierTable, &g_stTabChp[i].usLgMax);
usResultat |= MC_usLireSignedChar (usNumFichierTable, &g_stTabChp[i].cTypeChamp);
/* On se positionne sur le bon fichier */
posChamp=0;
temp1 = 0;
temp2 = 0;
temp3 = 0;
temp4 = 0;
psFichier = NULL;
usCr = usRechercherFichier(usNumFichierTable,&psFichier);
/* Enregistrement de la position du champs dans le fichier */
if ( (posChamp=ftell(psFichier->pFichier)) <0)
usCr = ERR_FICHIER_STRUCTURE;
if (usCr == OK) {
temp1 = fgetc(psFichier->pFichier);
temp2 = fgetc(psFichier->pFichier);
temp3 = fgetc(psFichier->pFichier);
temp4 = fgetc(psFichier->pFichier);
if (temp1==EOF || temp2==EOF || temp3==EOF || temp4==EOF)
usCr = ERR_FICHIER_STRUCTURE;
if (usCr == OK) {
//int reservation_pulValeur = MultiByteToWideChar (CP_ACP, 0, buf, -1, NULL, 0) ;
//LPWSTR pulValeur_unicode = new WCHAR[reservation_pulValeur];
//MultiByteToWideChar (CP_ACP, 0, buf, -1, pulValeur_unicode, reservation_pulValeur) ;
//MessageBox (NULL, pulValeur_unicode, TEXT("iPaqDev"), MB_OK);
MessageBox (NULL, TEXT("debutPul"), TEXT("iPaqDev"), MB_OK);
if (i==1)
{
ulTmp2 = (((unsigned short)temp1)<<24) +
(((unsigned short)temp2)<<16) +
(((unsigned short)temp3)<<8) +
(unsigned short)temp4;
}else
{
ulTmp = (((unsigned short)temp1)<<24) +
(((unsigned short)temp2)<<16) +
(((unsigned short)temp3)<<8) +
(unsigned short)temp4;
}
MessageBox (NULL, TEXT("finPul"), TEXT("iPaqDev"), MB_OK);
}
}
//TODO : usCr = MC_usLireUnsignedLong(usNumFichierBinaire,&ulTmp);
if (usCr == OK) {
MessageBox (NULL, TEXT("POUET 1"), TEXT("iPaqDev"), MB_OK);
if (i!=1)
{
g_stTabChp[i].bOccurence = (ulTmp < 0x80000000UL) ? ulTmp : (-(~((long) ulTmp)) -1);
}
else
{
g_stTabChp[i].bOccurence = (ulTmp2 < 0x80000000UL) ? ulTmp2 : (-(~((long) ulTmp2)) -1);
}
MessageBox (NULL, TEXT("POUET 2"), TEXT("iPaqDev"), MB_OK);
}
free(psFichier);
}
À tous les coups, le problème n'est pas à droite du =, mais à sa gauche:
g_stTabChp[i] doit représenter une adresse invalide.
j'ai trouvé merci ;)