الجزء 2 :¦- دورة تعليم الـC -¦: الدرس 5 -¦: توجيهات المعالح
ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¢ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ®ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ±
ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¹أ¢â‚¬آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آµط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¸ط·آ·ط¢آ¢ط·آ¢ط¢آ¾ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ­ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ©
EdyBel

  • ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¹أ¢â‚¬آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ´ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ±ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¦ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط£آ¢أ¢â‚¬â€چط¢آ¢ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¹ط·آ·ط¢آ¢ط·آ¢ط¢آ¾: 46565
    ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¹ط£آ¢أ¢â€ڑآ¬ط¹آ©ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ· ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¹أ¢â‚¬آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¹ط·آ·ط¢آ¢ط·آ¢ط¢آ¾ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¸ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ²: 15853
ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¶ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ«ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¢ط¢آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ© ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ£ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ³ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ³ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¸ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ©
EdyBel

ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¶ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ«ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¢ط¢آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ© ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ£ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ³ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ³ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¸ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ©
ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¹أ¢â‚¬آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ´ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ±ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¦ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط£آ¢أ¢â‚¬â€چط¢آ¢ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¹ط·آ·ط¢آ¢ط·آ¢ط¢آ¾: 46565
ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¹ط£آ¢أ¢â€ڑآ¬ط¹آ©ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ· ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¹أ¢â‚¬آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¹ط·آ·ط¢آ¢ط·آ¢ط¢آ¾ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¸ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ²: 15853
ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¯ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¹أ¢â‚¬آ  ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¹أ¢â‚¬آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ´ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ±ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¦ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط£آ¢أ¢â‚¬â€چط¢آ¢ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¹ط·آ·ط¢آ¢ط·آ¢ط¢آ¾ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¸ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ«ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¢ط¢آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¸ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§: 7.4
ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¹أ¢â‚¬آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ£ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¸ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ° ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¹أ¢â‚¬آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¥ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¶ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ·ط¢آ¢ط·آ¢ط¢آ¦: 6264
  • 00:37 - 2014/07/02

 المعالج
Le préprocesseur
The preprocessor

 
بعد كل المعلومات المتعبة التي تلقّيتموها في الدروس حول الجداول، النصوص و المؤشرات، فسنقوم بالتوقف قليلاً و أسترجاع أنفاسنا، لأننا بصدد قراءة درس إضافي  و سهل في الدورة، المعلومات التي به لا تعتبر من أساسيات لغة الـC التي من اللازم تعلّمها، لكنها معلومات مفيدة جداً أنصحكم بالإطلاع عليها و التعرف على كيفية عملها.
هذا الدرس يخصّ المعالج، و هو برنامج صغير يشتغل قبل انطلاق ترجمة الكود مباشرة.
 
الاستيراد Include :
كنت قد تكلم في دروس سابقة بأنه يوجد ما نسميه في لغة الـC بتوجيهات المعالج Directives de préprocesseur. و هذه التوجيهات لها ميزة خاصة : تبدأ دائماً بإشارة دياز #  و لهذا سيسهل علينا التعرّف عليها في الكود .
لحدّ الآن، التوجيهة الوحيدة التي رأيناها في الدورة هي include# ، هذه التوجيهة تسمح لنا باستيراد محتوى ملفات كود في الكود الذي نعمل عليه، و نحن نحتاجها بالظبط في استيراد الملفات ذات الصيغة .h للمكتبات stdio.h , stdlib.h .. إلى آخره، و أيضاً الملفات التي نحن ننشؤها بذات الصيغة.
 
لنستورد ملفاً ذو صيغة .h موجوداً في نفس المجلّد الذي سطّبنا فيه الـIDE أي Integrated developpement environnement أي الـCode Blocks في حدّ ذاته، نستعمل الـ: <> كالتالي :
 
 
#include <stdlib.h>
 
بينما إن كنا نريد استيراد ملف نحن أنشأناه ووضعناه في المجلّد الذي به مشروعنا، فسنقوم ذلك كالتالي :
 
#include "monfichier.h"
 
كما قلت، فالمعالج، ينطلق اشتغاله قبل بدء الترجمة،  و يقوم بالبحث في كلّ الكود عن توجيهات المعالج، هي تلك الأسطر المشهورة و التي تبدأ بـ# , فعندما يجد مثلاُ التوجيهة include# يقوم بإحضار محتوى الملف المطلوب و يضعه في مكان هذه التوجيهة.
 
انفترض أن لديّ ملفّا .c يحتوي الكود الخاص بالدوال التي كتبتها، و لدي ملف .h يحتوي نماذج prototypes الدوال التي هي موجودة بالملف .c ، يمكن تلخيص ذلك بالمخطط التالي :
 
Inclusion de fichier
 

كل محتوى الملف fichier.h سيتم وضعه دتخل الملف fichier.c في مكان التوجيهة #include "fichier.h" ، تخيلوا ان لدينا في الملف fichier.c التالي :

#include "fichier.h"
int maFonction(int truc, double bidule)
{
   
}
void autreFonction(int valeur)
{
   
}
 
و في الملف fichier.h التالي :
 
int maFonction(int truc, double bidule);
void autreFonction(int valeur);
 
عندما يمر المعالج بهذا الكود، قبل أن تتم ترجمة الملف fichier.c، سيضع كما قلت محتوى الملف fichier.h في الملف fichier.c يعني أن الملف fichier.c قبل الترجمة سيحتوي كالتالي :
 
int maFonction(int truc, double bidule);
void autreFonction(int valeur);
int maFonction(int truc, double bidule)
{
   
}
void autreFonction(int valeur)
{
   
}
 
هذا ليس بالأمر المعقد لفهمه، و لعلّ بعضكم يشكك في أن الأمر يحصل بهذه الطريقة، لكن بالفعل هذا ما يحصل .
كتلخيص للسابق فإن توجيهة include# لا تفعل أي شيئ سوى بإحضار محتوى ملف و دمجه مع الملف الحالي، من المهمّ فهم هذا الشيء.
 
بالطبع، كان بإمكاننا وضع نماذج الدوال في أعلى الملف fichier.c بأنفسنا، لكن استعمال الملف fichier.h ليس فقط مرحاً، بل هناك أسباب وجيهة لفعل ذلك، فمثلا لو أن محتوى الملف fichier.h كبير جداً، و مثلا لدينا في المشروع عدة ملفات .c التي تستعمل الدوال الموجودة نماذجها في ذلك الملف، هل تعتقدون أنه من السهل ان نستورد محتوى الملف fichier.h في هذه الملفات .c ام أننا في كلّ مرة ننسخ و نلصق محتوى الملف fichier.h في ذات الملفات ؟
 
المعرّفات Define :
 
سنتعرف الآن على توجيهة معالج جديدة و هي define# ، هذه التوجيهة تسمح بإطلاق déclarer ثابت، يعني أن نرفق خانة في الذاكرة برقم غير متغيّر أي ثابت.
 
#define NOMBRE_VIES_INITIALES 3
 
يجب ان تكتبوا بالترتيب :  define# ثم اسم الثابت ثم قيمته التي لن تتغير في ما تبقّى من الكود . لن أقول لكم أنها قاعدة، لكن تعوّدوا على أن يكون اسم الثابت كبير، أقصد majuscule أو upper case .
 
الثوابت التي نعرّفها عن طريق الـdefine مختلفة عن الثوابت التي نعرّفها ( أو نطلقها ) بهذه الطريقة :
 
const int NOMBRE_VIES_INITIALES = 3;
 
قالثوابت التي نعرفها بالـconst تأخذ حيّزا في الذاكرة، حتى  وإن لم تتغير قيمتها فإنها تحجز خانة لتخزن فيها القيمة الخاصة بها . بينما الثوابت التي نعرّفها بالـdefine فهي لا تحجز أي مكان بالذاكرة ! فكيف تعمل ؟
 
ببساطة فإن التوجيهة define# تكتفي بتعويض اسم الثابت بقيمته في كلّ مكان من الكود، أي أن الثابتة : NOMBRE_VIES_INITIALES سيتم استبدالها في كل مرة بالرقم 3 .
 
هذا ما يبدو عليه الملف .c قبل الترجمة :
 
#define NOMBRE_VIES_INITIALES 3
int main(int argc, char *argv[])
{
    int vies = NOMBRE_VIES_INITIALES;
   
 
و بعدما يمرّ المعالج من هنا :
 
int main(int argc, char *argv[])
{
    int vies = 3;
   
 
كما نرى فقد تم تعويض الثابت بقيمته .
 
ما الفائدة من استعمال ثوابت توجيهات المعالج بالنسبة للثوابت العادية التي نعرّفها بالـconst ؟؟
يمكننا القول ان ثوابت توجيهات المعالج مفيدة كونها لا تحجز مكان في الذاكرة، الشيء الجيّد الآخر هو أنه سيتم استبدال الثابتة بقيمتها في كلّ الملف الذي يحتوي على الـdefine .  و من وجهة نظر الدوال، فإن قمنا بتعريف ثابت كلاسيكياُ داخل الدالة فإنه لا يعمل إلا داخل الدالة، أي أنه يتم حذفه بالخروج من الدالة، بينما بالـنسبة لثوابت الـdefine فإنه سيتم استبدالهما في كلّ دوال الملف دون استثناء.
 
مثال للفهم :
 
مثلا، لو أنكم تقومون ببرمجة برنامج بواجهة رسومية، قد تحتاجون لتعريف طول و عرض الواجهة، و بالتالي فإنكم ستعرّفون حتما ثابتين لذلك :
 
#define LARGEUR_FENETRE 800
#define HAUTEUR_FENETRE 600
 
إن حدث و كنتم تريدون تغيير حجم الواجهة، فيكفي أن تغيّروا القيمة الموجودة بالـdefine و تعيدون ترجمة الكود .
في غالب الأحيان فإن الـdefine تكون في ملفات .h تحت نماذج الدوال، على أي حال فإنه بامكانكم أن تروا محتوى المكتبات مثل stdlib.h، ستجدون الكثير من define .
 
معرّفة Define من أجل حجم جدول :
 
نستعمل كثيراً المعرّفات من أجل تعريف حجم جدول :
 
#define TAILLE_MAX 1000
int main(int argc, char *argv[])
{
    char chaine1[TAILLE_MAX], chaine2[TAILLE_MAX];
    // ...
 
لكن، ألم تقولي سابقاً انه من غير الممكن أن نضع اسم ثابت او متغيّر داخل الـ [ ] لتعريف حجم الجدول ؟
نعم هذا صحيح، يعني انه لو كتبنا سابقا :
 
const TAILLE_MAX 1000
int main(int argc, char *argv[])
{
    char chaine1[TAILLE_MAX];
    // ...
فإن هذا الأمر خاطئ، لكن كما قلت، فإن الثابتة التي عرّفناها بالـdefine لا يذنعتبرها كثابتة عادية، لقد قلت أنه سيتم استبدالها بقيمتها كالتالي :
 
#define TAILLE_MAX 1000
int main(int argc, char *argv[])
{
    char chaine1[1000], chaine2[1000];
    // ...
 
و هذا أمر مسموح به .
 
في حالة وجدنا أن 1000 خانة غير كافية للجدول، يكفي تعديل القيمة ووضعها مثلا 2000 و سيتغيّر حجم الجدول اوتوماتيكياً.
 
بعض الحسابات مع المعرّفات :
 
بالفعل، فإنه من الممكن أن نقوم ببعض الحسابات بينما نستعمل المعرّفات، فمثلا هذا الكود سيقوم بإنشاء ثابت LARGEUR_FENETRE و آخر HAUTEUR_FENETRE و أيضاً: NOMBRE_PIXELS التي تحتوي عدد البيكسلز التي تظهر في الواجهة ( نحسبها بـ: الطول x العرض ) .
 
#define LARGEUR_FENETRE 800
#define HAUTEUR_FENETRE 600
#define NOMBRE_PIXELS (LARGEUR_FENETRE * HAUTEUR_FENETRE)
 
الثابتة NOMBRE_PIXELS  أثناء الترجمة سيتم استبدالها بـالكود LARGEUR_FENETRE * HAUTEUR_FENETRE، أي بـ800*600 بمعنى آخر : 480000 . لا تنسوا وضع الأقواس كي تفرّقوا الحساب عن باقي الكود . يمكنكم القيام بكل العمليات القاعدية : جمع، طرح، قسمة، ضرب، باقي قسمة .
 
الثوابت التي سبق تعريفها :
 
بالإضافة إلى الثوابت التي انتم عرّفتموها، فإنه توجد ثوابت معرّفة من قبل، كل منها تبدأ و تنتهي بالرمز _ ، نكتبه في لوحة المفاتيح بـ: الرقم 8 أعلى اللوحة .
 
__LINE__ : تعطي رقم السطر الحالي من الكود .
__FILE__ :  تعطي اسم الملف الحالي .
__DATE__ : تعطي تاريخ ترجمة الكود .
__TIME__ :  تعطي الساعة التي تمت فيها ترجمة الكود.
 
قد تكون هذه الثوابت مفيدة للتحكم في الأخطاء، مثال :
 
printf("Erreur a la ligne %d du fichier %s\n", __LINE__, __FILE__);
printf("Ce fichier a ete compile le %s a %s\n", __DATE__, __TIME__);
 
النتيجة :
 
Erreur a la ligne 9 du fichier main.c
Ce fichier a ete compile le Jan 13 2006 a 19:21:10
 
 
التعريفات البسيطة :
 
إنه من الممكن أن نكتب بكل بساطة :
 
#define CONSTANTE
 
يعني ان نعرّف ثابت دون أن نعطيه قيمة ابتدائية، لكنه يبقى موجود .
 
ما الفائدة من ذلك ؟؟
الأمر ليس بسيطاً للغاية بالشكل الذي نتصوّره، لكن سنكتشف الفائدة الآن .
 
الماكرو Marco :
 
كنا قد رأينا بانه باستعمال الـdefine، بامكاننا أن نعرّف ثابت يتم استبداله بقيمته في الكود باكمله، مثال :
 
#define NOMBRE 9
 
لكن المعرّفة define أقوى من هذا بكثير، فهي قادرة على استبدال كلمة بكود سورس باكمله ! بهذا نقول أننا أنشأنا ماكرو marco .
 
ماكرو بدون خواص :
 
هذا مثال عن ماكرو بسيطة :
 
#define COUCOU() printf("Coucou");
 
الذي تغيّر هو القوسين الذين أضفناهما بعد اسم الماكرو، سنرى فائدتهما لاحقاً .
فلمجرب الماكرو داخل هذا الكود سورس :
 
#define COUCOU() printf("Coucou");
int main(int argc, char *argv[])
{
    COUCOU()
    return 0;
}
 
النتيجة :
 
 
Coucou
 
هذا ليس أحسن ما يمكن فعله بالماكرة، لكن يمكن القول أن الماكرو عبارة عن بضعه أسطر من الكود التي يتم استبدالها في مكان اسم الماكرو قبل الترجمة.
الكود الذي كتبناه يشبه هذا :
 
int main(int argc, char *argv[])
{
    printf("Coucou");
    return 0;
}
 
إذا فهمتمن هذا الكود فانتم قد فهمتم كيف يعمل الأمر .
 
لكن، هل يمكننا أن نرفق بماكرو سطراً واحدا من الكود فقط؟؟
 
لا، يمكنكم أن ترفقوها بعدد من الاسطر، و يكفي ان تضعوا \ قبل كلّ سطر جديد :
 
 
#define RACONTER_SA_VIE() printf("Coucou, je m'appelle Brice\n"); \
printf("J'habite a Nice\n"); \
printf("J'aime la glisse\n");
int main(int argc, char *argv[])
{
    RACONTER_SA_VIE()
    return 0;
}
 
النتيجة :
 
Coucou, je m'appelle Brice
J'habite a Nice
J'aime la glisse
 
كما تلاحظون ففي الدالة الرئيسية main، عندما قمنا بنداء الماكرو، لم نضع بعدها ; لأنها توجيهة خاصة بالمعالج و لا تحتاج إلى ; في النهاية .
 
ماكرو بالخواص :
 
كنا قد رأينا كيف نقوم بإنشاء ماكرو بدون خواص و حان الوقت لنتعرف على الماكرو بالخواص. إن الفائدة من استعمال الماكرو هو امكانية نداء الماكرو في اماكن عديدة من الكود، في عوض نسخ و لصق الكود الخاص بالماكرو في كل تلك الأمكنة مما يضخّم حجم الملف.
 
الماكرو بالخواص يشبه بشكل كبير الدوال :
 
#define MAJEUR(age) if (age >= 18) \
printf("Vous etes majeur\n");
int main(int argc, char *argv[])
{
    MAJEUR(22)
    return 0;
}
 
النتيجة :
 
Vous etes majeur
 
يمكننا مثلا إضافة الـelse لكي نُظهر على الشاشة : انت قاصر " vous etes mineur " ، حاولوا القيام بذلك، و لا تنسوا أن تضعوا \ قبل السطر الجديد.
 
في المثال السابق، قمنا بوضع اسم متغيرة بين القوسين، المتغيرة سميناها age، حينما نقوم بنداء الماكرو فإنه سيتم استبدال المتغيرة بقيمتها ( هنا 22 ) .
أي أن الكود السابق قبل الترجمة مباشرة يصبح هكذا :
 
 
int main(int argc, char *argv[])
{
    if (22 >= 18)
    printf("Vous etes majeur\n");
    return 0;
}
 
تم استبدال السطر الذي ينادي الماكرو، بالكود الذي تحتويه الماكرو، و تم تعويض المتغيرة age بقيمتها .
يمكننا انشاء ماكرو بعدة خواص :
 
 
#define MAJEUR(age, nom) if (age >= 18) \
printf("Vous etes majeur %s\n", nom);
int main(int argc, char *argv[])
{
    MAJEUR(22, "Maxime")
    return 0;
}
 
 
هذا كلّ ما يمكننا أن نقوله حول الماكرو و المميزات التي تقدّمها لنا .
في الواقع، أنتم لستم بحاجة أن تتعاملوا كثيراً مع الماكرو، لكن اعلموا ان مكتبات معقدة كالـwxWidgets و الـQt تستعملان بكثرة الماكرو، لهذا من المستحسن ان تتعلّموا كيف تعمل الأمور.
 
الشروط :
 
نعم، يمكننا أن نستعمل الشروط في لغة المعالج ، مثال :
 
#if condition
   
#elif condition2
   
#endif
 
الكلمة المفتاحية if# تسمح بدمج شرط معالج، elif# تعني else if . الأمر يتوقف عندما نضع endif# ، ستلاحظون أننا لا نستعمل الحاضنتين في لغة المعالج.
الفائدة هي أننا سنتمكن من إجراء ترجمة شرطية compilation conditionnelle .
مثلا، إن كان الشرط محققا فإن الكود ستتم ترجمته، و إن كان غير محقق فلن تتم ترجمة أمر الشرط و كأنه قد تم حذفه!
 
ifdef#  و ifndef# :
 
سنرى الآن الفائدة من استعمال define منذ دون تعريف قية الثابت الذي أطلقناه.
 
#define CONSTANTE
 
لهذا يمكننا استعمال الشرط ifdef لنقول if defined أي هل هي معرّفة ؟؟ بالنسبة لـifndef ، فهذا يعني العكس، if not defined أي هل هي غير معرفة ؟
 
فلنتخيل الأمر :
 
#define WINDOWS
#ifdef WINDOWS
   
#endif
#ifdef LINUX
   
#endif
#ifdef MAC
   
#endif
 
هذا مثال عن برنامج multi platform . أي أن لكل منصّة الكود الخاص بها لأن البرنامج يتغير من نظام تشغيل إلى آخر. لهذا فيجب من أجل كلّ منصة إعادة ترجمة الكود، إن كنا في اللينكس فسنغيّر define WINDOWS# بـdefine LINUX# و نعيد الترجمة . باقي الشروط لن تكون محققة يعني أنه سيتم تجاهلها.
 
ifndef# لتفادي الدمج اللامنتهي :
 
ماذا يعني الدمج اللامنتهي ؟
هذا أمر بسيط، تخيلوا أن لدينا ملف A.h و ملف B.h، الملف A.h يحتوي تعليمة تدمج فيه محتوى B.h إذا فالملف B.h مدموج الآن بـA.h , و هنا يبدأ المشكل، تخيّلوا أن الملف B.h يحتوي نفسه على تعليمة تدمج فيه محتوى الملف A.h !!! يعني أن الملف الأول بحاجة إلى الثاني و العكس صحيح.
 
هذا ما سيحصل :
- الحاسوب سيجد بأن عليه دمج الملف B مع الملف A
- يقوم بقراءة الملف B.h فيجد بان عليه دمج الملفAَ مع الملف B
- يحاول دمج الملف A مع الملف B، لكن أيضا الملف A يحتاج إلى دمج الملف B !!!
- هنا يدخل الحاسوب في حلقة غير منتهية، أي أنه لن يتوقف عن دمج ملف في آخر.
 
الحل و الذي يجب أن تعتمدوه في كلّ الملفات .h هو :
 
#ifndef DEF_NOMDUFICHIER // Si la constante n'a pas été définie le
fichier n'a jamais été inclus
#define DEF_NOMDUFICHIER // On définit la constante pour que la
prochaine fois le fichier ne soit plus inclus

#endif
 
أي أننا نضع كل محتوى الملف .h بين الـifndef# و الـendif# .
 
هل فهمتم كيف يعمل الكود ؟؟ إن الامر يبدو صعباً لكنه ليس كذلك، سأحاول أن أشرح :
تخيلوا أن الملف .h تم دمجه للمرة الأولى، سيقرأ الحاسوب الشرط ( هل DEF_NOMDUFICHIER لم يتم تعريفها ؟؟؟ ) بما أنه تم دمج الملف للمرة الأولى، فإنه لم يتم تعريفها بعد، فسيقوم المعالج بالدخول إلى الأمر الموافق للـif . أي أنه سيجد الأمر :
 
#define DEF_NOMDUFICHIER
 
لقد تم تعريف الثابت، المرة القادمة التي يتم دمج الملف فيها، ستبقة الثابتة معرفة و لهذا لن نخاطر بإعادة دمج الملف من جديد !
اسم الثابت يمكنكم تسميته مثلما تريدون، لكن احرصوا أن يختلف اسمه من ملف .h إلى آخر و إلا فلن تتم قراءة سوى أول ملف .h و الباقي سيتم تجاهله!!!
إذا فلتغيّروا NOMDUFICHIER باسم الملف الحالي.
 
أنصحكم بإلقاء نظرة على المكتبات .h المتواجدة في حاسوبكم، سترون بأنها كلها مكتوبة بنفس الطريقة التي شرحتها في هذا الدرس. أي ifndef# في البداية و endif# في النهاية لضمان عدم دمج نفس الملف اكثر من مرة .
 
ملخص :
 
1- المعالج هو برنامج صغيرة يشتغل قبل ترجمة الكود، و يقوم بإجراء تغييرات على الكود الأصلي.
2- توجيهة المعالج include# تسمح بدمج محتوى ملف في ملف آخر.
3- توجيهة المعالج define# تسمح بتعريف ثابت، يتم استبدال اسمه بقيمته قبل ترجمة الكود .
4- الماكرو هي مجموعة من الأسطر التي نعرّفها بالـdefine و في كل مرة يتم استبدال اسمها بالكود الذي يرافقها.
5- لنختار أجزاء الكود التي نريد ترجمتها نقوم باستعمال if# و elif# و endif# .
6- لنتجنب الدمج غير المنتهى للملف، نستعمل الشروط .
 الجزء 2 :¦- دورة تعليم الـC -¦: الدرس 5 -¦: توجيهات المعالح
ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¨ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ¯ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¸ط·آ·ط¢آ¢ط·آ¢ط¢آ¹ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ©
ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ§ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ£ط·آ¢ط¢آ¢ط·آ£ط¢آ¢ط£آ¢أ¢â€ڑآ¬ط¹â€کط·آ¢ط¢آ¬ط·آ£ط¢آ¢ط£آ¢أ¢â‚¬ع‘ط¢آ¬ط·آ¹أ¢â‚¬آ ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آµط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ¸ط·آ·ط¢آ·ط·آ¢ط¢آ¸ط·آ·ط¢آ¢ط·آ¢ط¢آ¾ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ­ط·آ·ط¢آ·ط·آ¢ط¢آ·ط·آ·ط¢آ¢ط·آ¢ط¢آ·ط·آ·ط¢آ·ط·آ¢ط¢آ¢ط·آ·ط¢آ¢ط·آ¢ط¢آ©