View Full Version : C++ help
Axet
21st October 2009, 17:36
Come ultimo esame devo fare un fottuto progetto di robotica.
Il prof vuole che sia assolutamente scritto in c++, linguaggio che non ho mai usato, e che sia sviluppato con visual studio 2008, ambiente che non ho mai usato.
Sostanzialmente devo scrivere una dll che faccia una certa cosa (parsing da un file per ottenere certe informazioni su oggetti tridimensionali, proiezione di questi oggetti 3d sul piano 2d, generazione di una matrice che esplifichi come sono gli oggetti sul piano 2d e infine la generazione di un file contenente la suddetta matrice).
Ora, sticazzi di quello che devo fare, il mio problema è un altro.. sto facendo dei test per ambientarmi con l'ambiente (lol), ma non capisco come minchia fare ad eseguire la dll. Prima mi obbligava scegliere un file per il debug, scelta che è ricaduta sull'unico disponibile cioè regsvr32.exe.
Ora, se provo ad eseguire il tutto (ovviamente dopo aver compilato), mi dice "nessun nome di DLL specificato".
WTF?
Se qualcuno mi illumina mi fa un grandissimo favore visto che, come già detto, è l'ultimo esame e devo consegnarlo asap visto che il termine per la consegna del libretto per rientrare nella sessione di laurea di dicembre è il 10 novembre.
Aiutoh :love:
Kat
21st October 2009, 18:42
Non ho ben capito cosa ti serve, ma una dll non la puoi eseguire.
Dovresti fare un altro progetto eseguibile (console o window non so che deve fare il tuo programma), aggiungere la reference alla dll e fare le chiamate dal codice di questo progetto.
Regsvr32 serve a registrare le dll o gli oggetti COM, non c'entra col debug.
Axet
21st October 2009, 18:48
Come detto sopra mai usato c++ nè visual studio ergo non conosco un tubo ^^
Cmq boh pensavo che ci fosse un toollino o qualcosa per far girare una dll anche se in linea teorica eseguibile non è. pd -_-
Kat
21st October 2009, 18:58
Purtroppo Visual C++ ce l'ho in ufficio, qui a casa ho solo C#, quindi vado a memoria, pero' la struttura dei progetti dovrebbe essere molto simile e funzionare come ti ho detto.
Crea 2 progetti, uno come Console Application (o Window se deve essere grafico) che e' l eseguibile, l'altro come Class Library ( o come si chiama per il C++) che genera la dll.
Poi dovresti avere un AddReference o simile sul progetto dell'exe e gli aggiungi quello della dll.
A questo punto includi i .h nel codice dell'exe e puoi creare oggetti della dll, dovrebbe funzionarti l'intellisense ecc ecc
Domani eventualmente ti posso dire qualcosa di piu' preciso.
NoeX
21st October 2009, 19:00
Kat mi ha preceduto di 1 minuto, ha detto tutto perfettamente
Altra cosa
CLR Project -> Class Library
Win32 -> Win32 Project per la DLL
Certo che vacca eva, dopo 4-5 anni che non tocco C e faccio solo Java, sono troppo spaesato
P.S.: sto facendo anche io un progetto in C++ con VS 2008.
Ma alla fine gli oggetti che crei meglio managed o non-managed per le 'piccole' cose ?
Axet
21st October 2009, 19:04
Thanks, domani provo che mo son cotto che ho sbattuto la testa per mezza giornata su sta menata di c++ e l'altra mezza giornata su agent speak + java per lo stage :rain:
Come se non bastasse stasera mi tocca pure la sukata by champions porco ido giornata dimmerda t_T
NoeX
21st October 2009, 21:04
Non ho ben capito cosa ti serve, ma una dll non la puoi eseguire.
Dovresti fare un altro progetto eseguibile (console o window non so che deve fare il tuo programma), aggiungere la reference alla dll e fare le chiamate dal codice di questo progetto.
Regsvr32 serve a registrare le dll o gli oggetti COM, non c'entra col debug.
Domanda DLL (dato che a breve dovrò farne una e non le ho mai fatte prima d'ora)
DLL = libreria di funzioni, ok
Ho un progetto in C#, ho una DLL in C++ (CLR o Nativo non penso faccia differenza sull'utilizzo), posso invocarne una funzione della Dll che prende in input un oggetto definito in C++ da C# ?
Non mi torna molto il sistema dei tipi
Kat
21st October 2009, 21:26
Domanda DLL (dato che a breve dovrò farne una e non le ho mai fatte prima d'ora)
DLL = libreria di funzioni, ok
Ho un progetto in C#, ho una DLL in C++ (CLR o Nativo non penso faccia differenza sull'utilizzo), posso invocarne una funzione della Dll che prende in input un oggetto definito in C++ da C# ?
Non mi torna molto il sistema dei tipi
L'argomento e' molto complesso.
Se devi semplicemente chiamare una o piu' funzioni C++ da C#, nel codice c++ devi dichiarare la funzione per essere esportata, una cosa del tipo:
extern "C" __declspec(dllexport) void func()
{
...
}
e poi utilizzare il sistema di P/Invoke di .NET (namespace System.Runtime.InteropServices) dichiarando la stessa funzione in C# nel modo seguente:
[DllImport("nomedll.dll")]
static extern void func();
A quel punto puoi chiamarla nel codice C# come un normale metodo.
Se invece vuoi istanziare oggetti C++ e' molto piu' complicato, l'unico sistema che conosco e' generare delle classi COM in C++ invece che classi normali, poi aggiungere la reference alla dll COM nel progetto C# e .NET si occupera' del resto generando delle classi di Interop corrispondenti a quelle C++, che puoi istanziare normalmente.
Tutto questo senza entrare nel merito del passaggio dei parametri, ci sono delle corrispondenze precise da utilizzare per fare il marshalling dei tipi (bool, int, string, puntatori ecc) fra i due linguaggi.
Se ti serve approfondire posso cercare dei link dove sono spiegati meglio tutti questi meccanismi.
San Vegeta
21st October 2009, 21:44
Domanda DLL (dato che a breve dovrò farne una e non le ho mai fatte prima d'ora)
DLL = libreria di funzioni, ok
Ho un progetto in C#, ho una DLL in C++ (CLR o Nativo non penso faccia differenza sull'utilizzo), posso invocarne una funzione della Dll che prende in input un oggetto definito in C++ da C# ?
Non mi torna molto il sistema dei tipi
controlli a quanti bit è il tipo nativo e usi le funzioni di marshaling/unmarshaling per fare il cast più appropriato.
il bello del c++ è che lavora ancora a basso livello, quindi decidi tu come interpretare le aree di memoria.
Kat
22nd October 2009, 11:43
Un paio di link sull'argomento:
http://www.codeproject.com/KB/COM/cominterop.aspx
Nella prima parte spiega abbastanza bene come creare oggetti COM e utilizzarli in C#.
http://www.codeproject.com/KB/cs/essentialpinvoke.aspx
C'e' una comoda tabella di riferimento per le conversioni di tipo tra C++ e C#.
Hador
22nd October 2009, 11:47
(kat sta sera non ci sei?)
probabilmente non è questo il caso ma per applicazioni molto semplici, o meglio dove i due programmi comunicano solo per 1 funzione, si può anche usare qualche middleware stupidissimo... noi di recente facevamo comunicare java-c# e php tramite xml-rpc.
Glasny
22nd October 2009, 12:08
Povero Axet fa una domanda semplice e nel thread si finiscono per dire cose anche interessanti ma molto più avanzate :D
Per comunicazioni molto semplici si può anche pensare a utilizzare direttamente una connessione tcp.
Riassumo un po' per Axet. Le dll sono delle librerie quindi giustamente non hanno nemmeno un main e necessitano di un'applicazione per essere eseguite. Ecco perchè ti viene detto di creare sia la dll che poi un'applicazione. Il resto ovviamente non c'entra siccome usi semplicemente C++ senza altri linguaggi in mezzo.
Axet
23rd October 2009, 15:42
Ma porco ido del maonnad troia impestata del cristo caro, ho passato una 15ina di tutorial e TUTTI, TUTTI, TUTTI I FOTTUTTISSIMI CODICI DI ESEMPIO NON VANNO.
Come porco ido è possibile cristo, dice che mancano i nomi delle dll da una parte, dall'altra che gli import non sono ok.. l'unica cosa che son riuscito a fare è una normale applicazione console, woot, mi è utile!
Cioè veramente mi stan cadendo i coglioni, bell'ambiente visual studio cazzo t_t
Cifra
23rd October 2009, 15:46
Potresti moderare il tuo linguaggio? Grazie.
Axet
23rd October 2009, 15:52
Potresti moderare il tuo linguaggio? Grazie.
rofl
edit:
Non esiste un tutorial ufficiale o quanto meno fatto come si deve di Visual C++ 2008 inerentemente alla creazione e all'uso in una app console di una dannata dll??
Cioè ogni cazzo di esempio non funziona o perchè non compila e anche se compila poi non funge una ceppa.. ho buttato giu tutto il progetto uml, devo "solo" implementare ma finchè non riesco ad eseguire un tubo sono punto a capo perchè non saprò mai se quel che ho fatto funziona quindi sarebbe solo controproducente.. sto impazzendo sono ore che compilo e provo roba e non funge una sega.
San Vegeta
23rd October 2009, 18:32
Ma porco ido del maonnad troia impestata del cristo caro, ho passato una 15ina di tutorial e TUTTI, TUTTI, TUTTI I FOTTUTTISSIMI CODICI DI ESEMPIO NON VANNO.
Come porco ido è possibile cristo, dice che mancano i nomi delle dll da una parte, dall'altra che gli import non sono ok.. l'unica cosa che son riuscito a fare è una normale applicazione console, woot, mi è utile!
Cioè veramente mi stan cadendo i coglioni, bell'ambiente visual studio cazzo t_t
senza offesa, io quando non avevo mai messo mano al .net, ho installato il visual studio express, aperto l'ide, ho scritto un po' di codice c# che non avevo mai studiato e dopo 1 ora avevo un'applicazione che usava una dll per dialogare con un nostro server scritto in java.
se tutti i tutorial che hai provato non vanno, l'errore è in te. cerca di capire cosa hai fatto di sbagliato in tutti i tutorial, avrai ripetuto lo stesso errore un po' ovunque
Axet
23rd October 2009, 18:37
senza offesa, io quando non avevo mai messo mano al .net, ho installato il visual studio express, aperto l'ide, ho scritto un po' di codice c# che non avevo mai studiato e dopo 1 ora avevo un'applicazione che usava una dll per dialogare con un nostro server scritto in java.
se tutti i tutorial che hai provato non vanno, l'errore è in te. cerca di capire cosa hai fatto di sbagliato in tutti i tutorial, avrai ripetuto lo stesso errore un po' ovunque
No non hai capito, io prendo il progetto di esempio lo importo in VS e non funziona lol
Allora prendo i sorgenti, li copio e li incollo seguendo lo stesso schema del progetto iniziale e cmq non va.
Seguiti poi n-mila tutorial, fatto tutto alla lettera, ricontrollato tutto decine di volte ma nada... sono sul nervoso/incazzato andante tanto più che la deadline si avvicina e non ho scritto una riga di codice
San Vegeta
23rd October 2009, 18:54
dimmi che versioni di .net hai installato, che ide hai e cosa stai facendo... vediamo se riesco a replicarlo qui... tieni conto che ho appena installato 7 e formattato tutto, quindi devo reinstallare tutto pure
Hador
23rd October 2009, 18:56
ma quali tutorial? msdn è mostruosa come documentazione... http://msdn.microsoft.com/it-it/library/60k1461a.aspx
Axet
23rd October 2009, 19:10
dimmi che versioni di .net hai installato, che ide hai e cosa stai facendo... vediamo se riesco a replicarlo qui... tieni conto che ho appena installato 7 e formattato tutto, quindi devo reinstallare tutto pure
Visual studio 2008, sto semplicemente cercando di fare una mini-dll con un solo metodo (che ovviamente viene esposot) e di un applicazione console che la utilizza.
Giusto per capire dove cazzo mettere le mani quando poi comincio ad implementare il progetto che devo fare, visto che come ben puoi immaginare se non riesco ad eseguire il codice che ho scritto non vado da nessuna parte :madd:
@hador:
già cercato da eoni sulle msdn, non ho trovato un tubo che mi possa essere utile.
mahoney
23rd October 2009, 19:14
cosa intendi per non va? errore di compilazione o runtime?
che tipo di character set utilizzi? Unicode oppure Multi-Byte?
Kat
23rd October 2009, 19:15
Che progetto hai provato e che errori ti da?
Magari dal tipo di errore si riesce a capire qual e' il problema e ad aiutarti a compilare e far andare il tutto.
Axet
24th October 2009, 16:34
Scrivo solo ora che prima non ero a casa quindi non avevo i progetti sottomano:
Allora io ho una soluzione chiamata "provaaa" (le "a" in eccesso sono dovute allo sclero me ne sono accorto dopo loll), in cui c'è un progetto chiamato pure lui "provaaa" dove c'è il file d'intestazione dlltest.h siffatto:
#ifndef _DLLTEST_H_
#define _DLLTEST_H_
#include <iostream>
#include <stdio.h>
#include <windows.h>
using namespace std;
extern "C" __declspec(dllexport) void NumberList();
extern "C" __declspec(dllexport) void LetterList();
#endif
Come sorgente invece c'è il file dlltest.cpp:
#include "dlltest.h"
#define MAXMODULE 50
char module[MAXMODULE];
extern "C" __declspec(dllexport)
void NumberList() {
GetModuleFileName(NULL, (LPTSTR)module, MAXMODULE);
cout << "\n\nThis function was called from "
<< module
<< endl << endl;
cout << "NumberList(): ";
for(int i=0; i<10; i++) {
cout << i << " ";
}
cout << endl << endl;
}
extern "C" __declspec(dllexport)
void LetterList() {
GetModuleFileName(NULL, (LPTSTR)module, MAXMODULE);
cout << "\n\nThis function was called from "
<< module
<< endl << endl;
cout << "LetterList(): ";
for(int i=0; i<26; i++) {
cout << char(97 + i) << " ";
}
cout << endl << endl;
}
Sto codice l'ho copiato e incollato da un tutorial e me lo compila senza problemi, ma ovviamente essendo una dll non si può usare come standalone quindi nella stessa soluzione ho creato un nuovo progetto chiamato "testexec" dove c'è il solo file sorgente dllrun01.cpp:
#include <conio.h>
#include "dlltest.h"
void main() {
NumberList();
LetterList();
getch();
}
Anche questo codice l'ho preso dallo stesso tutorial, quindi in teoria dovrebbe fungere.
Invece no, se compilo mi da questo errore:
1>------ Inizio compilazione: Progetto: testexec, Configurazione: Debug Win32 ------
1>Compilazione in corso...
1>dllrun01.cpp
1>c:\documents and settings\hax\documenti\visual studio 2008\projects\provaaa\testexec\dllrun01.cpp(2) : fatal error C1083: Impossibile aprire il file inclusione 'dlltest.h': No such file or directory
1>Il log di compilazione è stato salvato in 'file://c:\Documents and Settings\HaX\Documenti\Visual Studio 2008\Projects\provaaa\testexec\Debug\BuildLog.htm'
1>testexec - 1 errore/i, 0 avviso/i
========== Compilazione: 0 completate, 1 non riuscite, 1 aggiornate, 0 ignorate ==========
Per quale assurda ragione? :|
Ho provato anche a fare una copia del file .dll e metterlo nella cartella del progetto dell'eseguibile ma nada.. il tutorial non diceva altro. Ed era il migliore che ho trovato lol
mahoney
25th October 2009, 15:54
Scrivo solo ora che prima non ero a casa quindi non avevo i progetti sottomano:
Allora io ho una soluzione chiamata "provaaa" (le "a" in eccesso sono dovute allo sclero me ne sono accorto dopo loll), in cui c'è un progetto chiamato pure lui "provaaa" dove c'è il file d'intestazione dlltest.h siffatto:
Come sorgente invece c'è il file dlltest.cpp:
Sto codice l'ho copiato e incollato da un tutorial e me lo compila senza problemi, ma ovviamente essendo una dll non si può usare come standalone quindi nella stessa soluzione ho creato un nuovo progetto chiamato "testexec" dove c'è il solo file sorgente dllrun01.cpp:
Anche questo codice l'ho preso dallo stesso tutorial, quindi in teoria dovrebbe fungere.
Invece no, se compilo mi da questo errore:
Per quale assurda ragione? :|
Ho provato anche a fare una copia del file .dll e metterlo nella cartella del progetto dell'eseguibile ma nada.. il tutorial non diceva altro. Ed era il migliore che ho trovato lol
il debugger da errore di file non trovato, ma non la dll bensi il file.h.
devi creare un path dell'applicazione in modo da permettere a vs2008 di eseguire l'include.(#include "dlltest.h")
Oppure aggiungere la cartella della soluzione alle vc++ directories, dal menu opzioni.
Tools>Options>Projects and Solutions>VC++ Directories
NoeX
25th October 2009, 20:09
Grazie delle risposte :)
Risolto Axet?
Axet
26th October 2009, 00:34
il debugger da errore di file non trovato, ma non la dll bensi il file.h.
devi creare un path dell'applicazione in modo da permettere a vs2008 di eseguire l'include.(#include "dlltest.h")
In che senso? :look:
Ho provato a mettere il percorso completo del file .h, non dice più che non trova la dll, in compenso però dice che le due funzioni che richiamo nel main (definite nella dll) non vengono risolte :rain:
Oppure aggiungere la cartella della soluzione alle vc++ directories, dal menu opzioni.
Tools>Options>Projects and Solutions>VC++ Directories
Aggiunto tutti i percorsi possibili ma ancora mi da lo stesso errore :cry:
Kat
26th October 2009, 11:26
In che senso? :look:
Ho provato a mettere il percorso completo del file .h, non dice più che non trova la dll, in compenso però dice che le due funzioni che richiamo nel main (definite nella dll) non vengono risolte :rain:
Cioe? Unresolved external?
Axet
26th October 2009, 11:29
Cioe? Unresolved external?
Sono in uni e VS ce l'ho sul fisso a casa quindi vado a memoria, cmq diceva qualcosa tipo "_NumberList() non può essere risolto" e "_LetterList() non può essere risolto"
Pd QQ
Kat
26th October 2009, 11:57
Sono in uni e VS ce l'ho sul fisso a casa quindi vado a memoria, cmq diceva qualcosa tipo "_NumberList() non può essere risolto" e "_LetterList() non può essere risolto"
Pd QQ
Ma sono progetti C++ managed o meno? Perche' cambiano un po' di convenzioni e dichiarazioni da utilizzare.
Axet
26th October 2009, 12:01
Unmanaged :O
Glasny
26th October 2009, 14:34
Sei sicuro che l'errore te lo dava il debugger e non il linker ?
Perchè io direi che non hai associato il compilato di dlltest col main, non so se hai fatto due progetti distinti allora è ovvio che di suo non vi sia un riferimento alla dll che hai compilato nel primo progetto. Purtroppo in 5 minuti non ti ho trovato una guida con screen quindi te li dico in 4 parole : devi aggiungere un riferimento NEL progetto del main ALLA dll che hai compilato. Credo ci sia in un qualche menu, add reference, dll, e la metti.
Un consiglio, non usare codice da copiare/incollare ma cerca dei progetti di esempio completi e parti da lì.
Axet
26th October 2009, 17:31
Nada, ho provato ad aggiungere la soluzione come riferimento (click col destro sul progetto -> riferimenti) ma ancora non va.
Btw l'errore lo da in compilazione.. :O
edit:
se invece esplicito tutto il percorso del .h da includere, l'errore me lo da il linker.. sarò stronzo io ma il paradiso si rivolta ogni fottutissima volta che provo a premere f7 t_T
Axet
26th October 2009, 18:05
Ho copia-incollato l'hedaer praticamente OVUNQUE e ha stampato a schermo..
Si è sentita la vocina angelica "aaaaaaaaaaaaaaaaaaaaaahhh" e una luce divina ha illuminato il monitor.
Axet
27th October 2009, 16:22
Torno all'attacco.. ho iniziato a scrivere il codice per il progetto, giusto definire una sola delle classi da ereditare e vedere se riesco a far funzionare la dll anche se dentro ci sono delle classi (l'esempio che ero riuscito a far funzionare non aveva alcuna classe al suo interno)
La dll la compila senza problemi, la mini applicazione console di test però da problemi.. errori col linker etc.
Cmq.. i file interessati in questo caso sono 3:
parseECF.h
//#ifndef _PARSEECF_h_
//#define _PARSEECF_h_
#define matrix_height 30
#define matrix_width 30
#include <string>
//#if defined DLL_EXPORT
//#define DECLDIR _declspec(dllexport)
//#else
//#define DECLDIR _declspec(dllimport)
//#endif
//extern "C" _declspec(dllexport) bool parse(const char* path);
//#endif
extern "C" _declspec(dllexport)
class parseECF
{
public:
//parseECF();
//~parseECF();
private:
int cella;
int obsMatrix[matrix_height][matrix_width];
public:
bool parse(const char* path);
};
parseECF.cpp
#include "parseECF.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
//#include "parseECF.h"
//parseECF()
//{
// parseECF::cella = 10;
//}
extern "C" _declspec(dllexport)
bool parse(const char* path)
{
ifstream myfile;
myfile.open(path, ifstream::in);
if(!myfile)
{
cout << "apertura fallita" << endl;
return false;
}
cout << "apertura riuscita" << endl;
return true;
}
E infine l'applicazione di test, tale testing.cpp:
#include "parseECF.h"
int main()
{
parseECF test;
std::string cane = "prova";
const char* prova2 = cane.c_str();
test.parse(prova2);
return 1;
}
Le parti commentate sono dovute a esperimenti mal riusciti ma le ho lasciate perchè non si sa mai..
L'errore che mi da è il seguente:
1>------ Inizio compilazione: Progetto: progettoRobotica, Configurazione: Debug Win32 ------
2>------ Inizio compilazione: Progetto: testEsecuzione, Configurazione: Debug Win32 ------
1>Compilazione in corso...
2>Compilazione in corso...
1>parseECF.cpp
2>testing.cpp
1>c:\documents and settings\hax\documenti\visual studio 2008\projects\progettorobotica\progettorobotica\pa rseecf.h(33) : warning C4091: '__declspec(dllexport)': ignorato a sinistra di 'parseECF' quando non si dichiara alcuna variabile
2>Collegamento in corso...
1>Collegamento in corso...
2>testing.obj : error LNK2019: riferimento al simbolo esterno "public: bool __thiscall parseECF::parse(char const *)" (?parse@parseECF@@QAE_NPBD@Z) non risolto nella funzione _main
2>C:\Documents and Settings\HaX\Documenti\Visual Studio 2008\Projects\progettoRobotica\Debug\testEsecuzion e.exe : fatal error LNK1120: 1 esterni non risolti
1>Collegamento in corso...
2>Il log di compilazione è stato salvato in 'file://c:\Documents and Settings\HaX\Documenti\Visual Studio 2008\Projects\progettoRobotica\testEsecuzione\Debu g\BuildLog.htm'
2>testEsecuzione - 2 errore/i, 0 avviso/i
1>Incorporamento del manifesto in corso...
1>Il log di compilazione è stato salvato in 'file://c:\Documents and Settings\HaX\Documenti\Visual Studio 2008\Projects\progettoRobotica\progettoRobotica\De bug\BuildLog.htm'
1>progettoRobotica - 0 errore/i, 1 avviso/i
========== Compilazione: 1 completate, 1 non riuscite, 0 aggiornate, 0 ignorate ==========
:shrug:
Ho cercato il codice dell'errore su google, ma non mi ha aiutato a risovlere il problema.. odio c++ t_T
Axet
27th October 2009, 17:29
Up :cry:
Glasny
27th October 2009, 17:40
Come prima Axet, devi aggiungere anche questo nei riferimenti, altrimenti da testing.cpp non ti vede la dll parseECF.
Axet
27th October 2009, 17:46
Come prima Axet, devi aggiungere anche questo nei riferimenti, altrimenti da testing.cpp non ti vede la dll parseECF.
Già fatto ma purtroppo non funziona :(
sicuramente ho sbagliato qualcosa nel codice, non ci piove, il punto è che dal basso della mia pressochè nulla conoscenza di c++ non riesco a capire cosa.
Porco ido se avessi dovuto farlo in lisp, prolog, java, salcazzo avrei finito da 2 secoli e invece non ho praticamente ancora iniziato.. mi vien voglia di tagliarmi le vene :rain:
Hador
27th October 2009, 17:49
in lisp :sneer:
io purtroppo (cioè per fortuna) c++ mai usato... ma so a chi chiedere prossimo giro che mi vedi in uni fermami che ti faccio aiutare, tipo domani
Axet
27th October 2009, 21:58
Io uppo che magari qualche anima pia capita da ste parti :D
Kat
28th October 2009, 11:16
Ho incollato il tuo codice in due progetti che ho creato ora.
A livello di codice nel file parseECF.cpp manca la dichiarazione della classe di cui stai implementando la funzione, cioe' parseECF:: davanti a parse(const char* path)
A parte questo che non c'entra con l'errore di link, dovresti aprire le properties del progetto dell'exe e aggiungere sotto Linker->General->Additional Library Directories il path dove viene generata la dll (tipicamente ...\debug) e sotto Linker->Input->Additional Dependencies il nome della lib prodotta dalla generazione della dll.
Per es. se stai generando pippo.dll, dovrebbe generare nello stesso folder anche una pippo.lib.
Con queste operazioni mi e' sparito l'errore di Unresolved external, e ho potuto compilare ed eseguire il tutto.
Axet
28th October 2009, 15:23
Ho incollato il tuo codice in due progetti che ho creato ora.
A livello di codice nel file parseECF.cpp manca la dichiarazione della classe di cui stai implementando la funzione, cioe' parseECF:: davanti a parse(const char* path)
A parte questo che non c'entra con l'errore di link, dovresti aprire le properties del progetto dell'exe e aggiungere sotto Linker->General->Additional Library Directories il path dove viene generata la dll (tipicamente ...\debug) e sotto Linker->Input->Additional Dependencies il nome della lib prodotta dalla generazione della dll.
Per es. se stai generando pippo.dll, dovrebbe generare nello stesso folder anche una pippo.lib.
Con queste operazioni mi e' sparito l'errore di Unresolved external, e ho potuto compilare ed eseguire il tutto.
Grazie mille kat appena arrivo a casa provo.
Per quanto riguarda l'aver scritto "bool parse(const char* path)" invece di "parseECF::bool parse(const char* path)", è dovuto al fatto che se scrivo la seconda cosa mi dice che sto ridefinendo il metodo (WTF? non c'è overload ed è definito nella dichiarazione della classe nell'header) e di conseguenza mi da errore.. boh!
Cmq appena arrivo a casa provo, grazie ancora <3
Axet
28th October 2009, 17:29
Niente, purtroppo sempre il solito errore..
Ho aggiunto la directory corretta qui "Linker->General->Additional Library Directories ".
Mentre "Linker->Input->Additional Dependencies " mi apre una finestra dove però non posso selezionare nè aggiungere niente.
Eccheccazzo ç____ç
Warbarbie
28th October 2009, 18:18
Niente, purtroppo sempre il solito errore..
Ho aggiunto la directory corretta qui "Linker->General->Additional Library Directories ".
Mentre "Linker->Input->Additional Dependencies " mi apre una finestra dove però non posso selezionare nè aggiungere niente.
Eccheccazzo ç____ç
Hai provato ad aggiungere le dependencies nella dichiaraziona iniziale?
Axet
28th October 2009, 18:31
Hai provato ad aggiungere le dependencies nella dichiaraziona iniziale?
No, how to?
Warbarbie
28th October 2009, 18:33
No, how to?
Boh, non so nulla di C++
Axet
28th October 2009, 18:45
Scompari -.-
Kat
28th October 2009, 19:14
Puoi postare la command line che c'e' sotto Linker nelle properties?
Quelle sono le opzioni che effettivamente usa il linker in base a tutte le impostazioni del progetto.
Probabilmente manca qualcosa li dentro, direi la .lib da linkare visto che non riesci ad aggiungerla dal menu.
Axet
28th October 2009, 19:53
Puoi postare la command line che c'e' sotto Linker nelle properties?
Quelle sono le opzioni che effettivamente usa il linker in base a tutte le impostazioni del progetto.
Probabilmente manca qualcosa li dentro, direi la .lib da linkare visto che non riesci ad aggiungerla dal menu.
Eccola:
/OUT:"C:\Documents and Settings\HaX\Documenti\Visual Studio 2008\Projects\progettoRobotica\Debug\testEsecuzion e.exe" /INCREMENTAL /NOLOGO /LIBPATH:"C:\Documents and Settings\HaX\Documenti\Visual Studio 2008\Projects\progettoRobotica\Debug" /LIBPATH:"C:\Documents and Settings\HaX\Documenti\Visual Studio 2008\Projects\progettoRobotica\progettoRobotica\De bug" /MANIFEST /MANIFESTFILE:"Debug\testEsecuzione.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Documents and Settings\HaX\Documenti\Visual Studio 2008\Projects\progettoRobotica\Debug\testEsecuzion e.pdb" /SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib "..\debug\progettorobotica.lib"
Kat
28th October 2009, 21:43
Non mi torna questo:
"..\debug\progettorobotica.lib"
dovrebbe esserci il nome della lib e basta, come tutte le altre.
Il path lo prende da /LIBPATH.
A parte questo mi sembra tutto a posto, cmq il codice di errore e' quello tipico di quando non trova la dll.
Axet
29th October 2009, 01:56
Quindi come posso sistemare? :look:
Kat
29th October 2009, 14:57
Eh senza avere davanti tutto il codice e i progetti e' difficile dire piu' di questo.
Io ho VS2005 e non il 2008, non so se e' cambiato il sistema per aggiungere le dll come reference. Non riesci ad aggiungerla come ti ho detto? Nel linker dovrebbe semplicemente esserci il nome, il path lo prende da una variabile diversa (e dalla corrispondente opzione nelle properties).
Ma la dichiarazione della funzione Parse nel .cpp della dll poi l'hai compilata con parseECF:: ? Altrimenti e' chiaro che non lo trova, cosi' e' definita come funzione, non come metodo della classe parseECF.
Non so se sono stato chiaro, ma e' un po' arduo da spiegare a parole.
Axet
29th October 2009, 20:34
No non me lo faceva aggiungere, cmq ho abdicato.
Faccio un progetto console normalissimo e lo presento al prof, se vuole DOPO glielo trasformo in dll in qualche cazzo di maniera (magari mi illumina lui su come fare, anche se ho già avuto un'idea che in teoria mi risolverebbe tutti i problemi di sto tipo, ma per ora chissene mi sto sbattendo ad implementare).
Btw visto che sto appunto implementando, non esiste un container non tipizzato in c++ come ad esempio le collection in java? :O
Mi serve una struttura dati che mi tenga dentro N elementi di tipo eterogeneo, l'unica cosa carina che ho trovato è il vector che però purtroppo è tipizzato. La mia speranza era quella di dichiarare un vector della classe padre e sperare che non rompesse i coglioni quando lo riempivo di oggetti di classi figlie.. difatti sulla push non rompe, il problema è quando cerchi di reperire i dati dal vector scopri che son magicamente diventati di tipo "classe padre".. non so se mi spiego :D
Un container più intelligente non esiste? t_T
edit:
per spiegarmi meglio, se io dichiaro:
vector<animale> x;
e poi faccio
x.push_back(new cane());
me lo genera e non rompe le palle.. se però vado a cercare di accedere direttamente all'ultimo oggetto inserito, cioè un oggetto di tipo cane, nella seguente maniera:
x.back()->"metodo random"; i metodi/attributi che mi mostra e che posso usare sono quelli della classe padre.
Difatti provo a reperire l'oggetto così:
cane* y = x.back();
mi da errore in compilazione in quanto impossibile convertire da animale a cane.. t_T
mahoney
29th October 2009, 21:13
No non me lo faceva aggiungere, cmq ho abdicato.
Faccio un progetto console normalissimo e lo presento al prof, se vuole DOPO glielo trasformo in dll in qualche cazzo di maniera (magari mi illumina lui su come fare, anche se ho già avuto un'idea che in teoria mi risolverebbe tutti i problemi di sto tipo, ma per ora chissene mi sto sbattendo ad implementare).
Btw visto che sto appunto implementando, non esiste un container non tipizzato in c++ come ad esempio le collection in java? :O
Mi serve una struttura dati che mi tenga dentro N elementi di tipo eterogeneo, l'unica cosa carina che ho trovato è il vector che però purtroppo è tipizzato. La mia speranza era quella di dichiarare un vector della classe padre e sperare che non rompesse i coglioni quando lo riempivo di oggetti di classi figlie.. difatti sulla push non rompe, il problema è quando cerchi di reperire i dati dal vector scopri che son magicamente diventati di tipo "classe padre".. non so se mi spiego :D
Un container più intelligente non esiste? t_T
edit:
per spiegarmi meglio, se io dichiaro:
vector<animale> x;
e poi faccio
x.push_back(new cane());
me lo genera e non rompe le palle.. se però vado a cercare di accedere direttamente all'ultimo oggetto inserito, cioè un oggetto di tipo cane, nella seguente maniera:
x.back()->"metodo random"; i metodi/attributi che mi mostra e che posso usare sono quelli della classe padre.
Difatti provo a reperire l'oggetto così:
cane* y = x.back();
mi da errore in compilazione in quanto impossibile convertire da animale a cane.. t_T
Prova ad usare un vettore di puntatori invece di type:
vector<animale*> x;
o cmq puoi sempre provare con un type non definito:
vector<void*> x;
gli elementi che recuperi per l'elaborazione devo essere 'castati' nella classe type che ti serve o nativa:
x.push_back(new animale());
animale* y = (animale*)x.back();
EDIT:
^^
cane* y = x.back();
cane* y = (cane*)&x.back();
Axet
29th October 2009, 21:20
Si pardon ho scritto male io, ovviamente dichiaro un vettore di puntatori.
Thanks provo sia col metodo del void che con il cast (anche se l'avevo cassato perchè temevo di dover fare upcasting e downcasting con conseguende copy constructor e visto che son neofita del c++ è meglio che non mi spingo troppo in la).
In caso cmq non riesca con nessuno dei metodi continuo come sto facendo ora, cioè N vettori di N tipi diversi e poi mi arrangio in qualche modo :D
edit:
provato.. non funziona nessuno dei due metodi ma pensandoci il motivo è molto semplice. Quando sbatti l'oggetto della classe figlia nel vector viene automaticamente fatto il cast alla classe padre. Di conseguenza, essendo un cast da una classe più specifica a una meno specifica vi è perdita di informazioni. Dato questo fattore, un cast "al contrario" da padre a figlia è ovviamente impossibile perchè le informazioni perse durante il primo cast sono, per l'appunto, scomparse e non è che saltano fuori dal nulla :D
Alkabar
29th October 2009, 21:52
Argh C++ ... non posso aiutare qua, lo ho studiato solo quando cercavo lavoro con Goldman Sachs e quando non e' andata ho lasciato andare.
Kolp
29th October 2009, 22:35
OT ti hanno chiamato per l'inteview da GS? io ho fatto l'application, ma avendo poche working experiences e senza alcun voto del master, la vedo dura che mi chiamino...
mahoney
29th October 2009, 22:49
edit:
provato.. non funziona nessuno dei due metodi ma pensandoci il motivo è molto semplice. Quando sbatti l'oggetto della classe figlia nel vector viene automaticamente fatto il cast alla classe padre. Di conseguenza, essendo un cast da una classe più specifica a una meno specifica vi è perdita di informazioni. Dato questo fattore, un cast "al contrario" da padre a figlia è ovviamente impossibile perchè le informazioni perse durante il primo cast sono, per l'appunto, scomparse e non è che saltano fuori dal nulla :D
'need' le dichiarazioni delle due classi, padre e figlia.
Edit:
suppongo che stai usando classi derivate; il padre (animale) è il riferimento ad una specie animale, e la figlia la specie in dettaglio:
class animale
{
public:
string m_specie;
};
class cane: public animale
{
public:
int m_nZampe;//quante zampe
int m_nDenti;//quanti denti
int m_sesso;//0mas//1fem//2e
int m_alimentazione;//0carne//1vege//2onni
};
Edit2:
se invece usi classi 'nested' ed avere i figli all'interno della classe padre:
class cane
{
public:
string m_specie;
cane* m_myFather;//alla creazione inserisci qui il colpevole
vector<cane*>figli;
};
Axet
30th October 2009, 00:28
Uso classi derivate.. cmq sono abbastanza sicuro che sia come ho detto prima, se tu casti dalla classe figlia alla classe padre avrai inevitabilmente una perdità di specificità che è irrecuperabile visto che le informazioni, di fatto, scompaiono.
Mi son rassegnato all'inferiorità del c++ rispetto a java (flamehh :sneer:) e di conseguenza all'uso di più vector di tipo differente :D
marlborojack
30th October 2009, 01:12
Mi son rassegnato all'inferiorità del c++ rispetto a java (flamehh :sneer:) e di conseguenza all'uso di più vector di tipo differente :D
Taci, stolto infedele, il c++ è il verbo. Supponiamo che tu abbia la classe madre e classe figlia, e tu debba mettere gli oggetti della classe figlia in un array della classe madre, ma poi accedervi tramite i metodi della classe figlia. Allora, l'array della classe base dev'essere di puntatori alla classe base, in modo che tu possa creare gli oggetti nello heap. A quel punto, assegni nell'array l'indirizzo dell'oggetto, dopodichè assegni ad un puntatore della classe figlia lo stesso indirizzo salvato nel puntatore dell'array della classe base. Non c'è alcuna perdita di informazione, perchè non c'è alcun assegnamento.
Axet
30th October 2009, 02:19
Vero, dopo una giornata a sbattere la testa su sta merda non ci avevo pensato.
Btw però così facendo avrei bisogno di un puntatore per ogni oggetto nel container, a sto punto manco mi servirebbe più il vector :scratch:
Cioè non posso fare così, mi serve che sia gestibile dinamicamente :O
marlborojack
30th October 2009, 02:25
Vero, dopo una giornata a sbattere la testa su sta merda non ci avevo pensato.
Btw però così facendo avrei bisogno di un puntatore per ogni oggetto nel container, a sto punto manco mi servirebbe più il vector :scratch:
Cioè non posso fare così, mi serve che sia gestibile dinamicamente :O
Devi essere molto stanco. leggi qui (http://it.wikipedia.org/wiki/Vector_(STL))
"memorizzare nel vector non gli oggetti ma puntatori ad essi"
Axet
30th October 2009, 02:47
Devi essere molto stanco. leggi qui (http://it.wikipedia.org/wiki/Vector_(STL))
"memorizzare nel vector non gli oggetti ma puntatori ad essi"
Ci sto dietro da stamani praticamente non stop, fai due conti tu t_t
Domani ci riguardo mo veramente basta perchè ha iniziato a darmi un'errore strano e son tipo 30 minuti che guardo lo schermo senza capire da dove provenga una cosa del genere se io la classe che mo da errore non l'ho sfiorata manco con un dito t_t
domani t_T
Axet
30th October 2009, 11:40
Devi essere molto stanco. leggi qui (http://it.wikipedia.org/wiki/Vector_(STL))
"memorizzare nel vector non gli oggetti ma puntatori ad essi"
Provato ma non me lo fa fare. La pagina di wiki che mi hai linkato (e ieri sera manco me ne ero accorto rotfl) dice che per far si che il riallocamento del vector sia più veloce e meno oberante dal punto di vista computazionale/temporale conviene passare al vector il puntatore invece che l'oggetto in se.. ed è quello che faccio io, ti copio il codice della dichiarazione e dell'assegnamento.
vector<parallelepiped*> parals;
...
...
...
parallelepiped* paral = new parallelepiped(name, floor);
parals.push_back(paral).
Se faccio come hai detto tu, dichiarando quindi un vettore così:
vector<parsedObject*> objects;
me lo mette senza problemi nel vettore, ma poi quando vado a reperire il dato non me lo reperisce più come parallelepiped bensì come parsedObject.
Ah ovviamente parsedObject è padre, parallelepiped è figlio.
marlborojack
30th October 2009, 12:23
Provato ma non me lo fa fare. La pagina di wiki che mi hai linkato (e ieri sera manco me ne ero accorto rotfl) dice che per far si che il riallocamento del vector sia più veloce e meno oberante dal punto di vista computazionale/temporale conviene passare al vector il puntatore invece che l'oggetto in se.. ed è quello che faccio io, ti copio il codice della dichiarazione e dell'assegnamento.
vector<parallelepiped*> parals;
...
...
...
parallelepiped* paral = new parallelepiped(name, floor);
parals.push_back(paral).
Se faccio come hai detto tu, dichiarando quindi un vettore così:
vector<parsedObject*> objects;
me lo mette senza problemi nel vettore, ma poi quando vado a reperire il dato non me lo reperisce più come parallelepiped bensì come parsedObject.
Ah ovviamente parsedObject è padre, parallelepiped è figlio.
Quando vai a reperire il dato, devi fare il gioco dei puntatori, ovvero qualcosa tipo parallelepiped* punt = objects.get(i), perchè objects[i] dovrebbe contenere il puntatore e quindi l'indirizzo della zona di memoria che contiene l'oggetto parallelepiped
Axet
30th October 2009, 12:55
Quando vai a reperire il dato, devi fare il gioco dei puntatori, ovvero qualcosa tipo parallelepiped* punt = objects.get(i), perchè objects[i] dovrebbe contenere il puntatore e quindi l'indirizzo della zona di memoria che contiene l'oggetto parallelepiped
E secondo te non l'ho fatto? :D
Mi dice che non può castare da parsedObject a parallelepiped :shrug:
Cmq ho trovato una soluzione alternativa quindi amen :)
Grazie cmq :D
mahoney
30th October 2009, 15:00
parallelepiped* punt = (parallelepiped*)objects.get(i);
ovviamente ti da parsedObject, contiene proprio quelli, e cmq se inizializzi l'oggetto(new....) come parallelepiped, la conversione a parallelepiped* ti da accesso a tutti i dati.
Axet
5th November 2009, 19:34
Nuovo giro, nuovo gioco :metal:
Come fare a dichiarare dinamicamente degli array? Mi spiego meglio:
for(int i = 2; i <= CAMP; i++)
{
double add[4] = {x, y, z, 1.0};
preRot.push_back(add);
}
n.b.:
preRot è vector di double*... vector<double*> preRot;
Nel ciclo riportato qua sopra vorrei far si che ad ogni iterazione mi venga generato un nuovo array. invece così facendo mi ripiazza sempre il puntatore alla medesima locazione di memoria quindi mi trovo 4784 valori uguali perchè in ogni cella del vector c'è sempre lo stesso puntatore a double -_-
Ho provato con un po' di sintassi java-like (lol QQ) ma niente, documentazione su internet idem.
Dai lo so che voi illuminati ci mettete 10 secondi a risolvere sta troiata, elargitemi la conoscenza :metal:
Rayvaughan
5th November 2009, 19:36
int = 2 non da errore?
edit: visto la classe vector asd
Axet
5th November 2009, 19:37
Edito ovviamente è int i, ho scritto non ho copia-incollato :D
Alkabar
5th November 2009, 19:42
Madooo che ditarculoooo. Scompaio di nuovo. :look:.
Axet
5th November 2009, 19:52
Ce l'ho fatta, sbagliavo a usare la new come un pollo :D
Axet
7th November 2009, 12:12
Ma non lo banniamo sto qua? E' una sorta di strano bot ..
Rayvaughan
7th November 2009, 12:31
è un bot all'incontrario
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.