আমি ওপেনসিভি টিউটোরিয়াল অধ্যয়ন করছি এবং assert
ফাংশন জুড়ে এসেছি ; এটার কাজ কি?
আমি ওপেনসিভি টিউটোরিয়াল অধ্যয়ন করছি এবং assert
ফাংশন জুড়ে এসেছি ; এটার কাজ কি?
উত্তর:
assert
যদি তার যুক্তিটি মিথ্যা প্রমাণিত হয় তবে প্রোগ্রামটি সমাপ্ত হবে (সাধারণত দৃ the় বক্তব্য উদ্ধৃত করে একটি বার্তা সহ)। এটি সাধারণত ডিবাগিংয়ের সময় ব্যবহৃত হয় যদি কোনও অপ্রত্যাশিত পরিস্থিতি দেখা দেয় তবে প্রোগ্রামটি আরও স্পষ্টভাবে ব্যর্থ হয়ে যায়।
উদাহরণ স্বরূপ:
assert(length >= 0); // die if length is negative.
এটির মতো ব্যর্থ হলে প্রদর্শিত হওয়ার জন্য আপনি আরও তথ্যমূলক বার্তা যুক্ত করতে পারেন:
assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");
অন্যথায় এটি:
assert(("Length can't possibly be negative! Tell jsmith", length >= 0));
আপনি যখন একটি রিলিজ (নন-ডিবাগ) বিল্ডটি করছেন, আপনি সাধারণত মায়ক্রো assert
সংজ্ঞায়িত করে NDEBUG
ম্যাক্রো সংজ্ঞায়িত করে বিবৃতিগুলির মূল্যায়নের ওভারহেডটি সরাতে পারেন usually এর তাত্পর্যপূর্ণ এটি হল যে আপনার প্রোগ্রামটি কখনই দৃsert় ম্যাক্রো চলার উপর নির্ভর করবে না ।
// BAD
assert(x++);
// GOOD
assert(x);
x++;
// Watch out! Depends on the function:
assert(foo());
// Here's a safer way:
int ret = foo();
assert(ret);
প্রোগ্রামটি কল বন্ধ করে দেওয়া () এবং কোনও কিছু করার গ্যারান্টি না দেওয়া সংমিশ্রণ থেকে, দৃser় প্রতিজ্ঞাগুলি কেবল বিকাশকারী দ্বারা ধরে নেওয়া জিনিসগুলি পরীক্ষা করতে ব্যবহার করা উচিত, উদাহরণস্বরূপ, ব্যবহারকারী একটি চিঠির পরিবর্তে একটি সংখ্যা প্রবেশ করান (যা হওয়া উচিত অন্যান্য উপায়ে পরিচালিত)।
assert
সাধারণত একটি ব্যতিক্রম উত্থাপন করে" - সি ++ এ এটি "ব্যতিক্রম" উত্থিত হয় না এটি একে গর্ভপাত বলে ... এটি কিছুটা আলাদা।
#
চরিত্রটি কোনও মন্তব্য দেয় না।
assert("error message", expression)
জাহির কম্পিউটার বিবৃতি বিবৃতি অনুরূপ নিশ্চিত করুন ইংরেজিতে।
একবার দেখুন
সি (+) উদাহরণস্বরূপ সি ++ এ প্রোগ্রাম
অনেক সংকলক একটি প্রতিস্থাপন () ম্যাক্রো সরবরাহ করে। প্রতিস্থাপন () ম্যাক্রো সত্য প্রত্যাবর্তন করে যদি এর পরামিতি সত্যকে মূল্যায়ন করে এবং যদি এটি মিথ্যা মূল্যায়ন করে তবে এক ধরণের পদক্ষেপ নেয়। অনেক সংকলক ব্যর্থ হয় এমন এক প্রতিবেদনে প্রোগ্রামটি বাতিল করে দেবে; অন্যরা ব্যতিক্রম নিক্ষেপ করবে
অ্যাসেট () ম্যাক্রোর একটি শক্তিশালী বৈশিষ্ট্য হ'ল ডিইবিইউজি সংজ্ঞায়িত না করা হলে প্রিপ্রসেসর এটিকে কোনও কোডের মধ্যেই ভেঙে দেয়। এটি উন্নয়নের সময় একটি দুর্দান্ত সহায়তা, এবং চূড়ান্ত পণ্য জাহাজগুলি যখন কার্য সম্পাদনযোগ্য সংস্করণের আকারে কোনও পারফরম্যান্স পেনাল্টি বা বৃদ্ধি পায় না।
যেমন
#include <stdio.h>
#include <assert.h>
void analyze (char *, int);
int main(void)
{
char *string = "ABC";
int length = 3;
analyze(string, length);
printf("The string %s is not null or empty, "
"and has length %d \n", string, length);
}
void analyze(char *string, int length)
{
assert(string != NULL); /* cannot be NULL */
assert(*string != '\0'); /* cannot be empty */
assert(length > 0); /* must be positive */
}
/**************** Output should be similar to ******************
The string ABC is not null or empty, and has length 3
প্রতিস্থাপন () ফাংশন প্রোগ্রাম বাগগুলি নির্ণয় করতে পারে। সি-তে এটি সংজ্ঞায়িত হয় <assert.h>
এবং সি ++ এ এটি সংজ্ঞায়িত হয় <cassert>
। এর প্রোটোটাইপটি হ'ল
void assert(int expression);
আর্গুমেন্ট এক্সপ্রেশন আপনি যা পরীক্ষা করতে চান তা হতে পারে - একটি ভেরিয়েবল বা কোনও সি এক্সপ্রেশন। যদি অভিব্যক্তি সত্যের কাছে মূল্যায়ন করে, () কিছু না করে বলুন। যদি অভিব্যক্তি FALSE- র কাছে মূল্যায়ন করে তবে জোর দেওয়া () স্টেডারে একটি ত্রুটি বার্তা প্রদর্শন করে এবং প্রোগ্রামের সম্পাদন বন্ধ করে দেয়।
আপনি কীভাবে দাবী ব্যবহার করবেন? এটি বেশিরভাগ ঘন ঘন প্রোগ্রাম ত্রুটিগুলি খুঁজে বার করতে ব্যবহৃত হয় (যা সংকলনের ত্রুটি থেকে পৃথক)। একটি ত্রুটি কোনও প্রোগ্রাম সংকলন হতে বাধা দেয় না, তবে এটি এর ফলে ভুল ফলাফল দেয় বা অনুচিতভাবে চালিত হয় (উদাহরণস্বরূপ লকআপ)। উদাহরণস্বরূপ, আপনি যে আর্থিক-বিশ্লেষণ প্রোগ্রামটি লিখছেন সেটি মাঝে মাঝে ভুল উত্তর দেয়। আপনার সন্দেহ হয় যে পরিবর্তনশীল সুদ_রেট নেতিবাচক মান গ্রহণের ফলে সমস্যাটি ঘটেছিল, যা কখনই ঘটে না। এটি পরীক্ষা করতে, বিবৃতিটি রাখুন
জোড় (আগ্রহ_রেট> = 0); প্রোগ্রামের অবস্থানগুলিতে যেখানে ইন্টারেস্ট_রেট ব্যবহৃত হয়। চলকটি যদি কখনও নেতিবাচক হয়ে যায় তবে জোর দেওয়া () ম্যাক্রো আপনাকে সতর্ক করে দেয়। তারপরে আপনি সমস্যার কারণ সনাক্ত করতে প্রাসঙ্গিক কোডটি পরীক্ষা করতে পারেন।
কীভাবে দৃsert়তা () কাজ করে তা দেখতে নীচের নমুনা প্রোগ্রামটি চালান । আপনি যদি একটি ননজারো মান সন্নিবেশ করেন তবে প্রোগ্রামটি মানটি প্রদর্শন করে এবং সাধারণত সমাপ্ত হয়। আপনি যদি শূন্য প্রবেশ করেন তবে দাবী () ম্যাক্রো অস্বাভাবিক প্রোগ্রাম সমাপ্তিকে জোর করে। আপনি যে সঠিক ত্রুটি বার্তাটি দেখছেন তা আপনার সংকলকের উপর নির্ভর করবে, তবে এখানে একটি আদর্শ উদাহরণ রয়েছে:
দৃ failed়তা ব্যর্থ হয়েছে: এক্স, ফাইল তালিকা 19_3.c, লাইন 13 নোট করুন যে, কাজ করার জন্য () দাবি করার জন্য আপনার প্রোগ্রামটি অবশ্যই ডিবাগ মোডে সংকলন করতে হবে। ডিবাগ মোড সক্ষম করার তথ্যের জন্য আপনার সংকলক ডকুমেন্টেশন দেখুন (যেমন একটি মুহুর্তে ব্যাখ্যা করা হয়েছে)। আপনি যখন পরে রিলিজ মোডে চূড়ান্ত সংস্করণটি সংকলন করেন তখন দৃ the় () ম্যাক্রোগুলি অক্ষম থাকে।
int x;
printf("\nEnter an integer value: ");
scanf("%d", &x);
assert(x >= 0);
printf("You entered %d.\n", x);
return(0);
একটি পূর্ণসংখ্যা মান লিখুন: 10
আপনি 10 প্রবেশ করিয়েছেন।
একটি পূর্ণসংখ্যা মান লিখুন: -1
ত্রুটির বার্তা: অস্বাভাবিক প্রোগ্রাম সমাপ্তি
আপনার ত্রুটি বার্তাটি আপনার সিস্টেম এবং সংকলকের উপর নির্ভর করে ভিন্ন হতে পারে, তবে সাধারণ ধারণাটি একই।
'ব্যতিক্রম উত্থাপন' এবং 'হোল্ট এক্সিকিউশন' এর মতো স্টাফ বেশিরভাগ সংকলকের ক্ষেত্রে সত্য হতে পারে তবে সবার জন্য নয়। (বিটিডাব্লু, এমন কি বক্তব্য রয়েছে যা সত্যই ব্যতিক্রম ছুঁড়ে?)
সি 6 এক্স এবং অন্যান্য টিআই সংকলকগুলি দ্বারা ব্যবহৃত দাবির একটি আকর্ষণীয়, কিছুটা পৃথক অর্থ: নির্দিষ্ট দাবী বিবৃতি দেখে, এই সংকলকগণ নির্দিষ্ট বিবরণী সম্পাদন করতে বিবৃতিটিতে তথ্য ব্যবহার করে। দুষ্ট।
সি উদাহরণ:
int dot_product(short *x, short *y, short z)
{
int sum = 0
int i;
assert( ( (int)(x) & 0x3 ) == 0 );
assert( ( (int)(y) & 0x3 ) == 0 );
for( i = 0 ; i < z ; ++i )
sum += x[ i ] * y[ i ];
return sum;
}
এটি ডি সংকলককে বলে যে অ্যারেগুলি 32-বিটস সীমানায় সংযুক্ত রয়েছে, তাই সংকলকটি এ জাতীয় প্রান্তিককরণের জন্য তৈরি নির্দিষ্ট নির্দেশাবলী তৈরি করতে পারে।
সি ++ 11 এন 3337 স্ট্যান্ডার্ড খসড়া
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
19.3 জোর
1 (সারণী 42) এ বর্ণিত শিরোনাম <ক্যাসারেট> সি ++ প্রোগ্রামের জরুরী দলিলগুলির জন্য একটি ম্যাক্রো এবং দৃ as় চেকগুলি অক্ষম করার জন্য একটি প্রক্রিয়া সরবরাহ করে।
2 সামগ্রীগুলি স্ট্যান্ডার্ড সি লাইব্রেরির শিরোনাম <assert.h> এর মতো।
C99 N1256 স্ট্যান্ডার্ড খসড়া
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
7.2 ডায়াগনস্টিকস <assert.h>
1 শিরোনাম
<assert.h>
অ্যাসেট ম্যাক্রো সংজ্ঞায়িত করে এবং অন্য ম্যাক্রোকে বোঝায়,NDEBUG
যা দ্বারা সংজ্ঞায়িত হয় না<assert.h>
। তাহলেNDEBUG
সোর্স ফাইল বিন্দু এই <assert.h> অন্তর্ভুক্ত করা হয় একটি ম্যাক্রো নাম হিসাবে সংজ্ঞায়িত করা হয় জাহির ম্যাক্রো কেবল হিসাবে সংজ্ঞায়িত করা হয়#define assert(ignore) ((void)0)
প্রতিস্থাপন ম্যাক্রো প্রতিটি সময়
<assert.h>
অন্তর্ভুক্ত করা হয় NDEBUG বর্তমান অবস্থা অনুযায়ী পুনরায় সংজ্ঞায়িত করা হয় ।২. দৃsert় ম্যাক্রো বাস্তব কার্য হিসাবে নয়, ম্যাক্রো হিসাবে প্রয়োগ করা হবে। যদি কোনও প্রকৃত ফাংশন অ্যাক্সেস করার জন্য ম্যাক্রো সংজ্ঞাটি দমন করা হয়, তবে আচরণটি সংজ্ঞায়িত।
7.2.1 প্রোগ্রাম ডায়াগোনস্টিকস
.2.২.২.২ জোর ম্যাক্রো
সংক্ষিপ্তসার
1।
#include <assert.h> void assert(scalar expression);
বিবরণ
2 অ্যাসেট ম্যাক্রো ডায়াগনস্টিক টেস্টগুলিকে প্রোগ্রামগুলিতে রাখে; এটি একটি অকার্যকর এক্সপ্রেশন প্রসারিত। যখন এটি কার্যকর করা হয়, যদি অভিব্যক্তি (যার মধ্যে একটি স্কেলারের প্রকার থাকবে) মিথ্যা (যা 0 এর সমান তুলনা করা হয়), তবে মীমাংসাকারী ম্যাক্রো ব্যর্থ হওয়া নির্দিষ্ট কল সম্পর্কিত তথ্য লিখবে (যুক্তির পাঠ্য সহ, নামটির নাম) উত্স ফাইল, উত্স রেখা নম্বর, এবং ঘের ফাংশনটির নাম - পরেরটি যথাক্রমে প্রাক-প্রসেসিং ম্যাক্রোগুলির মান
__FILE__
এবং__LINE__
এবং শনাক্তকারীর__func__
) একটি বাস্তবায়ন-সংজ্ঞায়িত বিন্যাসে স্ট্যান্ডার্ড ত্রুটির প্রবাহের মান। 165) এটি পরিত্যক্ত ফাংশনটিকে কল করে।রিটার্নস
3 দাবী ম্যাক্রো কোনও মূল্য দেয় না।
অন্যথায় এবং প্রিন্টএফের তুলনায় স্বাভাবিক হিসাবে অ্যাসেস্ট () ফাংশনটি ব্যবহারের প্রধান তিনটি কারণ রয়েছে
assert () ফাংশনটি মূলত ডিবাগিং পর্যায়ে ব্যবহৃত হয়, প্রিন্টফ স্টেটমেন্ট সহ প্রতিবার আপনি এমন একটি শর্ত পরীক্ষা করতে চান যা লিখে চূড়ান্ত কোডে নাও যেতে পারে, লিখতে কষ্টকর লাগে।
বৃহত সফ্টওয়্যার মোতায়েনের ক্ষেত্রে, আসর্টটি খুব সহজেই আসে যেখানে আপনি সংক্ষেপক () ফাংশনটির জন্য শিরোনাম ফাইলটির সাথে সংযুক্ত হওয়ার আগে সংজ্ঞায়িত NDEBUG ম্যাক্রো ব্যবহার করে সংক্ষিপ্ত বিবৃতি উপেক্ষা করতে পারেন।
প্রতিস্থাপন () কার্যকর হয় যখন আপনি কোনও ফাংশন বা কিছু কোড ডিজাইন করেন এবং কোডটি কী সীমাবদ্ধ করে এবং কী কাজ করে না তা সম্পর্কে ধারণা পেতে চান এবং অবশেষে এটি অনুমানের সাথে খেলে মূল্যায়ন করার জন্য অন্য কোনওটি অন্তর্ভুক্ত করে।
এটি এমন একটি ফাংশন যা এটির মূল্যায়ন যদি ভুয়া হয় তবে প্রোগ্রামের প্রয়োগটি থামিয়ে দেবে। সাধারণত এটি ম্যাক্রো দ্বারা বেষ্টিত থাকে যাতে রিলিজ সেটিংসের সাথে সংকলিত হওয়ার পরে এটি ফলাফল বাইনারিতে সংকলিত হয় না।
এটি আপনার তৈরি অনুমানগুলি পরীক্ষা করার জন্য ব্যবহার করার জন্য ডিজাইন করা হয়েছে। উদাহরণ স্বরূপ:
void strcpy(char* dest, char* src){
//pointers shouldn't be null
assert(dest!=null);
assert(src!=null);
//copy string
while(*dest++ = *src++);
}
আপনি যে আদর্শটি চান তা হ'ল আপনি আপনার প্রোগ্রামে একটি ত্রুটি তৈরি করতে পারেন, যেমন অবৈধ যুক্তি দিয়ে কোনও ফাংশন কল করা এবং আপনি সেগফোল্টসের আগে একটি দৃ as়তার সাথে আঘাত করেন (বা প্রত্যাশা অনুযায়ী কাজ করতে ব্যর্থ হন)
এছাড়াও, আপনি গতিশীল বরাদ্দ সফল হয়েছিল কিনা তা পরীক্ষা করতে এটি ব্যবহার করতে পারেন।
কোড উদাহরণ:
int ** p;
p = new int * [5]; // Dynamic array (size 5) of pointers to int
for (int i = 0; i < 5; ++i) {
p[i] = new int[3]; // Each i(ptr) is now pointing to a dynamic
// array (size 3) of actual int values
}
assert (p); // Check the dynamic allocation.
অনুরূপ, একই, সমতুল্য:
if (p == NULL) {
cout << "dynamic allocation failed" << endl;
exit(1);
}
new
বরাদ্দ ব্যর্থতা যদি না আপনি উল্লেখ উপর একটি ব্যতিক্রম ছোঁড়ার nothrow
(যা তুমি এখানে না)। তদুপরি, আপনার ফর্ম্যাটটি অদ্ভুত এবং exit
খারাপ।
assert()
কখনও কখনও ঘটবে না এমন জিনিসগুলি ডিবাগিং এবং স্ট্যাম্পিংয়ের জন্য।