又一个:将结构的向量传递给函数 - C ++,MinGW

时间:2014-01-06 11:40:48

标签: c++ eclipse function vector struct

我知道这里有很多类似的问题,但我无法解决这个问题,没有同事,所以:

我正在使用MinGW(4.8.x)和Eclipse CDT Kepler。

1)我有自己的代码并清理它我改变它使用结构的向量 - 一切都很好,除了接收它的函数抱怨无效参数'。

2)我将代码缩减到最小的工作示例,如果我将它全部放在一个文件中它可以工作,但是如果我将我的定义移出到标题(我需要在我的主代码中执行)它突然无法解析结构中的字段... 下面的代码用于三个文件配置,header / function / main。

(在我的主要代码中我使用namespace std - 但这似乎不是问题。另外,在这里有最多的工作示例的无关标题,但是在我的主代码中需要它们。 )

myheaders.h

/*************************/
/****** myheaders.h ******/
/*************************/

/**-- Header Files --**/

// File Streams and IO
#include <stdio.h>
#include <sstream>
#include <iostream>
#include <fstream>

// For strtod -> string to double
#include <stdlib.h>

// Math Operations
//#include <math.h>
#include <cmath>

// To get the CPU time
#include <time.h>

// For Vectors
#include <vector>

// For strings, C strings right now...
#include <cstring>

// Needed globally for the function definitions
// using namespace std;

#ifndef MY_HEADERS
#define MY_HEADERS

struct SpeciesLoss {
    int ReactionID;
    int SpeciesID;
    double coefficient;
};

std::vector< double > SpeciesLossRate(std::vector<SpeciesLoss> , int, const std::vector< double > & );

#endif

function.cpp

/*************************/
/****** function.cpp *****/
/*************************/

#include "myheaders.h"

std::vector< double > SpeciesLossRate(
    std::vector< SpeciesLoss > SpeciesLossList,
    int Number_Species,
    const std::vector< double >& Combined_Rates
    )
{
    std::vector< double > temp_species_loss;
    temp_species_loss.resize(1);

    temp_species_loss[0]=SpeciesLossList[0].ReactionID;

    return temp_species_loss;
}    

的main.cpp

/*************************/
/******** main.cpp *******/
/*************************/

#include "myheaders.h"

std::vector< SpeciesLoss > SpeciesLossAll; // New vector for recording species loss, uses a vector of structs

int main(int argc, char* argv[])
{
    std::vector< double > Rates;
    Rates.push_back(1);

    SpeciesLossAll.push_back(SpeciesLoss());
    SpeciesLossAll[0].ReactionID = 0;
    SpeciesLossAll[0].SpeciesID = 0;
    SpeciesLossAll[0].coefficient = 0;

    std::vector< double > SpeciesConcentrationChange = SpeciesLossRate(SpeciesLossAll,1, Rates);

    return 0;
}   

编辑:

屏幕截图Screenshot of Code

编辑2: 而且有趣的更新 - 它在使用GCC的Linux上编译得很好。总比没有好,但我仍然想知道出了什么问题,加上我希望我的代码能够跨平台......

编辑3: 这越来越奇怪了 - 我刚刚在我的家用电脑上测试了我的代码(在Linux上编译的完整项目),它运行Windows 7,在我的笔记本电脑运行Windows 8时出现问题并且出现问题。 C ++构建的设置完全相同。 两者都运行MinGW 4.8.1 ...... 两者都运行最新的Eclipse Kepler ......

是的,我知道我还需要测试一些建议。

2 个答案:

答案 0 :(得分:1)

#ifndef MY_HEADERS
#define MY_HEADERS

应该在您的文件的开头。由于你不知道编译器将以什么顺序包含头文件,这可能会导致问题...特别是如果你将你的个人头文件包含在多个文件中,那么肯定会让它表现得如此。另外,请记住,既然您没有提供默认构造函数,而是使用编译器为您提供的构造函数,那么结构中的那些变量很可能不会像您期望的那样初始化为零。

EDIT#1 您是否正在编译所有内容而不仅仅是主...我只是将您的代码复制到VS中并且它有效!

EDIT#2 尝试定义内联函数而不是单独的实现文件。

static std::vector< double > SpeciesLossRate(
    std::vector< SpeciesLoss > SpeciesLossList,
    int Number_Species,
    const std::vector< double >& Combined_Rates
    )
{
    std::vector< double > temp_species_loss;
    temp_species_loss.resize(1);

    temp_species_loss[0]=SpeciesLossList[0].ReactionID;

    return temp_species_loss;
}  

EDIT#3 好的,从屏幕截图来看,这绝对是有效的代码。为了尝试一切;实现自己的构造函数和结构的复制构造函数。我知道这可能听起来很愚蠢但也许Eclipse不这么认为。

答案 1 :(得分:1)

好的 - 我找到了答案 - 我认为 - 它归结为Eclipse。 - &GT;项目 - &gt; C / C ++索引 - &gt;重建

这解决了这个问题。 事实上,早期的Eclipse CDT版本已知这个问题:https://bugs.eclipse.org/bugs/show_bug.cgi?id=348170