View Full Version : [C++]array dinamici
supernovae
18-09-2008, 09:30
ciao a tutti, ho un problema con la definizione di array allocati dinamicamente.
In pratica ho una classe che ha nei campi privati un array di puntatori ad oggetti ed un intero che dovrebbe essere la dimensione di tale array.
in alcune funzioni ho bisogno di aggiungere oggetti all'array ma se provo a farlo senza riallocare l'array mi da un errore di segmentazione.
Non posso fare neanche una cosa del genere:
es
class x
{.......}
class y
{......
private:
x* array;
int dim;
};
funz()
{....
x=new y[dim];
}
dato che la classe y non ha un costruttore di default
come posso riallocare nuova memoria per l'array:confused:
tomminno
18-09-2008, 10:18
Ma usare vector no?
supernovae
18-09-2008, 10:44
con i vector l'ho gia fatto, volevo provarlo a fare con gli array dinamici
tomminno
18-09-2008, 10:51
con i vector l'ho gia fatto, volevo provarlo a fare con gli array dinamici
Allora devi implementarti una lista, con le operazioni di ricerca, inserimento e cancellazione. E' il modo corretto di creare un insieme di elementi ridimensionabile a piacere (che è quello che vuoi te)
Allora devi implementarti una lista, con le operazioni di ricerca, inserimento e cancellazione. E' il modo corretto di creare un insieme di elementi ridimensionabile a piacere (che è quello che vuoi te) no, è il modo corretto di implementare un multinsieme ordinato di elementi ridimensionabile in tempo costante ma con tempo di accesso lineare.
gli array sono molto diversi dalle liste: se vuole ammortizzare il tempo di ridimensionamento di un array può usare algoritmi particolari (es: raddoppiare la dimensione fisica ad ogni "sforamento" anziché incrementarla solo di 1).
tuttavia la domanda non era a carattere algoritmico: non si è capito cosa stia chiedendo supernovae, anche perché il codice che ha riportato è sbagliato (assegna un puntatore y* al nome di un tipo, "x", non ha senso).
tomminno
18-09-2008, 14:01
no, è il modo corretto di implementare un multinsieme ordinato di elementi ridimensionabile in tempo costante ma con tempo di accesso lineare.
Spiegami quale tra multiinsieme e ordinato non si applica anche alla definizione di array.
Poi chi ha detto che l'accesso ad una lista debba essere lineare?
Puoi sempre usare strutture d'appoggio e ridurre il costo di accesso.
In più hai la possibilità di rimuovere o inserire in mezzo all'insieme cosa che con l'array (e vector) non fai con la stessa efficienza.
gli array sono molto diversi dalle liste: se vuole ammortizzare il tempo di ridimensionamento di un array può usare algoritmi particolari (es: raddoppiare la dimensione fisica ad ogni "sforamento" anziché incrementarla solo di 1).
In pratica reimplementa vector.
Avendo scartato vector pensavo cercasse di implementare una alternativa.
Spiegami quale tra multiinsieme e ordinato non si applica anche alla definizione di array. ho mai sostenuto una cosa del genere?
Poi chi ha detto che l'accesso ad una lista debba essere lineare?
Puoi sempre usare strutture d'appoggio e ridurre il costo di accesso. come ad esempio un array :asd:
In più hai la possibilità di rimuovere o inserire in mezzo all'insieme cosa che con l'array (e vector) non fai con la stessa efficienza. si ma non è che i doni ti scendono dal cielo: se usi una lista il tempo di accesso è lineare; se usi un array il tempo di accesso è costante ma è lineare quello di inserzione. se li usi entrambi hai le limitazioni di entrambi :sofico:
ora non mi venire a blaterare di dizionari, hash tables, alberi di ricerca, alberi RB... :blah: queste cose le sappiamo tutti, ma a supernovae non gliene frega un cavolo: lui ha un problema molto banale col C++ che gli altri stentano a capire, ma non è un problema algoritmico :rolleyes:
probabilmente non deve neanche realizzare un programma efficiente, sta solo facendo qualche esperimento didattico.
In pratica reimplementa vector. è lui che vuole farsi male, mica io.
Avendo scartato vector pensavo cercasse di implementare una alternativa. te l'ha anche detto qual è l'alternativa: con i vector l'ho gia fatto, volevo provarlo a fare con gli array dinamici
supernovae
18-09-2008, 14:17
tuttavia la domanda non era a carattere algoritmico: non si è capito cosa stia chiedendo supernovae, anche perché il codice che ha riportato è sbagliato (assegna un puntatore y* al nome di un tipo, "x", non ha senso).
con quello che ho scritto volevo indicare una classe che ha come campo privato un array di puntatori ad oggetti del tipo x con dimensione variabile.
con quello che ho scritto volevo indicare una classe che ha come campo privato un array di puntatori ad oggetti del tipo x con dimensione variabile. non faresti prima a scrivere un codice corretto così capiamo tutti? :D
esemplificativo ma corretto.
supernovae
18-09-2008, 14:24
probabilmente non deve neanche realizzare un programma efficiente, sta solo facendo qualche esperimento didattico.
si hai ragione, sto semplicemente provando a svolgere un esercizio in un altro modo
supernovae
18-09-2008, 14:30
class Point3D
{
Point3D(double xx, double yy, double zz) : x(xx), y(yy), z(zz) {}
double x, y, z;
};
class Polyline
{
public:
Polyline();
Polyline(const Polyline& obj);
Polyline(Point3D* points, int pointCount);
~Polyline();
Polyline& operator = (const Polyline& obj);
void add_point();
int num_point() const;
Point3D at(int i);
private:
Point3D* Points;
int dim;
};
ad esempio nell'implementare il costruttore di copia ho bisogno di allocare nuova memoria nell'array Points, altrimenti va in errore di segmentazione, vero?
hai tre scelte:
1) usare vector :rolleyes:
2) gestire lo stesso array in oggetti diversi e stare attento alla deallocazione
3) ricopiare tutto l'array, ma il problema è un altro: alla classe Point3D manca il costruttore no-arg, di quegli array non puoi allocarne neanche uno.
supernovae
19-09-2008, 15:34
alla classe Point3D manca il costruttore no-arg, di quegli array non puoi allocarne neanche uno.
ok pare che siamo arrivati alla conclusione del mio problema. Pensavo che esistesse un altro modo per allocare l'array senza dichiarare un costruttore di default, invece mi sbagliavo...e si che il dev me lo provava a far capire in tutti i modi:D
ok pare che siamo arrivati alla conclusione del mio problema. Pensavo che esistesse un altro modo per allocare l'array senza dichiarare un costruttore di default, invece mi sbagliavo...e si che il dev me lo provava a far capire in tutti i modi:D aldilà di tutto il "dev" come lo chiami tu (non che m'importi visto che del nome di quel cesso puoi fare tutto lo scempio che vuoi) puoi anche usarlo per il tiro al bersaglio :mc:
Dev-C++ è una cosa totalmente priva di senso: vecchio, buggato, privo di features, non più sviluppato, non più supportato, e perdipiù usa un compilatore che non è quello "ufficiale" per programmare su Windows (smettiamola con la mania dell'open-source: il MinGW ha un Platform SDK ridotto, a meno che non si debba scrivere un programma portabile è perfettamente inutile).
usa Visual C++ 2008 Express, o se proprio devi Code::Blocks.
DanieleC88
21-09-2008, 13:14
(smettiamola con la mania dell'open-source: il MinGW ha un Platform SDK ridotto, a meno che non si debba scrivere un programma portabile è perfettamente inutile).
usa Visual C++ 2008 Express, o se proprio devi Code::Blocks.
Code::Blocks utilizza lo stesso identico compilatore di Dev-C++, quindi non migliora niente da quel punto di vista. È solo una versione più aggiornata, ma è lo stesso MinGW di prima. ;)
Che abbia un platform SDK ridotto non importa, già è tanto che ce l'abbia; Dev-C++ è sempre stato l'IDE scelto da chi era agli inizi per smanettare un po' con la compilazione di semplici programmi. In questo direi che MinGW è più che ottimo, gli va anche di lusso. :D
Che poi Dev-C++ al giorno d'oggi bisogni evitarlo, be', sono d'accordo anche io. Lo sto dicendo da parecchio, se proprio volete Dev-C++, passate almeno a wxDev-C++ che è un po' meno morto come progetto. Code::Blocks è la scelta migliore IMHO. ;)
Ah, ultima frecciatina (:D): il compilatore Microsoft ti avverte (a volte anche giustamente) che certe funzioni della libreria standard del C sono poco "sicure", e ti invita a sostituirle con versioni alternative che non esistono altrove; IMHO chi inizia non dovrebbe abituarsi a scrivere roba poco portabile, anche se magari "più sicura" (che poi non è nemmeno vero, basta fare attenzione). A rendere il tutto a prova di bomba ci potrà pensare una volta maturato come programmatore. :)
ciao ;)
Code::Blocks utilizza lo stesso identico compilatore di Dev-C++, quindi non migliora niente da quel punto di vista. È solo una versione più aggiornata, ma è lo stesso MinGW di prima. ;) a parte che Code::Blocks può usare diversi compilatori (anche quelli Microsoft-compatibili credo), comunque lo so: intendevo dire che se proprio proprio Visual C++ gli fa schifo (e già questo è un suo demerito visto che in informatica non esistono religioni) allora è meglio Code::Blocks di Dev-C++.
Ah, ultima frecciatina (:D): il compilatore Microsoft ti avverte (a volte anche giustamente) che certe funzioni della libreria standard del C sono poco "sicure", e ti invita a sostituirle con versioni alternative che non esistono altrove; IMHO chi inizia non dovrebbe abituarsi a scrivere roba poco portabile, anche se magari "più sicura" (che poi non è nemmeno vero, basta fare attenzione). A rendere il tutto a prova di bomba ci potrà pensare una volta maturato come programmatore. :) questo è un altro discorso completamente; secondo me sarebbe meglio usare sempre il C++ e mettersi l'anima in pace :asd:
DanieleC88
21-09-2008, 13:40
a parte che Code::Blocks può usare diversi compilatori (anche quelli Microsoft-compatibili credo)
Anche Dev-C++ tecnicamente potrebbe, se si imposta manualmente il compilatore. Anche se sarebbe uno scempio, e per il resto concordo perfettamente. :D
questo è un altro discorso completamente; secondo me sarebbe meglio usare sempre il C++ e mettersi l'anima in pace :asd:
Vabbe', io mettevo l'esempio di uno che inizia dal C, anche se pure io a conti fatti (ovvero dopo aver iniziato dal C), dovendo ricominciare, lo farei dal C++. :p
ciao ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.