У меня есть две матрицы как глобальные переменные. Однако, когда я запускаю свой проект, я получаю ошибку компоновщика Mach-O apache в xCode, которая говорит, что мои глобальные переменные объявляются более одного раза. Я решил, что проблема заключается в размещении моих глобальных переменных и импорте файлов заголовков.Как объявить глобальные переменные в моем проекте на C++?
Мой 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__) */
Мой 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;
}
}
}
Мой 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;
}
я столкнулся эту проблему раньше, но исправил ее, выбирая глобальные переменные. Однако мне нужно оптимизировать этот код, и использование глобальных переменных - это способ сделать это, поэтому мне нужно понять это. Благодаря!
Вы на самом деле следует избегать их. –
Вы не можете избежать неизбежных иногда. – user3125367
Хмм, набор данных, на котором я делаю SVD, огромен. Должен ли я возвращаться и передавать в массиве указателей? – h20poloman