I have two matrices as global variables. However, when I run my project, I get a apache Mach-O linker error in xCode that says that my global variables are declared more than once. I've determined the problem to be the placement of my global variables and the imports of the header files.
我有两个矩阵作为全局变量。但是,当我运行我的项目时,我在xCode中得到一个apache Mach-O链接器错误,该错误表明我的全局变量被多次声明。我已确定问题是我的全局变量的放置和头文件的导入。
My svd.h is here:
我的svd.h在这里:
#ifndef __netflix_project__svd__
#define __netflix_project__svd__
#include <stdio.h>
#include "dataManager.h"
const float GLOBAL_AVG_SET1 = 3.608609;
const float GLOBAL_AVG_SET2 = 3.608859;
const int TOTAL_USERS = 458293;
const int TOTAL_MOVIES = 17770;
double **user_feature_table = new double *[TOTAL_USERS];
double **movie_feature_table = new double *[TOTAL_MOVIES];
void initialize(int num_features);
void train();
double predictRating(int user, int movie);
#endif /* defined(__netflix_project__svd__) */
My svd.cpp is here:
我的svd.cpp在这里:
#include "svd.h"
void initialize(int num_features) {
for(int i = 0; i < TOTAL_USERS; i++) {
user_feature_table[i] = new double[num_features];
for(int k = 0; k < num_features; k++) {
user_feature_table[i][k] = GLOBAL_AVG_SET2 / num_features;
}
}
for(int i = 0; i < TOTAL_MOVIES; i++) {
movie_feature_table[i] = new double[num_features];
for(int k = 0; k < num_features; k++) {
movie_feature_table[i][k] = GLOBAL_AVG_SET2 / num_features;
}
}
}
My main.cpp looks like this:
我的main.cpp看起来像这样:
#include <iostream>
#include "svd.h"
int main(int argc, const char * argv[]) {
// Parse file and store test points as testPoint objects
std::vector<testPoint*> dataSet = fillTestPoints();
// Get global average of data set
/*
double avg = getGlobalAverage(dataSet);
printf("%f", avg);
*/
initialize(30);
for(int i = 0; i < TOTAL_USERS; i++) {
printf("%f\n", user_feature_table[i][0]);
}
return 0;
}
I ran into this problem before, but fixed it by taking out the global variables. However, I do need to optimize this code, and using global variables is the way to do it so I do need to figure this out. Thanks!
我之前遇到过这个问题,但是通过取出全局变量来修复它。但是,我确实需要优化此代码,并且使用全局变量是实现此目的的方法,因此我需要弄清楚这一点。谢谢!
1 个解决方案
#1
6
In header file, only declare them.
在头文件中,只声明它们。
extern const float GLOBAL_AVG_SET1;
extern const float GLOBAL_AVG_SET2;
extern const int TOTAL_USERS;
extern const int TOTAL_MOVIES;
extern double **user_feature_table;
extern double **movie_feature_table;
In one of your .cpp files, define and initialize them:
在其中一个.cpp文件中,定义并初始化它们:
const float GLOBAL_AVG_SET1 = 3.608609;
const float GLOBAL_AVG_SET2 = 3.608859;
const int TOTAL_USERS = 458293;
const int TOTAL_MOVIES = 17770;
double **user_feature_table = new double *[TOTAL_USERS];
double **movie_feature_table = new double *[TOTAL_MOVIES];
#1
6
In header file, only declare them.
在头文件中,只声明它们。
extern const float GLOBAL_AVG_SET1;
extern const float GLOBAL_AVG_SET2;
extern const int TOTAL_USERS;
extern const int TOTAL_MOVIES;
extern double **user_feature_table;
extern double **movie_feature_table;
In one of your .cpp files, define and initialize them:
在其中一个.cpp文件中,定义并初始化它们:
const float GLOBAL_AVG_SET1 = 3.608609;
const float GLOBAL_AVG_SET2 = 3.608859;
const int TOTAL_USERS = 458293;
const int TOTAL_MOVIES = 17770;
double **user_feature_table = new double *[TOTAL_USERS];
double **movie_feature_table = new double *[TOTAL_MOVIES];