2012-02-03 12 views
7

Ho un problema con Eclipse Indigo lamentando che i metodi di una classe non possono essere risolti, ma compilando comunque e funzionando correttamente (AFAIK). È un programma molto semplice. Ecco Population.cpp:Il metodo Eclipse non può essere risolto con un semplice programma C++

#include <stdlib.h> 
#include <iostream> 
#include <time.h> 
#include "Population.h" 

Population::Population() { 
    // TODO Auto-generated constructor stub 

} 

Population::~Population() { 
    // TODO Auto-generated destructor stub 
} 

void Population::initializePop(int numBits, int N) { 

    srand((unsigned)time(0)); 
    for(int i=0; i<N; i++) { 
     x[i] = (char*) calloc(numBits, sizeof(char)); 
     for(int j=0; j<numBits; j++) { 
      if(rand() < 0.5) 
       x[i][j] = 0; 
      else 
       x[i][j] = 1; 
     } 
    } 

} 

char** Population::getX() { 
    return x; 
} 

void Population::printStuff() { 
    std::cout << "Whatever"; 
} 

Ora, ho creato quel codice e tutto va bene. In un altro progetto all'interno di Eclipse, sto chiamando questo codice come questo:

#include <typeinfo> 
#include <string.h> 
#include <iostream> 
#include "cute.h" 
#include "ide_listener.h" 
#include "cute_runner.h" 
#include "Population.cpp" 

void testPopulationGeneration() { 
    Population* p = new Population; 
    int N = 10; 
    int bits = 4; 
    char** pop; 

    ASSERTM("Population variable improperly initialized", dynamic_cast<Population*>(p)); 

    std::cout << p->printStuff(); 
    std::cout << "Ok..."; 
    p->initializePop(bits, N); 

    pop = p->getX(); 
    ASSERTM("Pop not correct size.", sizeof(pop) == 10); 
} 

Come potete vedere sto in corso anche il plugin per CUTE TDD in C++. Non si lamenta quando dichiaro p come tipo Population e passa la prima asserzione. Sono un po 'nuovo al C++, ma mi sono assicurato di aggiungere il progetto da cui Population.cpp proviene al percorso di inclusione per il progetto di test.

Non è un grosso problema perché non mi interessa nulla di ovvio, ma è ancora molto fastidioso. Non vedo una situazione in cui dovrebbe farlo.

Grazie per qualsiasi aiuto!

risposta

3

sizeof(pointer) restituisce la dimensione del puntatore (4 su sistemi a 32 bit e 8 su 64 bit), non la dimensione di ciò a cui punta! Salva le dimensioni nella classe e aggiungi una funzione per restituirle.

Inoltre, in initializePop non è necessario allocare l'array X effettivo?

X = calloc(N, sizeof(char *)); 

O meglio, è necessario utilizzare new per l'allocazione in quanto si utilizza C++:

X = new char* [N]; 

e versioni successive:

X[i] = new char [numbits]; 
+0

Grazie per la punta! Non risponde alla domanda, ma la dimensione della punta mi ha aiutato. Credo di aver usato linguaggi di alto livello per troppo tempo. Poco arrugginito sulle basi del genere. Sembra quasi un hack per archiviare le dimensioni insieme alla matrice stessa, ma suppongo che se la dimensione dell'array sarà l'input da riga di comando, non c'è modo migliore di farlo in C++. –

10

Questo potrebbe essere un problema di indicizzazione relative al esterni #include intestazioni non trovato. Seguire i passaggi qui sotto e vedere se aiuta:

  1. Vai a ciascuno di vostra abitudine #include (ad esempio "cute.h") e premere F3 (vale a dire "Visualizza dichiarazione"); vedere se è in grado di accedere a quel file o no; se non copia questi file su qualche blocco note
  2. Se il file non è accessibile, localizzalo nella struttura di directory ; per esempio. "Cute.h" e "ah" si trovano a, "C://Eclipse/MyWork/Workspace/Project/include_1" e "ide_listener.h" si trova a , "C://Eclipse/MyWork/Workspace/Project/include_2", quindi copiare entrambi i percorsi delle cartelle su alcuni notepad
  3. All'interno Eclipse andare a Project -> Properties -> C/C++ General -> Paths and Sybmols; vedrai diverse schede come , Sybmols, Library Paths ...
  4. Fare clic su Library Paths -> Add -> Workspace... -> <locate the above folder paths> e premere OK
  5. Consentire la ricostruzione dell'indicizzatore; ora segui nuovamente il passo (1); spero che i file siano accessibili
  6. Per sicurezza futura per file più grandi, andare su Window -> Preferences -> C/C++ -> Editor -> Scalability -> "Enable scalability mode when ..." e impostare il numero di linee su un numero grande come 500000 e premere "OK";

è necessario L'ultimo passo, perché quando il file cresce in numero di riga e se supera il numero di cui sopra, allora eclissi si fermerà mostrando le definizioni per alcuni "scalabilità" ragioni, anche se sarebbe indicizzato.

+0

Ho provato a esaminare tutti i miei inclusi ed Eclipse può trovare tutte le fonti, quindi non sembra essere il mio problema. –

+0

Non vedo i "Percorsi libreria" sotto Percorsi e Simboli sul mio ADT. Qualcuno sa dove si è trasferito ora? Grazie. – inder

+0

@inder, intendevi 'Windows> Preferenze> Debug/Release> Percorso ricerca origine'? – iammilind

19

Prova questo:

Nella finestra di Explorer del progetto, fare clic destro sul vostro progetto -> Indice -> Ricostruisci

Problemi correlati