আমাদের কত স্তরের পয়েন্টার থাকতে পারে?


443

*একক চলকগুলিতে কয়টি পয়েন্টার ( ) অনুমোদিত?

আসুন নিম্নলিখিত উদাহরণ বিবেচনা করা যাক।

int a = 10;
int *p = &a;

একইভাবে আমরা থাকতে পারে

int **q = &p;
int ***r = &q;

ইত্যাদি।

উদাহরণ স্বরূপ,

int ****************zz;

582
যদি এটি কখনও আপনার পক্ষে সত্যিকারের সমস্যা হয়ে দাঁড়ায়, আপনি খুব ভুল কিছু করছেন।
চোরমাস্টার

279
আপনার মস্তিষ্কের বিস্ফোরিত হওয়া বা সংকলক গলে যাওয়া - যত তাড়াতাড়ি ঘটে তা না হওয়া পর্যন্ত আপনি পয়েন্টারগুলির স্তরের যোগ করা চালিয়ে যেতে পারেন।
জেরেমিপি

47
যেহেতু একটি পয়েন্টারের কাছে পয়েন্টার আবার, ঠিক আছে, কেবলমাত্র একটি পয়েন্টার তাই কোনও তাত্ত্বিক সীমা থাকা উচিত নয়। সম্ভবত সংকলকটি কিছু হাস্যকর উচ্চ সীমার বাইরে এটি পরিচালনা করতে সক্ষম হবে না তবে ভাল ...
খ্রিস্টান রাউ

73
নতুন সি ++ এর সাথে আপনার কিছু ব্যবহার করা উচিতstd::shared_ptr<shared_ptr<shared_ptr<...shared_ptr<int>...>>>
জোসেফেক্স

44
@ জোসেফএক্স - এটি সি ++ স্ট্যান্ডার্ডে একটি সমস্যা দেখায় - ক্ষমতার দিকে স্মার্ট পয়েন্টার বাড়ানোর কোনও উপায় নেই। আমাদের তাত্ক্ষণিকভাবে (pow (std::shared_ptr, -0.3))<T> x;-0.3 ইন্ডিয়ারেশনের স্তরের জন্য সমর্থন করার জন্য একটি বর্ধনের দাবি করতে হবে ।
স্টিভ 314

উত্তর:


400

Cমান নির্দিষ্ট করে নিম্ন সীমা:

5.2.4.1 অনুবাদ সীমা

276 বাস্তবায়নটি কমপক্ষে একটি প্রোগ্রাম অনুবাদ ও সম্পাদন করতে সক্ষম হবে যা নিম্নলিখিত সীমাবদ্ধতার প্রতিটি অন্তত একটি উদাহরণ রয়েছে: [...]

279 - 12 পয়েন্টার, অ্যারে, এবং ফাংশন ঘোষক (যে কোনও সংমিশ্রণে) একটি গাণিতিক, কাঠামো, ইউনিয়ন বা শূন্য প্রকার পরিবর্তন করে

উপরের সীমাটি বাস্তবায়ন নির্দিষ্ট।


121
: সি ++ মান "বিশেষ পরামর্শ দেওয়া হচ্ছে" একটি বাস্তবায়ন সমর্থন অন্তত 256. (একাধিক ব্যতিক্রমী হওয়া উচিত পঠনযোগ্যতার বিশেষ পরামর্শ দেওয়া হচ্ছে যে, আপনি নিজে 2 অথবা 3 অতিক্রম, এবং তারপর এমনকি।) যে
জেমস Kanze

22
এই সীমাটি একক ঘোষণায় কতজন; আপনি একাধিক typedefs এর মাধ্যমে আপনি কতটা ইন্ডিরিয়ারেশন অর্জন করতে পারবেন তা উপরের গণ্ডিকে চাপিয়ে দেয় না ।
কাজ

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

5
অন্য একটি নোটে, আমি যদি লম্বা
গাধাটির ডিফেরেন্সিং শৃঙ্খলাযুক্ত

11
@ਬੇেলিলিয়াম: সাধারণত এই সংখ্যাগুলি প্রাক-মানককরণ সফ্টওয়্যার সমীক্ষা করে আসে। এই ক্ষেত্রে সম্ভবতঃ তারা সাধারণ সি প্রোগ্রাম এবং অস্তিত্ব সি কম্পাইলার দিকে তাকিয়ে অন্তত একটি কম্পাইলার যে বেশী 12 এবং / অথবা কোন প্রোগ্রাম যে যদি আপনাকে 12. এটা সীমাবদ্ধ কপর্দকশূন্য সমস্যা হবে পাওয়া

155

প্রকৃতপক্ষে, সি প্রোগ্রামগুলি সাধারণত অসীম পয়েন্টার ইন্ডিয়ারেশন ব্যবহার করে। এক বা দুটি স্থির স্তর সাধারণ। ট্রিপল ইন্ডিয়ারেশন বিরল is তবে অসীম খুব সাধারণ বিষয়।

অসীম পয়েন্টার ইন্ডিয়ারেশন একটি কাঠামোর সাহায্যে অর্জন করা হয়, অবশ্যই, সরাসরি ঘোষকের সাথে নয়, যা অসম্ভব হবে। এবং একটি কাঠামোর প্রয়োজন যাতে আপনি বিভিন্ন কাঠামোতে এই কাঠামোর অন্যান্য ডেটা অন্তর্ভুক্ত করতে পারেন যেখানে এটি শেষ হতে পারে।

struct list { struct list *next; ... };

এখন আপনি করতে পারেন list->next->next->next->...->next। এই সত্যিই শুধু একাধিক পয়েন্টার indirections হল: *(*(..(*(*(*list).next).next).next...).next).next.nextকাঠামোর প্রথম সদস্য হ'ল এবং মূলত এটি একটি নূপুর, তাই আমরা এটি হিসাবে কল্পনা করতে পারি ***..***ptr

আসলে এটির কোনও সীমাবদ্ধতা নেই কারণ লিঙ্কগুলি এ জাতীয় দৈত্য প্রকাশের চেয়ে লুপের সাহায্যে বিবর্তিত হতে পারে এবং তদুপরি, কাঠামোটি সহজেই বিজ্ঞপ্তিযুক্ত করা যায়।

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


48
এটি সম্পূর্ণ আলাদা ইস্যু, যদিও - অন্য কাঠামোর সাথে একটি পয়েন্টার যুক্ত স্ট্রাক্টটি পয়েন্টার-পয়েন্টারের চেয়ে খুব আলাদা। কোন আন্ত ***** একটি আন্তঃ **** এর থেকে স্বতন্ত্র ধরণের।
ফ্লাফি

12
এটি "খুব" আলাদা নয়। পার্থক্যটি fluffy হয়। এটি শব্দার্থবিদ্যার চেয়ে সিনট্যাক্সের আরও কাছাকাছি। একটি পয়েন্টার অবজেক্টের একটি পয়েন্টার, বা একটি স্ট্রাকচার অবজেক্টের একটি পয়েন্টার যার মধ্যে একটি পয়েন্টার রয়েছে? এটি একই ধরণের জিনিস। একটি তালিকার দশম উপাদানটিতে পৌঁছনো দশটি স্তরকে সম্বোধন করে নির্দেশ করে। (অবশ্যই, একটি অসীম গঠন প্রকাশ করার ক্ষমতা struct টাইপ অসম্পূর্ণ struct টাইপ মাধ্যমে নিজেই বিন্দু করতে সক্ষম হচ্ছে, যাতে উপর নির্ভর করে list->nextএবং list->next->nextএকই ধরনের হয়; অন্যথায় আমরা অসীম টাইপ গঠন করা হবে।)
Kaz

34
আমি "ফ্লুফি" শব্দটি ব্যবহার করার সময় আমি সচেতনভাবে খেয়াল করতে পারি নি যে আপনার নামটি ফ্লফি। অসচেতনতার প্রভাব? তবে আমি নিশ্চিত যে এই শব্দটি আগেও ব্যবহার করেছি।
কাজ

3
এছাড়াও মনে রাখবেন যে মেশিনের ভাষায়, আপনি ঠিক এমন কোনও কিছুতে পুনরাবৃত্তি করতে পারবেন LOAD R1, [R1]যতক্ষণ না R1 প্রতিটি পদক্ষেপে একটি বৈধ পয়েন্টার। "একটি ঠিকানা রাখে এমন শব্দ" ব্যতীত অন্য কোনও ধরণের জড়িত নেই। ঘোষিত প্রকারগুলি আছে কি না তা ইন্ডিয়ারেশন নির্ধারণ করে না এবং এর কত স্তর রয়েছে determine
কাজ

4
কাঠামোটি বৃত্তাকার হলে নয়। যদি R1নিজের অবস্থান নির্দেশ করে এমন কোনও অবস্থানের ঠিকানা ধরে রাখে তবে LOAD R1, [R1]অসীম লুপে কার্যকর করা যেতে পারে।
কাজ

83

তাত্ত্বিকভাবে:

আপনি যতটা ইন্ডিয়ারেশন চান আপনার কাছে থাকতে পারেন।

বাস্তবে:

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

এখানে উল্লেখ:

C99 স্ট্যান্ডার্ড 5.2.4.1 অনুবাদ সীমা:

- 12 পয়েন্টার, অ্যারে, এবং ফাংশন ডিক্লেয়ারার (কোনও সংমিশ্রণে) একটি ঘোষণায় একটি গাণিতিক, কাঠামো, ইউনিয়ন বা শূন্য প্রকার পরিবর্তন করে।

এটি প্রতিটি প্রয়োগকে অবশ্যই সমর্থন করবে এমন নিম্ন সীমাটি নির্দিষ্ট করে । নোট করুন যে একটি পাদদেশে মান আরও বলেছে:

18) বাস্তবায়নের ক্ষেত্রে যখনই সম্ভব স্থির অনুবাদ সীমা চাপানো উচিত।


16
ইন্ডিয়ারেশনগুলি কোনও স্ট্যাককে উপচে ফেলে না!
বেসাইল স্টারিঙ্কেভিচ

1
সংশোধন করা হয়েছে, ফাংশনটিতে প্যারামিটার সীমাবদ্ধ হওয়ার সীমা হিসাবে কিউ পড়ার এবং উত্তর দেওয়ার এই অনুভূতি আমার ছিল। কেন জানি না ?!
অলোক সেভ করুন

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

8
ইন্ডিয়ারেশনগুলি কোনও স্ট্যাককে উপচে ফেলে না! -> না! পার্সার স্ট্যাক উপচে পড়তে পারে। স্ট্যাক পয়েন্টার ইন্ডিয়ারেশনের সাথে কীভাবে সম্পর্কিত? পার্সার স্ট্যাক!
পবন মঞ্জুনাথ

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

76

লোকেরা যেমন বলেছে, "তত্ত্বের কোনও সীমা" নেই। যাইহোক, আগ্রহের বাইরে আমি এটি g ++ 4.1.2 দিয়ে চালিয়েছি এবং এটি 20,000 অবধি আকারে কাজ করেছে। সংকলন যদিও বেশ ধীর ছিল তাই আমি উচ্চতর চেষ্টা করিনি। সুতরাং আমি অনুমান করব যে জি ++ কোনও সীমাবদ্ধতা আরোপ করে না। ( size = 10এটি অবিলম্বে সুস্পষ্ট না হলে ptr.cpp স্থাপন এবং দেখার চেষ্টা করুন ))

g++ create.cpp -o create ; ./create > ptr.cpp ; g++ ptr.cpp -o ptr ; ./ptr

create.cpp

#include <iostream>

int main()
{
    const int size = 200;
    std::cout << "#include <iostream>\n\n";
    std::cout << "int main()\n{\n";
    std::cout << "    int i0 = " << size << ";";
    for (int i = 1; i < size; ++i)
    {
        std::cout << "    int ";
        for (int j = 0; j < i; ++j) std::cout << "*";
        std::cout << " i" << i << " = &i" << i-1 << ";\n";
    }
    std::cout << "    std::cout << ";
    for (int i = 1; i < size; ++i) std::cout << "*";
    std::cout << "i" << size-1 << " << \"\\n\";\n";
    std::cout << "    return 0;\n}\n";
    return 0;
}

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

63

চেক করতে মজা লাগে।

  • ভিজ্যুয়াল স্টুডিও 2010 (উইন্ডোজ 7 এ), এই ত্রুটিটি পাওয়ার আগে আপনার 1011 স্তর থাকতে পারে:

    মারাত্মক ত্রুটি C1026: পার্সার স্ট্যাক ওভারফ্লো, প্রোগ্রাম খুব জটিল

  • gcc (উবুন্টু), 100k + *ক্র্যাশ ছাড়াই! আমার ধারণা হার্ডওয়ারটি এখানে সীমাবদ্ধতা।

(কেবলমাত্র একটি পরিবর্তনশীল ঘোষণার মাধ্যমে পরীক্ষা করা)


5
প্রকৃতপক্ষে, আনারি অপারেটরগুলির জন্য প্রযোজনাগুলি রাইট-রিকার্সিভ, যার অর্থ হ'ল একটি শিফট-কমানো পার্সার *হ্রাস করতে সক্ষম হবার আগে সমস্ত নোডকে স্ট্যাকের মধ্যে সরিয়ে ফেলবে ।
কাজ

28

এখানে কোন সীমা নেই, উদাহরণ পরীক্ষা করুন

উত্তরটি "পয়েন্টারের স্তর" দ্বারা আপনি কী বোঝায় তার উপর নির্ভর করে। যদি আপনার অর্থ হয় "একক ঘোষণায় আপনি কত স্তরের ইন্ডিরিয়ারেশন পেতে পারেন?" উত্তর "কমপক্ষে 12"

int i = 0;

int *ip01 = & i;

int **ip02 = & ip01;

int ***ip03 = & ip02;

int ****ip04 = & ip03;

int *****ip05 = & ip04;

int ******ip06 = & ip05;

int *******ip07 = & ip06;

int ********ip08 = & ip07;

int *********ip09 = & ip08;

int **********ip10 = & ip09;

int ***********ip11 = & ip10;

int ************ip12 = & ip11;

************ip12 = 1; /* i = 1 */

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

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


7
প্রায় অবশ্যই একটি সীমা আছে, যেহেতু সংকলকটি একটি সীমাবদ্ধ মেমরির মধ্যে তথ্যের উপর নজর রাখে। ( g++98242 আমার মেশিনে একটি অভ্যন্তরীণ ত্রুটি সঙ্গে aborts আমি আশা যে প্রকৃত সীমা মেশিন এবং লোড উপর নির্ভর করবে আমি এই বাস্তব কোডে একটি সমস্যা হতে আশা করবেন না।।।)
জেমস Kanze

2
হ্যাঁ @ ম্যাথিউইউএম। : আমি কেবল তাত্ত্বিকভাবে বিবেচনা করেছি :) উত্তর শেষ করার জন্য জেমসকে ধন্যবাদ
নন্দকুমার টেকলে

3
ঠিক আছে, লিঙ্কযুক্ত তালিকাগুলি আসলে কোনও পয়েন্টারের কাছে নির্দেশক নয়, তারা এমন স্ট্রাক্টের পয়েন্টার যা একটি পয়েন্টারযুক্ত (তা হয় বা আপনি প্রচুর অপ্রয়োজনীয়
ingালাই

1
@ র্যান্ডম 832: নন্দ বলেছিলেন 'যদি আপনার অর্থ "রানটাইম সময়ে পয়েন্টার ইন্ডিরেশনের কত স্তর থাকতে পারে", তাই তিনি স্পষ্টভাবে পয়েন্টারগুলিতে পয়েন্টার (* এন) সম্পর্কে কথা বলার সীমাবদ্ধতাটি সরিয়ে দিয়েছিলেন।
LarsH

1
আমি আপনার বক্তব্যটি পাই না: ' এখানে কোনও সীমা নেই, উদাহরণটি এখানে দেখুন। 'উদাহরণের কোনও প্রমাণ নেই যে সীমা নেই। এটি কেবল প্রমাণিত করে যে একটি 12 তারা ইন্ডিয়ারেশন সম্ভব। circ_listওপি-র প্রশ্ন সম্পর্কিত কোনও উদাহরণই প্রমাণিত হয় না : আপনি পয়েন্টার তালিকাকে অতিক্রম করতে পারবেন তা বোঝায় না যে সংকলকটি একটি এন-স্টার ইন্ডায়ার্কেশন সংকলন করতে পারে।
আলবার্তো

24

এটি কার্যত পয়েন্টার সহ এমনকি মজাদার।

#include <cstdio>

typedef void (*FuncType)();

static void Print() { std::printf("%s", "Hello, World!\n"); }

int main() {
  FuncType const ft = &Print;
  ft();
  (*ft)();
  (**ft)();
  /* ... */
}

এখানে চিত্রিত হিসাবে এটি দেয়:

ওহে বিশ্ব!
ওহে বিশ্ব!
ওহে বিশ্ব!

এবং এটি কোনও রানটাইম ওভারহেডের সাথে জড়িত নয়, সুতরাং আপনার সংকলকটি ফাইলটিতে চাপ না দেওয়া পর্যন্ত আপনি সম্ভবত তাদের যতটা চান স্তুপ করতে পারেন।


20

নেই কোন সীমা । পয়েন্টার হ'ল মেমরির একটি অংশ যার বিষয়বস্তু একটি ঠিকানা।
আপনি যা বলেছেন

int a = 10;
int *p = &a;

একটি পয়েন্টার একটি পয়েন্টার এছাড়াও একটি ভেরিয়েবল যা অন্য পয়েন্টার একটি ঠিকানা থাকে।

int **q = &p;

এখানে ইতিমধ্যে qঠিকানাটি ধারণ করে এমন ঠিকানা সম্বলিত পয়েন্টারটি এখানে ।pa

একটি পয়েন্টার থেকে পয়েন্টার সম্পর্কে বিশেষ কিছু নেই।
সুতরাং পোনিটারগুলির শৃঙ্খলে কোনও সীমা নেই যা অন্য পয়েন্টারের ঠিকানাটি ধারণ করে।
অর্থাত।

 int **************************************************************************z;

অনুমতি দেওয়া হয়.


17

প্রতিটি সি ++ বিকাশকারীকে (ইন) বিখ্যাত থ্রি তারকা প্রোগ্রামারটির কথা শুনে নেওয়া উচিত ছিল

এবং সত্যিই মনে হয় এমন কিছু যাদু "পয়েন্টার বাধা" রয়েছে যা ছদ্মবেশী হতে হবে

সি 2 এর উদ্ধৃতি:

থ্রি স্টার প্রোগ্রামার

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


2
github.com/psi4/psi4public/blob/master/src/lib/libdpd/… এবং এর মতো একটি 4-তারকা প্রোগ্রামার লিখেছিলেন। তিনি আমারও বন্ধু এবং আপনি যদি কোডটি যথেষ্ট পরিমাণে পড়ে থাকেন তবে আপনি কেন এটি 4 টি তার জন্য উপযুক্ত তা বুঝতে পারবেন।
জেফ

13

এখানে দুটি সম্ভাব্য প্রশ্ন রয়েছে তা নোট করুন: আমরা একটি সি টাইপের মধ্যে কতগুলি পয়েন্টার ইন্ডায়ারেশান অর্জন করতে পারি এবং কতগুলি স্তরের পয়েন্টার ইন্ডিরেশান আমরা একক ঘোষককে স্টাফ করতে পারি।

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

typedef int *type0;
typedef type0 *type1;
typedef type1 *type2; /* etc */

সুতরাং শেষ পর্যন্ত, এটি একটি বাস্তবায়ন সমস্যা যা কোনও সি / প্রোগ্রাম প্রত্যাখাত হওয়ার আগে কত বড় / জটিল তৈরি করা যায় তার ধারণার সাথে সংযুক্ত, যা খুব সংকলক নির্দিষ্ট।


4

আমি উল্লেখ করতে চাই যে * এর একটি স্বেচ্ছাসেবী সংখ্যার সাথে একটি ধরণের উত্পাদন হ'ল এমন কিছু যা টেমপ্লেট রূপক দ্বারা ঘটতে পারে। আমি ঠিক কী করছি তা ভুলে গিয়েছি, তবে প্রস্তাবিত হয়েছিল যে আমি নতুন স্বতন্ত্র প্রকারের উত্পাদন করতে পারি যার মধ্যে পুনরাবৃত্ত হওয়া টি * প্রকারগুলি ব্যবহার করে তাদের মধ্যে এক ধরণের মেটা কসরত হয় ।

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


আমি স্বীকার করি আমি আপনার উত্তর পুরোপুরি বুঝতে পারি না, তবে এটি আমাকে এক্সপ্লোর করার জন্য একটি নতুন অঞ্চল দিয়েছে। :)
ankush981

3

2004 মিজ্রা সি স্ট্যান্ডার্ডের 17.5 এর বিধি পয়েন্টার ইন্ডিয়ারেশনের 2 স্তরেরও বেশি নিষিদ্ধ করেছে।


15
খুব নিশ্চিত যে এটি প্রোগ্রামারদের জন্য একটি সুপারিশ, সংকলকগুলির জন্য নয়।
কোল জনসন

3
আমি পয়েন্টার ইন্ডিয়ারেশনের প্রায় 2 স্তরের প্রায় 17.5 বিধি সহ নথিটি পড়েছি। এবং এটি অগত্যা 2 টি স্তরের বেশি নিষিদ্ধ করে না। এতে বলা হয়েছে যে এই রায়টি 2 টিরও বেশি স্তরের "non-compliant"মান হিসাবে অনুসরণ করা উচিত । তাদের রায়গুলিতে গুরুত্বপূর্ণ শব্দ বা বাক্যাংশটি হ'ল "should"এই বিবৃতি থেকে শব্দটি ব্যবহার করা : Use of more than 2 levels of indirection can seriously impair the ability to understand the behavior of the code, and should therefore be avoided.এগুলি ভাষা প্রতিষ্ঠানের দ্বারা নির্ধারিত বিধিগুলির বিরোধিতা হিসাবে এই সংস্থার দ্বারা নির্ধারিত নির্দেশিকা।
ফ্রান্সিস কুগার

1

বাস্তব সীমাবদ্ধতার মতো জিনিস নেই তবে সীমা রয়েছে। সমস্ত পয়েন্টার হ'ল ভেরিয়েবল যা সাধারণত স্ট্যাপে হিপ নন স্টোরেজ করে থাকে । স্ট্যাকটি সাধারণত ছোট থাকে (কিছু সংযোগের সময় এটির আকার পরিবর্তন করা সম্ভব)। সুতরাং আসুন আমরা 4MB স্ট্যাকের বলি যা বেশ সাধারণ আকার। এবং যাক আমাদের পয়েন্টার রয়েছে যা 4 বাইট আকারের (পয়েন্টার আকারগুলি আর্কিটেকচার, টার্গেট এবং সংকলক সেটিংসের উপর নির্ভর করে এক নয়)।

এই ক্ষেত্রে 4 MB / 4 b = 1024তাই সম্ভব সর্বোচ্চ সংখ্যক 1048576 হতে পারে, কিন্তু আমরা আসলে যে কিছু অন্যান্য উপাদান স্ট্যাক হয় উপেক্ষা করা উচিত নয়।

তবে কিছু সংকলকগুলির পয়েন্টার চেইনের সর্বাধিক সংখ্যা থাকতে পারে তবে সীমাটি স্ট্যাক আকার। সুতরাং আপনি যদি অনন্তের সাথে সংযোগের সময় স্ট্যাকের আকার বাড়িয়ে থাকেন এবং অনন্ত মেমরিযুক্ত মেশিন রাখেন যা ওএস চালায় যা সেই মেমরিটিকে পরিচালনা করে যাতে আপনার সীমাহীন পয়েন্টার চেইন থাকবে have

আপনি যদি int *ptr = new int;নিজের পয়েন্টারটি হিপটিতে ব্যবহার করেন এবং রাখেন তবে এটি স্বাভাবিক উপায় সীমাটি হিপ আকার নয়, স্ট্যাক নয়।

সম্পাদনা করুন ঠিক তা বুঝতে infinity / 2 = infinity। মেশিনে আরও মেমরি থাকে তাই পয়েন্টারের আকার বৃদ্ধি পায়। সুতরাং স্মৃতি যদি অসীম হয় এবং পয়েন্টারের আকারটি অসীম হয়, তবে এটি খারাপ খবর ... :)


4
ক) পয়েন্টারগুলি হিপ ( new int*) এ সংরক্ষণ করা যেতে পারে । খ) int*এবং int**********কমপক্ষে যুক্তিসংগত আর্কিটেকচারের উপর একই আকার আছে।

@ রাইটফোল্ড এ) হ্যাঁ পয়েন্টারগুলি গাদা হয়ে রাখা যেতে পারে। তবে এটি পূর্ববর্তী পয়েন্টারটির দিকে ইশারা করছে এমন ধারক তৈরির মতো খুব আলাদা জিনিস হবে। খ) অবশ্যই int*এবং int**********একটির আকার একই, আমি বলিনি যে তাদের আলাদা আছে।
ST3

2
তারপরে আমি দেখতে পাচ্ছি না স্ট্যাকের আকারটি এমনকি দূরবর্তীভাবে প্রাসঙ্গিক।

@ ডেটফোল্ড আমি সমস্ত তথ্য distribution েকে রাখার সময় এবং স্ট্যাকের মধ্যে যখন ডেটা বন্টন করার স্বাভাবিক পদ্ধতি সম্পর্কে চিন্তা করি তখন এটি কেবলমাত্র সেই ডেটার দিকেই নির্দেশক। এটি স্বাভাবিকভাবেই হবে , তবে আমি সম্মত হই যে পয়েন্টারগুলি স্ট্যাকের মধ্যে স্থাপন করা সম্ভব।
ST3

"অবশ্যই ইনট * এবং একটি আন্ত ********** একই আকার" - মানটি গ্যারান্টি দেয় না (যদিও আমি এমন কোনও প্ল্যাটফর্ম জানি না যেখানে এটি সত্য নয়)।
মার্টিন Bonner মনিকা

0

এটি যেখানে আপনি পয়েন্টার সঞ্চয় করেন তার উপর নির্ভর করে। যদি তারা স্ট্যাকের হয় তবে আপনার যথেষ্ট সীমাবদ্ধতা রয়েছে। আপনি যদি এটি স্তূপে সঞ্চয় করেন তবে আপনি সীমাটি অনেক বেশি।

এই প্রোগ্রামটি দেখুন:

#include <iostream>

const int CBlockSize = 1048576;

int main() 
{
    int number = 0;
    int** ptr = new int*[CBlockSize];

    ptr[0] = &number;

    for (int i = 1; i < CBlockSize; ++i)
        ptr[i] = reinterpret_cast<int *> (&ptr[i - 1]);

    for (int i = CBlockSize-1; i >= 0; --i)
        std::cout << i << " " << (int)ptr[i] << "->" << *ptr[i] << std::endl;

    return 0;
}

এটি 1 এম পয়েন্টার তৈরি করে এবং শোগুলিতে এটি দেখায় যে চেইনটি প্রথম চলকটিতে কী চলে তা সহজেই সহজে লক্ষ্য করা যায় number

BTW। এটি 92Kর‌্যামের ব্যবহার করে তাই আপনি কত গভীর যেতে পারেন তা কল্পনা করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.