সি
গল্পের
আমার স্ত্রী পরিবার থেকে একটি বিড়াল উত্তরাধিকার সূত্রে প্রাপ্ত। † দুর্ভাগ্যক্রমে, আমি প্রাণীদের পক্ষে খুব অ্যালার্জি পেয়েছি। বিড়ালটি তার প্রাইমটি খুব ভালভাবেই কাটিয়েছিল এবং এটি পাওয়ার আগেই আমাদের ইথানাইজ করা উচিত ছিল, তবে সংবেদনশীল মানের কারণে সে এটিকে থেকে মুক্তি পেতে নিজেকে আনতে পারেনি। আমি আমার দুর্ভোগের অবসান ঘটাতে একটি পরিকল্পনা তৈরি করেছি ।
আমরা একটি বর্ধিত ছুটিতে যাচ্ছিলাম, কিন্তু সে পশুচিকিত্সকের অফিসে বিড়ালটিতে চড়াতে চায় নি। তিনি অসুস্থতার সংক্রমণ বা খারাপ আচরণের বিষয়ে উদ্বিগ্ন ছিলেন। আমি একটি স্বয়ংক্রিয় বিড়াল ফিডার তৈরি করেছি যাতে আমরা এটি বাড়িতে রেখে যেতে পারি। আমি সি তে মাইক্রোকন্ট্রোলারের ফার্মওয়্যারটি লিখেছিলাম ফাইলটি main
নীচের কোডের মতো দেখাচ্ছে।
তবে, আমার স্ত্রীও একজন প্রোগ্রামার এবং বিড়ালের প্রতি আমার অনুভূতিগুলি জানতেন, তাই তিনি এটিকে ঘরে বসে ছাড়তে সম্মত হওয়ার আগে একটি কোড-রিভিউয়ের উপর জোর দিয়েছিলেন। তার বেশ কয়েকটি উদ্বেগ ছিল, সহ:
main
একটি মান সম্মত স্বাক্ষর নেই (একটি হোস্টেড বাস্তবায়নের জন্য)
main
একটি মান দেয় না
tempTm
malloc
পরিবর্তে ডাকা হয়েছিল বলে অবিরাম ব্যবহার করা হয়calloc
- এর রিটার্ন মান
malloc
castালাই করা উচিত নয়
- মাইক্রোকন্ট্রোলারের সময়টি ভুল হতে পারে বা গড়িয়ে যেতে পারে (ওয়াই 2 কে বা ইউনিক্স সময় 2038 সমস্যার মতো)
elapsedTime
পরিবর্তনশীল যথেষ্ট পরিসর নাও থাকতে পারে
এটি অনেক দৃinc়প্রত্যয়মূলক লেগেছিল, কিন্তু শেষ পর্যন্ত তিনি সম্মত হন যে এগুলি বিভিন্ন কারণে সমস্যা ছিল না (এটি আমাদের কোনও দুর্ঘটনা দেয় নি যে আমরা আমাদের বিমানের জন্য ইতিমধ্যে দেরি করেছিলাম)। সরাসরি পরীক্ষার জন্য সময় না থাকায় তিনি কোডটি অনুমোদন করলেন এবং আমরা ছুটিতে গেলাম। যখন আমরা কয়েক সপ্তাহ পরে ফিরে এসেছি , তখন আমার বিড়ালের দুর্দশা শেষ হয়ে গেছে (যদিও এর ফলে আমি এখন আরও অনেক কিছু পেয়েছি)।
Tire পুরোপুরি কল্পিত দৃশ্য, কোনও উদ্বেগ নেই।
কোড
#include <time.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
//#include "feedcat.h"
// contains extern void FeedCat(struct tm *);
// implemented in feedcat.c
// stub included here for demonstration only
#include <stdio.h>
// passed by pointer to avoid putting large structure on stack (which is very limited)
void FeedCat(struct tm *amPm)
{
if(amPm->tm_hour >= 12)
printf("Feeding cat dinner portion\n");
else
printf("Feeding cat breakfast portion\n");
}
// fallback value calculated based on MCU clock rate and average CPI
const uintmax_t FALLBACK_COUNTER_LIMIT = UINTMAX_MAX;
int main (void (*irqVector)(void))
{
// small stack variables
// seconds since last feed
int elapsedTime = 0;
// fallback fail-safe counter
uintmax_t loopIterationsSinceFeed = 0;
// last time cat was fed
time_t lastFeedingTime;
// current time
time_t nowTime;
// large struct on the heap
// stores converted calendar time to help determine how much food to
// dispense (morning vs. evening)
struct tm * tempTm = (struct tm *)malloc(sizeof(struct tm));
// assume the cat hasn't been fed for a long time (in case, for instance,
// the feeder lost power), so make sure it's fed the first time through
lastFeedingTime = (size_t)(-1);
while(1)
{
// increment fallback counter to protect in case of time loss
// or other anomaly
loopIterationsSinceFeed++;
// get current time, write into to nowTime
time(&nowTime);
// calculate time since last feeding
elapsedTime = (int)difftime(nowTime, lastFeedingTime);
// get calendar time, write into tempTm since localtime uses an
// internal static variable
memcpy(&tempTm, localtime(&nowTime), sizeof(struct tm));
// feed the cat if 12 hours have elapsed or if our fallback
// counter reaches the limit
if( elapsedTime >= 12*60*60 ||
loopIterationsSinceFeed >= FALLBACK_COUNTER_LIMIT)
{
// dispense food
FeedCat(tempTm);
// update last feeding time
time(&lastFeedingTime);
// reset fallback counter
loopIterationsSinceFeed = 0;
}
}
}
অপরিবর্তিত আচরণ:
যাঁরা নিজেরাই ইউবি অনুসন্ধান করতে বিরত হন না তাদের জন্য:
এই কোডটিতে অবশ্যই স্থানীয়-নির্দিষ্ট, অনির্ধারিত, এবং বাস্তবায়ন-সংজ্ঞায়িত আচরণ রয়েছে তবে সকলকে সঠিকভাবে কাজ করা উচিত। সমস্যাটি নিম্নলিখিত কোডের লাইনগুলিতে থাকে: স্ট্যাকটি ছিন্ন করে বস্তুটির পরিবর্তে পয়েন্টারটি
struct tm * tempTm //...
//...
memcpy(&tempTm, localtime(&nowTime), sizeof(struct tm));
memcpy
ওভাররাইট করে tempTM
। এই মুছে ফেলা, অন্যান্য বিষয়ের ছাড়াও, elapsedTime
এবং loopIterationsSinceFeed
। মানগুলি মুদ্রিত করে এখানে একটি উদাহরণ রান করুন:
pre-smash : elapsedTime=1394210441 loopIterationsSinceFeed=1
post-smash : elapsedTime=65 loopIterationsSinceFeed=0
বিড়ালটিকে হত্যার সম্ভাবনা:
- সীমাবদ্ধ কার্যকর কার্যকর পরিবেশ এবং বিল্ড চেইন দেওয়া, অপরিবর্তিত আচরণ সর্বদা ঘটে।
- একইভাবে, অপরিবর্তিত আচরণ সর্বদা বিড়াল ফিডারকে ইচ্ছাকৃতভাবে কাজ করতে বাধা দেয় (বা বরং এটি "কাজ করতে" উদ্দেশ্য হিসাবে অনুমতি দেয়)।
- যদি ফিডার কাজ না করে তবে সম্ভবত বিড়াল মারা যাবে die এটি এমন কোনও বিড়াল নয় যা নিজের জন্য বাধা দিতে পারে এবং আমি প্রতিবেশীকে এটি সন্ধান করতে বলিনি।
আমি অনুমান করি যে বিড়ালটি সম্ভাব্যতার সাথে মারা যায় 0.995 ।