2015-10-28 1 views
-2

J'utilise CodeBlocks pour C++ et c'est probablement un problème de compilateur. J'apprends en utilisant le pointeur de vecteur et ai essayé de créer la fonction qui retourne le pointeur de vecteur. Voici mon code. Il a compilé et exécuté avant sans utiliser de pointeur. Maintenant j'essaye d'avoir une fonction qui renvoie le pointeur, mais d'une manière ou d'une autre cela ne fonctionne pas et je n'ai pas pu comprendre les erreurs. S'il vous plaît aider.Problème du compilateur CodeBlocks, C++

erreur:

main.cpp|8|undefined reference to `RandomNum::RandomNum(int, int, int, int) 
main.cpp|9|undefined reference to `RandomNum::getVecPointer() 

main.cpp

#include <iostream> 
#include "RandomNum.h" 

using namespace std; 

int main() 
{ 
    RandomNum rand(5, 5, 100, 1000); <----error 
    vector<float>* p = rand.getVecPointer(); 
    cout << (*p)[0] << endl; 

    return 0; 
} 

RandomNum.h

#include <vector> 

#ifndef RANDOMNUM_H 
#define RANDOMNUM_H 

class RandomNum 
    { 
private: 

    int M, x, y, z; //M is the number of cells 
    std::vector <float> aVector; 

public: 
    //constructor 
    RandomNum(int, int, int, int); 

    //generate random float between 0 and 1; 
    float unif(); 

    //build a vector of random points 
    std::vector<float>* getVecPointer(); 
}; 
#endif 

RandomNum.cpp

#include "RandomNum.h" 
#include <cmath> //for trunc() 

RandomNum::RandomNum(int MM,int xx, int yy, int zz) 
{ 
    //x, y, z are seeds, M is the number of random numbers to be generated [0,1] 
    M = MM; 
    x = xx; 
    y = yy; 
    z = zz; 
} 

float RandomNum::unif() 
{ 
    float tmp; 

    ... 

    return(tmp - trunc(tmp)); 
} 

std::vector<float>* RandomNum::getVecPointer() 
{ 
    int i ; 
    for (i = 0 ; i < M; i++) 
    { 
     float x = unif(); 
     aVector.push_back(x); 
    } 
    return &aVector; 
} 
+2

Tout d'abord, vous * do * construire avec le fichier 'RandomNum.cpp', et créer un lien avec le fichier objet qu'il génère? Deuxièmement, la chose «normale» est de renvoyer une * référence * à la place d'un pointeur, ce qui rend l'utilisation plus facile, par ex. l'opérateur d'indexation. Troisièmement, le nom 'getVecPointer' est un peu trompeur, la fonction ne renvoie pas seulement * * un pointeur vers le vecteur, elle le remplit aussi avec des données. –

+0

Plus précisément, quelque chose comme 'g ++ -c RandomNum.cpp && g ++ -o principal main.cpp RandomNum.o' (ajuster pour le compilateur/plate-forme). –

+0

S'il vous plaît partager les détails de la façon dont vous construisez ce code. Il y a probablement une erreur de liaison dans votre implémentation. –

Répondre

1

Je suis incapable pour reproduire votre problème. J'ai téléchargé vos fichiers et j'ai créé un Makefile:

OLIST += rand.o RandomNum.o 

CFLAGS += -Wall -Werror 

all: rand 

%.o: %.cpp 
    c++ $(CFLAGS) -c $< 

rand: $(OLIST) 
    c++ -o rand $(OLIST) 

clean: 
    rm -f *.o rand 

est ici la sortie de la marque:

c++ -Wall -Werror -c rand.cpp 
c++ -Wall -Werror -c RandomNum.cpp 
c++ -o rand rand.o RandomNum.o 

Notez que parce que vous aviez un problème de compilation, je nop'ed l'appel trunc si les choses serait plus simple (c'est-à-dire que ce n'était pas pertinent pour le problème que vous aviez). Aussi, j'ai renommé main.cpp en rand.cpp [encore, ne devrait faire aucune différence]

+0

Merci. J'ai ajusté le réglage du compilateur et maintenant le programme s'exécute comme prévu. La fonction de test que j'ai faite en retournant un pointeur fonctionne très bien. – MLAC

0

Si vous utilisez le membre public vector :: at, qui retourne un élément à la position i dans le vecteur, votre code fonctionnera

int main() 
{ 
    RandomNum rand(5, 5, 100, 1000); // <----error 
    vector<float>* p = rand.getVecPointer(); 
    for (int i = 0; i < p->size(); i++) { 
     cout << (p)->at(i); 
    } 

    return 0; 
} 

Bien que ce programme soit valide, il existe peu de raisons d'utiliser un pointeur sur un vecteur. Les vecteurs sont construits pour utiliser RAII (Resource Acquisition Is Initialization), une méthode de gestion de leur propre mémoire. Lorsque vous utilisez un pointeur sur un vecteur, vous annulez le but de RAII. Vous devrez peut-être gérer l'allocation de mémoire/le nettoyage, les pointeurs NULL, etc., ce dont RAII est censé vous épargner.

Votre fonction getVecPointer() peut retourner le vecteur :: données fonction de membre public qui renvoie un pointeur sur le premier élément du tableau utilisé en interne par le vecteur ...

int* p = myvector.data();