আমি আগ্রহী সুতরাং, তদন্ত গগলগুলি চালনার সময় এবং যেহেতু আমার উদ্ভাবক হওয়া দরকার আমার সংকলক বা সংকলনের পতাকাগুলিতে আমার অ্যাক্সেস নেই। এছাড়াও এই কোডটি সম্পর্কে কিছুই বোঝায় না কারণ এটি প্রতিটি ধারণা অনুমান করা খারাপ ধারণা নয়।
প্রথমে আসল প্রকারটি পরীক্ষা করা যাক gets
। এর জন্য আমার একটু কৌশল আছে:
template <class> struct Name;
int main() {
Name<decltype(gets)> n;
// keep this function call here
cout << FirstFactorial(gets(stdin));
return 0;
}
এবং এটি দেখতে ... সাধারণ:
/tmp/613814454/Main.cpp:16:19: warning: 'gets' is deprecated [-Wdeprecated-declarations]
Name<decltype(gets)> n;
^
/usr/include/stdio.h:638:37: note: 'gets' has been explicitly marked deprecated here
extern char *gets (char *__s) __wur __attribute_deprecated__;
^
/usr/include/x86_64-linux-gnu/sys/cdefs.h:254:51: note: expanded from macro '__attribute_deprecated__'
# define __attribute_deprecated__ __attribute__ ((__deprecated__))
^
/tmp/613814454/Main.cpp:16:26: error: implicit instantiation of undefined template 'Name<char *(char *)>'
Name<decltype(gets)> n;
^
/tmp/613814454/Main.cpp:12:25: note: template is declared here
template <class> struct Name;
^
1 warning and 1 error generated.
gets
অবচয় হিসাবে চিহ্নিত হয়েছে এবং স্বাক্ষর রয়েছে char *(char *)
। তবে কীভাবে FirstFactorial(gets(stdin));
সংকলন হয়?
আসুন অন্য কিছু চেষ্টা করুন:
int main() {
Name<decltype(gets(stdin))> n;
// keep this function call here
cout << FirstFactorial(gets(stdin));
return 0;
}
যা আমাদের দেয়:
/tmp/286775780/Main.cpp:15:21: error: implicit instantiation of undefined template 'Name<int>'
Name<decltype(8)> n;
^
অবশেষে আমরা কিছু পাচ্ছেন: decltype(8)
। সুতরাং gets(stdin)
পুরোটি পাঠ্যগতভাবে ইনপুট ( 8
) দ্বারা প্রতিস্থাপিত হয়েছিল ।
এবং জিনিসগুলি অস্থির হয়ে ওঠে। সংকলক ত্রুটি অবিরত:
/tmp/596773533/Main.cpp:18:26: error: no matching function for call to 'gets'
cout << FirstFactorial(gets(stdin));
^~~~
/usr/include/stdio.h:638:14: note: candidate function not viable: no known conversion from 'struct _IO_FILE *' to 'char *' for 1st argument
extern char *gets (char *__s) __wur __attribute_deprecated__;
সুতরাং এখন আমরা এর জন্য প্রত্যাশিত ত্রুটি পেয়েছি cout << FirstFactorial(gets(stdin));
আমি একটি ম্যাক্রো পরীক্ষা করেছি এবং যেহেতু #undef gets
কিছুই করার মতো মনে হচ্ছে এটি ম্যাক্রো নয় বলে মনে হচ্ছে।
কিন্তু
std::integral_constant<int, gets(stdin)> n;
এটি সংকলন করে
কিন্তু
std::integral_constant<int, gets(stdin)> n; // OK
std::integral_constant<int, gets(stdin)> n2; // ERROR wtf??
n2
লাইনে প্রত্যাশিত ত্রুটিটি সহ নয় ।
এবং আবারও, প্রায় কোনও পরিবর্তনই main
লাইনটিকে cout << FirstFactorial(gets(stdin));
প্রত্যাশিত ত্রুটিটি থেকে বের করে দেয়।
তবুও stdin
আসলে খালি মনে হচ্ছে।
সুতরাং আমি কেবল উপসংহারে অনুমান করতে পারি এবং তাদের অনুমান করতে পারি যে তাদের কাছে একটি সামান্য প্রোগ্রাম রয়েছে যা উত্সটি বিশ্লেষণ করে এবং gets(stdin)
পরীক্ষার কেস ইনপুট মানটি বাস্তবে সংকলকটিতে খাওয়ানোর আগে প্রতিস্থাপন করার চেষ্টা করে (খারাপভাবে) । কারও কাছে যদি আরও ভাল তত্ত্ব থাকে বা আসলে তারা কী করছে তা জানেন তবে শেয়ার করুন!
এটি অবশ্যই খুব খারাপ অনুশীলন। এটি গবেষণা করার সময় আমি জানতে পেরেছিলাম যে এখানে কমপক্ষে একটি প্রশ্ন রয়েছে ( উদাহরণস্বরূপ ) এবং কারণ লোকেরা বুঝতে পারে না যে সেখানে কোনও সাইট রয়েছে যারা এই কাজ করে তাদের উত্তর "হ'ল gets
ব্যবহার করুন ... পরিবর্তে" ব্যবহার করুন যা আসলেই একটি ভাল পরামর্শ তবে কেবল ওপিকে আরও বিভ্রান্ত করে যেহেতু স্টিডিনের কাছ থেকে কোনও বৈধ পঠনের কোনও প্রচেষ্টা এই সাইটে ব্যর্থ হবে।
TLDR
gets(stdin)
অবৈধ সি ++। এই নির্দিষ্ট সাইটটি এটি ব্যবহার করে এমন একটি চালাকি ((কী কারণে আমি বুঝতে পারি না)। আপনি যদি সাইটে জমা দেওয়া চালিয়ে যেতে চান তবে (আমি এটির পক্ষেও সমর্থন দিচ্ছি না এবং এটি সমর্থনও করছি না) আপনাকে এই নির্মাণটি ব্যবহার করতে হবে যা অন্যথায় অর্থবোধ করে না, তবে সচেতন হন যে এটি ভঙ্গুর। প্রায় কোনও পরিবর্তনই main
ত্রুটি ছুঁড়ে দেবে। এই সাইটের বাইরে সাধারণ ইনপুট পড়ার পদ্ধতি ব্যবহার করুন।
stdin
স্ট্যান্ডার্ড লাইব্রেরিতে একটিFILE*
, এবং যে কোনও ধরণের রূপান্তরিত হয়char*
, যা আর্গুমেন্টের ধরণgets()
। যাইহোক, আপনার কখনও কখনও, কখনও কখনও কখনও অবহেলিত সি প্রতিযোগিতার বাইরে এই জাতীয় কোডটি লেখা উচিত নয়। যদি আপনার সংকলক এমনকি এটি গ্রহণ করে, আরও সতর্কতাযুক্ত পতাকা যুক্ত করুন এবং আপনি যদি এমন কোনও কোডবেস ঠিক করতে চেষ্টা করছেন যা এতে নির্মিত হয়েছে, সতর্কতাগুলিকে ত্রুটিতে পরিণত করুন।