C++ இல் 'கவுட் தெளிவற்றது' பிழை

C Il Kavut Telivarratu Pilai



இந்த கட்டுரை C++ நிரலாக்க மொழியில் உள்ள தெளிவற்ற பிழைகள் பற்றி கவலை கொண்டுள்ளது. வெவ்வேறு பணிகளில் பயன்படுத்தப்படும் முறைகள் அல்லது ஆபரேட்டர்களை கம்பைலர் தீர்மானிக்க முடியாதபோது தெளிவற்ற சூழ்நிலை தோன்றும். சில நேரங்களில், ஒரே பெயர்வெளியுடன் ஒரே அளவுரு செயல்பாட்டைப் பயன்படுத்துகிறோம், பின்னர் இரண்டு நிகழ்வுகளிலும் cout வரையறுக்கப்படுகிறது. நாம் நிரலை இயக்கும் போது, ​​கம்பைலர் கூட் தெளிவற்ற பிழையை உருவாக்குகிறது, ஏனெனில் இந்த குறியீடு எந்த அர்த்தத்தைக் காட்டுகிறது என்பதை கம்பைலர் புரிந்து கொள்ளவில்லை. நிரலுக்குள் வரையறுக்கப்பட்ட பெயர்வெளிகள் அல்லது செயல்பாடுகளின் பல அறிவிப்புகளுக்கு இடையே மோதல் ஏற்படும் போது குழப்பமான தெளிவின்மை எழுகிறது.

எடுத்துக்காட்டு 1:

இது C++ நிரலாக்கத்தில் பெரும்பாலும் நிகழும் ஒரு cout ambiguous பிழையின் ஒரு எடுத்துக்காட்டு. இங்கே, நாம் பல பெயர்வெளிகளைப் பயன்படுத்தும் போது கம்பைலர் எவ்வாறு தெளிவற்ற பிழைகளை cout இல் உருவாக்குகிறது என்பதைப் பார்ப்போம். இந்த எடுத்துக்காட்டின் குறியீடு துணுக்கு பின்வருவனவற்றில் குறிப்பிடப்பட்டுள்ளது:







# அடங்கும்

பெயர்வெளி மடிக்கணினி {

வெற்றிடமானது காட்சி ( ) {

வகுப்பு :: கூட் << 'இது லேப்டாப் பெயர்வெளி' << வகுப்பு :: endl ;

}

}

பெயர்வெளி கைபேசி {

வெற்றிடமானது காட்சி ( ) {


வகுப்பு :: கூட் << 'இது மொபைல் பெயர்வெளி' << வகுப்பு :: endl ;

}

}

முழு எண்ணாக முக்கிய ( ) {

பயன்படுத்தி பெயர்வெளி மடிக்கணினி ;
பயன்படுத்தி பெயர்வெளி கைபேசி ;

காட்சி ( ) ;

திரும்ப 0 ;


}

இங்கே, நமது தேவைக்கேற்ப வரையறுக்கப்பட்ட இரண்டு பெயர்வெளிகளைக் கொண்ட ஒரு நிரலை எடுத்தோம். திரையில் சரங்களை காட்ட விரும்புகிறோம். இந்த குறியீட்டின் வெளியீடு பின்வருவனவற்றில் இணைக்கப்பட்டுள்ளது:





குறியீட்டை செயல்படுத்தும்போது, ​​குழப்பமான சூழ்நிலையைப் பற்றி பிழை உருவாக்கப்படுகிறது. கம்பைலர் குறியீட்டைப் படிக்கும் போது, ​​கம்பைலர் பயனர் முனையிலிருந்து தெளிவான உள்ளீட்டைப் பெறாததால் பிழை ஏற்படுகிறது. எங்கள் குறியீட்டில் பல பெயர்வெளி அறிவிப்புகளைப் பயன்படுத்தினோம். முழு குறியீட்டிலும், திரையில் வெளியீட்டைக் காண்பிக்க மட்டுமே 'காட்சி' முறையைப் பயன்படுத்தினோம். எந்தக் காட்சி முறை எந்த பெயர்வெளியுடன் தொடர்புடையது என்பது கம்பைலருக்குத் தெரியாது. நாம் குறியீட்டை எளிமையாகவும் தெளிவாகவும் உருவாக்க வேண்டும், இதனால் தொகுப்பாளர் குறியீட்டை தெளிவற்றதாக மாற்றாமல் படிகளை எளிதாகப் புரிந்துகொள்கிறார்.





இந்த பிழைக்கான தீர்வாக, கம்பைலர் மேலும் புரிந்து கொள்ள, முக்கிய செயல்பாட்டில் தொடர்புடைய பெயர்வெளியுடன் முறை அழைப்பதாகும். எங்களின் பிரதான செயலாக்கப் பகுதியில் எந்தப் பெயர்வெளி முறையை அழைக்க விரும்புகிறோம் என்பதைத் தெளிவாகக் குறிப்பிடுகிறோம்.

# அடங்கும்

பெயர்வெளி மடிக்கணினி {

வெற்றிடமானது காட்சி ( ) {


வகுப்பு :: கூட் << 'இது லேப்டாப் பெயர்வெளி' << வகுப்பு :: endl ;

}

}

பெயர்வெளி கைபேசி {

வெற்றிடமானது காட்சி ( ) {

வகுப்பு :: கூட் << 'இது மொபைல் பெயர்வெளி' << வகுப்பு :: endl ;

}

}

முழு எண்ணாக முக்கிய ( ) {

பயன்படுத்தி பெயர்வெளி மடிக்கணினி ;
பயன்படுத்தி பெயர்வெளி கைபேசி ;
மடிக்கணினி :: காட்சி ( ) ;
திரும்ப 0 ;


}

இங்கே, முந்தைய ஸ்கிரீன்ஷாட்டில் பார்த்தது போல, பிரதான செயல்பாட்டில் உள்ள “லேப்டாப்” பெயர்வெளியுடன் காட்சி() முறையை இணைக்கலாம். இப்போது, ​​நிரலை இயக்கவும். வெளியீடு கன்சோல் சாளரத்தில் காட்டப்படும்.



எடுத்துக்காட்டு 2:

இந்த காட்சி C++ இல் உள்ள cout தெளிவற்ற பிழையுடன் தொடர்புடையது. செயல்படுத்தல் ஓட்டம் புரியாத போது கம்பைலர் பிழையைக் காட்டுகிறது. இந்த எடுத்துக்காட்டின் குறியீடு துணுக்கு பின்வருவனவற்றில் இணைக்கப்பட்டுள்ளது:

# அடங்கும்

பெயர்வெளி மொழி {

வெற்றிடமானது அச்சு ( முழு எண்ணாக நான் ) {

வகுப்பு :: கூட் << 'சி மொழியின் பெயர்வெளி:' << நான் << வகுப்பு :: endl ;

}

}

பெயர்வெளி ஜாவா {

வெற்றிடமானது அச்சு ( முழு எண்ணாக ஜே ) {

வகுப்பு :: கூட் << 'ஜாவா மொழியின் பெயர்வெளி:' << ஜே << வகுப்பு :: endl ;

}

}

பயன்படுத்தி பெயர்வெளி மொழி ;

பயன்படுத்தி பெயர்வெளி ஜாவா ;

முழு எண்ணாக முக்கிய ( ) {

அச்சு ( 5 ) ;
திரும்ப 0 ;


}

இந்தக் குறியீட்டில், தேவையான அனைத்து நூலக தலைப்புகளையும் வரையறுக்கிறோம். வெவ்வேறு நோக்கங்களுக்காக இரண்டு பெயர்வெளிகளை உருவாக்குகிறோம். 'மொழி' பெயர்வெளியில், பயனரிடமிருந்து முழு எண்ணை எடுக்கும் 'அச்சு' முறையை நாங்கள் வரையறுக்கிறோம். “அச்சு” செயல்பாட்டில், பயனர் கன்சோல் திரையில் அனுப்பிய மதிப்பைக் காட்ட விரும்புகிறோம். எங்கள் குறியீட்டில் உள்ள 'கவுட்' ஸ்ட்ரீமைப் பயன்படுத்தி தேவையான வெளியீட்டைக் காண்பிக்கிறோம். அதன் பிறகு, 'ஜாவா' என்ற மற்றொரு பெயர்வெளியை வரையறுக்கிறோம்.

இந்த 'ஜாவா' நேம்ஸ்பேஸில், 'cout' ஐப் பயன்படுத்தி பயனர் கடந்து செல்லும் மதிப்பைக் காட்ட மீண்டும் 'அச்சு' முறையைப் பயன்படுத்துகிறோம். C++ இல் கன்சோல் சாளரத்தில் விரும்பிய வெளியீட்டைப் பெற, எங்கள் முக்கிய செயல்பாட்டில் பயன்படுத்த இரண்டு பெயர்வெளிகளையும் அழைக்கிறோம். “முக்கிய” செயல்பாட்டில், கன்சோல் திரையில் அனுப்பப்பட்ட மதிப்பைக் காட்ட “அச்சு()”ஓவர்லோடட் செயல்பாட்டை அழைக்கிறோம்.

பிரதான மெனுவிலிருந்து 'செயல்படுத்து' விருப்பத்தை கிளிக் செய்து 'தொகுத்து இயக்கவும்' விருப்பத்தைத் தேர்ந்தெடுக்கவும். இந்த குறியீட்டு செயல்பாட்டில் தெளிவின்மை பற்றிய பிழை ஏற்படுகிறது. பிழை ஸ்கிரீன்ஷாட் பின்வருமாறு இணைக்கப்பட்டுள்ளது:

இந்த பிழையானது, கம்பைலர் ஓவர்லோடட் பிரிண்ட்() செயல்பாட்டைப் பற்றி குழப்பத்தில் இருப்பதைக் குறிக்கிறது. இந்த பிழை வரி 19 இல் உள்ளது,  “அச்சிடு (5)”. இந்த ஓவர்லோடட் ஃபங்ஷன் எந்த நேம்ஸ்பேஸுக்கு சொந்தமானது என்பதில் கம்பைலர் குழப்பமடைந்துள்ளார். ஆரம்பநிலையாளர்கள் பெரும்பாலும் இந்த வகையான பிழைகளில் சிக்கிக் கொள்கிறார்கள்.

உண்மையில் சிக்கலானதாக இல்லாத இந்தப் பிழையைத் தீர்ப்போம். தெளிவற்ற பிழைகள் எளிதில் தீர்க்கப்படும். கம்பைலர் தெரிவுநிலை மற்றும் புரிதலுக்காக 'முக்கிய' செயல்பாட்டில் ஓவர்லோட் செய்யப்பட்ட செயல்பாட்டின் மூலம் பெயர்வெளியைக் குறிப்பிட வேண்டும். இந்த நிரலில் உள்ளதைப் போலவே, பின்வருவனவற்றில் குறிப்பிடப்பட்டுள்ளபடி, எங்களின் தற்போதைய குறியீட்டில் இந்த “java::print(5)” ஐச் சேர்ப்போம்:

# அடங்கும்

பெயர்வெளி மொழி {

வெற்றிடமானது அச்சு ( முழு எண்ணாக நான் ) {

வகுப்பு :: கூட் << 'சி மொழியின் பெயர்வெளி:' << நான் << வகுப்பு :: endl ;

}

}

பெயர்வெளி ஜாவா {

வெற்றிடமானது அச்சு ( முழு எண்ணாக ஜே ) {

வகுப்பு :: கூட் << 'ஜாவா மொழியின் பெயர்வெளி:' << ஜே << வகுப்பு :: endl ;

}

}

பயன்படுத்தி பெயர்வெளி மொழி ;

பயன்படுத்தி பெயர்வெளி ஜாவா ;

முழு எண்ணாக முக்கிய ( ) {

ஜாவா :: அச்சு ( 5 ) ;
திரும்ப 0 ;


}

இப்போது, ​​நிரல் எந்த தெளிவற்ற பிழையும் இல்லாமல் சரியாகச் செயல்படுத்தப்பட்டு, கன்சோல் திரையில் வெளியீட்டைக் காட்டுகிறது. இந்த திட்டத்தின் வெளியீடு பின்வருவனவற்றில் இணைக்கப்பட்டுள்ளது:

எடுத்துக்காட்டு 3:

தெளிவற்ற சிக்கலின் காரணமாக உருவாக்கப்பட்ட பிழை தொடர்பான இறுதி மற்றும் கடைசி எடுத்துக்காட்டு இதுவாகும். கம்பைலர் சரியான முடிவைப் பெற முடியாது. பயனரின் சிறந்த புரிதலுக்காக இந்த எடுத்துக்காட்டின் குறியீடு துணுக்கு பின்வருவனவற்றில் இணைக்கப்பட்டுள்ளது:

இங்கே, தேவையான நூலகங்களை வரையறுக்கிறோம். அதன் பிறகு, கன்சோல் சாளரத்தில் சரத்தை காண்பிக்க விரும்பும் வகுப்பைக் கொண்ட பெயர்வெளியை வரையறுக்கிறோம். இந்த வரையறுக்கப்பட்ட பெயர்வெளியை 'சி' மாறியுடன் 'முக்கிய' செயல்பாட்டில் அழைக்கிறோம். அதன் பிறகு, பெயர்வெளி பொருளைப் பயன்படுத்தி அச்சு() முறையை அழைக்கிறோம். முறை அழைப்புக்குப் பிறகு கன்சோல் திரையில் சரத்தை மீண்டும் காண்பிக்கிறோம். வெளியீடு இரண்டு சரங்களாக இருக்க வேண்டும் மற்றும் கன்சோல் திரையில் காட்டப்படும். இந்த குறியீட்டை இயக்கும்போது, ​​​​பின்வருவதில் காட்டப்பட்டுள்ளபடி பிழை ஏற்படுகிறது:

# அடங்கும்

பயன்படுத்தி பெயர்வெளி வகுப்பு ;

பெயர்வெளி என் பெயர்வெளி {

வர்க்கம் கூட் {
பொது :
வெற்றிடமானது அச்சு ( ) {


கூட் << 'தனிப்பயன்' << வகுப்பு :: endl ;

}

} ;

}

முழு எண்ணாக முக்கிய ( ) {

என் பெயர்வெளி :: கூட் c ;
c. அச்சு ( ) ;


கூட் << 'வணக்கம், உலகம்!' << வகுப்பு :: endl ;

திரும்ப 0 ;

}

கன்சோல் திரையில் தரவைக் காண்பிக்கும் கூட் அறிக்கையை கம்பைலர் தேர்ந்தெடுக்கவில்லை. கம்பைலரால் கவுட் அறிக்கையைச் சேர்ந்த பெயர்வெளியைப் புரிந்து கொள்ள முடியவில்லை மற்றும் பிழையை உருவாக்குகிறது. இந்த பிழைக்கான தீர்வு, கம்பைலர் வாசிப்புத்திறன் மற்றும் புரிதலுக்காக ஒரு கவுட் அறிக்கையுடன் பெயர்வெளிப் பொருளைச் சேர்ப்பதாகும். cout அறிக்கையுடன் 'std::' ஐச் சேர்த்து குறியீட்டை இயக்கவும். பின்வரும் வெளியீடு கன்சோல் திரையில் காட்டப்படும்:

முடிவுரை

இங்கே, கன்சோல் திரையில் வெளியீட்டைக் காண்பிப்பது தொடரியல் பிழை அல்லது தருக்கப் பிழை அல்லாத பிழையை உருவாக்குகிறது என்று கூறலாம். பெரும்பாலான நேரங்களில், பயனர் நல்ல குறியீட்டு உணர்வை எழுதுகிறார், ஆனால் அது கம்பைலருக்கு புரியாது. கம்பைலர் உள்ளீடு பற்றி தெளிவற்றதாக உள்ளது. எனவே, C++ நிரலாக்க மொழியில் பிழைகளைத் தவிர்க்க, ஒவ்வொரு குறியீட்டுப் படியையும் சரியான பெயர் இடைவெளி மற்றும் தொடரியல் மூலம் தெளிவுபடுத்தவும். இந்தச் சிக்கலைத் தீர்ப்பதில் ஈடுபட்டுள்ள படிநிலைகள் வெளிப்படையான தகுதிகளைப் பயன்படுத்துதல், பெயர்வெளி மோதல்களைத் தடுப்பது மற்றும் இந்தச் சிக்கலைத் தீர்ப்பதில் ஈடுபட்டுள்ள படிநிலைகளை உத்தேசித்துள்ள செயல்பாடுகள் அல்லது பொருள்கள் அடையாளம் கண்டுள்ளதை உறுதி செய்தல்.