কি ((অকার্যকর (*) ()) বুফ) (); এর অর্থ কি?


59

আমি পিকোসিটিএফ-তে বাইনারি শোষণের চ্যালেঞ্জটি সমাধান করছি এবং কোডের এই অংশটি পেয়েছি:

((void (*)())buf)();

bufএকটি অক্ষর অ্যারে যেখানে ।

আমি চ্যালেঞ্জটি সমাধান করেছি তবে এটি ঠিক কী করছে বুঝতে পারে না। আমি এই সুতোর দিকে তাকিয়েছিলাম কিন্তু আমি এটি তৈরি করতে পারি না।

কী ((void (*)())buf)();মানে?


14
কী ((void (*)())buf)();মানে? এর অর্থ লেখক বুঝতে পারে না typedeftypedef void (*voidFuncPtrType)();এই কোডটি পরিষ্কার করে দেবে।
অ্যান্ড্রু হেনেল

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

2
এর অর্থ আপনার প্রোগ্রামটির ইউবি রয়েছে।
আর .. গীটহাব স্টপ হেল্পিং আইসিসি

4
এর অর্থ সি এর "সর্পিল" প্রকারের ঘোষণার নিয়মটি খুব জটিল। কার্যত প্রতিটি অন্যান্য স্থিতিযুক্ত-টাইপিত ভাষা সি থেকে সরাসরি অবতীর্ণ হয় না এর পরিবর্তে বাম থেকে ডান নিয়ম ব্যবহার করে।
ম্যাসন হুইলারের

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

উত্তর:


129

void (*)() এটি একটি প্রকার, টাইপটি "ফাংশন টু ফাংশন যা অনির্দিষ্ট আর্গুমেন্ট নেয় এবং কোনও মূল্য দেয় না"।

(void (*)()) উপরের ধরণের একটি টাইপ-কাস্ট।

(void (*)())bufbufউপরের ধরণের কাস্ট ।

((void (*)())buf)() ফাংশনটি কল করে (কোনও যুক্তি ছাড়াই)।

সংক্ষেপে: এটি সংকলকটিকে bufকোনও ফাংশনের পয়েন্টার হিসাবে বিবেচনা করতে এবং সেই ফাংশনটি কল করতে বলে।


15
আরও জটিল সি এক্সপ্রেশনগুলি ইংরেজিতে অনুবাদ করার জন্য আমি cdeclইউটিলিটি (বা ওয়েবসাইট ) সহায়ক বলে মনে করি।
বিটিএ

3
@ বিটিএ সিডিকেল এখানে দরকারী নয় কারণ সিনট্যাক্সটি কোনও ঘোষণা নয়। এটি পূর্বে ঘোষিত প্রতীকটিতে কাস্টের মাধ্যমে একটি ফাংশন কল
বলভ

3
@bolov - সমগ্র বিবৃতি, না, কিন্তু এটি করে ব্যাখ্যা সবচেয়ে জটিল অংশ এটি। সেখান থেকে, বাকী ডিকোডিং মোটামুটি সোজা।
বিটিএ

5
@ অ্যাভিডি যদি যেখানেই bufবা যেখানে copyঅবস্থিত হয় তা কার্যকর করার যোগ্য ঠিকানায় থাকে এবং কোডটি নিজেই অবস্থান-স্বতন্ত্র থাকে, এটি কাজ করবে। এটি অবশ্যই বহনযোগ্য হিসাবে এটি পাওয়ার মতো, তবে এটি অনেকগুলি খালি-ধাতব পরিবেশের পাশাপাশি পুরানো x86 ওএসেও কাজ করা উচিত যা স্ট্যাক এবং হিপটিতে কোনও এক্সিকিউট (এনএক্স) বিট সেট করে না।
wrtlprnft

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

11

পয়েন্টারটিকে bufঅনির্দিষ্ট সংখ্যক পরামিতি গ্রহণ করে পয়েন্টারটিকে অকার্যকর ফাংশনে রূপান্তরিত করা হয় এবং তারপরে অবনতিযুক্ত (অর্থাৎ ফাংশন নামে ডাকা হয়)।


9

এটি একটি টাইপকাস্ট, তার পরে একটি ফাংশন কল। প্রথমত, ফাংশনটিতে bufপয়েন্টারটিতে কাস্ট করা হয় যা ফিরে আসে void। শেষ যুগের বন্ধনী মানে ফাংশনটি তখন ডাকা হয়।


7

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

একটি ব্যাখ্যা:

"অক্ষর অ্যারে" আসলে মেশিন কোডের একটি অ্যারে। আপনি যখন অ্যারে নিক্ষেপ করেন void (*)()এবং কল করেন, এটি অ্যারের ভিতরে মেশিন কোড চালায়। আপনি যদি অ্যারের সামগ্রীগুলি সরবরাহ করেন তবে আমি এটি আপনার জন্য বিচ্ছিন্ন করতে এবং এটি কী করছে তা আপনাকে জানিয়ে দিতে পারি।

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