Oppure

Loading
22/01/16 10:34
Non ci stiamo capendo, tu hai scritto

Postato originariamente da Mikelius:

Postato originariamente da nessuno:

1) allocare il buffer prima di chiamare la funzione e liberarla dopo la sua chiamata quando non se ne ha più bisogno (la responsabilità di allocare/liberare la memoria è del "chiamante";)



io voglio dire che mi sembra più ordinato allocare/deallocare nello stesso posto, nel mio caso il main(), e non allocarla nella funzione chiamata e deallocarla nella funzione chiamante. Ho capito che , correggimi se sbaglio, posso nel main() creare una funzione che alloca memoria, ritornala al main(), creare un'altra funzione che usi la memoria allocata, ritornare al main(), chiamare unha terza funzione che deallochi lo spazio in precedenza allocato e ritornare al main... voglio dire che questo mi sembra più disordinato per quello che vorrei fare io, forse per progetti più complessi avrà senso

Prima volevo scrivere, ma mi è partito il post, per le MSDN ok, però a volte sono spiegate in modo rigido e non sempre con esempi esplicativi. Se c'era gualche guida che le spiegasse o almeno qualche buon esempio da affiancarglil non guasterebbe

22/01/16 20:50
Ok, ma non è una questione di ordine.

Molte volte il main (in generale, meglio parlare della "funzione chiamante";) non conosce le necessità di memoria della "funzione chiamata" e quindi non può allocarla.

In questo caso, è la funzione chiamata che la alloca restituendo il puntatore e lasciando la responsabilità della liberazione alla chiamante (pena memory leak). E non hai alternative in questo caso.

Ad esempio, prendi la funzione (API) di Windows NetServerEnum

msdn.microsoft.com/it-it/library/windows/desktop/…(v=vs.85).aspx

Questa alloca il buffer internamente e restituisce il puntatore tramite il doppio puntatore passato come parametro.
Dopo avere usato il buffer in uscita, la memoria eventualmente allocata deve essere liberata tramite la funzione NetApiBufferFree.
22/01/16 22:05
ok, io non dicevo in generale, ma visto che so quanta memoria serve, lo faccio nello stesso posto.

e' più una questione mia di ordine, poi ovviamente se utilizzo librerie esterne, o se il progetto richiede altro, mi adeguo.

visto che ho la possibilità di scegliere, in questo specifico caso , forse, farò come dicevo, fermo restando che se mi rendo conto che cambiare porta a miglioramenti cambio .
22/01/16 22:12
TheDarkJuster
Capisco il problema di ordine derivato da allocazione e deallocazione di risorse in posizioni diverse del programma, ma se passi il puntatore alla memoria da riempire come hai intensive di controllare che sia memoria non deallocata e della dimensione giusta? Se metti il malloc nella tua funzione e ritorni il puntatore all'area di memoria riempita mantieni un certo ordine degli input e output e puoi controllare la validità della memoria solo controllando che non punti a NULL.
aaa
26/01/16 9:12
Postato originariamente da Mikelius:

ok, io non dicevo in generale, ma visto che so quanta memoria serve, lo faccio nello stesso posto.

e' più una questione mia di ordine, poi ovviamente se utilizzo librerie esterne, o se il progetto richiede altro, mi adeguo.


Appunto, quello che voglio farti notare è che sono preminenti le esigenze del progetto, non quelle del tuo "ordine" ...


Solo per completezza, parli di EOF confondendolo con il NUL terminatore di stringa ... ovviamente non sono la stessa cosa ...
26/01/16 9:52
Postato originariamente da nessuno:

Solo per completezza, parli di EOF confondendolo con il NUL terminatore di stringa ... ovviamente non sono la stessa cosa ...


Questa purtroppo è una cosa che mi porto dalle superiori, il prof cercava di spiegarci il c++ a modo suo, e non ha minimamente differenziato le cosa al tempo, usava entrambi indistintamente. non e' che faccio confusione, ma devo reimparare ad utilizzarli correttamente nel loro giusto ambito.

Cmq NULL è usato nei puntatoti per indicare che il puntatore punta a nessuna cella di memoria (tipicamente il puntatore contiene il valore 0)

EOF è un valore speciale (tipicamente -1) che indica la fine della strasmissione dati (in caso di stringhe ad esempio, che la stringa è finita.

giusto?
Ultima modifica effettuata da 26/01/16 9:55
26/01/16 12:29
TheDarkJuster
"EOF è un valore speciale (tipicamente -1) che indica la fine della strasmissione dati (in caso di stringhe ad esempio, che la stringa è finita."
No. EOF sta per End Of File ed è definito come -1. Non si usa per determinare la fine di una stringa o di uno stream, EOF di usa per per determinare la fine di un file, ovvero quando il cursore ha passato l'ultimo byte del file.

NULL è definito come :
#define (void*)0
quindi 0 e NULL NON SONO la stessa cosa. In realtà potrebbero esserlo per un calcolatore, ma logicamente, per un essere umano non lo sono.

NULL si usa per puntare a un'area di memoria inutilizzabile.
aaa
26/01/16 15:14
Intanto grazie del tempo che stai dedicandomi,

allora:

EOF è diverso da 'Intanto grazie del tempo che stai dedicandomi,

allora:

EOF è diverso da '{parsed_message}' che è il terminatore di stringa. '{parsed_message}' è il NULL per le stringhe, corretto?
Non ero sicuro che fosse implementato a -1 in tutti i compilatori, ma se dici che è universale ok, per questo ho scritto " tipicamente -1 ".
Pero', se le ritrovo li posto, ho trovato sorgenti che esaminavano una stringa e cercavano come ultimo valore proprio EOF (non '{parsed_message}' o NULL, c'era proprio stringa[i] == EOF ), in questo caso cosa indicherebbe?

So che concettualmente 0,NULL e "vuoto" sono cose completamente diverse, per un umano.
Per il puntatore a NULL, ho letto da parecchie parti che un puntatore a NULL è un puntatore che non punta a una zona di memoria usabile, e visto che ,visto che celle di memoria "vuote" è impossibile averle, sempre ci saranno valari spazzatura (ecco perchè è bene inizzializzare qualsiasi variabile) il valore NULL viene implementato come indirizzo di memoria 0x00 (ovviamente in questo caso devo pensare come una macchina, quindi se per essa sono la stessa cosa in questo caso, me lo faccio piacere)
in più mi pare di capire che c'è differenza tra un puntatore che punta a NULL e un puntatore che vale NULL.

' che è il terminatore di stringa. 'Intanto grazie del tempo che stai dedicandomi,

allora:

EOF è diverso da '{parsed_message}' che è il terminatore di stringa. '{parsed_message}' è il NULL per le stringhe, corretto?
Non ero sicuro che fosse implementato a -1 in tutti i compilatori, ma se dici che è universale ok, per questo ho scritto " tipicamente -1 ".
Pero', se le ritrovo li posto, ho trovato sorgenti che esaminavano una stringa e cercavano come ultimo valore proprio EOF (non '{parsed_message}' o NULL, c'era proprio stringa[i] == EOF ), in questo caso cosa indicherebbe?

So che concettualmente 0,NULL e "vuoto" sono cose completamente diverse, per un umano.
Per il puntatore a NULL, ho letto da parecchie parti che un puntatore a NULL è un puntatore che non punta a una zona di memoria usabile, e visto che ,visto che celle di memoria "vuote" è impossibile averle, sempre ci saranno valari spazzatura (ecco perchè è bene inizzializzare qualsiasi variabile) il valore NULL viene implementato come indirizzo di memoria 0x00 (ovviamente in questo caso devo pensare come una macchina, quindi se per essa sono la stessa cosa in questo caso, me lo faccio piacere)
in più mi pare di capire che c'è differenza tra un puntatore che punta a NULL e un puntatore che vale NULL.

' è il NULL per le stringhe, corretto?
Non ero sicuro che fosse implementato a -1 in tutti i compilatori, ma se dici che è universale ok, per questo ho scritto " tipicamente -1 ".
Pero', se le ritrovo li posto, ho trovato sorgenti che esaminavano una stringa e cercavano come ultimo valore proprio EOF (non 'Intanto grazie del tempo che stai dedicandomi,

allora:

EOF è diverso da '{parsed_message}' che è il terminatore di stringa. '{parsed_message}' è il NULL per le stringhe, corretto?
Non ero sicuro che fosse implementato a -1 in tutti i compilatori, ma se dici che è universale ok, per questo ho scritto " tipicamente -1 ".
Pero', se le ritrovo li posto, ho trovato sorgenti che esaminavano una stringa e cercavano come ultimo valore proprio EOF (non '{parsed_message}' o NULL, c'era proprio stringa[i] == EOF ), in questo caso cosa indicherebbe?

So che concettualmente 0,NULL e "vuoto" sono cose completamente diverse, per un umano.
Per il puntatore a NULL, ho letto da parecchie parti che un puntatore a NULL è un puntatore che non punta a una zona di memoria usabile, e visto che ,visto che celle di memoria "vuote" è impossibile averle, sempre ci saranno valari spazzatura (ecco perchè è bene inizzializzare qualsiasi variabile) il valore NULL viene implementato come indirizzo di memoria 0x00 (ovviamente in questo caso devo pensare come una macchina, quindi se per essa sono la stessa cosa in questo caso, me lo faccio piacere)
in più mi pare di capire che c'è differenza tra un puntatore che punta a NULL e un puntatore che vale NULL.

' o NULL, c'era proprio stringa[i] == EOF ), in questo caso cosa indicherebbe?

So che concettualmente 0,NULL e "vuoto" sono cose completamente diverse, per un umano.
Per il puntatore a NULL, ho letto da parecchie parti che un puntatore a NULL è un puntatore che non punta a una zona di memoria usabile, e visto che ,visto che celle di memoria "vuote" è impossibile averle, sempre ci saranno valari spazzatura (ecco perchè è bene inizzializzare qualsiasi variabile) il valore NULL viene implementato come indirizzo di memoria 0x00 (ovviamente in questo caso devo pensare come una macchina, quindi se per essa sono la stessa cosa in questo caso, me lo faccio piacere)
in più mi pare di capire che c'è differenza tra un puntatore che punta a NULL e un puntatore che vale NULL.

Ultima modifica effettuata da 26/01/16 15:16