আমি বিভিন্ন সংকলকের মাধ্যমে নিম্নলিখিত কোডটি চালাচ্ছি:
int main()
{
float **a;
void **b;
b = a;
}
আমি যা সংগ্রহ করতে পারব থেকে, void **
হয় না একটি জেনেরিক পয়েন্টার যার মানে অন্য পয়েন্টার থেকে কোন রূপান্তর কম্পাইল করা উচিত নয় বা অন্তত একটি সতর্কবার্তা নিক্ষেপ করা। তবে, এখানে আমার ফলাফলগুলি (উইন্ডোতে সমস্ত সম্পন্ন হয়েছে):
- জিসিসি - প্রত্যাশার মতো একটি সতর্কতা নিক্ষেপ করে।
- g ++ - প্রত্যাশার মতো ত্রুটি ছুঁড়েছে (এটি সি ++ এর কম অনুমতিপ্রাপ্ত টাইপিংয়ের কারণে হয়েছে কি?)
- এমএসভিসি (cl.exe) - এমনকি / ওয়াল নির্দিষ্ট করেও কোনও সতর্কতা দেয় না।
আমার প্রশ্নটি: আমি কি পুরো জিনিসটি সম্পর্কে কিছু মিস করছি এবং এমএসভিসি সতর্কতা উত্থাপন করার কোনও নির্দিষ্ট কারণ নেই? MSVC করে যখন রূপান্তর একটি সতর্কবার্তা উত্পাদন থেকে void **
থেকে float **
।
নোটের আরেকটি বিষয়: আমি যদি a = b
স্বচ্ছ রূপান্তরটি দিয়ে প্রতিস্থাপন করি a = (void **)b
তবে সংকলকগুলির মধ্যে কেউ সতর্কতা ছুঁড়ে না ফেলে। আমি ভেবেছিলাম এটি একটি অবৈধ castালাই হওয়া উচিত, তবে কেন কোনও সতর্কতা থাকবে না?
আমি এই প্রশ্নটি জিজ্ঞাসা করার কারণটি হ'ল আমি CUDA এবং অফিসিয়াল প্রোগ্রামিং গাইড ( https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory ) শিখতে শুরু করেছি was নিম্নলিখিত কোডটি পাওয়া যাবে:
// Allocate vectors in device memory
float* d_A;
cudaMalloc(&d_A, size);
যা একটি অন্তর্নিহিত রূপান্তর সম্পাদন করা উচিত void **
জন্য &d_A
, প্রথম আর্গুমেন্ট হিসাবে এর cudaMalloc
ধরনের হয় void **
। ডকুমেন্টেশন জুড়ে একই কোড পাওয়া যাবে। এটি কি এনভিআইডিআইএর শেষ দিকে ঝিমঝিম কাজ নাকি আমি আবার কিছু হারিয়ে যাচ্ছি? যেহেতু nvcc
এমএসভিসি ব্যবহার করে, কোড সতর্কতা ছাড়াই সংকলন করে।
void**
জেনেরিক পয়েন্টার নয়। শুধু void*
হয়।
(void**)
একটি স্পষ্টত সি স্টাইলের castালাই। এটি সংকলককে বলে যে আপনি কী করছেন তা ঘনিষ্ঠভাবে না দেখে এবং আপনাকে বিশ্বাস করে to এটি প্রকারের সুরক্ষা সিস্টেমের স্পষ্ট ওভাররাইড এবং সংকলকরা মূলত যে কোনও ধরণের রূপান্তর গ্রহণ করতে হয়। সি স্টাইলের কাস্টগুলি এড়ানো উচিত, এগুলি খুব শক্তিশালী। সি ++ এর মতো কাস্ট ব্যবহার করুন static_cast
যা আপনি যদি এমন কিছু করার চেষ্টা করছেন যা বোঝা যায় না তবে অভিযোগ করবে।