foo (অকার্যকর) বনাম foo (শূন্য *)


9

কার্যকরী এবং সিনট্যাক্টিকালি বললে, কোনও ফাংশনের মধ্যে পার্থক্য আছে যার প্রোটোটাইপ int foo(void)এবং int foo(void *)?

আমি উদাহরণস্বরূপ, int bar(int)এবং int bar(int *)- এর মধ্যে পার্থক্যটি জানি of তার মধ্যে একটি ইন্টের সন্ধান করছে, এবং অন্যটি কোনও ইনট পয়েন্টার খুঁজছে। না voidএকই ভাবে আচরণ?


সম্পর্কিত সম্পর্কিত একটি উত্তর: stackoverflow.com/a/1043209/434551
আর সাহু


আরও আকর্ষণীয় হতে পারে foo(void)এবং মধ্যে পার্থক্য foo()
ম্যাক্সিম এগারুশকিন

উত্তর:


10

সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের এই উত্তর থেকে voidএটি কীভাবে ব্যবহৃত হবে তার উপর নির্ভর করে বিশেষভাবে চিকিত্সা করা হয়। ইন Cএবং C++, কোনও ডেটা টাইপের অনুপস্থিতিvoid নির্দেশ করতে ব্যবহৃত হয় , অন্যদিকে মেমোরিতে কিছু ডেটা / স্পেসvoid * নির্দেশ করে এমন পয়েন্টার নির্দেশ করতে ব্যবহৃত হয় যা টাইপ নেই। void *এটি নিজস্বভাবে ডিফারেন্স করা যায় না এবং প্রথমে অন্য কোনও ধরণের কাস্ট করতে হবে। এই castালাইটি সুস্পষ্ট হওয়ার দরকার নেই C, তবে এটি অবশ্যই স্পষ্ট হওয়া উচিত C++। (এই কারণেই আমরা মলোকের রিটার্ন মানটি কাস্ট করি না void *))


যখন প্যারামিটার হিসাবে কোনও ফাংশন ব্যবহার করা হয়, তার voidঅর্থ কোনও পরামিতিগুলির মোট অনুপস্থিতি এবং এটি কেবলমাত্র পরামিতি অনুমোদিত। একটি চলক টাইপের মতো শূন্যতা ব্যবহার করার চেষ্টা করা বা সংকলক ত্রুটির ফলে অন্যান্য যুক্তিগুলির ফলাফল অন্তর্ভুক্ত:

int foo(void, int);     //trying to use "void" as a parameter
int bar(void baz);      //trying to use "void" as an argument's type
main.c:1:8: error: 'void' must be the first and only parameter if specified
int foo(void, int);
       ^
main.c:2:14: error: argument may not have 'void' type
int bar(void baz);
             ^

টাইপের সাথে ভেরিয়েবল ঘোষণা করাও একইভাবে অসম্ভব void:

int main(void) {
  void qux;         //trying to create a variable with type void
}
main.c:5:8: error: variable has incomplete type 'void'
  void qux;

voidকোনও ফাংশনের রিটার্ন মান কোনও ডেটা ফেরত আসবে না তা নির্দেশ করে। যেহেতু প্রকারের পরিবর্তনশীল ঘোষণা voidকরা অসম্ভব void, তাই একটি শূন্য পয়েন্টার সহ এমনকি কোনও ফাংশনের রিটার্ন মান ধরা অসম্ভব

void foo(int i) { return; }

int main(void) {
  void *j;
  j = foo(0);

  return 0;
}
main.c:5:5: error: assigning to 'void *' from
      incompatible type 'void'
  j = foo(0);
    ^ ~~~~~~

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

#include <stdio.h>

int main(void) {
  double foo = 47.2;    //create a double
  void *bar = &foo;     //create a void pointer to that double
  char *baz = bar;      //create a char pointer from the void pointer, which
                        //is supposed to hold a double

  fprintf(stdout, "%s\n", baz);
}

নিম্নলিখিত কোডটি তবে পুরোপুরি আইনী; একটি অকার্যকর পয়েন্টার থেকে এবং থেকে castালাই এটি ধারণ করা মানটি কখনই পরিবর্তন করে না।

#include <stdio.h>

int main(void) {
  double foo = 47.2;
  void *bar = &foo;
  double *baz = bar;

  fprintf(stdout, "%f\n", *baz);
}

47.200000

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

int quux(void *);   //a function that receives a pointer to data whose type is not known, and returns an int.
void *quuz(int);    //a function that receives an int, and returns a pointer to data whose type is not known.

tl; dr void একটি ফাংশন প্রোটোটাইপের অর্থ "কোনও ডেটা নেই" এবং কোনও void *ফাংশন প্রোটোটাইপের অর্থ কোনও প্রকারের মান বা কোনও প্যারামিটার নির্দেশ করে না, "এই ফাংশনটিতে প্রদত্ত পয়েন্টারে থাকা ডেটাটির একটি পরিচিত প্রকার নেই" এবং একটি পরামিতি বা প্রত্যাবর্তনের মান নির্দেশ করে পয়েন্টারটিতে ডেটা ব্যবহার করার আগে যার পয়েন্টারটি অবশ্যই অন্য কোনও ধরণের কাস্ট করতে হবে।


void * ... must be cast to another type first, but may be done so without an explicit cast.সি ++ তে সত্য নয়। সি ++ এ রূপান্তর ফর্মটি void*অবশ্যই স্পষ্ট হওয়া উচিত। PSালাকে স্পষ্টভাবে স্পষ্ট বলা পিএস অপ্রয়োজনীয় কারণ কাস্ট সংজ্ঞা অনুসারে একটি সুস্পষ্ট রূপান্তর।
এরেরিকা

সি / সি ++ পার্থক্য প্রতিফলিত করার জন্য আপডেট হয়েছে, আমাকে জানানোর জন্য আপনাকে ধন্যবাদ!
নিক রিড

4

foo(void) - কোন পরামিতি সঙ্গে ফাংশন

foo(void *)- একটি void *প্যারামিটার দিয়ে ফাংশন

কী void *? এটি কোনও নির্দিষ্ট প্রকারের সাথে ডেটাতে কেবল পয়েন্টার। এটি অন্য কোনও পয়েন্টার প্রকারে কাস্ট করা যায়

unsigned add(void *arr)
{
   unsigned *uarr = arr;
   return uarr[0] + uarr[1];
}

প্রয়োজনীয় উত্তর, সুতরাং এটি সেরা। আমি কেবল ইলিশ করব যে এটি (type) vs. (type *)দম্পতিদের মহাবিশ্বের একটি ব্যতিক্রম কেননা শূন্যতা আসলে কোনও প্রকার নয়।
রবার্তো ক্যাবনি

2

কার্যকরীভাবে এবং সিন্ট্যাক্টিকভাবে বলতে গেলে, এমন কোনও ফাংশনের মধ্যে কোনও পার্থক্য রয়েছে যার প্রোটোটাইপটি ইন্ট ফু (শূন্য) এবং ইন্ট ফু (শূন্য *)?

পার্থক্য আছে:

int foo(void) কোনও ফাংশন ঘোষণা করে যা কোনও আর্গুমেন্ট গ্রহণ করে না।

int foo(void *)এমন একটি ফাংশন ঘোষণা করে যা টাইপের একক যুক্তি গ্রহণ করে void*

সি ++ int foo(void)তে সমান int foo()

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