শূন্য-ভিত্তিক অ্যারেগুলি কেন আদর্শ হয়?


112

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

এখন আমি বিতর্ক করতে আসলেই ভাল নই সুতরাং শূন্য-ভিত্তিক অ্যারেগুলিকে আরও উপযুক্ত মনে করার পরিবর্তে আমি অন্য কোনও ভাল কারণের প্রস্তাব দিতে পারি না। কেন হয় শূন্য অ্যারে জন্য সাধারণ আদ্যস্থল?


একটি এন-এলিমেন্ট অ্যারেতে, উপাদান 'এন' উপস্থিত নেই। একটি এন-এলিমেন্ট অ্যারের সদস্য রয়েছে যার সংখ্যা 0 থেকে এন -1 কেবল। সুতরাং, আমাদের থেকে 1 থেকে শুরু হওয়া অ্যারে থাকলে এটি আরও ভাল নয় এবং তাই কোনও এন-এলিমেন্ট অ্যারে আসলে অ্যারের উপস্থিত এন উপাদানগুলিকে উপস্থাপন করে।

আমি শূন্য-ভিত্তিক অ্যারেগুলি পছন্দ করি কারণ বাইটের প্রথম বিট 2 ^ 1 নয়, 2 ^ 0 হয়। এটি আমাকে মাঝে মাঝে সহায়তা করে :)
e-MEE

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

আমি বিশ্বাস করতে পারি না এই প্রশ্নটি স্ট্যাকওভারফ্লো থেকে প্রোগ্রামারগুলিতে স্থানান্তরিত হয়েছিল এবং তারপরে, অ-গঠনমূলক হিসাবে বন্ধ হয়ে গিয়েছিল। এটি বোবা।
প্যারাসেবল

উত্তর:


105

আমি মনে করি না যে আমাদের মধ্যে কেউ এডজার ডাব্লু ডিজকস্ট্রার নিবন্ধ "সংখ্যাটি শূন্য থেকে কেন শুরু করা উচিত" এর চেয়ে শক্তিশালী যুক্তি সরবরাহ করতে পারে ।


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

6
ডিজকસ્ત્રের নিবন্ধটি স্টাইল সম্পর্কিত, তবে তার যুক্তিগুলি সরলতা এবং ব্যবহারের সহজতা সম্পর্কে ... +১।
প্যার্সেবল

80

কর্তৃপক্ষের যুক্তি

ভাল ... স্পষ্টতই, খুব সাম্প্রতিকতম ভাষা সহ বেশিরভাগ ভাষাগুলি শূন্য-ভিত্তিক। যেহেতু এই ভাষাগুলি বেশ দক্ষ লোকেরা লিখেছিল তাই আপনার বন্ধুটি অবশ্যই ভুল হতে পারে ...

কেন এক?

1 কেন শূন্যের চেয়ে আরও ভাল সূচনা সূচক হবে? 2 বা 10 নয় কেন? উত্তরটি নিজেই আকর্ষণীয় কারণ এটি ধারণার পক্ষ থেকে লোকদের যদিও প্রক্রিয়া সম্পর্কে অনেক কিছু দেখায়।

প্রথম যুক্তি হল যে এটা আরো প্রাকৃতিক কারণ হল 1 ম সাধারণত এক , অন্যেরা সব দিচ্ছে সামনে অন্তত মানুষের সংখ্যাগরিষ্ঠ জন্য ...

এক নম্বর যুক্তিটি হ'ল শেষ সূচকটি অ্যারের আকারও ...

আমি সাধারণত এই ধরণের যুক্তিগুলির কারণে যে কারণগুলি শুনে থাকি তার "গুণমান" দ্বারা আমি এখনও মুগ্ধ ... এবং আরও বেশি স্মরণ করিয়ে দিলে আমি ...

শূন্য হয় না কেন?

... "এক-ভিত্তিক" স্বীকৃতিগুলি পশ্চিমা সংস্কৃতি থেকে বাম-ওভারস যা শতাব্দী ধরে শূন্যের অস্তিত্বকে উপেক্ষা করে, যদি না হয় তবে।

বিশ্বাস করুন বা না করুন, মূল গ্রেগরিয়ান ক্যালেন্ডার -3, -2, -1, 1, 2, 3 থেকে চলেছে ... পশ্চিমা বিজ্ঞানে যে সমস্যাটি অবদান রেখেছিল তা কল্পনা করার চেষ্টা করুন (উদাহরণস্বরূপ, 1 জানুয়ারী -২ থেকে কত বছর? মূল গ্রেগরিয়ান ক্যালেন্ডারের সংঘাতের মতো সাধারণ কিছু নিয়ে বিরোধের চেয়ে দেখতে 1 লা জানুয়ারী 2)।

একবিংশ শতাব্দীতে মাইল এবং গজ দূরে রেখে এক-ভিত্তিক অ্যারে রাখা ভাল (ঠিক আছে, আমি তার জন্য ... ... mod _ ^ ...)

জিরো কেন? কারণ এটি গণিত!

প্রথম (ওফস ... দুঃখিত ... আমি আবার চেষ্টা করব)

শূন্য , শূন্য কিছুই নয়, একটি কিছু। এবং কিছু ধর্মীয় গ্রন্থ ধারণ করে যে "শুরুতে কিছুই ছিল না"। কম্পিউটার সম্পর্কিত কিছু আলোচনা ধর্মীয় বিতর্কের মতো জ্বলতে পারে তাই এই বিষয়টি যতটা মনে হয় ততটা বিষয়গুলির বাইরে নয় ... ^ _ ^

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

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

তৃতীয় , কম্পিউটার ভাষার অ্যারেগুলি হার্ডওয়্যারের সাথে আবদ্ধ থাকার জন্য, 21 টি পূর্ণসংখ্যার একটি সি অ্যারে বরাদ্দ করুন এবং পয়েন্টারটি 10 ​​সূচকটি ডানদিকে সরান, এবং আপনার কাছে একটি প্রাকৃতিক [-10 থেকে 10] অ্যারে থাকবে। এটি হার্ডওয়ারের পক্ষে স্বাভাবিক নয়। তবে এটি গণিতের জন্য। অবশ্যই গণিতটি অপ্রচলিত হতে পারে তবে আমি শেষবার যাচাই করেছিলাম, বিশ্বের বেশিরভাগ মানুষ বিশ্বাস করেছিলেন যে এটি তা নয়।

চার , ইতিমধ্যে অন্য কোথাও উল্লেখ করা হয়েছে, এমনকি পৃথক অবস্থানের জন্য (বা পৃথক মান থেকে দূরত্ব হ্রাস) এর জন্য প্রথম সূচকটি শূন্য হবে, কোনও ভবনের মেঝের মতো (শূন্য থেকে শুরু করে), ক্রমহ্রাসমান গণনা (3, 2, 1, জিরো) !), স্থল উচ্চতা, কোনও চিত্রের প্রথম পিক্সেল, তাপমাত্রা (শূন্য কেলভিন, পরম শূন্যের জন্য বা শূন্য সেন্টিগ্রেড ডিগ্রি, জলের হিমায়িত তাপমাত্রা হিসাবে 273 কে)। প্রকৃতপক্ষে, কেবলমাত্র একমাত্র যা দিয়ে শুরু হয় তা হ'ল " প্রথম , দ্বিতীয় , তৃতীয় , ইত্যাদি" র প্রচলিত উপায় way পুনরাবৃত্তির স্বরলিপি, যা আমাকে স্বাভাবিকভাবে পরবর্তী পয়েন্টে নিয়ে যায় ...

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

উপসংহার

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

শূন্য-ভিত্তিক অ্যারেগুলি গণিত সম্পর্কিত কারণে শূন্য-ভিত্তিক। হার্ডওয়্যার-সম্পর্কিত কারণে নয়।

এখন, যদি এটি আপনার সহকর্মী প্রোগ্রামারটির সমস্যা হয় তবে তাকে পুনরাবৃত্তিকারী এবং ফোরচ লুপের মতো বাস্তব উচ্চ স্তরের কনস্ট্রাক্ট দিয়ে প্রোগ্রাম শুরু করুন।


শূন্য সেন্টিগ্রেড ডিগ্রি 273,15 কে;)

2
আমি জানি (আমার পদার্থবিজ্ঞানের উপর একটি মাস্টার ডিপ্লোমা আছে) তবে আমি অনুভব করেছি যে দশমিকের সাথে খেলাটা আমার মজাদার দিকের চেয়ে কম যুক্তিযুক্ত বিষয় নয় যা দিয়ে আমি আমার যুক্তিগুলিকে রঙিন করার চেষ্টা করেছি ... ^ _ ^ ...
প্যারেসবাল

20
আপনার অনুচ্ছেদগুলিকে "শূন্য, প্রথম, দ্বিতীয়, তৃতীয়, চার, পাঁচ" লেবেলযুক্ত রয়েছে। ধারাবাহিকতার জন্য আপনার অবশ্যই কার্ডিনাল সংখ্যা ("জিরো, এক, দুই, তিন, চার, পাঁচ") বা অর্ডিনাল সংখ্যা ("জিরোথ, প্রথম, দ্বিতীয়, তৃতীয়, চতুর্থ, পঞ্চম") ব্যবহার করা উচিত। :-)
শ্রীভাতসারআর

10
একইভাবে, আমাদের জীবনের প্রথম বছরের জন্য, আমরা এক বছরের নয়, শূন্য বছর বয়সী

3
@ নিকিতা রাইবাক: আশ্চর্যজনক বিষয়টি হ'ল আপনি যে মন্তব্যটি আপনার আগে সমস্ত মন্তব্যকারীদের দ্বারা দেখা হয়েছিল তা আপনি মিস করেছেন: অবশ্যই বিল টিকটিকিটির উত্তরটি সঠিক। এ কারণেই আমি তাকে +1 ভোট দিয়েছি এবং এ কারণেই এটি প্রশ্নের সেরা উত্তর হিসাবে বেছে নেওয়া হয়েছিল। আমার উত্তরটি 1-ভিত্তিক অ্যারেগুলির পিছনে মিথ্যা কারণগুলি নিয়ে মজা করা এবং এমন 1 টি-বেসড অ্যারে উপদ্রব হতে পারে এমন কংক্রিটের ক্ষেত্রে প্রস্তাব দেওয়া সম্পর্কে আরও। তবুও, আমি অবাক হয়েছি আপনি "একক
দৃ conv়প্রত্যয়ী

47

অর্ধ-খোলা বিরতি ভাল রচনা। আপনি যদি লেনদেন করছেন 0 <= i < limএবং আপনি nউপাদানগুলি দ্বারা প্রসারিত করতে চান তবে নতুন উপাদানগুলির পরিসীমা সূচক রয়েছে lim <= i < lim + n। শূন্য ভিত্তিক অ্যারে নিয়ে কাজ করা গাণিতিক সহজ করে তোলে যখন বিভাজন বা concatenating অ্যারে অথবা যখন উপাদানের গণনা । কেউ আশা করেন যে সরল পাটিগণিত কম বেড়ানোর পোস্টে ত্রুটি বাড়ে ।


অর্ধ-খোলা অন্তরগুলির জন্য +1 - এটি সবকিছুকে সহজ করে তোলে।
৮:০৯

29

নির্দিষ্ট ধরণের অ্যারে ম্যানিপুলেশন 1-ভিত্তিক অ্যারেগুলির সাথে ক্রেজি জটিল হয় তবে 0-ভিত্তিক অ্যারেগুলির সাথে আরও সহজ থাকে।

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

ফরটারনের অ্যালগরিদমে প্রচুর পরিমাণ ছিল a[i + j + k - 2], যখন সি ++ ছিল a[i + j + k], কারণ ফোরট্রান অ্যারেটি 1-ভিত্তিক ছিল, যখন সি ++ অ্যারে 0-ভিত্তিক ছিল।


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

আমি 1 টি ভিত্তিক অ্যারেগুলির অপ্রয়োজনীয় জটিলতাও আঘাত করেছি, 0 ভিত্তিক অ্যারেগুলি আমার সীমিত অভিজ্ঞতায় বিরল ব্যতিক্রমের সাথে অ্যারে সূচীকরণের জন্য সর্বদা পরিষ্কার কোড তৈরি করেছে।

তাদের সংশ্লিষ্ট সূচকগুলি কেবল 1 দ্বারা অফসেট করা থাকলে ফরটারান এবং সি ++ সূচকগুলি কীভাবে 2 দ্বারা পৃথক হবে? এছাড়াও, বিয়োগ 2 কেন ? ফরটারান যদি 1-ভিত্তিক হয় তবে আপনি 2 (বা 1) যুক্ত করবেন না?
রিেক্স করুন

@ রেক্স: এইভাবে এটি কাজ করে এবং তাই এটি 1-ভিত্তিক অ্যারেগুলির সাথে এত জটিল।
জে বাজুজি

@ রেক্স: ধরুন আপনি একটি ফ্ল্যাটের সাথে একটি 3 ডি অ্যারে অনুকরণ করছেন। তারপরে, 0 বেসে, উপাদান (0 0 0) ফ্ল্যাট অ্যারেতে 0 এলিমেন্টের সাথে মিলে যায়। ওটিওএইচ, যদি এটি 1-ভিত্তিক হয় তবে উপাদান (1 1 1) ফ্ল্যাট অ্যারেতে উপাদান 1 এর সাথে মিল রাখে: 1 + 1 + 1-2।

22

একটি অ্যারের সূচকটি আসলে কোনও সূচক নয়। এটি কেবল একটি অফসেট যা অ্যারের শুরু থেকে দূরত্ব। প্রথম উপাদান অ্যারের শুরুতে তাই কোনও দূরত্ব নেই। সুতরাং অফসেট 0 হয়।


3
আজকাল বেশিরভাগ ভাষার জন্য যেগুলি ডিজাইন করা হয়ে থাকে, এটি সত্যিই একটি বাস্তবায়ন বিশদ, যা ভাষায় হাজির হওয়া উচিত নয় (এটি করার জন্য আরও ভাল কারণ ছাড়াও)
জেনস স্কাউডার

17

কারণগুলি কেবল historicalতিহাসিক নয়: সি এবং সি ++ এখনও প্রায় রয়েছে এবং ব্যাপকভাবে ব্যবহৃত হয় এবং পয়েন্টার গাণিতিক সূচী 0 থেকে অ্যারে শুরু হওয়ার জন্য খুব কার্যকর কারণ।

অন্যান্য ভাষার ক্ষেত্রে পয়েন্টার গাণিতিকের অভাব রয়েছে, প্রথম উপাদানটি সূচক 0 বা 1 এ রয়েছে কিনা তা অন্য কোনও কিছুর চেয়ে কনভেনশন বেশি।
সমস্যাটি হ'ল যে ভাষাগুলি সূচকে 1 কে তাদের প্রথম উপাদান হিসাবে ব্যবহার করে তাদের কোনও শূন্যস্থানে অস্তিত্ব থাকে না এবং সাধারণত লাইব্রেরিগুলির সাথে আলাপ করতে হয় যা প্রায়শই আপনি এটি অনুমান করেছেন- সি বা সি ++ ...

ভিবি এবং এর উত্পন্ন স্বাদগুলি অ্যারেগুলি 0 বা 1 এ শুরু হতে ভোগ করেছে এবং এটি দীর্ঘদিন ধরে সমস্যার উত্স হয়ে দাঁড়িয়েছে।

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


একমত। ধারাবাহিকতার বিষয়টি এবং যদি না আপনার কাছে নিম্ন-স্তরের কোড (সি / সি ++ সহ) সম্পূর্ণভাবে এড়িয়ে যাওয়ার বিলাসিতা না থাকে তবে 1-ভিত্তিক অ্যারেগুলির সাথে কাজ করা কেবল সমস্যার জন্য জিজ্ঞাসা করছে।
শোগ 9

আমরা যখন এটি করছি, একটি প্রশ্ন: আপনি কি কখনও প্ল্যাটফর্মবিহীন উপায়ে নিম্ন-স্তরের কোড ব্যবহার করেন? অন্য কথায়, আপনি সর্বদা একটি প্ল্যাটফর্ম বা অন্য প্ল্যাটফর্মে থাকেন এবং কোনটি ঠিক আছে তা আপনার জানতে হবে?
ড্যান রোজনস্টার্ক

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

1
@ কেরলেসা: না, যুক্তিটি ভিবি 6 (স্বয়ংক্রিয় আপগ্রেড সহকারী…) এর সাথে পিছনে সামঞ্জস্য রাখার ছিল যদিও তারা স্বীকৃত ছিল যে স্বরলিপিটি স্ব-স্বজ্ঞাত এবং ত্রুটি-প্রবণ। অন্যদিকে, Andএবং Orবিটওয়াইজ হওয়ার কারণে ভিবি 6 এর সাথে কোনও সম্পর্ক নেই, এটি কোনও ভিবি-টাইপের ভাষার একমাত্র যৌক্তিক সমাধান। আপনি কি আছে AndAlsoএবং OrElseআপনার লজিক্যাল অপারেশন জন্য।
কনরাড রুডলফ

Andএবং Orবিটওয়াইজ হওয়ার সাথে VB6 এর সাথে সম্পর্কযুক্ত কারণ তারা ভিবি 6-তে সামান্য দিকে ছিল। কুরুচিপূর্ণ অপারেটরগুলি AndAlsoএবং OrElseবিটওয়াইজ করা উচিত ছিল, যেহেতু বিটওয়াইজ অপারেশনগুলি যৌক্তিকগুলির চেয়ে অনেক কম সাধারণ। "পিছনের সামঞ্জস্যতা" এর কারণে ভাষার উপর যেমন কুরুচিপূর্ণ ওয়ার্ট রয়েছে, যেমন বাইভাল এটি ডিফল্ট হয়েও পুরো জায়গা জুড়ে প্লাস্টার করে।
ক্যারলেস

10

জিরো-ভিত্তিক অ্যারেগুলির মূলগুলি সি এবং এমনকি এসেম্বলারের হয়। সি সহ, পয়েন্টার গণিতটি মূলত এইভাবে কাজ করে:

  • একটি অ্যারের প্রতিটি উপাদান একটি নির্দিষ্ট সংখ্যক বাইট দখল করে। একটি 32 বিট পূর্ণসংখ্যা (স্পষ্টতই) 4 বাইট হয়;
  • অ্যারের ঠিকানার পরে সমান আকারের সংলগ্ন ব্লকে পরবর্তী উপাদানগুলি সহ অ্যারের প্রথম উপাদানটি দখল করা হয়।

উদাহরণস্বরূপ, ধরে নিন int a[4]0xFF00 এ, ঠিকানাগুলি হ'ল:

  • a [0] -> 0xFF00;
  • a [1] -> 0xFF04;
  • a [2] -> 0xFF08;
  • a [3] -> 0xFF0C।

সুতরাং, শূন্য ভিত্তিক সূচকগুলি সহ, ঠিকানাগুলি গণিত সহজ:

উপাদানটির ঠিকানা = অ্যারে + সূচকের ঠিকানা * আকারের (প্রকার)

আসলে সি এর এক্সপ্রেশনগুলি সমস্ত সমতুল্য:

  • একটি [2];
  • 2 [একটি]; এবং
  • * (একটি + 2)।

একভিত্তিক অ্যারে সহ, গণিতটি (কখনও তাই) কিছুটা জটিল।

সুতরাং কারণগুলি মূলত .তিহাসিক।


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

উল্লেখযোগ্য যে এন-ভিত্তিক অ্যারেগুলিকে সাধারণত অ্যারে 'অফসেট' সহ কোড জেনারেট করে শূন্য রানটাইম ব্যয়ে স্বয়ংক্রিয়ভাবে গণনা করা যায়।
রডি

8

আপনি যদি শূন্য-ভিত্তিক অ্যারে ব্যবহার করেন তবে অ্যারের দৈর্ঘ্যটি বৈধ সূচকগুলির সেট। কমপক্ষে, এটিই পেনো পাটিগণিত বলেছেন:

0 = {}
1 = 0 U {0} = {0}
2 = 1 U {1} = {0,1}
3 = 2 U {2} = {0,1,2}
...
n = n-1 U {n-1} = {0,1,2...n-1}

সুতরাং এটি এক অর্থে সবচেয়ে প্রাকৃতিক স্বরলিপি।


7

কারণ সিটিতে অ্যারে এবং পয়েন্টারগুলির মধ্যে একটি দৃ corre় সম্পর্ক রয়েছে

char* p = "hello";
char q[] = "hello";

assert(p[1] == q[1]);

assert(*p == *q)

* পি * (পি + 0) এর সমান

1 এর সূচনা সূচকটি পরে আপনাকে মাথাব্যথা দেয়


5

1-ভিত্তিক অ্যারেগুলির সুবিধাগুলির একটি হিপ একটি উদাহরণ। আমি একটি সূচক দেওয়া , আমি তার পিতামাতার এবং বাম সন্তানের সূচক হয়

PARENT[ আমি ] = আমি ÷ 2

LCHILD[ আমি ] = আমি × 2

তবে শুধুমাত্র 1-ভিত্তিক অ্যারেগুলির জন্য। 0 ভিত্তিক অ্যারেগুলির জন্য আপনার কাছে

PARENT[ আমি ] = ( আমি + 1) ÷ 2 - 1

LCHILD[ আমি ] = ( আমি + 1) × 2 - 1

এবং তারপরে আপনার সম্পত্তি আছে যে আমি সেই সূচকের উপ-অ্যারের আকারও (অর্থাত্ [1, i ] পরিসরে সূচকগুলি )।

তবে শেষ পর্যন্ত তাতে কিছু আসে যায় না, কারণ আপনি স্বাভাবিকের চেয়ে আরও একটি উপাদান বরাদ্দ করে এবং জিরোথ উপেক্ষা করে 0-ভিত্তিক অ্যারেটিকে 1-ভিত্তিক অ্যারে তৈরি করতে পারেন। সুতরাং আপনি উপযুক্ত হলে 1-ভিত্তিক অ্যারেগুলির সুবিধা পেতে অপ্ট-ইন করতে পারেন, এবং অন্যান্য অন্যান্য পরিস্থিতিতে ক্লিনার গাণিতিকের জন্য 0-ভিত্তিক অ্যারেগুলি রাখতে পারেন।


4

আমার অনুভূতি হ'ল এটি সম্পূর্ণ স্বেচ্ছাচারিতা। শূন্য- বা এক-ভিত্তিক অ্যারে সম্পর্কে বিশেষ কিছু নেই। ভিজ্যুয়াল বেসিক থেকে নিজেকে মুক্ত করার পরে (বেশিরভাগ ক্ষেত্রে, আমি এক্সেলে ছোটখাটো কিছু করি) আমি 1-ভিত্তিক অ্যারেগুলির সাথে কাজ করি নি, এবং ... এটি একই রকম। আসল বিষয়টি হল যে আপনার যদি অ্যারের তৃতীয় উপাদানটির প্রয়োজন হয় তবে এটি কেবল একটি বাস্তবায়ন বিশদ যা তাকে 3 বা 2 বলা হয় তবে যাইহোক, আপনি অ্যারে দিয়ে 99% কাজ কেবল দুটি পরম পয়েন্টের প্রতি আগ্রহী: প্রথম উপাদান এবং গণনা বা দৈর্ঘ্য। আবার এটি কেবল একটি বাস্তবায়ন বিশদ যা প্রথম উপাদানটিকে একের পরিবর্তে শূন্য বলা হয় বা শেষ উপাদানটিকে গণনা -১ বা তার পরিবর্তে গণনা বলা হয়।

সম্পাদনা: উত্তরদাতাদের মধ্যে কয়েকজন উল্লেখ করেছেন যে 1-ভিত্তিক অ্যারেগুলি ফেন্সপোস্ট ত্রুটিগুলির প্রবণতা বেশি। আমার অভিজ্ঞতায়, এখন এটি সম্পর্কে চিন্তা করা, এটি সত্য। আমার মনে আছে ভিজিবিতে, "এটি হয় কাজ করবে বা ফুঁসে উঠবে কারণ আমি একা হয়ে যাচ্ছি।" জাভাতে কখনই ঘটে না। যদিও আমি ভেবেছিলাম আমি আরও ভাল হয়ে যাচ্ছি, কিছু উত্তরদাতা এমন কেস দেখিয়েছেন যার মধ্যে 0-ভিত্তিক অ্যারে ফলাফলগুলি ভাল গাণিতিকের ফলস্বরূপ, যখন আপনাকে নিম্ন স্তরের ল্যাংয়ের সাথে ডিল করতে হবে না।


পিএইচপি-তে, বেশিরভাগ সন্ধানের মধ্যে স্ট্রিং ফাংশন ফালুস পাওয়া যায় নি। না -1।
jmucchiello

আপনি শেষ উপাদানটির সূচকের সাথে গণনাটিকে বিভ্রান্ত করছেন। শূন্য-ভিত্তিক বা এক-ভিত্তিক অ্যারে ব্যবহার করা হোক না কেন খালি অ্যারের গণনা সর্বদা 0 থাকে is একভিত্তিক অ্যারেগুলির সুবিধা হ'ল গণনাটি শেষ উপাদানটির অবস্থান (তবে এটি কেবলমাত্র একমাত্র সুবিধা)।

এই উভয় পয়েন্ট সম্পর্কে সত্য: শেষ অর্ধেকটি মুছে ফেলা হয়েছে, যেহেতু এটি শূন্য-ভিত্তিক বা এক-ভিত্তিক অ্যারেগুলির জন্য একই: আপনার শূন্য উপাদান পাওয়া গেলে গণনা 0 হয়।
ড্যান রোজনস্টার্ক

আমি আমার জবাবের শেষ অর্ধেক বুঝিয়েছি ...
ড্যান রোজনস্টার্ক

4

10+ বছর সি / সি ++ প্রোগ্রামার হিসাবে, পাস্কাল এবং ডেলফির একটি খুব শক্তিশালী ব্যাকগ্রাউন্ড সহ, আমি এখনও পাস্কেলের শক্ত অ্যারে বাউন্ড এবং সূচক প্রকারের চেকিং এবং তার সাথে আসা নমনীয়তা এবং সুরক্ষাটি মিস করি। এর একটি সুস্পষ্ট উদাহরণ হ'ল প্রতিটি মাসের জন্য অ্যারে ডেটা হোল্ডিংয়ের মান।

প্যাসকেল:

 Type Month = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);

  Var Days[Month] of integer;

  ... 
  if Year mod 4 = 0 then // yes this is vastly simplified for leap years and yes i don't know what the comment marker is in pascal and no i won't go look it up
    Days[Feb] := 29
  else
    Days[Feb] := 28;

সি / তে 1 বা 'ম্যাজিক নম্বর' ব্যবহার না করে সি ভাষায় অনুরূপ কোড লেখা বেশ চ্যালেঞ্জিং। মনে রাখবেন যে দিন [২] এবং দিনগুলি [জানু + ডিসেম্বর] এর মত প্রকাশগুলি কেবল সংকলন করবে না, যা সি বা এসেম্ব্লার হিসাবে এখনও মনে করে এমন লোকদের কাছে নৃশংস হতে পারে।

আমার বলতে হবে পাস্কাল / ডেল্ফি ভাষার অনেক দিক রয়েছে যা আমি কিছুটা মিস করি না, তবে সি শূন্য-ভিত্তিক অ্যারেগুলি তুলনা করে কেবল "বোবা" বলে মনে হয়।


উল্লেখ্য যে, আপনার অ্যালগরিদম বছর 2100. জন্য সঠিক নয় মূল্য হতে পারে en.wikipedia.org/wiki/Leap_year#Algorithm

2
আমি জানি ;-) তবে, এটি বছর 2000 আমি শুধু খেলছি "বিদ্যাবাগীশ স্পট" জন্য সঠিক ছিল ...
রডি

প্যাডেন্ট স্পট! হাঃ হাঃ হাঃ.
jcollum

হ্যাঁ. পুরো বিষয়টি এড়িয়ে চলুন, আপনি চাইলেও অ্যারেটি বেস করুন।
লরেন পেচটেল

আপনার গড় পাস্কল সংকলক মেশিন কোড তৈরি করার সময় জানু = 0, ডিসেম্বর = 11 নির্ধারণ করে দিলে আমি অবাক হব না

4

এটি 0 থেকে শুরু হয় এবং 1 নয় এর কারণটি হ'ল আপনি অফসেটটিকে ভাবতে পারেন যে অ্যারের স্মৃতির শুরু থেকে এই উপাদানটি কত দূর far এটি আমাকে 0 তম উপাদান দেওয়ার কথা বলছে না - এটি বলছে, শুরু থেকে 0 উপাদান হিসাবে আমাকে এমন উপাদান দিন।

এটি দেখার আরেকটি উপায় হ'ল এগুলি (বেশিরভাগ অংশের জন্য) সমতুল্য:

array[n]

*(array + n)

মানটি কখনই পরিবর্তিত হবে না কারণ সি প্রায় ৪০ বছর ধরে রয়েছে। এটি পরিবর্তন করার কোন বাধ্যতামূলক কারণ নেই এবং যদি তারা তা করে থাকে তবে অ্যারে শুরুর উপর নির্ভর করে যে বিদ্যমান কোড 0 রয়েছে তা ভেঙে যাবে।


আসলে, আপনি সি array[n]হিসাবে পুনরায় লিখতে পারেন n[array]এটি করা ভাল ধারণা নয়, এটি বিভ্রান্তিকর! তবে এটি আইনী (ভাল, কমপক্ষে C89 অবধি) উপরের সেই পরিচয়ের কারণে এবং সংযোজনটি পরিবহণযোগ্য।
ডোনাল ফেলো

এটি লেখার এক পাগল উপায় something এমন কিছু যা আপনি যদি কোনও কোড দেখেন যা আপনাকে বজায় রাখতে হয়েছিল সেটি একটি বিশাল সতর্কতা চিহ্ন।
শুকরিয়া

4

কিছু মূল অবস্থান / আপেক্ষিক অবস্থানের তথ্য সহ কোড 0 থেকে শুরু হওয়া অ্যারেগুলি সহ অনেক বেশি ক্লিনার।

উদাহরণস্বরূপ: একটি বৃহত্তর ভেক্টরে একটি সংজ্ঞায়িত অবস্থানে কোনও ভেক্টরকে অনুলিপি করার কোডটি 1: থেকে শুরু হওয়া অ্যারেগুলি সহ একটি ব্যথা is

function copyAtPos (dest, vect, i):
    for i from 1 -> vect.length do
        dest[pos+i-1] = vect[i]

0 থেকে শুরু হওয়া অ্যারেগুলির সাথে বিরোধিতা করে:

function copyAtPos (dest, vect, i):
    for i from 0 -> vect.length-1 do
        dest[pos+i] = vect[i]

আপনি যদি বড় আকারের কনভোলিউশন সূত্র লিখতে শুরু করেন তবে এটি আবশ্যক হয়ে ওঠে।


3

2 বা 3 বা 20 হয় না কেন? এটি 1-ভিত্তিক অ্যারে থাকা শূন্য ভিত্তিক অ্যারেগুলি বোঝার পক্ষে কোনওভাবেই সহজ বা সহজ like 1-ভিত্তিক অ্যারেগুলিতে স্যুইচ করতে, সেখানে থাকা প্রতিটি প্রোগ্রামারকে অ্যারে দিয়ে কীভাবে কাজ করবেন তা শিখতে হবে।

এবং তদ্ব্যতীত, আপনি যখন বিদ্যমান অ্যারেগুলিতে অফসেটগুলি নিয়ে কাজ করছেন তখন এটি আরও বোধগম্য হয়। আপনি যদি অ্যারে থেকে 115 বাইট পড়ে থাকেন তবে আপনি জানেন যে পরবর্তী অংশটি 115 এ শুরু হবে And এবং এরপরে, পরবর্তী বাইটটি সর্বদা আপনি যে বাইটটি পড়েছেন তার আকার। 1-ভিত্তিক আপনাকে সর্বদা একটি যুক্ত করতে হবে।

এবং আপনার কখনও কখনও "সত্য" পয়েন্টার গাণিতিক ব্যতীত ভাষায় এমনকি অ্যারেতে ডেটাগুলির অংশগুলিও মোকাবেলা করতে হবে। জাভাতে আপনার কাছে মেমরি ম্যাপযুক্ত ফাইল বা বাফারগুলিতে ডেটা থাকতে পারে। সেক্ষেত্রে আপনি জানেন যে ব্লক আমি আকারে * i। 1-ভিত্তিক সূচক সহ এটি ব্লক * i + 1 এ থাকবে।

1-ভিত্তিক সূচকের সাহায্যে, অনেকগুলি কৌশলগুলির জন্য পুরো জায়গা জুড়ে +1 প্রয়োজন হবে।


2 বা 3 বা 20 হয় না কেন? কারণ 0 হ'ল সংযোজনীয় পরিচয় এবং 1 হ'ল গুণক পরিচয়। তারা সবচেয়ে বুদ্ধিমান।

3

1-ভিত্তিক অ্যারে ব্যবহার করে একটি একক মাত্রার অ্যারেটিকে বহুমাত্রিক অ্যারে রূপান্তর করুন:

int w = 5, h = 5, d = 5;

int[] a1 = new int[w * h * d], new a2 = int[w,h,d];

for (int z = 1; z <= d; z++)

  for (int y = 1; y <= h; y++)

    for (int x = 1; x <= w; x++)

      a1[x + (y - 1) * w + (z - 1) * h] = a2[x,y,z];

মনে রাখবেন যে আপনার y এবং z সূচকগুলি 0-ভিত্তিক (y - 1, z - 1) আপনার অ্যারে 1-ভিত্তিক হলেও। কিছু পরিস্থিতিতে আপনি 0-ভিত্তিক সূচকগুলি এড়াতে পারবেন না। ধারাবাহিকতার জন্য, কেন সর্বদা 0-ভিত্তিক সূচকগুলি ব্যবহার করবেন না?


3

আপনি কেন অ্যারে শুরু করতে চান?

যখন আপনি বলবেন a[x][y], কম্পাইলার এই অনুবাদ: a+(x*num_cols+y)। যদি অ্যারেগুলি শুরু হয়, এটি হয়ে যাবে a+(x*num_cols+y-1)। এটি একটি অতিরিক্ত গাণিতিক অপারেশন হবে প্রতি একক সময় আপনি একটি অ্যারের উপাদান অ্যাক্সেস করতে চান। আপনি প্রোগ্রামগুলি ধীর করতে চান কেন?


1
আসলে, এটি একটি ((x - 1) * নাম_কোলা) + y - 1) হতে হবে - এক্স এবং y উভয়ই 1 থেকে শুরু হবে
ডেনিস মুনসি

2

আমি এখানে একটি অঙ্গ নেভিগেশন যাচ্ছি এবং একটি পূর্ণসংখ্য 'keyed' অ্যারের চেয়ে আলাদা কিছু প্রস্তাব।

আমি মনে করি আপনার সহকর্মী দৈহিক জগতে একটি "সেট" এর এক থেকে এক ম্যাপিং তৈরি করছে যেখানে আমরা সর্বদা ১ এ গণনা শুরু করি I আমি এটি বুঝতে পারি, আপনি যখন কোনও অভিনব কাজ করছেন না তখন কিছু কোড বোঝা সহজ is যখন আপনি সফ্টওয়্যার এবং শারীরিক বিশ্বের মধ্যে 1 থেকে 1 ম্যাপ করেন।

আমার পরামর্শ

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

অর্থাৎ kvp['Name Server'] = "ns1.example.com"; (এটি লক্ষ লক্ষ সম্ভাব্য উদাহরণগুলির মধ্যে একটি মাত্র)।

Discaimer

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

শেষ ধারণাটি হ'ল শূন্য-ভিত্তিক অ্যারে বা কী মান যুক্তগুলি যেখানে এটি বোধগম্য হয় তা ব্যবহার করুন, মনে রাখবেন যে যখন আপনার কেবল একটি হাতুড়ি থাকে তখন প্রতিটি সমস্যা পেরেকের মতো দেখতে শুরু করে ...


2

ব্যক্তিগতভাবে, এক যুক্তি হ'ল অ্যারে সূচিগুলি অফসেট হিসাবে দেখায়। এটা ঠিক বোঝা যায়।

কেউ বলতে পারে যে এটির প্রথম উপাদানটি, তবে অ্যারের উত্সের সাথে সম্পর্কিত প্রথম উপাদানটির অফসেটটি শূন্য। যেমন, অ্যারের উত্সটি গ্রহণ করা এবং শূন্য যুক্ত করা প্রথম উপাদানটি দেবে।

সুতরাং কম্পিউটিংয়ের ক্ষেত্রে শূন্য যুক্ত করা সহজ যুক্ত করার চেয়ে প্রথম উপাদানটি খুঁজে বের করতে এবং তার পরে একটি সরিয়ে ফেলুন।

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


ঠিক - এটি মূলত নিম্ন স্তরের ভাষা থেকে প্রায় একটি সম্মেলন lying

2

১-ভিত্তিক সূচকগুলির পরিবর্তে 0-ভিত্তিক সূচকগুলি ব্যবহার করার জন্য কেবল দুটি (খুব) গুরুতর কারণগুলি প্রচুর প্রগ্রেমার এবং পুনরায় পিছনে সামঞ্জস্যতার জন্য পুনর্নির্মাণ এড়াতে পারে বলে মনে হয়

আপনার প্রাপ্ত সমস্ত উত্তরগুলিতে আমি 1-ভিত্তিক সূচকের বিরুদ্ধে অন্য কোনও গুরুতর তর্ক দেখিনি।

প্রকৃতপক্ষে, সূচকগুলি প্রাকৃতিকভাবে 1-ভিত্তিক , এবং এটি এখানে।

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

বাস্তব বিশ্বে সূচকগুলি 1-বেস হয়।

থমাস যেমন উপরে বলেছেন, যে ভাষাগুলি 0-বেস সূচকগুলি ব্যবহার করেছিল সেগুলি প্রকৃতপক্ষে সূচিগুলি নয় অফসেটগুলি ব্যবহার করে । এবং এই ভাষাগুলি ব্যবহার করে এমন বিকাশকারী সূচকগুলি নয়, অফসেট সম্পর্কে চিন্তা করে । বিষয়গুলি পরিষ্কারভাবে বর্ণিত থাকলে এটি কোনও সমস্যা হবে না, তবে তারা তা নয়। অফসেট ব্যবহার করে প্রচুর বিকাশকারী এখনও সূচকগুলি সম্পর্কে কথা বলে। এবং সূচকগুলি ব্যবহার করে প্রচুর বিকাশকারী এখনও জানে না যে সি, সি ++, সি #, ... অফসেট ব্যবহার করে।

এই হল বাক্যে কথন সমস্যা

(ডিস্ক্রাস্ট্রের কাগজ সম্পর্কে দ্রষ্টব্য - এটি আমি উপরে যা বলেছি ঠিক সেগুলি বলেছে : গণিতবিদ 1-ভিত্তিক সূচকগুলি ব্যবহার করেন But তবে ডিস্কস্ট্রা মনে করেন যে matematists এগুলি ব্যবহার করবেন না কারণ কিছু অভিব্যক্তি তখন কুশ্রী হবে (যেমন: 1 <= n <= 0 )। ঠিক আছে, নিশ্চিত নন যে তিনি সেটির উপরেই রয়েছেন - এই ব্যতিক্রমী খালি সিকোয়েন্সগুলি এড়ানোর জন্য এই জাতীয় দৃষ্টান্তের শিফট করা সামান্য ফলাফলের জন্য অনেক সমস্যা বলে মনে হচ্ছে ...)


2
গণিতবিদগণ সর্বদা 1-ভিত্তিক সূচক ব্যবহার করেন না। আমি সিকোয়েন্সের প্রাথমিক মানটির জন্য x0 প্রচুর বার ব্যবহার করেছি। এটি যেকোন বেশি সুবিধাজনক তার উপর নির্ভর করে।

2

আপনি কি "20 শতকে" আসলে 1900 এর দশকে উল্লেখ করে বিরক্ত হয়েছেন? ওয়েল, 1-ভিত্তিক অ্যারেগুলি ব্যবহার করার সময় আপনি যে সমস্ত ক্লান্তিকর জিনিসগুলি সর্বদা মোকাবেলা করেন তার জন্য এটি একটি ভাল উপমা।

.NET IO.stream পড়ার পদ্ধতির মতো একটি সাধারণ অ্যারে টাস্কটি বিবেচনা করুন:

int Read(byte[] buffer, int offset, int length)

এখানে নিজেকে 0-ভিত্তিক অ্যারেগুলি বোঝানোর জন্য আমি আপনাকে পরামর্শ দিচ্ছি যা আরও ভাল:

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

এখন, এই বাস্তবায়নগুলির মধ্যে কোনটি সহজ? কোনটি এখানে এবং সেখানে ছিটানো +1 এবং -1 অফসেট রয়েছে? আমি যা ভেবেছিলাম. আসলে আমি যুক্তি দিয়ে বলব যে কেবলমাত্র যখন সূচীকরণের শৈলীটি বিবেচনা করে না তখন যখন আপনি এমন কিছু ব্যবহার করা উচিত যা একটি অ্যারের মতো ছিল না, যেমন একটি সেট like


এটি ভাসমান পয়েন্ট সহ একটি খারাপ উপমা বিভ্রান্ত পূর্ণসংখ্যার যুক্তি।

2

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

base + n * element_size

সুতরাং 0 অবশ্যই প্রথম অফসেট।


1

এটি বাস্তবায়নের বিভিন্ন উপায় রয়েছে:

  • 0 ভিত্তিক অ্যারে সূচকগুলি
  • 1-ভিত্তিক অ্যারে সূচকগুলি
  • 0 বা 1 ভিত্তিক অ্যারে (ভিবি 6.0 এর মতো ... এটি সত্যই ভয়ঙ্কর)

শেষ পর্যন্ত, আমি মনে করি না যে কোনও ভাষা 0 বা 1 ভিত্তিক অ্যারে ব্যবহার করে কিনা তা বিবেচনা করে। তবে, আমি মনে করি যে সর্বোত্তম পছন্দটি 0-ভিত্তিক অ্যারেগুলি ব্যবহার করা হয়, সাধারণ প্রোগ্রামারের কারণেই বেশিরভাগ প্রোগ্রামার সেই কনভেনশনে ব্যবহৃত হয় এবং এটি ইতিমধ্যে লিখিত কোডের বিশাল সংখ্যাগরিষ্ঠের সাথে সামঞ্জস্যপূর্ণ।

আপনি সত্যিই ভুল করতে পারেন তবেই কেবল ভিজুয়াল বেসিকের মতোই বেমানান হওয়া। আমি বর্তমানে যে কোড বেসটি বজায় করছি তা 0 এবং 1 ভিত্তিক অ্যারেগুলির মধ্যে বিভক্ত; এবং এটি কোনটি খুঁজে বের করা অত্যন্ত কঠিন। এটি লুপের জন্য একটি বিরক্তিকর ভার্বোজের দিকে নিয়ে যায়:

dim i as integer, lb as integer, ub as integer
lb = LBound(array)
ub = UBound(array)
for i = lb to ub
       '...
next

হাহাহা আমি মনে আছে, যে মানুষ
চুষেছে

আমি মনে করি আমার এমনকি নেতিবাচক সংখ্যা দিয়ে শুরু হওয়া অ্যারেগুলি মনে আছে। আমি ভিবি থেকে দূরে থাকার অনেক কারণের মধ্যে একটি মাত্র।

1

রৈখিক সংগ্রহে কোনও আইটেমের অবস্থান সম্পর্কে কথা বলার সময় জিরো স্বাভাবিক ।

বইয়ের পূর্ণ শেল্ফটির কথা চিন্তা করুন - প্রথম বইটি শেল্ফের পাশের প্রাচীরের সাথে ফ্লাশ অবস্থিত - এটি অবস্থান শূন্য।

সুতরাং আমি অনুমান করি এটির উপর নির্ভর করে আপনি অ্যারে সূচকগুলিকে জিনিসগুলি সন্ধান করার বা বিষয়গুলির উল্লেখ করার উপায় বলে বিবেচনা করছেন কিনা on


1

আমি 0 ভিত্তিক সূচককে পছন্দ করি যেহেতু মডুলো (এবং মোডুলোর জন্য যখন অপারেটর ব্যবহার করা হয়) সর্বদা কিছু মানের জন্য 0 প্রদান করে।

আমি প্রায়শই নিজেকে এই জাতীয় অ্যারে ব্যবহার করে দেখতে পাই:

int blah = array[i & 0xff];

1 ভিত্তিক সূচকগুলি ব্যবহার করার সময় আমি প্রায়শই এই জাতীয় কোডটি ভুল করি।


1

অ্যারে-ভিত্তিক কোডের অনেকগুলি প্রোগ্রামিং ছাড়াই 0-বেস রক্ষা করা শক্ত, যেমন স্ট্রিং সন্ধান এবং বিভিন্ন শ্রেণীবদ্ধকরণ / একত্রীকরণ অ্যালগরিদমগুলি বা একক মাত্রার অ্যারেতে বহু-মাত্রিক অ্যারেগুলি সিমুলেট করা। ফোর্টরান 1-ভিত্তিক, এবং এই জাতীয় কোডটি সঠিকভাবে সম্পাদন করার জন্য আপনার প্রচুর কফির প্রয়োজন।

তবে এটি এর বাইরেও যায়। কোনও উপাদানের সূচকগুলি পরিবর্তে কোনও কিছুর দৈর্ঘ্য সম্পর্কে চিন্তা করতে সক্ষম হওয়া এটি একটি খুব দরকারী মানসিক অভ্যাস। উদাহরণস্বরূপ, পিক্সেল-ভিত্তিক গ্রাফিকগুলি করার ক্ষেত্রে, স্থানাঙ্কগুলি পিক্সেলের পরিবর্তে পড়ার চেয়ে বেশি স্পষ্ট হয়। এইভাবে, একটি 3x3 আয়তক্ষেত্রে 16 নয়, 9 পিক্সেল রয়েছে।

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

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


1

এটি ঠিক তাই, এবং বহু বছর ধরে। এটিকে পরিবর্তন করা, এমনকি বিতর্ক করাও ট্র্যাফিক লাইট পরিবর্তন বা বিতর্ক করা ঠিক ততটাই অর্থহীন। আসুন নীল = থামুন, লাল = যান।

সি ++ এর জন্য সংখ্যাসূচক রেসিপিগুলিতে সময়ের সাথে সাথে পরিবর্তনগুলি দেখুন। তারা নকল 1-ভিত্তিক সূচকে ম্যাক্রোগুলি ব্যবহার করেছিল, তবে 2001 এর সংস্করণটি ছেড়ে দিয়েছে এবং পশুর সাথে যোগ দিয়েছে। এর পেছনের কারণগুলিতে তাদের সাইট www.nr.com এ আলোকিত করার সামগ্রী থাকতে পারে

বিটিডাব্লু, বিরক্তিকর হ'ল একটি অ্যারের বাইরে একটি ব্যাপ্তি নির্দিষ্ট করার রূপগুলি। উদাহরণ: পাইথন বনাম আইডিএল; a [100: 200] বনাম একটি [100: 199] 100 টি উপাদান পেতে। প্রতিটি ভাষার শিখতে শিখতে হবে। এমন একটি ভাষা পরিবর্তনের জন্য যা এটির সাথে একরকমভাবে মিলে যায় তবে দাঁত ঘষতে ও ঘষতে পারে এবং কোনও আসল সমস্যা সমাধান না করে।


1

আমি 0-ভিত্তিক অ্যারে পছন্দ করি কারণ অন্যরা যেমন বলেছে এটি গণিতকে সহজ করে তোলে। উদাহরণস্বরূপ, যদি আমাদের একটি 10-1010 গ্রিড অনুকরণকারী 100 টি উপাদানের 1-মাত্রিক অ্যারে থাকে তবে সারি r, কর্ন সিতে উপাদানটির অ্যারে সূচক আমি কী?

0 ভিত্তিক: i = 10 * আর + সি
1-ভিত্তিক: i = 10 * (r - 1) + গ

এবং, সূচকটি i দিয়ে দেওয়া সারি এবং কলামে ফিরে যাওয়া হ'ল:

0-ভিত্তিক: সি = i% 10
         r = তল (i / 10)
1-ভিত্তিক: সি = (আমি - 1)% 10 + 1
         আর = সিল (i / 10)

উপরের গণিতটি 1-ভিত্তিক অ্যারেগুলি ব্যবহার করার সময় স্পষ্টত আরও জটিল বলে দেওয়া হয়েছে, 0-ভিত্তিক অ্যারেগুলি মান হিসাবে বেছে নেওয়া যৌক্তিক বলে মনে হয়।

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

সম্ভবত আরও ভাল যুক্তিটি হ'ল 1-ভিত্তিক অ্যারেগুলির সাহায্যে কোনও ভাষায় অ্যারে সূচক ক্রিয়াকলাপকে হ্রাস করার জন্য সিলিং ফাংশনটি ব্যবহার করে পূর্ণসংখ্যা বিভাগ করা প্রয়োজন require যাইহোক, গাণিতিক দৃষ্টিকোণ থেকে, পূর্ণসংখ্যা বিভাগে ডি বাকী আর, যেখানে d এবং r উভয়ই ধনাত্মক হয় ফিরে আসা উচিত। সুতরাং, 0-ভিত্তিক অ্যারেগুলি গণিতকে সহজ করার জন্য ব্যবহার করা উচিত।

উদাহরণস্বরূপ, যদি আপনি এন উপাদানগুলির সাথে অনুসন্ধানের টেবিল তৈরি করে থাকেন তবে মান x এর জন্য অ্যারের মধ্যে বর্তমান মানের পূর্বে নিকটতম সূচকটি হবে (প্রায়, মানগুলি উপেক্ষা করে যেখানে ফলাফলটি বৃত্তাকার পূর্বে পূর্ণসংখ্যা হয়):

মেঝে সহ 0-ভিত্তিক: মেঝে ((এন - 1) * এক্স / এক্সরেঞ্জ)
মেঝে সহ 1-ভিত্তিক: মেঝে ((এন - 1) * এক্স / এক্সরেঞ্জ) + 1
সিলের সাথে 1-ভিত্তিক: সিল ((এন - 1) * এক্স / এক্সরেঞ্জ)

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


আপনার বহুমাত্রিক অ্যারে সমর্থনকারী উচ্চ স্তরের ভাষা না পাওয়া পর্যন্ত এটি একটি ভাল কারণ good

1

আমি বাজি ধরছি প্রোগ্রামারটি কেবল প্রতিদিন চিন্তাভাবনা করে 0 ভিত্তিক অ্যারের পাল্টা স্বজ্ঞাততায় বিরক্ত হয়েছিল এবং অ্যারে বর্ণনার আরও স্বজ্ঞাত উপায়ের জন্য তর্ক করছিলাম। আমি এটাকে বিড়ম্বিত মনে করি যে মানুষ হিসাবে আমরা "ক্লাস" নিয়ে আসতে এতটা সময় ব্যয় করেছি যাতে আমরা আমাদের কোডগুলিতে আরও বেশি মানবিক উপায়ে জিনিসগুলি বর্ণনা করতে পারি, তবে তারপরে 0 বনাম 1 অ্যারের দিকে তাকালে আমরা মনে করি যে আমরা স্তব্ধ হয়ে যাব এটি একা যুক্তি।

যতদূর কম্পিউটার সম্পর্কিত এবং গাণিতিকভাবে 0 সম্ভবত ভাল হতে চলেছে, তবে আমি মনে করি একটি পয়েন্ট এখানে মিস করা হচ্ছে। আমরা যদি জিনিসগুলিকে আরও মানবিক উপায়ে (উদাহরণস্বরূপ শ্রেণি) বর্ণনা করতে চাইতাম তবে আমরা ভাষার অন্যান্য অংশের জন্য কেন একই জিনিস চাইব না? মানুষের কাছে সহজেই উপলব্ধিযোগ্য এবং ব্যবহারযোগ্য ভাষা তৈরি করার জন্য এটি কি সমান যৌক্তিক বা বৈধ নয় (বা সেই বিষয়টির জন্য উচ্চতর অগ্রাধিকার গ্রহণ করুন ...) এবং এইভাবে, প্রসারিত করে এমন পরিস্থিতিতে এমন ঝুঁকির ঝুঁকির ঝোঁক তৈরি করে যা যুক্তি-বাগ তৈরি করে এবং আরও প্রবণ করে একটি ব্যবহারযোগ্য সৃষ্টি দ্রুত উত্পাদন। পিএইচপি উদাহরণ:

array(1 => 'January', 'February', 'March');

আমাদের অনুরোধ অনুযায়ী 1 ভিত্তিক অ্যারে দেয়।

কেন না আদর্শ আছে:

array('January', 'February', 'March');

এবং ব্যতিক্রমটি হ'ল:

array(0 => 'Value for scenario where 0 *has* to be used as the key',
      'value2', 'value3');

পিএইচপি বলার ক্ষেত্রে, আমার বাজি ৮০% সময় হয় যখন 1 ভিত্তিক অ্যারেটি ডিফল্ট বাক্যনির্মাণের ভিত্তিতে বাস্তব বিশ্বের ব্যবহারের ক্ষেত্রে যুক্তি-বাগগুলি হ্রাস করে বা কমপক্ষে গড়পড়তা কারণ তৈরি না করে, যদিও এটি অনেক কিছু তৈরি করে while কোডার উপর দ্রুত ব্যবহারযোগ্য কোড উত্পাদন করা সহজ। মনে রাখবেন, আমি যখন ধরে নিচ্ছি তখনও প্রয়োজন হবে এর জন্য অ্যারে (0 => 'মান') এর বিকল্প থাকবে, তবে বাস্তব বিশ্বের বর্ণনার কাছাকাছি কিছু থাকার জন্য এটি বেশিরভাগ সময় ব্যবহারিক বাস্তব হিসাবে ধরে নিচ্ছি।

এই দৃষ্টিকোণ থেকে এটি দেখার জন্য যখন সত্যিই অনুরোধটি খুব বেশি দূরে সঞ্চারিত হয় না। কোনও ইন্টারফেসের কাছে যাওয়ার সময়, এটি কোনও ওএস বা প্রোগ্রামারটির ভাষা হোন, আমরা যেভাবে মানুষের চিন্তাভাবনা এবং অভ্যাসের চারপাশে এটি ডিজাইন করি, বেশিরভাগ ক্ষেত্রেই আমরা যত বেশি খুশি থাকি এবং মানব এবং কম্পিউটারের মধ্যে কম ভুল বোঝাবুঝি হয় (মানব যুক্তি- বাগ), এবং দ্রুত উত্পাদন ইত্যাদি we যদি বাস্তব জগতের ৮০% সময় আমি তালিকাগুলি তৈরি বা গণনা করার সময় 1 এর সাথে জিনিসগুলি বর্ণনা করি তবে কম্পিউটারটিকে আমার অর্থটি এমনভাবে ব্যাখ্যা করা উচিত যা এটি সামান্য তথ্যের সাথে বোঝে বা সম্ভব হিসাবে কিছু বর্ণনা করার স্বাভাবিক পদ্ধতি থেকে পরিবর্তন করে। সংক্ষেপে আমরা বাস্তব বিশ্বের মডেল করতে পারি, বিমূর্ততা আরও ভাল মানের। সুতরাং তিনি যা চান তা কোনওভাবেই বোকা নয় যেহেতু এটিই চূড়ান্ত লক্ষ্য এবং এটি আরও বিমূর্ততার প্রয়োজনের প্রমাণ হতে পারে। কম্পিউটারটি শেষ পর্যন্ত 0 টি ভিত্তিক অ্যারের বিশেষ ব্যবহার হিসাবে এটি দেখতে পাবে। কম্পিউটার এতক্ষণ কীভাবে এটি ব্যাখ্যা করে আমি তার কম যত্ন নিতে পারি কারণ এটি সময়ের সাথে কম বাগ সহ আমি কী চাই তা বর্ণনা করার একটি সহজ এবং আরও স্বজ্ঞাত উপায়।

সুতরাং, এটি আমার দুই সেন্ট। তিনি কী বলছিলেন, বা যার অর্থ ব্যাখ্যা করা হয়েছিল, আমি তার গুরুত্বে সন্দেহ করি doubt তাঁর সম্ভবত যা বোঝাতে চেয়েছিল তা হ'ল, "আমি কম্পিউটারটি যা চাই তা বলার কম স্বজ্ঞাত উপায় ঘৃণা করি" " :) আমরা সবাই না? হাঃ হাঃ হাঃ.


1

আপনার নিজের "কোড" লেখার সময় আপনি যদি যত্ন নেন তবে এটি সম্ভব। আপনি ধরে নিতে পারেন আপনার সূচকটি n থেকে শুরু হয়ে সমস্ত এন> = 0 এবং সেই অনুযায়ী প্রোগ্রামের জন্য।

মান সম্পর্কে, বোরালিদ একটি দুর্দান্ত যুক্তি আছে।

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