ungültige parameter werden an funktion übergeben



  • hallo,
    ich habe das porblem das ich koordinaten einlese und dann mit create distancematrix mit eine matrix baue mit der entfernung von jedem zu jedem punkt.dabei tritt increatedistancematrix ein fehler auf da lt compiler ungültige parameter an createDistancematrix übergeben werden und das programm wird mit dem aufruf von createdistancematix nicht mehr ausgeführt. bitte um hilfe wie ich createdistancematrix zum laufen bringe
    beste grüsse
    reinhold
    t

    #include"stdafx.h"
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    // ***** global variables, structures and constants *****
    struct Customer   // keeps all data of a point, coordinates and demand
    {
    	int x;
    	int y;
    	int demand;
    };
    
    vector<Customer> listOfCus;
    int numberCus, capacity, maxRouteTime, serviceTime; // first line variables
    
    Customer depot;
    
    vector<vector<int>> listOfTours;
    
    int nearestNeighbor;
    
    // ***** functions and function prototypes *****
    void readDataFile()
    {
    	//string tmp;
    
    	ifstream dataFile("C:\\Users\\Reinhold Weihs\\Desktop\\cvrp_instances\\vrpnc1.txt");
    
    	int cx, cy, cd; // just for initial reading of the data
    
    	dataFile >> numberCus >> capacity >> maxRouteTime >> serviceTime; // read first line and safe the values
    	//cout << numberCus <<" " << capacity << " " << maxRouteTime <<" " << serviceTime << endl;
    	cout << "Number of customers: " << numberCus << endl;
    	dataFile >> depot.x >> depot.y; // read the second line with the depot coordinates
    	//cout << depot.x << " " << depot.y << endl;
    
    	listOfCus.insert(listOfCus.begin(),depot); // save the depot in the list of customers
    
    	for (int i = 1; i < numberCus+1; i++) // reads all the other customer coordinates and demand & safe it in the list of customers
    	{
    		dataFile >> cx >> cy >> cd;
    
    		//cout << cx << " " << cy << " " << cd << endl;
    
    		if (!dataFile.fail())
    		{
    			Customer c;
    			c.x = cx;
    			c.y = cy;
    			c.demand = cd;
    			listOfCus.insert(listOfCus.begin()+i,c);
    		}
    	}
    
    	dataFile.close();
    }
    float calcEuclideanDist(const Customer firstCostumer, const Customer secondCostumer)
    {
        double dist=sqrt(pow(firstCostumer.x-secondCostumer.x,2)+pow(firstCostumer.y-secondCostumer.y,2));
        return dist;
    
    }
    
    void createDistanceMatrix( vector<Customer> listOfCus,vector<vector<float> >&distanceMatrix)
    {
    
        for(int row=0;row<numberCus;row++)
        {
            for(int column=0;column<numberCus;column++)
            {
                distanceMatrix[row][column]=calcEuclideanDist(listOfCus[row],listOfCus[column]);
    
            }
        }
    }
    


  • Reinhold.Weihs schrieb:

    da lt compiler ungültige parameter an createDistancematrix übergeben werden

    Fehlermeldung pls



  • Es wird wohl eher nicht der Compiler sein, der die Meldung ausspuckt. Benutze einen Debugger. Wahrscheinlich ist irgendwo row/column falsch. std::vector kennt seine Größe, so etwas wie numberCus muss man da nicht benutzen.

    Welchen Sinn hat hier das const?

    float calcEuclideanDist(const Customer firstCostumer, const Customer secondCostumer)
    


  • Wenn der Aufruf der Funktion falsch ist, wieso postest du dann nicht den Codeteil, wo der Aufruf drinsteht?



  • so zur fehlermeldung es kommt eine box mit der meldung" main funktioniert nicht mehr", unten der codeteil wo die funktion aufgerufen wir. const hat den grund weil hier die euklidische distanzformel dist=Wurzel(xi-xj)2+(yi-yj)2 berechnet wird und die funktion für die distanzmatrix dann den wert an der stelle xij wobei i die zeile der distanzmatrix und j die spalte der distanzmatrix ist!. Die loops für row und colomn kommen daher das die distanzmatrix genau so viele zeilen und spalten hat wie kunden eingelesen wurden daher numberCUS als kürzel für number of costumer
    lg
    reinhold

    int main()
    {   Customer firstCostumer;
        Customer secondCostumer;
        vector<vector<float>>distanceMatrix;
        int startingNode=0;
        vector<bool> unvisitedCus;
    	vector<int> solution;
       int secondcostumer;
       int nextNode=0;
    	readDataFile();
    	createDistanceMatrix(listOfCus,distanceMatrix);
    


  • In createDistanceMatrix greifst du auf Zeilen und Spalten von distanceMatrix zu, die nicht existieren (der vector ist komplett leer)



  • in die distanzmatrix sollen die werte eingetragen werden die in calcEtuklidianDist berechnet wurden ich habe auch versucht mit dem wert dist den calcEuklidianDist zurückgibt in der funktion createDistancematrix über

    distanceMatrix.push_back(dist)
    

    die werte reinzuschreiben leider auch dieses ansinnen scheiterte.....dist war als globale variable definiert.



  • geschafft:)

    vector<float>distanzmatrix ;
    distanzmatrix.push_back(dist)
    

    und funktion distanzmatrix wurde ersatzlos eingespart 😃 danke für die zahlreiche hilfe !


Anmelden zum Antworten