निम्नलिखित कार्यक्रम में,

//1 और // काम नहीं कर रहे हैं, लेकिन // काम कर रहे हैं।

//4 और //5 काम नहीं कर रहे हैं, लेकिन //6 काम नहीं कर रहे हैं।

प्रश्न:

यदि स्थिति में पता मान समान हैं, तो तुलना निम्न त्रुटि क्यों दे रही है:

त्रुटि: विशिष्ट सूचक प्रकार 'नोड*' और 'int*' के बीच तुलना में कास्ट का अभाव है*

#include<iostream>
using namespace std;

struct Node  
{
    int data;
    Node *Next;
};

int main()
{
    Node *Node1=new Node;
    Node *Node2=new Node;

    Node1->data=11;
    Node1->Next=Node2;

    Node2->data=22;
    Node2->Next=NULL;

    /* 
    if(Node1->Next==&Node2->data) //1
        cout<<"Node1->Next==&Node2->data"<<endl; //2
    */        
        cout<<"Node1->Next="<<Node1->Next<<"  &Node2->data="<<&Node2->data<<endl;//3 

    /*    
    if(Node2==&Node2->data) //4
        cout<<"Node2==&Node2->data"<<endl; //5
    */   
        cout<<"Node2="<<Node2<<"   &Node2->data="<<&Node2->data<<endl; //6

    if(Node1->Next==Node2)  //7
        cout<<"Node1->Next==Node2"<<endl;  //8 

        cout<<"Node1->Next="<<Node1->Next<<"   Node2="<<Node2<<endl; //9
}

--

**Output:**
Node1->Next=0x7fb05c460e00  &Node2->data=0x7fb05c460e00
Node2=0x7fb05c460e00   &Node2->data=0x7fb05c460e00
Node1->Next==Node2
Node1->Next=0x7fb05c460e00   Node2=0x7fb05c460e00
0
Bahubali 2 नवम्बर 2017, 17:11
1
if(Node1->Next==&Node2->data) आपको इससे क्या उम्मीद थी?
 – 
DimChtz
2 नवम्बर 2017, 17:14
1
आप Node->Next की तुलना &Node->Data से क्यों कर रहे हैं? एक Node का सूचक है, दूसरा int का सूचक है। तुलना के साथ आप वास्तव में क्या हासिल करने की उम्मीद कर रहे हैं?
 – 
Sean
2 नवम्बर 2017, 17:14
1
आप एक int (यानी data फ़ील्ड का पता) के पते के साथ Node * (यानी Next फ़ील्ड) की तुलना करने का प्रयास कर रहे हैं। इसका कोई मतलब नहीं निकलता। आप वास्तव में क्या करना चाहते हैं?
 – 
Darhuuk
2 नवम्बर 2017, 17:15
ओह, मुझे समझ में आ गया, आप यादृच्छिक तुलना लिख ​​रहे हैं: if(Node1->Next==&Node2->data), if(Node2==&Node2->data), आदि.. जब तक आपको कुछ ऐसा न मिल जाए जो काम करता हो। खैर, ऐसा नहीं होने वाला है।
 – 
DimChtz
2 नवम्बर 2017, 17:18
हाय सब, वर्तमान में मैं कोई एप्लिकेशन विकसित नहीं कर रहा हूं। बस मैं समझना चाहता हूं कि पॉइंटर्स के साथ संरचनाएं कैसे काम करती हैं। यदि स्मृति स्थान बिल्कुल समान हैं, तो कथन में तुलना क्यों विफल हो रही है?
 – 
Bahubali
2 नवम्बर 2017, 17:18

2 जवाब

आप विभिन्न सूचक प्रकारों की तुलना कर रहे हैं यानी Node* साथ में int । आप इसे केवल if शर्तों को टाइप करके प्राप्त कर सकते हैं:

if((int*)Node1->Next==(int*)&Node2->data) //1

//and

 if((int*)Node2==(int*)&Node2->data) //4

आप सही हैं कि पते समान हैं लेकिन सी ++ डिफ़ॉल्ट रूप से सख्त प्रकार की जांच करता है, इसलिए आपको कास्ट करने की आवश्यकता क्यों है। हालांकि हो सके तो बचें

3
DeepakKg 2 नवम्बर 2017, 17:24
हालांकि यह एक भयानक विचार की तरह लगता है। आप सेब की तुलना संतरे से कर रहे हैं और दोनों को एक केला बना रहे हैं ताकि उनकी तुलना की जा सके...
 – 
Darhuuk
2 नवम्बर 2017, 17:28
ऐसा लगता है कि ओपी मेमोरी एड्रेस और स्ट्रक्चर लेआउट (शायद) के बारे में कुछ सीखना चाहता है: उपर्युक्त कोड यह जांचने का तरीका है कि स्मृति में कुछ नोड संरचना का पता बिल्कुल संरचना के पहले int डेटा सदस्य का पता है। बहुत संभव है, इस मामले में, उत्तर हाँ है, उनका पता एक ही है। अब जब हम जानते हैं कि इस विशिष्ट मामले में दो पते समान हैं ... चलो इसे भूल जाते हैं और ऐसा कोई कोड नहीं लिखते हैं जो इस तरह की धारणा पर निर्भर करता है (जो निश्चित रूप से टूट जाएगा, उदाहरण के लिए जैसे ही कोई वर्चुअल फ़ंक्शन जोड़ता है नोड संरचना के लिए)
 – 
Gian Paolo
2 नवम्बर 2017, 17:33
दारहुक : नहीं, यह सेब और संतरे के बीच तुलना नहीं है। सभी पॉइंटर्स एक ही आकार के हैं और तुलना करने के लिए उन्हें int * के साथ टाइपकास्ट करना सुरक्षित है। हालांकि यह टालने योग्य है, लेकिन इसमें कुछ भी गलत नहीं है। यदि मैं गलत हूं तो मुझे बताएं
 – 
DeepakKg
2 नवम्बर 2017, 17:37
जैसे ही वर्चुअल फ़ंक्शंस और बेस क्लास और अन्य चीजें फेंक दी जाती हैं, संरचना में आपके द्वारा सूचीबद्ध पहला आइटम पहले नहीं हो सकता है ... जब तक यह विशिष्ट परिस्थितियों को स्पष्ट करता है जिसमें यह काम करता है।
 – 
doctorlove
2 नवम्बर 2017, 18:35
डॉक्टरलोव: आप सही हैं लेकिन मुझे संदेह है कि एक लिंक सूची वर्चुअल फ़ंक्शन के साथ किसी भी उद्देश्य की पूर्ति करेगी :)
 – 
DeepakKg
2 नवम्बर 2017, 18:44

ऐसा लगता है कि आप पॉइंटर्स में संग्रहीत पतों की तुलना करना चाहते हैं, और पॉइंटर्स के प्रकार की परवाह नहीं करते हैं। लेकिन सूचक तुलना उस तरह काम नहीं करती है। यदि आप दो पॉइंटर्स की तुलना करते हैं, तो उनके प्रकार समान होने चाहिए।

Node1->Next प्रकार का है Node* और &Node2->data प्रकार int* का है। इसलिए तुलना विफल हो रही है। लेकिन अगर प्रकार समान होते, तो तुलना का मूल्यांकन true होता।

यदि आप ऐसा करना चाहते हैं, तो आपको उन्हें एक ही प्रकार में डालना होगा, शायद void* पर।

bool compareAddresses(void* ptr1, void* ptr2){
    return ptr1 == ptr2;
}

और आप अपनी स्थिति लिख सकते हैं जैसे:

if (compareAddresses(Node1->Next, &Node2->data))

यहां, पॉइंटर्स स्वचालित रूप से void* पर कास्ट हो जाते हैं। इसी तरह:

if (compareAddresses(Node2, &Node2->data))

देखें यह कोड ideone पर लाइव है

0
Muhammad Ahmad 2 नवम्बर 2017, 17:45