সি-এ লুপ (for, while), রিকার্সন, বা ম্যাক্রো এক্সপ্যানশন ছাড়া একটি কাজ বারবার করার একটি ট্রিক হলো setjmp এবং longjmp ব্যবহার করা। এটি <setjmp.h> হেডারে থাকে এবং এক্সসেপশন হ্যান্ডলিং-র পরোক্ষ বাস্তবায়ন।
ফাংশন সিগনেচার
int setjmp(jmp_buf env); // বর্তমান কনটেক্সট সেভ করে, ০ রিটার্ন
void longjmp(jmp_buf env, int val); // সেভ করা পয়েন্টে জাম্প করে, val রিটার্ন করায়
উদাহরণ: ৫ সংখ্যা ১০০ বার প্রিন্ট
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
int main() {
int x = 1;
setjmp(buf); // জাম্প পয়েন্ট সেট (প্রথমবারে ০ রিটার্ন)
printf("5"); // সংখ্যা প্রিন্ট
x++;
if (x <= 100)
longjmp(buf, 1); // buf-এ ফিরে যাও, setjmp ১ রিটার্ন করবে
return 0;
}
আউটপুট
5555555555555555555555555555555555555555555555555555555555555555555555555555
555555555555555555555555
(১০০ বার '৫' প্রিন্ট হয়েছে)
ব্যাখ্যা
setjmp(buf)প্রথমবারে কল হলে0রিটার্ন করে এবং প্রোগ্রাম normale চলেprintf("5")এক্সিকিউট হয়x++হয়ে ২ হয়longjmp(buf, 1)কল হলে কন্ট্রোল আবারsetjmp-এ ফিরে যায়, কিন্তু এইবারsetjmp1রিটার্ন করে- লুপ কন্ডিশন চেক হয়ে আবার জাম্প হয় — এটি ১০০ বার চলে
- স্ট্যাক আনওয়াইন্ডিং হয় না (ডেস্ট্রাক্টর/ক্লিনআপ কল হয় না — C++-এ ভয়ঙ্কর)
- রিসোর্স লিক হয় (ফাইল, লক, মেমরি)
- কোড পড়া ও ডিবাগ করা কঠিন হয়
- আধুনিক সি++-এ এক্সসেপশন (
try/catch) বা লুপ ব্যবহার করুন - লুপ আনরোলিং (ম্যানুয়ালি ১০০ লাইন লিখে)
printf("%0*s", 100, "");ট্রিক (প্রিন্ট ফরম্যাট এক্সপ্লয়িট)- রিকার্সন (যদি অনুমতিত থাকে)
সতর্কতা ⚠️
এটি শুধু শিক্ষামূলক/ট্রিক উদ্দেশ্যে। বাস্তব প্রোগ্রামে
setjmp/longjmp ব্যবহার করা দুৰ্ভিপ্রায়: