"দাবী" ফাংশন কী?


261

আমি ওপেনসিভি টিউটোরিয়াল অধ্যয়ন করছি এবং assertফাংশন জুড়ে এসেছি ; এটার কাজ কি?


20
ম্যানের কাছ থেকে প্রাপ্ত নোটটি লক্ষ্য করুন: "দাবী () একটি ম্যাক্রো হিসাবে প্রয়োগ করা হয়েছে; যদি পরীক্ষা করা এক্সপ্রেশনটির পার্শ্ব-প্রতিক্রিয়া থাকে তবে এনডিইবিউজি সংজ্ঞায়িত করা আছে কিনা তার উপর নির্ভর করে প্রোগ্রামের আচরণটি ভিন্ন হবে This । "
জোহানেস স্কাউব - 10


35
@ এস.লট এখন গুগল সন্ধানকারী লোকেরা এই পৃষ্ঠাকে শীর্ষ অনুসন্ধানের ফলাফল হিসাবে সন্ধান করবে, তাদের প্রশ্নের উত্তম সমালোচিত উত্তর প্রদান করবে এবং একই সাথে স্ট্যাক ওভারফ্লো প্রচার করবে, সুতরাং এটি আমার কাছ থেকে একটি +1!
ম্যাট গ্রাম

6
এটা আমার কাছ থেকে একটি -1। শীর্ষস্থানীয় অনুসন্ধানের ফলাফলটি ডকুমেন্টেশন হওয়া উচিত যা ওপিকে প্রথমে পরামর্শ করা উচিত।
অরবিট

9
@LightnessRacesinOrbit। আমাকে অলস বলুন, তবে আমি নিজের মতো বুদ্ধিমান এসও ব্যবহারকারীরা যে ডকুমেন্টেশনগুলির সংক্ষিপ্তসার, সংক্ষিপ্ত বিবরণ এবং ডকুমেন্টেশনের রিডিং ব্যাখ্যা করে তা ব্যবহার করতে পছন্দ করি। আমার আন্তরিক ধন্যবাদ :)
টাইসন হিলমার 26'18

উত্তর:


297

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় প্রতিজ্ঞাগুলি কেবল বিকাশকারী দ্বারা ধরে নেওয়া জিনিসগুলি পরীক্ষা করতে ব্যবহার করা উচিত, উদাহরণস্বরূপ, ব্যবহারকারী একটি চিঠির পরিবর্তে একটি সংখ্যা প্রবেশ করান (যা হওয়া উচিত অন্যান্য উপায়ে পরিচালিত)।


49
" assertসাধারণত একটি ব্যতিক্রম উত্থাপন করে" - সি ++ এ এটি "ব্যতিক্রম" উত্থিত হয় না এটি একে গর্ভপাত বলে ... এটি কিছুটা আলাদা।
আরটিয়াম

5
আমি মনে করি না যে উত্তরটি প্রশ্নটি ট্যাগ করা (সি এবং সি ++) হিসাবে একই ভাষাগুলি সম্পর্কে। সি এবং সি ++ এ, দাবিটি একটি ব্যতিক্রম বাড়ায় না, এটির চারপাশে তার যুক্তি রয়েছে, এবং #চরিত্রটি কোনও মন্তব্য দেয় না।
স্টিভ জেসপ

এখানে আপনার বিকল্পগুলি রয়েছে: উত্তরটিকে সম্প্রদায়-উইকিতে তৈরি করুন এবং অন্যকে সঠিক তথ্য রাখার অনুরোধ জানিয়ে পুরানো জিনিসগুলি সরিয়ে আপনার প্রশ্ন সম্পাদনা করুন। এইভাবে, ডাউনভোটগুলি আপনার প্রতিনিধিকে প্রভাবিত করবে না এবং লোকেরা উত্তরটি উন্নত করতে পারে।
জোহানেস স্কাউব -

2
দৈর্ঘ্য> = 0 টি দৈর্ঘ্য NaN হলে
আন্ড্রেয়াস

1
বর্তমানে, ভিএস ২০১৫-তে, ত্রুটি বার্তার সাথে জোর দেওয়া কাজ করবে না কারণ এটি অর্ডার থেকে বহিষ্কার। এটি হওয়া উচিতassert("error message", expression)
ডুসকিংটন

102

জাহির কম্পিউটার বিবৃতি বিবৃতি অনুরূপ নিশ্চিত করুন ইংরেজিতে।


131
ভাল, বেশ না। "নিশ্চিত করুন যে লাইটটি বন্ধ আছে" এর অর্থ "লাইটটি পরীক্ষা করুন এবং এটি চালু থাকলে এটি বন্ধ করুন," না "লাইটটি বন্ধ আছে কিনা এবং দয়া করে বিস্ফোরণ হয় কিনা তা দেখুন না।" আমি বলব "ডাবল-চেক" একটি কাছাকাছি অনুবাদ।
লুক মোরার

7
@ লুক, এটি ইংরেজি ভাষার বিস্ময়কর চিত্র তুলে ধরেছে যে ভাষা একই কথা বলার অনেক উপায় সরবরাহ করে। তবে দৃsert়তা বিবেচনা করুন (দৈর্ঘ্য> 0)। সুতরাং আমরা যে অনুবাদ করতে পারেন "দুবার চেক পরিমাণটিকে শূন্যতে তার চেয়ে অনেক বেশী হয়" বা "নিশ্চিত পরিমাণটিকে শূন্যতে তার চেয়ে অনেক বেশী হয়" । উভয় বিকল্প পরিষ্কারভাবে কাজ করার সময়, আমি এখনও আমার পছন্দ করি;)
ব্লেক 7

4
ওয়েল, কিন্তু অন্যান্য ব্যাখ্যা "হয় করা পরিমাণটিকে শূন্যতে থেকে বেশি হতে।" সুতরাং আরও কিছুটা অস্পষ্টতা আছে।
লুক মোরার

29
এটি ইংরেজী ক্রিয়া "দাবী" এর সাথে আরও সাদৃশ্যপূর্ণ
স্টিভ কার্টার

প্রকৃতপক্ষে, "নিশ্চিত করুন" এর অর্থ "চেক, এবং ঠিক না থাকলে, পরিবর্তন করুন" হিসাবে ব্যাখ্যা করা যেতে পারে।
এরিক বনগার

14

একবার দেখুন

সি (+) উদাহরণস্বরূপ সি ++ এ প্রোগ্রাম

অনেক সংকলক একটি প্রতিস্থাপন () ম্যাক্রো সরবরাহ করে। প্রতিস্থাপন () ম্যাক্রো সত্য প্রত্যাবর্তন করে যদি এর পরামিতি সত্যকে মূল্যায়ন করে এবং যদি এটি মিথ্যা মূল্যায়ন করে তবে এক ধরণের পদক্ষেপ নেয়। অনেক সংকলক ব্যর্থ হয় এমন এক প্রতিবেদনে প্রোগ্রামটি বাতিল করে দেবে; অন্যরা ব্যতিক্রম নিক্ষেপ করবে

অ্যাসেট () ম্যাক্রোর একটি শক্তিশালী বৈশিষ্ট্য হ'ল ডিইবিইউজি সংজ্ঞায়িত না করা হলে প্রিপ্রসেসর এটিকে কোনও কোডের মধ্যেই ভেঙে দেয়। এটি উন্নয়নের সময় একটি দুর্দান্ত সহায়তা, এবং চূড়ান্ত পণ্য জাহাজগুলি যখন কার্য সম্পাদনযোগ্য সংস্করণের আকারে কোনও পারফরম্যান্স পেনাল্টি বা বৃদ্ধি পায় না।

যেমন

#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

11
"যদি এনডিইবিউজি সংজ্ঞায়িত করা হয়" না?
রিচএন

2
সে সম্পর্কে "অনেক সংকলক" কী? এমএসভিসি এবং জিসিসি উভয়ই এই একটির সাথে সম্মতিযুক্ত। কোন নন-কমপ্লায়েন্ট কম্পাইলার: দৃsert়তা নেই; কোনও বার্তা মুদ্রণ করবেন না এবং যখন একটি দৃsert়তা ব্যর্থ হয়; যথাযথ NDEBUG এর পরিবর্তে DEBUG ব্যবহার করবেন?
স্টিভ জেসপ

Lmao, অবশ্যই এটি জাভা-নমুনা নামক একটি ওয়েবসাইট যা এটি এত ভুল হয়ে যায়।
আন্ডারস্কোর_১

6

প্রতিস্থাপন () ফাংশন প্রোগ্রাম বাগগুলি নির্ণয় করতে পারে। সি-তে এটি সংজ্ঞায়িত হয় <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

ত্রুটির বার্তা: অস্বাভাবিক প্রোগ্রাম সমাপ্তি

আপনার ত্রুটি বার্তাটি আপনার সিস্টেম এবং সংকলকের উপর নির্ভর করে ভিন্ন হতে পারে, তবে সাধারণ ধারণাটি একই।


আপনি কীভাবে আপনার নমুনা প্রোগ্রাম দৃsert়তার সাথে কাজ করে তা ব্যাখ্যা করেছেন। কীভাবে দৃ .়ভাবে কাজ করে তা নয়। কীভাবে এটি প্রোগ্রামটি অস্বাভাবিকভাবে শেষ করে? এটা কি একরকম ব্যতিক্রম ছুঁড়ে? কি ধরনের? এটি একটি বিশেষ সংকেত তৈরি করে? কি সংকেত? কোনও ধরণের সি ++ ট্রাই-ক্যাচ প্রক্রিয়া দ্বারা দৃ ?়তাগুলি "ধরা" যেতে পারে?
মোটি শ্নের

4

'ব্যতিক্রম উত্থাপন' এবং 'হোল্ট এক্সিকিউশন' এর মতো স্টাফ বেশিরভাগ সংকলকের ক্ষেত্রে সত্য হতে পারে তবে সবার জন্য নয়। (বিটিডাব্লু, এমন কি বক্তব্য রয়েছে যা সত্যই ব্যতিক্রম ছুঁড়ে?)

সি 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-বিটস সীমানায় সংযুক্ত রয়েছে, তাই সংকলকটি এ জাতীয় প্রান্তিককরণের জন্য তৈরি নির্দিষ্ট নির্দেশাবলী তৈরি করতে পারে।


1
যদি দাবিটি মিথ্যা হয় এবং এনডিইবিউজি সেট না করা হয় তবে তারা কী করবে? যদি এটি <assert.h> থেকে আসর করা সংস্করণ হয় তবে মানকটির জন্য এটি কোনও বার্তা মুদ্রণ এবং বাতিল করতে হবে। স্পষ্টতই স্ট্যান্ডার্ডটি বলে না যে তাদেরকে বিবৃতিটির সত্যের ভিত্তিতে অনুকূলিতকরণের অনুমতি দেওয়া হচ্ছে না, তবে অনুগত হতে হবে যদি এটি মিথ্যা হয় তবে তাদের বাতিল করতে হবে।
স্টিভ জেসপ

1
তারা মান আচরণ অনুসরণ
stijn

1

সি ++ 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 দাবী ম্যাক্রো কোনও মূল্য দেয় না।


1

অন্যথায় এবং প্রিন্টএফের তুলনায় স্বাভাবিক হিসাবে অ্যাসেস্ট () ফাংশনটি ব্যবহারের প্রধান তিনটি কারণ রয়েছে

  1. assert () ফাংশনটি মূলত ডিবাগিং পর্যায়ে ব্যবহৃত হয়, প্রিন্টফ স্টেটমেন্ট সহ প্রতিবার আপনি এমন একটি শর্ত পরীক্ষা করতে চান যা লিখে চূড়ান্ত কোডে নাও যেতে পারে, লিখতে কষ্টকর লাগে।

  2. বৃহত সফ্টওয়্যার মোতায়েনের ক্ষেত্রে, আসর্টটি খুব সহজেই আসে যেখানে আপনি সংক্ষেপক () ফাংশনটির জন্য শিরোনাম ফাইলটির সাথে সংযুক্ত হওয়ার আগে সংজ্ঞায়িত NDEBUG ম্যাক্রো ব্যবহার করে সংক্ষিপ্ত বিবৃতি উপেক্ষা করতে পারেন।

  3. প্রতিস্থাপন () কার্যকর হয় যখন আপনি কোনও ফাংশন বা কিছু কোড ডিজাইন করেন এবং কোডটি কী সীমাবদ্ধ করে এবং কী কাজ করে না তা সম্পর্কে ধারণা পেতে চান এবং অবশেষে এটি অনুমানের সাথে খেলে মূল্যায়ন করার জন্য অন্য কোনওটি অন্তর্ভুক্ত করে।


0

এটি এমন একটি ফাংশন যা এটির মূল্যায়ন যদি ভুয়া হয় তবে প্রোগ্রামের প্রয়োগটি থামিয়ে দেবে। সাধারণত এটি ম্যাক্রো দ্বারা বেষ্টিত থাকে যাতে রিলিজ সেটিংসের সাথে সংকলিত হওয়ার পরে এটি ফলাফল বাইনারিতে সংকলিত হয় না।

এটি আপনার তৈরি অনুমানগুলি পরীক্ষা করার জন্য ব্যবহার করার জন্য ডিজাইন করা হয়েছে। উদাহরণ স্বরূপ:

void strcpy(char* dest, char* src){
    //pointers shouldn't be null
    assert(dest!=null);
    assert(src!=null);

    //copy string
    while(*dest++ = *src++);
}

আপনি যে আদর্শটি চান তা হ'ল আপনি আপনার প্রোগ্রামে একটি ত্রুটি তৈরি করতে পারেন, যেমন অবৈধ যুক্তি দিয়ে কোনও ফাংশন কল করা এবং আপনি সেগফোল্টসের আগে একটি দৃ as়তার সাথে আঘাত করেন (বা প্রত্যাশা অনুযায়ী কাজ করতে ব্যর্থ হন)


আমরা & কেন & কেবল কিছু লগিংয়ের তথ্য যুক্ত করতে ব্যবহার করব না?
আসাদ খান

1
কারণ আপনার কখনই আরআরসিপিপি-তে কোনও নাল পয়েন্টার পাস করা উচিত নয়। এটি সেই জিনিসগুলির মধ্যে একটি যা হ'ল উচিত নয়। যদি কোনও নাল পয়েন্টারটি পাস হয়ে যায় তবে এটি নির্দেশ করে যে উচ্চ স্তরের কিছু গণ্ডগোল হয়েছে। সর্বোপরি অপ্রত্যাশিত ডেটা মানগুলির কারণে সমস্যাটি থেকে প্রোগ্রামটি আরও ক্র্যাশ করে ফেলতে হবে (হয় ডেস্টটি ভুল বা নাল হচ্ছে)।
ইয়াকোবি

-5

এছাড়াও, আপনি গতিশীল বরাদ্দ সফল হয়েছিল কিনা তা পরীক্ষা করতে এটি ব্যবহার করতে পারেন।

কোড উদাহরণ:

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);
}

3
নং newবরাদ্দ ব্যর্থতা যদি না আপনি উল্লেখ উপর একটি ব্যতিক্রম ছোঁড়ার nothrow(যা তুমি এখানে না)। তদুপরি, আপনার ফর্ম্যাটটি অদ্ভুত এবং exitখারাপ।
অরবিট

হ্যাঁ তুমিই ঠিক. আমি যোগ করতে ভুলে গেছি। আপনি কীভাবে প্রস্থানের পরিবর্তে ব্যবহার করবেন তা দেখতে পছন্দ করবেন
সাদিকভ

1
@ সাদিকভ অন্য যে কোনও কোড ব্যবহার করে এমন ত্রুটিযুক্ত শর্তটি পরিচালনা করবে যা রিলিজ মোডে নির্মাণের সময় সম্পূর্ণ অপসারণ করা হয় না এবং এর ফলে আপনার ব্যবহারকারীদের সুরক্ষা ছাড়াই এবং অপরিজ্ঞাত আচরণের করুণায় রেখে যদি পূর্বশর্তটি সন্তুষ্ট না হয় এবং এর জন্য ধন্যবাদ, কখনই চেক করে ধরা পড়েনি । একটি রিলিজ বিল্ড তৈরির অনেক আগে - কেবল কখনওassert() কখনও কখনও ঘটবে না এমন জিনিসগুলি ডিবাগিং এবং স্ট্যাম্পিংয়ের জন্য।
আন্ডারস্কোর_১
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.