2015-04-26 6 views
2

У меня есть две матрицы как глобальные переменные. Однако, когда я запускаю свой проект, я получаю ошибку компоновщика 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; 
} 

я столкнулся эту проблему раньше, но исправил ее, выбирая глобальные переменные. Однако мне нужно оптимизировать этот код, и использование глобальных переменных - это способ сделать это, поэтому мне нужно понять это. Благодаря!

+5

Вы на самом деле следует избегать их. –

+0

Вы не можете избежать неизбежных иногда. – user3125367

+0

Хмм, набор данных, на котором я делаю SVD, огромен. Должен ли я возвращаться и передавать в массиве указателей? – h20poloman

ответ

5

В заголовочном файле только объявить им.

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; 

В одном из файлов .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]; 
Смежные вопросы