Un IF un peu complexe

tommyaltaïr

Membre confirmé
5 Mars 2008
25
0
Bonjour,
Quelqu'un peut il me dire comment fonctionne le if du code
Merci

Bloc de code:
UInt8 * 			data = (UInt8 *)malloc(kLineSize);//*********** 
UInt32			dataSize = kLineSize;//***************
enum

{
    kJumboScanMethod1 =					0,
    kJumboScanMethod2 =					1,
    kJumboScanPrepareForAcquisition =	        2,
    kJumboScanGetAcquisitionStatus =	        3,
    kJumboScanStopAcquisition =			4,
    kJumboScanOpenStream =				5,
    kJumboScanGetStreamStatus =			6,
    kJumboScanCloseStream =				7,
    kJumboScanGetCardDepth =			        8,
    kJumboScanGetVersion =				9,
    kJumboScanReadMemory =				10,
    kJumboScanWriteMemory =				11,
    kJumboScanMethod4 =					12,
    kJumboScanNumMethods
};

               if( (dataSize == sizeof(UInt32)) && (*((UInt32 *) data) == kStopListeningMessage) )
 
D'abord je pense que c'est du C.
Bloc de code:
if( (dataSize == sizeof(UInt32)) && (*((UInt32 *) data) == kStopListeningMessage) )

On voit qu'il est composé de deux parties
- "(dataSize == sizeof(UInt32))" => Renvoie vrai ou faux selon que le variable dataSize (qui est de type UInt32 et qui vaut kLineSize) est strictement égal au nombre d'octets qu'est composé le type UInt32. "sizeof" est un mot clé du C, c'en n'est pas une fonction !. ;)

- oula, ça se complique ! "(*((UInt32 *) data) == kStopListeningMessage)".
- "(UInt32 *) data" signifie caster (transformer) la variable data en pointeur de type UInt32.
- "*((UInt32 *) data)" Là on dépointe le pointeur, ça veut dire accéder à la variable d'adresse (UInt32 *) data.
- Et si cette variable est strictement égal à kStopListeningMessage, ça revoie vrai.

- Le "&&" signifie qu'il faut que les deux conditions soient vrai pour exécuter les instruction suivantes.

ouf :p
En espérant n'avoir pas dit trop de bêtises... :zen:
 
Bloc de code:
if([COLOR=DarkRed] (dataSize == sizeof(UInt32))[/COLOR] [COLOR=Blue]&&[/COLOR] ([COLOR=Sienna]*((UInt32 *) data) == kStopListeningMessage)[/COLOR] )

[COLOR=DarkRed]if ((TYPE IS UINT32))[/COLOR]
(dataSize == sizeof(UInt32))
 // I want to know if the provided value is the same size of UInt32 e.g 
can host properly my value; if not won't enter in the rigth expression branche

[COLOR=Blue]AND [/COLOR]RIGHT EXPRESSION

data IS A POINTER TO UInt32 

*((UInt32 *) data)

read

UInt32 *data I want the value hold by this POINTER
UInt32 VALUE = *(UInt32 *)data; //oublie le UInt8 certainement un 4 lettres 'abcd'

UInt8 data[4]; e.g UInt32 

dans l'absolue
UInt32 VALUE = *data;

le type casting est pour le compiler, de toutes les facons dans ce cas la 
premiere expression nous le guarantie, pas d'overflow ou de coupure possible,
mwouais bof j'essaye d'illustrer ce que le developer a voulu exprimé, bof in your dream man.

AND VALUE == [COLOR=Sienna]kStopListeningMessage[/COLOR] E.G 1 2 3 4 5 67 DON'T KNOW

[COLOR=DarkRed]if ((TYPE IS UINT32) AND VALUE = 78)[/COLOR]
la seule complexité ici est ta barriere avec la programmation en C et la synthax, la comparaison est elle tres simple.

mais bon... c'est assez cretin

UInt8 * data = (UInt8 *)malloc(kLineSize);
UInt32 dataSize = kLineSize;

c'est un essaie "pseudo dynamique" assez comique et a proscrire a ranger dans les BAD PRACTICES ou Je veux etre un Jacky tuning: here we go.

un exemple facile: voila vous vous plaignez parfois que certaines applications soient buguées, bah voila tout ce qu'il faut faire pour que ca arrive.