এটি আমার গ্রহণ করা এখানে:
সি ভাষার বিকাশ সিটিতে অ্যারের ধরণের বিবর্তনে কিছুটা অন্তর্দৃষ্টি দেয়:
আমি অ্যারে জিনিসটির রূপরেখা দেওয়ার চেষ্টা করব:
সি এর অগ্রদূত বি এবং বিসিপিএলের কোনও আলাদা অ্যারে টাইপ ছিল না, যেমন একটি ঘোষণা:
auto V[10] (B)
or
let V = vec 10 (BCPL)
ভি কে একটি (অপ্রচলিত) পয়েন্টার হিসাবে ঘোষণা করবে যা মেমরির 10 "শব্দের" অব্যবহৃত অঞ্চলে নির্দেশ করার জন্য সূচনা করা হয়েছিল। বি ইতিমধ্যে *
পয়েন্টার ডেরিফারেন্সিংয়ের জন্য ব্যবহৃত হয়েছিল এবং তার []
হাতে সংক্ষিপ্ত স্বরলিপি ছিল, যার *(V+i)
অর্থ V[i]
, আজ যেমন সি / সি ++ তে রয়েছে। যাইহোক, V
একটি অ্যারে নয়, এটি এখনও একটি পয়েন্টার যা কিছু স্মৃতিতে নির্দেশ করতে পারে। ডেনিস রিচি যখন স্ট্রাক্ট প্রকারের সাথে বি প্রসারিত করার চেষ্টা করেছিলেন তখন এটি সমস্যার কারণ হয়েছিল। তিনি চেয়েছিলেন যে অ্যারেগুলি আজকের মতো সিটির মতো স্ট্রাইকগুলির অংশ হতে পারে:
struct {
int inumber;
char name[14];
};
কিন্তু বি, বিসিপিএল অ্যারেগুলির পয়েন্টার হিসাবে ধারণার সাথে, name
ক্ষেত্রটির একটি পয়েন্টার থাকতে হবে যা রানটাইমের সময় কাঠামোর মধ্যে 14 বাইটের একটি মেমরি অঞ্চলে আরম্ভ করতে হবে । শুরুতে / বিন্যাসের সমস্যাটি শেষ পর্যন্ত অ্যারেগুলিকে একটি বিশেষ চিকিত্সা দিয়ে সমাধান করা হয়েছিল: সংকলকটি কাঠামোর মধ্যে অ্যারেগুলির অবস্থানগুলি স্ট্যাকের উপর ইত্যাদি সন্ধান করবে would এই চিকিত্সা প্রায় সমস্ত বি কোড এখনও চালানোর অনুমতি দেয় এবং "অ্যারে পয়েন্টারে রূপান্তর যদি আপনি তাদের তাকান" এর উত্স নিয়মটির । এটি একটি সামঞ্জস্যতা হ্যাক, যা খুব সহজ বলে প্রমাণিত হয়েছিল, কারণ এটি খোলার আকারের অ্যারে ইত্যাদির অনুমতি দেয় etc.
এবং এখানে আমার অনুমান কেন অ্যারে নির্ধারিত করা যায় না: যেহেতু অ্যারে বি তে পয়েন্টার ছিল, আপনি কেবল লিখতে পারেন:
auto V[10];
V=V+5;
একটি "অ্যারে" পুনঃব্যবস্থা করতে। এটি এখন অর্থহীন ছিল, কারণ অ্যারে ভেরিয়েবলের ভিত্তিটি আর লভ্য ছিল না। সুতরাং এই দায়িত্বটি বাতিল করা হয়নি, যা ঘোষিত অ্যারেগুলিতে এই প্রোগ্রামটি প্রত্যাখ্যানকারী কয়েকটি প্রোগ্রাম ধরতে সহায়তা করেছিল। এবং তারপরে এই ধারণাটি আটকে গেল: যেহেতু অ্যারে কখনই সি টাইপ সিস্টেমের প্রথম শ্রেণির হিসাবে বিবেচিত হয় নি, তাদের বেশিরভাগই বিশেষ প্রাণী হিসাবে বিবেচনা করা হত যা আপনি যদি তাদের ব্যবহার করেন তবে পয়েন্টার হয়ে যায়। এবং একটি নির্দিষ্ট দৃষ্টিকোণ থেকে (যা সি-অ্যারেগুলি একটি বোকড হ্যাক বলে উপেক্ষা করে) অ্যারে অ্যাসাইনমেন্টটি অস্বীকার করা এখনও কিছুটা অর্থবোধ করে: একটি উন্মুক্ত অ্যারে বা অ্যারে ফাংশন পরামিতি আকারের তথ্য ছাড়াই পয়েন্টার হিসাবে বিবেচনা করা হয়। সংকলকটিতে তাদের জন্য একটি অ্যারে অ্যাসাইনমেন্ট তৈরি করার তথ্য নেই এবং সামঞ্জস্যতার কারণে পয়েন্টার অ্যাসাইনমেন্টটি প্রয়োজনীয় ছিল।
typedef int vec[3];
void f(vec a, vec b)
{
vec x,y;
a=b;
x=y;
a=x;
x=a;
}
1978-এ সি এর একটি সংশোধন স্ট্রাক্ট অ্যাসাইনমেন্ট যোগ করার সময় এটি পরিবর্তন হয়নি ( http://cm.bell-labs.com/cm/cs/Wo/dmr/cchanges.pdf )। যদিও রেকর্ড ছিল স্বতন্ত্র ধরনের সি, এটা তাদের প্রাথমিক কে & R এর সি আপনি দায়িত্ব অর্পণ করা সম্ভব নয় অনুলিপি করতে ছিল তাদের সদস্য-অনুযায়ী আমার মনে সঙ্গে এবং আপনার ফাংশন পরামিতি তাদের একমাত্র পয়েন্টার পাস পারে। অ্যাসিগমেন্ট (এবং প্যারামিটার পাসিং) এখন কেবল স্ট্রাক্টের কাঁচা মেমরির মেমকি হিসাবে সংজ্ঞায়িত হয়েছিল এবং যেহেতু এটি অস্তিত্বের কোডটি ভাঙতে পারেনি এটি সহজেই যুক্তিযুক্ত হয়েছিল। অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া হিসাবে, এটি সুস্পষ্টভাবে কিছু ধরণের অ্যারে নিয়োগের সাথে পরিচয় করিয়ে দেয় তবে এটি কাঠামোর অভ্যন্তরে কোথাও হতাশ হয়, সুতরাং এটি অ্যারেগুলি যেভাবে ব্যবহৃত হয়েছিল তা নিয়ে সমস্যাটি প্রকৃতপক্ষে প্রবর্তন করতে পারেনি।