সি তে মডুলার ফার্মওয়্যার ডিজাইনের জন্য মেমরি বরাদ্দ করার সম্ভাবনা


16

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

এই মুহুর্তে, আমি ভাবছি যে মডিউল বর্ণনা করে কাঠামোর জন্য বরাদ্দ মেমরির সেরা পদ্ধতির কী হতে পারে। যদি সম্ভব হয় তবে আমি নিম্নলিখিতগুলি চাই:

  • অস্বচ্ছ স্ট্রাক্ট, সুতরাং স্ট্রাক্ট কেবল সরবরাহ করা ইন্টারফেস ফাংশন ব্যবহারের মাধ্যমে পরিবর্তিত হতে পারে
  • একাধিক দৃষ্টান্ত
  • লিঙ্কার দ্বারা বরাদ্দ মেমরি

আমি নিম্নলিখিত সম্ভাবনাগুলি দেখতে পাচ্ছি, আমার লক্ষ্যগুলির সাথে এটির সমস্ত দ্বন্দ্ব রয়েছে:

বিশ্বব্যাপী ঘোষণা

লিঙ্কার দ্বারা বরাদ্দকৃত একাধিক উদাহরণ, তবে স্ট্রাকটি অস্বচ্ছ নয়

(#includes)
module_struct module;

void main(){
   module_init(&module);
}

যদি malloc

অস্বচ্ছ স্ট্রাক্ট, একাধিক উদাহরণ, তবে স্তূপে অ্যালকোশন

মডিউলে। h:

typedef module_struct Module;

মডিউল.২০ ডি ইন ফাংশনে, বরাদ্দ মেমরিতে ম্যালোক এবং রিটার্ন পয়েন্টার

module_mem = malloc(sizeof(module_struct ));
/* initialize values here */
return module_mem;

মেন

(#includes)
Module *module;

void main(){
    module = module_init();
}

মডিউল ঘোষণা

অস্বচ্ছ স্ট্রাক্ট, লিঙ্কার দ্বারা বরাদ্দ, উদাহরণগুলির একটি পূর্বনির্ধারিত সংখ্যা

পুরো স্ট্রাক্ট এবং মেমরিটিকে মডিউলটিতে অভ্যন্তরীণ রাখুন এবং কোনও হ্যান্ডলার বা কাঠামো কখনই প্রকাশ করবেন না।

(#includes)

void main(){
    module_init(_no_param_or_index_if_multiple_instances_possible_);
}

এইগুলি কোনওভাবে অস্বচ্ছ স্ট্রাক্ট, গাদা বরাদ্দের পরিবর্তে লিংক এবং একাধিক / কোনও সংখ্যক উদাহরণের জন্য একত্রিত করার বিকল্প রয়েছে?

সমাধান

নীচে কিছু উত্তরে প্রস্তাবিত হিসাবে, আমি মনে করি সবচেয়ে ভাল উপায় হ'ল:

  1. মডিউল উত্স ফাইলে মোডু_এমএক্স.এনপিএসটিএনএসএসি মডিউলগুলির জন্য স্থান সংরক্ষণ করুন
  2. মডিউলটিকে নিজের মধ্যে MODULE_MAX_INSTANCE_COUNT সংজ্ঞায়িত করবেন না
  3. মডিউল ব্যবহারকারীরা এই সীমাবদ্ধতা সম্পর্কে অবগত আছেন এবং অ্যাপ্লিকেশনটির জন্য সর্বাধিক সংখ্যক উদাহরণ চেয়েছিল তা নিশ্চিত করার জন্য মডিউলগুলি শিরোনামের ফাইলটিতে একটি # আইডিফডিএফ MODULE_MAX_INSTANCE_COUNT # ত্রুটি যুক্ত করুন
  4. উদাহরণের সূচনাতে ডেসক্রিপটিভ স্ট্রাক্টের মেমরি ঠিকানা (* অকার্যকর) বা মডিউল সূচক (আপনি যা পছন্দ করেন) তা ফেরত দিন

12
বেশিরভাগ এম্বেড এমএফডাব্লু ডিজাইনার মেমরির ব্যবহার নির্বাহী এবং সহজ রাখতে গতিশীল বরাদ্দ এড়িয়ে চলেছে। বিশেষত যদি এটি খালি ধাতব হয় এবং মেমরিটি পরিচালনা করতে অন্তর্নিহিত ওএস না থাকে।
ইউজিন শ।

ঠিক ঠিক, কেন আমি লিঙ্কারটি বরাদ্দ করতে চাই ts
এল। হেইনরিচস

4
আমি নিশ্চিতভাবে বুঝতে পারি না আমি বুঝতে পারছি না ... যদি আপনার যদি ডায়নামিক সংখ্যার উদাহরণ থাকে তবে লিঙ্কার দ্বারা বরাদ্দ হওয়া মেমরিটি কীভাবে আপনি পেতে পারেন? এটা আমার কাছে বেশ অরগানীয় বলে মনে হচ্ছে।
jcaron

কেন লিঙ্কারটিকে একটি বড় মেমরি পুল বরাদ্দ করতে দেওয়া হবে না এবং সেখান থেকে আপনার নিজস্ব বরাদ্দও করুন, এটি আপনাকে শূন্য ওভারহেড বরাদ্দকারীর সুবিধাও দেয়। বরাদ্দকরণের ক্রিয়াটি আপনি ফাইলটিতে পুল অবজেক্টটিকে স্থির করতে পারেন যাতে এটি ব্যক্তিগত private আমার কিছু কোডে, আমি বিভিন্ন থ্রি রুটিনগুলিতে সমস্ত বরাদ্দ করি, তারপরে আমি কতটা বরাদ্দ ছিল তার পরে মুদ্রণ করি, সুতরাং চূড়ান্ত উত্পাদন সংকলনে আমি পুলটিকে সঠিক আকারে সেট করি।
লি ড্যানিয়েল ক্রকার

2
যদি এটি একটি সংকলন-সময় সিদ্ধান্ত হয়, আপনি কেবল আপনার মেকফিল বা সমমানের মধ্যে নম্বরটি সংজ্ঞায়িত করতে পারেন এবং আপনি সম্পূর্ণ প্রস্তুত। নম্বরটি মডিউলটির উত্সে থাকবে না তবে এটি অ্যাপ্লিকেশন নির্দিষ্ট হবে এবং আপনি কেবলমাত্র পরামিতি হিসাবে একটি উদাহরণ নম্বর ব্যবহার করেন।
জ্যাকারন

উত্তর:


4

এগুলি কোনওভাবে বেনামে কাঠামো, গাদা বরাদ্দের পরিবর্তে লিঙ্কার এবং একাধিক / কোনও সংখ্যক উদাহরণের জন্য একত্রিত করার বিকল্প রয়েছে?

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

তারপরে প্রকৃত স্ট্রাক্ট ঘোষণা এবং এর সাথে সম্পর্কিত সমস্ত ফাংশন যুক্ত উত্স ফাইলটি অভ্যন্তরীণ সংযোগের সাথে উদাহরণগুলির একটি অ্যারেও ঘোষণা করে। এটি হয় উদাহরণস্বরূপ পয়েন্টারগুলির বাহ্যিক সংযোগ সহ একটি অ্যারে সরবরাহ করে অথবা অন্যথায় সূচি দ্বারা বিভিন্ন পয়েন্টার অ্যাক্সেসের জন্য একটি ফাংশন। ফাংশনটির প্রকরণটি আরও কিছুটা মডুলার:

module.c

#include <module.h>

// 4 instances by default; can be overridden at compile time
#ifndef NUM_MODULE_INSTANCES
#define NUM_MODULE_INSTANCES 4
#endif

struct module {
    int demo;
};

// has internal linkage, so is not directly visible from other files:
static struct module instances[NUM_MODULE_INSTANCES];

// module functions

struct module *module_init(unsigned index) {
    instances[index].demo = 42;
    return &instances[index];
}

আমি অনুমান করি যে আপনি কীভাবে শিরোলেখার পরে স্ট্রাকটিকে একটি অসম্পূর্ণ প্রকার হিসাবে ঘোষণা করবেন এবং সমস্ত ফাংশন ( সেই ধরণের পয়েন্টারের শর্তে লিখিত ) ঘোষণা করবেন তা সম্পর্কে আপনি ইতিমধ্যে পরিচিত । উদাহরণ স্বরূপ:

module.h

#ifndef MODULE_H
#define MODULE_H

struct module;

struct module *module_init(unsigned index);

// other functions ...

#endif

এখন struct moduleআর অন্য অনুবাদ এককে অস্বচ্ছ হয় module.c, * এবং আপনি অ্যাক্সেস এবং কোন গতিশীল বরাদ্দ ছাড়া দৃষ্টান্ত কম্পাইল সময়ে সংজ্ঞায়িত সংখ্যা পর্যন্ত ব্যবহার করতে পারেন।


* যদি না আপনি অবশ্যই এর সংজ্ঞাটি অনুলিপি করেন না। module.hমুল বক্তব্যটি এটি করে না।


আমি মনে করি এটি ক্লাসের বাইরে থেকে সূচক পাস করার একটি বিজোড় নকশা। আমি যখন এই জাতীয় মেমরি পুলগুলি বাস্তবায়ন করি, তখন আমি সূচিটি একটি ব্যক্তিগত কাউন্টার হতে পারি, প্রতিটি বরাদ্দকৃত ইভেন্টের জন্য 1 দ্বারা বাড়িয়ে। যতক্ষণ না আপনি "NUM_MODULE_INSTANCES" পৌঁছেছেন, যেখানে কনস্ট্রাক্টর স্মৃতি ত্রুটির বাইরে চলে আসবে।
লুন্ডিন

এটি একটি সুস্পষ্ট পয়েন্ট, @ লন্ডিন। নকশার সেই দিকটি অনুমান করে যে সূচকের অন্তর্নিহিত তাত্পর্য রয়েছে, যা বাস্তবে হতে পারে বা নাও পারে। এটা তোলে হয় ওপি এর শুরু ক্ষেত্রে জন্য মামলা, যদিও জাভাস্ক্রিপ্টে গার্বেজ তাই হয়,। এ জাতীয় তাত্পর্য যদি বিদ্যমান থাকে তবে আরম্ভ না করেই উদাহরণ পয়েন্টার প্রাপ্তির উপায় সরবরাহ করে আরও সমর্থন করা যেতে পারে ।
জন বলিঞ্জার

সুতরাং মূলত আপনি এন মডিউলগুলির জন্য মেমরি সংরক্ষণ করেন, যতই ব্যবহার করা হবে না কেন, অ্যাপ্লিকেশন যদি এটি আরম্ভ করে তবে পরবর্তী অব্যক্ত উপাদানটিতে একটি পয়েন্টার ফিরিয়ে দিন। আমি কাজ করতে পারে অনুমান।
এল। হেইনিরিচস

@ এল.হিনেরিকস হ্যাঁ, এম্বেড থাকা সিস্টেমগুলি নির্বিচার প্রকৃতির। "অবিরত পরিমাণ অবজেক্টস" বা "অজানা পরিমাণ অবজেক্টস" বলে কোনও জিনিস নেই। অবজেক্টগুলি প্রায়শই সিঙ্গলেটন হয় (হার্ডওয়্যার ড্রাইভার), সুতরাং মেমরি পুলের প্রায়শই প্রয়োজন হয় না, কারণ কেবলমাত্র বস্তুর একক উদাহরণ উপস্থিত থাকবে।
লন্ডিন

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

22

আমি সি ++ এ ছোট মাইক্রো-কন্ট্রোলারগুলি প্রোগ্রাম করি যা আপনি যা চান ঠিক তা অর্জন করে।

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

শ্রেণীর অবজেক্টটি বিশ্বব্যাপী হতে পারে (সুতরাং আপনি লিঙ্ক-টাইমে জানেন যে সবকিছু ফিট হবে), বা মূলত স্ট্যাক-লোকাল। (অপরিজ্ঞাত গ্লোবাল আরম্ভের আদেশের কারণে আমি সি ++ গ্লোবাল পছন্দ করি না, তাই আমি স্ট্যাক-লোকালকেই পছন্দ করি)।

আমার পছন্দসই প্রোগ্রামিং শৈলীটি হল মডিউলগুলি স্ট্যাটিক ক্লাস, এবং তাদের (স্ট্যাটিক) কনফিগারেশনটি টেম্পলেট পরামিতি দ্বারা হয়। এটি প্রায় সমস্ত ওভারহড এড়িয়ে যায় এবং অপ্টিমাইজেশন সক্ষম করে। এটিকে এমন একটি সরঞ্জামের সাথে একত্র করুন যা স্ট্যাকের আকার গণনা করে এবং আপনি উদ্বেগ ছাড়াই ঘুমাতে পারেন :)

সি ++ এ কোডিংয়ের এই পথে আমার কথা: অবজেক্টস? না ধন্যবাদ!

এম্বেড / মাইক্রোকন্ট্রোলার প্রোগ্রামারগুলিকে প্রচুর পরিমাণে C ++ অপছন্দ বলে মনে হয় কারণ তারা মনে করে এটি তাদেরকে সমস্ত সি ++ ব্যবহার করতে বাধ্য করবে । এটি একেবারে প্রয়োজনীয় নয়, এবং এটি খুব খারাপ ধারণা হবে। (আপনি সম্ভবত সমস্ত সি ব্যবহার করেন না! হিপ, ভাসমান পয়েন্ট, সেটজ্যাম্প / লংজ্যাম্প, প্রিন্টফ, ...) ভাবুন


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

আরআইআইআই সম্পর্কে কথা বলছি: এটি আরও একটি সি ++ বৈশিষ্ট্য যা ছোট এমবেডেড সিস্টেমে খুব দরকারী, যদিও এটি (মেমরি বিলোপ) কারণটি বৃহত্তর সিস্টেমে সবচেয়ে বেশি ব্যবহৃত হয় (ছোট এম্বেডড সিস্টেমগুলি বেশিরভাগ গতিশীল মেমরি ডিলোকেসন ব্যবহার করে না)। কোনও সংস্থান লক করার কথা ভাবুন: আপনি লকড রিসোর্সটিকে একটি মোড়কের বস্তু হিসাবে তৈরি করতে পারেন, এবং লকিং র‌্যাপারের মাধ্যমে কেবলমাত্র সম্ভব হওয়া রিসোর্সে অ্যাক্সেসকে সীমাবদ্ধ করতে পারেন। মোড়ক সুযোগের বাইরে চলে গেলে, সংস্থানটি আনলক করা হয়। এটি লক না করেই অ্যাক্সেসকে বাধা দেয় এবং আনলকিংটি ভুলে যাওয়ার সম্ভাবনা অনেক বেশি করে দেয়। কিছু (টেমপ্লেট) যাদুতে এটি শূন্য-ওভারহেড হতে পারে।


মূল প্রশ্নটিতে সি উল্লেখ করা হয়নি, সুতরাং আমার সি ++ - কেন্দ্রিক উত্তর। এটি বাস্তব হলে অবশ্যই সি ....

আপনি ম্যাক্রো ট্র্যাকারি ব্যবহার করতে পারেন: আপনার স্টাটগুলি সর্বজনীনভাবে ঘোষণা করুন, তাই তাদের একটি প্রকার রয়েছে এবং বিশ্বব্যাপী বরাদ্দ করা যেতে পারে তবে তাদের উপাদানগুলির নাম ব্যবহারের বাইরে ছড়িয়ে দিন, যদি না কিছু ম্যাক্রো আলাদাভাবে সংজ্ঞায়িত হয়, যা আপনার মডিউলের .c ফাইলের ক্ষেত্রে। অতিরিক্ত সুরক্ষার জন্য আপনি মঙ্গলে সংকলনের সময়টি ব্যবহার করতে পারেন।

বা আপনার স্ট্রাক্টের একটি সর্বজনীন সংস্করণ রয়েছে যার এতে ব্যবহারযোগ্য কিছুই নেই এবং কেবলমাত্র আপনার .c ফাইলে ব্যক্তিগত সংস্করণ (ইউজফুল ডেটা সহ) রয়েছে এবং সেগুলি একই আকার বলে মনে করে। কিছুটা মেক-ফাইলের কৌশল এটিকে স্বয়ংক্রিয় করতে পারে।


@ লন্ডিনগুলি খারাপ (এম্বেড করা) প্রোগ্রামার সম্পর্কে মন্তব্য করে:

  • আপনি যে ধরণের প্রোগ্রামার বর্ণনা করেছেন তা সম্ভবত কোনও ভাষায় বিশৃঙ্খলা সৃষ্টি করবে। ম্যাক্রোর (সি এবং সি ++ তে উপস্থিত) একটি সুস্পষ্ট উপায়।

  • টুলিং কিছুটা সাহায্য করতে পারে। আমার ছাত্রদের জন্য আমি একটি বিল্ট স্ক্রিপ্ট আদেশ করি যা কোনও ব্যতিক্রম নয়, কোনও-আরটিটি নির্দিষ্ট করে না এবং হিপ ব্যবহার করা হয় বা কোড-আরম্ভকৃত গ্লোবাল উপস্থিত থাকাকালীন একটি লিঙ্কারের ত্রুটি দেয়। এবং এটি সতর্কতা = ত্রুটি নির্দিষ্ট করে এবং প্রায় সমস্ত সতর্কতা সক্ষম করে।

  • আমি টেমপ্লেটগুলি ব্যবহার করে উত্সাহিত করি তবে কনস্টেক্সপ্র এবং ধারণাগুলি সহ ধাতব প্রোগ্রাম কম এবং কম প্রয়োজন।

  • "বিভ্রান্ত আরডুইনো প্রোগ্রামারস" আমি অনেকটা আরডিনো (তারের, লাইব্রেরিতে কোডের প্রতিলিপি) প্রোগ্রামিং স্টাইলকে একটি আধুনিক সি ++ পদ্ধতির সাথে প্রতিস্থাপন করতে চাই যা ইজিয়ার, আরও সুরক্ষিত এবং দ্রুত এবং ছোট কোড তৈরি করতে পারে। যদি আমার কাছে সময় এবং ক্ষমতা থাকত ...


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

আপনি কেন (কেবল) সি ব্যবহার করছেন? হতে পারে এটি আপনাকে কমপক্ষে সি ++ বিবেচনা করার জন্য তাদেরকে বোঝানোর সুযোগ দেয় ... আপনি যা চান তা প্রয়োজনীয় সি (+ এর একটি ছোট অংশ) সি
ওয়াটার ভ্যান ওওইজেন

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

2
@ মিশেল একটি শখের প্রকল্পের জন্য আপনি ভাষা চয়ন করতে পারেন? সি ++ নিন!
ওয়াউটার ভ্যান ওইজেন

4
এম্বেডের জন্য ভাল সি ++ প্রোগ্রাম লেখার পক্ষে এটি সম্পূর্ণভাবে সম্ভব, সমস্যাটি হ'ল কিছু এম্বেডেড সিস্টেম প্রোগ্রামারগুলির মধ্যে কিছু> 50% এখানে কোয়া্যাকস, বিভ্রান্ত পিসি প্রোগ্রামারস, আরডুইনো শখবিদ ইত্যাদি রয়েছে। এই ধরণের লোকেরা কেবল একটি ব্যবহার করতে পারবেন না সি ++ এর পরিষ্কার উপসেটটি, এমনকি যদি আপনি তাদের মুখের কাছে এটি ব্যাখ্যা করেন। তাদের সি ++ দিন এবং আপনি এটি জানার আগে, তারা পুরো এসটিএল, টেম্পলেট মেটাপোগ্রামিং, ব্যতিক্রম হ্যান্ডলিং, একাধিক উত্তরাধিকার এবং আরও অনেক কিছু ব্যবহার করবে। এবং ফলাফল অবশ্যই সম্পূর্ণ আবর্জনা। এটি, দুঃখের বিষয়, 10 এম্বেড থাকা সি ++ প্রকল্পের মধ্যে 8 টি কীভাবে শেষ হয়।
লন্ডিন

7

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


ভাল ধারণা, আমি অনুমান করি যে আমি ব্যবহার করতে পারব --- # নির্ধারিত বিল্ড_বিউজিউটি (শর্ত) ((শূন্য) আকারের (চর [1 - 2 * !! (শর্ত)])) --- বিল্ড_বিউজিবিউজিট (মাপের (রিয়েল_স্ট্রাক্ট)! = আকারের ( ভুয়া_সংক্রান্ত)) ----
এল। হেইনিরিচ

2

বেনামি স্ট্রাক্ট, সুতরাং স্ট্রাক্ট কেবল সরবরাহ করা ইন্টারফেস ফাংশন ব্যবহারের মাধ্যমে পরিবর্তিত হতে পারে

আমার মতে এটি অর্থহীন is আপনি সেখানে একটি মন্তব্য রাখতে পারেন, তবে এটিকে আরও আড়াল করার চেষ্টা করার কোনও অর্থ নেই।

সি কখনও এ জাতীয় উচ্চতর বিচ্ছিন্নতা সরবরাহ করবে না, এমনকি যদি কাঠামোর জন্য কোনও ঘোষণা নাও দেওয়া হয় তবে দুর্ঘটনাক্রমে এটিকে ওভাররাইট করা সহজ হবে যেমন ভুল ত্রুটিযুক্ত মেমকি () বা বাফার ওভারফ্লো।

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


2

খাঁটি এসডাব্লু প্রশ্নগুলি /programming/ এ আরও ভাল জিজ্ঞাসা করা হয় ।

কলারের কাছে অসম্পূর্ণ প্রকারের কাঠামোটি প্রকাশ করার মত ধারণাকে যেমন আপনি বর্ণনা করেন, প্রায়শই তাকে "অস্বচ্ছ টাইপ" বা "অস্বচ্ছ পয়েন্টার" বলা হয় - বেনামি কাঠামোর অর্থ পুরোপুরি অন্য কিছু।

এটির সাথে সমস্যাটি হ'ল কলার অবজেক্টের উদাহরণগুলি বরাদ্দ করতে সক্ষম হবে না, কেবল এটির দিকে নির্দেশ করবে। একটি পিসিতে আপনি malloc"কন্সট্রাক্টর" অবজেক্টগুলির অভ্যন্তরে ব্যবহার করতে পারেন তবে এম্বেডড সিস্টেমে ম্যালোক হ'ল না।

সুতরাং আপনি এম্বেডে যা করেন তা হ'ল একটি মেমরি পুল সরবরাহ করা। আপনার সীমিত পরিমাণে র‌্যাম রয়েছে, তাই তৈরি করা যায় এমন বস্তুর সংখ্যা সীমাবদ্ধ করা সাধারণত কোনও সমস্যা হয় না।

SO এ অস্বচ্ছ ডেটা ধরণের স্থিতিক বরাদ্দ দেখুন ।


ওউ আমার শেষের দিকে নামকরণের বিভ্রান্তি পরিষ্কার করার জন্য আপনাকে ধন্যবাদ জানায়, ওপিকে অসুবিধাগ্রস্থ করে না। আমি ওভারফ্লো স্ট্যাক করার কথা ভাবছিলাম, তবে সিদ্ধান্ত নিয়েছি যে আমি এমবেডেড প্রোগ্রামারগুলিকে বিশেষভাবে টার্গেট করতে চাই।
এল। হেইনরিচস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.