1 सूची संरचनाओं और सरणियों के साथ अजीब समस्या

पर बनाया गया सवाल Tue, Apr 9, 2019 12:00 AM

मैं ग्राफ़ का उपयोग करके एक पथ नियोजन एल्गोरिथ्म को लागू कर रहा हूं। मेरे कार्यान्वयन में मेरे पास नोड्स और एज संरचनाएं हैं। नोड के सदस्यों में से एक किनारों की एक सूची है। मेरे पास एक अजीब समस्या है जो मेरे कोड में आई थी जब मैंने एक सरणी में नोड के लिए एक पॉइंटर का इस्तेमाल किया था, मैं इसे नीचे अलग करने में कामयाब रहा हूं:

int main()
{
  // Node node_array[5];                            // If I use this array, the program works fine.
  Node* node_array=(Node*)calloc(5, sizeof(Node) ); // This causes a problem

  Node* pointer_to_node=&(node_array[0]); 
  pointer_to_node->id=0;

  cout << "Did it work?" << "\n";//.
  cout << pointer_to_node->id << "\n";     // This works fine
  cout << (*pointer_to_node).id << "\n";   // This works fine
  Node bla=*pointer_to_node;               //This crashes the program. But if I remove the list of edges from Node, then it works fine.
  cout << "Yes it worked!" << "\n";        // Something is breaking if I don't reach this.
}

प्रोग्राम क्रैश हो जाता है (मुद्रण के बिना मौजूद रहता है "हाँ यह काम किया है!") जब मैं पॉइंटरेंस को इंगित करने का प्रयास करता हूं_टो_नोड। मेरे द्वारा देखी गई तीन चीजें हैं।

-यदि मैं एक नोड को परिभाषित करता हूं, एक पॉइंटर बनाता हूं और फिर इसे डीरफर करता हूं, तो कोई समस्या नहीं है।

-यदि मैं नोड नोड_रे [5] का उपयोग करके नोड्स की एक सरणी बनाता हूं, तो यह कार्यक्रम ठीक काम करता है।

-यदि मैं नोड से किनारों के सदस्य की सूची को हटाता हूं, तो सब कुछ ठीक काम करता है।

मुझे पता है कि इस तरह से कुछ को लागू करने के कई आसान तरीके हैं, लेकिन मैं यह जानने के लिए उत्सुक हूं कि कार्यक्रम को दुर्घटनाग्रस्त करने के लिए मैं वास्तव में यहां क्या तोड़ रहा हूं। मैं c ++ और स्टैक ओवरफ़्लो के लिए नया हूं, इसलिए किसी भी प्रतिक्रिया की सराहना की जाती है।

यहां मुख्य ()

के ऊपर शेष कोड है
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/types.h>
#include <time.h>
#include <sys/time.h>
#include <math.h>
#include <iostream>
#include <list>
using namespace std;

struct Node;        // NOTE: we'll define this in detail later, but we need it now
struct Edge;

// this is a basic graph node
struct Node
{
  int id;
  list<Edge> edges; // these are edges from {nodes which this node can be accessed}
};

//basic edge data stucture
struct Edge
{
  Node* startNode;     // the edge starts at this node
  Node* endNode;       // the edge goes to this node
  double edgeCost;     // going along the edge cost this much
};

    
0
  1. C ++ में 0600350991100100101035062, malloc, या calloc का उपयोग न करें। एक अच्छी पुस्तक प्राप्त करें।
    2019-04-09 13: 17: 34Z
    1 उत्तर                              1                         

    आपके realloc में Node शामिल हैं। यह C ++ वर्ग है जिसका अपना गैर-तुच्छ राज्य है। list और Node node_array[5]; के बीच अंतर यह है कि पहले वाला वास्तव में कंस्ट्रक्टरों को ठीक से बुलाएगा। कोड बम इस बुरी तरह से इनिशियलाइज़ड लिस्ट को कहीं और कॉपी करने की कोशिश करता है। यदि आप एक गतिशील आवंटन चाहते हैं, तो इसके बजाय 0600350991100100135035062 का उपयोग करें।

        
    3
    2019-04-09 13: 26: 37Z
    calloc(5, sizeof(Node) )
स्रोत रखा गया यहाँ