সিটিতে ফাংশন আর্গুমেন্ট হিসাবে অ্যারেগুলি কেন পাস করা যায় না?


12

অনুসরণ করছেন এই মন্তব্যটি , আমি কেন গুগল চেষ্টা করেছি, কিন্তু আমার Google-Fu ব্যর্থ হয়েছে।

লিঙ্ক থেকে মন্তব্য:

[...] তবে গুরুত্বপূর্ণ বিষয় হ'ল অ্যারে এবং পয়েন্টারগুলি সি-তে বিভিন্ন জিনিস are

ধরে নিই যে আপনি কোনও সংকলক এক্সটেনশন ব্যবহার করছেন না, আপনি সাধারণত কোনও ফাংশনে কোনও অ্যারে পাস করতে পারবেন না, তবে আপনি একটি পয়েন্টারটি পাস করতে পারেন এবং একটি পয়েন্টারকে সূচি দিতে পারেন যেন এটি অ্যারে হয়।

আপনি কার্যকরভাবে অভিযোগ করছেন যে পয়েন্টারগুলির কোনও দৈর্ঘ্য সংযুক্ত নেই। আপনার অভিযোগ করা উচিত যে অ্যারেগুলি ফাংশন আর্গুমেন্ট হিসাবে পাস করা যায় না, বা অ্যারেগুলি সুস্পষ্টভাবে পয়েন্টারগুলিতে অবনমিত হয়।


আমি নিশ্চিত নই যে এটি উত্তর, তবে অ্যারের ধরণের একটি অংশ এর আকার, সুতরাং আমি বিশ্বাস করি যে আপনি গ্রহণ করতে চান এমন প্রতিটি আকারের জন্য আপনাকে কোনও ফাংশন সংজ্ঞায়িত করতে হবে।
clcto

আপনি কি ফাংশন পয়েন্টার হিসাবে বোঝাতে চান ? দয়া করে প্রশ্নটি পরিষ্কার করুন।
user949300

2
@ user949300 না, মন্তব্যটির প্রসঙ্গে এটি বেশ পরিষ্কার; আপনি কোনও ফাংশনে অ্যারে পাস করতে পারবেন না কারণ এটি পয়েন্টার হয়ে যায়, এবং তিনি কেন জানতে চান তা জানতে চান।
ডোভাল

@ ডকব্রাউন রিলেমন এটির জন্য একটি সম্পাদনার প্রস্তাব দিয়েছে।
ফ্লোরিয়ান মার্জাইন

উত্তর:


18

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

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

[...} সমাধানটি টাইপলেস বিসিপিএল এবং টাইপ করা সি এর মধ্যে বিবর্তনমূলক শৃঙ্খলে অত্যন্ত গুরুত্বপূর্ণ লাফিয়ে দাঁড় করায় এটি স্টোরেজে পয়েন্টারটির বাস্তবায়নকে বাদ দেয় এবং পরিবর্তে অ্যারের নামটি যখন একটি অভিব্যক্তিতে উল্লেখ করা হয় তখন পয়েন্টারটির সৃষ্টি করে। আজকের সি-তে টিকে থাকা এই নিয়মটি হ'ল অ্যারে প্রকারের মানগুলি রূপান্তরিত হয়, যখন সেগুলি প্রকাশে প্রদর্শিত হয়, অ্যারে তৈরির প্রথম বস্তুর পয়েন্টারে পরিণত হয়।

এই আবিষ্কারটি ভাষার শব্দার্থবিজ্ঞানের অন্তর্নিহিত শিফট সত্ত্বেও বেশিরভাগ বিদ্যমান বি কোডটিকে কাজ চালিয়ে যেতে সক্ষম করে। [..]


5
একটি মান দ্বারা পাস করা struct Foo { int array[N]; } যেতে পারে। এবং গতিশীল এবং স্ট্যাটিক বরাদ্দগুলির চিকিত্সা সম্পর্কে শেষ বিটটি একই রকম ফিশ করে মনে হয় (কঠোর অর্থে একটি অ্যারে সর্বদা একটি আকারকে অন্তর্ভুক্ত করে, অ্যারে ইনডেক্সিংয়ের মতো জিনিসগুলির জন্য একত্রিতকরণের ধারণাগুলি পয়েন্টারগুলি অ্যারে-টু-পয়েন্টার ক্ষয়ের সাথে মিলিত হয়), আপনি কী ব্যাখ্যা করতে পারবেন?

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

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

সবকিছু অ্যারের ধরনের (এমনকি অ্যারে যে একটি struct টাইপ অংশ যদিও ছাড়া, মান দ্বারা গৃহীত হয়: @RobertHarvey এখনো ধরন সিস্টেমের মধ্যে একটি অসামঞ্জস্য যে হয় মান দ্বারা গৃহীত), এবং এটা এমনকি কল সাইট এ সঠিক একই স্বরলিপি (উভয় ব্যবহার এবং ফাংশনের স্বাক্ষরে)।

@ ডেলান: আপনারা এটি মনে রাখার চেয়ে অন্য কেন এটি প্রাসঙ্গিক?
রবার্ট হার্ভে

9

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

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


2
আমার কাছে এমন কয়েকটি বোর্ড রয়েছে যা ডেটার জন্য র‌্যামের 256 বাইট এবং কোডটির জন্য 2K ইপ্রোম রয়েছে। আপনি সেখানে কোনও অ্যারের অনুলিপি তৈরি করতে চান না।
জেরি যেরেমিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.