M_PI গণিত h এর সাথে কাজ করে তবে ভিজ্যুয়াল স্টুডিওতে cmath দিয়ে নয়


96

আমি ভিজ্যুয়াল স্টুডিও 2010 ব্যবহার করছি I আমি পড়েছি যে সি ++ এ ব্যবহার <cmath>না করে ব্যবহার করা ভাল <math.h>

তবে প্রোগ্রামটিতে আমি লিখার চেষ্টা করছি (Win32 কনসোল অ্যাপ্লিকেশন, খালি প্রকল্প) যদি আমি লিখি:

#define _USE_MATH_DEFINES
#include <math.h>

এটি সংকলন, আমি লিখতে হয়, যখন

#define _USE_MATH_DEFINES
#include <cmath>

এটি সঙ্গে ব্যর্থ হয়

ত্রুটি C2065: 'M_PI': অঘোষিত শনাক্তকারী

এটা কি স্বাভাবিক? আমি cmath বা গণিত h ব্যবহার করে তা কি বিবেচনা করে? যদি হ্যাঁ, তবে আমি এটি কীভাবে চিত্তাকর্ষক করে কাজ করব?

আপডেট : আমি যদি জিইউআইতে _USE_MATH_DEFINES সংজ্ঞায়িত করি তবে এটি কার্যকর হয়। কোনও ক্লু কেন এমন হচ্ছে?


আপনার উত্স ফাইল .c বা .cpp?
সুইস

4
সুইস: এখানে ব্যাপার হওয়া উচিত নয়।
রুবেনভিবি

খুব অদ্ভুত ... আমি নিশ্চিত করতে পারি যে VS2010 এর সাথে আমিও একই সমস্যা পেয়েছি ... সংজ্ঞায়িত হওয়া কী থামছে তা খতিয়ে দেখছি ... এটি অবশ্যই কোথাও অপ্রয়োজনীয় হওয়া উচিত ... তবে আমি কোথায় বুঝতে পারি না
Goz

X86 এর সাথে এটি ত্রুটি C2065 এর অভিযোগ করবে। X64 এর সাথে, তবে কোনও ত্রুটি নেই।
ব্যবহারকারী2616989

উত্তর:


117

মজার বিষয় হল আমি এটি আমার একটি অ্যাপ্লিকেশনটিতে পরীক্ষা করেছি এবং আমি একই ত্রুটি পেয়েছি।

আমি হেডারের মাধ্যমে যাচাই করে কিছুক্ষণ ব্যয় করেছি যে এখানে অপরিবর্তিত কিছু আছে _USE_MATH_DEFINESএবং কিছুই পাওয়া যায় নি।

সুতরাং আমি সরানো

#define _USE_MATH_DEFINES
#include <cmath>

আমার ফাইলের প্রথম জিনিস হতে হবে (আমি পিসিএইচএস ব্যবহার করি না তাই আপনি যদি হন তবে আপনার এটি পরে থাকতে হবে #include "stdafx.h") এবং হঠাৎ এটি পুরোপুরি সংকলন করে।

পৃষ্ঠার উপরের দিকে এটি সরানোর চেষ্টা করুন। কেন এটি যদিও সমস্যার কারণ হবে তা সম্পূর্ণরূপে অনিশ্চিত।

সম্পাদনা করুন : এটি নির্ধারণ করা। #include <math.h>Cmath এর হেডার রক্ষীদের মধ্যে দেখা দেয়। এর অর্থ হল # অন্তর্ভুক্তের তালিকার উচ্চতর কিছু নির্দিষ্ট করা cmathছাড়াই অন্তর্ভুক্ত #definemath.hবিশেষভাবে, যাতে আপনি এটিকে পুনরায় অন্তর্ভুক্ত করতে পারে যে এখন যোগ করার জন্য পরিবর্তিত সংজ্ঞায়িত ডিজাইন করা হয়েছে M_PIইত্যাদি এই সঙ্গে ঘটনা না cmath। সুতরাং আপনাকে #define _USE_MATH_DEFINESঅন্য কিছু অন্তর্ভুক্ত করার আগে আপনাকে নিশ্চিত করতে হবে। আশা করি এটি আপনার জন্য পরিষ্কার হয়ে গেছে :)

ব্যর্থ হওয়াতে math.hযেটি ইতিমধ্যে আপনি চিহ্নিত করেছেন হিসাবে আপনি অ-মানক সি / সি ++ ব্যবহার করছেন :)

সম্পাদনা 2 : বা মন্তব্যগুলিতে ডেভিডটি উল্লেখ করার সাথে সাথে নিজেকে নিজেকে একটি ধ্রুবক হিসাবে তৈরি করুন যা মানটিকে সংজ্ঞা দেয় এবং যাইহোক আপনার কাছে আরও কিছু বহনযোগ্য :) আছে


এর আগে এটি সংজ্ঞায়িত করা stdafx.hহ'ল ওপিএস সমস্যাটি আমি এর আগে এই আচরণের মুখোমুখি হয়েছি।
অলোক সেভ করুন

@ অলস: না এটি নয় ... এটি আমার উপরের সম্পাদনাগুলিতে ফাটল এবং ব্যাখ্যা করেছে :)
Goz

ওয়েল এটিই প্রথম কাজটি ছিল, এটি অন্য সমস্ত হেডারদের উপরে রাখুন আমি ওপিকে একই কাজ করতে বলেছিলাম .... যাইহোক আমার উত্তরটি মুছবে কেননা আপনার উত্তরটি কেন স্ট্যান্ডার্ড শিরোনামগুলির আগে হওয়া উচিত তার আসল কারণটি বলে says
অলোক

4
আপনি এই আচরণটি পাবেন, উদাহরণস্বরূপ, যদি আপনি করার আগে # অন্তর্ভুক্ত <math.h> এর সাথে অন্য কিছু ঘটে থাকে। এটি বলেছিল, <cmath> << math.h> অন্তর্ভুক্ত করতে হবে বা <math.h> এ অ-মানক সংজ্ঞা সক্ষম করতে হবে এমন স্ট্যান্ডার্ডে এমন কিছুই নেই। দুর্ভাগ্যক্রমে, এম_পিআই মানহীন। বহনযোগ্যতার জন্য, সবচেয়ে ভাল কাজটি এটি নিজেরাই সংজ্ঞায়িত করা। আরও ভাল, এটি const static doubleএকটি # নির্ধারিত মানের পরিবর্তে একটি করুন।
ডেভিড হামেন

4
@ ডেভিড হ্যামেন: একমত হয়েছেন .. এটিকে নিজের সংজ্ঞা দেওয়া নিঃসন্দেহে সবচেয়ে বহনযোগ্য বিকল্প :)
Goz

14

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


ভিজ্যুয়ালস্টুডিও থেকে অপারেটিং করার সময় এটি সম্ভবত একটি ভাল উত্তর, তবে নোট করুন যে মতলব ম্যাক্স কমান্ড লাইন (আমি ব্যবহার করেছি mex -D_USE_MATH_DEFINES) সংকলন করার সময় এটি আমার জন্য সমস্যার সমাধান করেনি । কেবলমাত্র /Y-কিছু মতলব মেক্সোপশন ফাইলগুলিতেই গন্ধ যুক্ত করা সাহায্য করেছে ...
ওরফে.নিস

10

এটি আমার পক্ষে কাজ করে:

#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>

using namespace std;

int main()
{
    cout << M_PI << endl;

    return 0;
}

প্রনয়ন এবং প্রিন্ট piমত উচিত: cl /O2 main.cpp /link /out:test.exe

আপনার পোস্ট করা কোডটিতে এবং কোনওটি আপনি সংকলনের চেষ্টা করছেন তাতে অবশ্যই কোনও মিল নেই।

আপনার আগে কোনও পূর্বনির্ধারিত শিরোনাম টানছে না তা নিশ্চিত হন #define


আপনি ভিজুয়ালস্টুডিওর কোন সংস্করণ ব্যবহার করছেন?
Goz

একই প্রোগ্রামটি আমার জন্য ভিজ্যুয়াল সি ++ 2010 এক্সপ্রেস সংস্করণের কমান্ড লাইন সংকলকটি ব্যবহার করে দুর্দান্ত কাজ করেছে। পার্থক্যটি হ'ল আমি <istream> থেকে স্টাড :: কোট এর পরিবর্তে <cstdio> থেকে std :: printf () ব্যবহার করেছি।

4
হ্যাঁ আমি এটি বুঝতে পেরেছি ... এর কারণ ম্যাথস এইচএএমএথের হেডার গার্ডগুলির মধ্যে থেকে বলা হয়েছিল ... সুতরাং ম্যাথস এইচটি ইতিমধ্যে # নির্ধারিত সেট ছাড়াই আগের শিরোনাম থেকে অন্তর্ভুক্ত করা হয়েছে :)
Goz

4

কনসোল বা উইন্ডোজ অ্যাপ্লিকেশন তৈরি করার সময় এটি ভিএস সম্প্রদায় 2015 এবং 2017 এ এখনও একটি সমস্যা। প্রকল্পটি যদি পূর্বনির্ধারিত শিরোলেখ দিয়ে তৈরি করা হয় তবে পূর্বনির্ধারিত শিরোনামগুলি # টির অন্তর্ভুক্ত হওয়ার আগে স্পষ্টতই লোড করা হয় , সুতরাং # ডিফাইন _USE_MATH_DEFINES প্রথম লাইন হলেও এটি সংকলন করবে না। # গণিতের পরিবর্তে # গণিতের পরিবর্তে কোনও পার্থক্য আসে না।

আমি কেবলমাত্র সমাধানগুলি হ'ল হয় একটি ফাঁকা প্রকল্প থেকে শুরু করা (সাধারণ কনসোল বা এম্বেড থাকা সিস্টেম অ্যাপ্লিকেশনগুলির জন্য) বা কমান্ড লাইন আর্গুমেন্টে / ওয়াই- যুক্ত করা, যা প্রাকম্পম্পিল্ড শিরোনামগুলির লোডিং বন্ধ করে দেয়।

পূর্বনির্ধারিত শিরোনাম অক্ষম করার বিষয়ে তথ্যের জন্য, https://msdn.microsoft.com/en-us/library/1hy7a92h.aspx দেখুন

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


আমি নিশ্চিত করি যে হ্যাকিং /
ওয়াই-

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

1

মাইথ কনস্ট্যান্ট সম্পর্কে মাইক্রোসফ্ট ডকুমেন্টেশন অনুযায়ী :

আপনার প্রকল্পটি রিলিজ মোডে তৈরি হওয়ার সময় ফাইলটি ATLComTime.hঅন্তর্ভুক্ত রয়েছে math.h। আপনি যদি কোনও প্রকল্পে গণিতের ধ্রুবকগুলির এক বা একাধিক ব্যবহার করেন তবে আপনাকে অন্তর্ভুক্ত করার আগে আপনাকে ATLComTime.hঅবশ্যই সংজ্ঞায়িত করতে হবে ।_USE_MATH_DEFINESATLComTime.h

ফাইলটি ATLComTime.hআপনার প্রকল্পে অপ্রত্যক্ষভাবে অন্তর্ভুক্ত থাকতে পারে। আমার ক্ষেত্রে অন্তর্ভুক্ত করার একটি সম্ভাব্য আদেশ ছিল:

প্রকল্পের "stdafx.h"<afxdtctl.h><afxdisp.h><ATLComTime.h><math.h>


এটি ব্যাখ্যা করতে পারে যে / Y- (stdafx.h অক্ষম করুন) সমস্যার সমাধান করবে কেন, তবে এটি ব্যাখ্যা করতে হবে -D_USE_MATH_DEFINESযে ডিফল্ট সংকলক সেটিংস সরবরাহ করা কেন সমস্যার সমাধান করার পক্ষে যথেষ্ট নয় ... যেহেতু সংকলনটি আমার নিজের জন্য মাতলাব ম্যাক্স কমান্ডের মাধ্যমে হয়েছিল সমস্যা, এটি ট্র্যাক করা খুব সুস্পষ্ট নয় ...
aka.nice

1

সিএমকে দিয়ে এটা ঠিক হবে

add_compile_definitions(_USE_MATH_DEFINES)

মধ্যে CMakeLists.txt


0

ব্যবহারকারী 78৮60০666০-এর পরামর্শ অনুসারে, প্রকল্পটিতে ডান ক্লিক করুন, বৈশিষ্ট্য নির্বাচন করুন, সি / সি ++ -> প্রিপ্রসেসরটিতে নেভিগেট করুন _USE_MATH_DEFINESএবং প্রিপ্রসেসর সংজ্ঞাতে যুক্ত করুন।

এটাই আমার পক্ষে কাজ করেছে।

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