Newsgroup: it.comp.lang.c
Titolo: Quale tipo di dato dichiarare da usare per accedere a della memoria allocata?

Ho allocato un'area di memoria da 500k B (ottenuta in Linux
attraverso le funzioni di gestione della memoria condivisa dello
standard "System V" shmget() e shmat() ).
Posso associare ad un puntatore a char l'indirizzo della prima cella di
tale blocco di memoria e quindi usare tale buffer (il blocco allocato)
per copiare files? Ad esempio leggo 250k B da un file (attraverso la
read() di POSIX) e li metto in tale buffer a partire dalla prima cella
a cui accedo con il puntatore a char. Quindi copio 250k B dal buffer
(usando la write() di POSIX) su di un nuovo file che creo.
codice:
_______________
dichiaro: char *shm_segm;     /* puntatore al buffer */
associo alla variabile l'indirizzo di memoria del blocco:
shm_segm=(char *) shmat(bla bla bla bla);
_______________
Per quello che so a livello teorico, quella shmat() concettualmente
potrebbe per semplicità venire considerata una "malloc(500000);" per 
come è stata chiamata la shmget() nel programma.
E' un buon modo di procedere o sarebbe preferibile adottare un diverso
tipo di dato al posto del char* ? In pratica ho pensato al puntatore a 
char perchè ragiono in byte visto che le funzioni per leggere e scrivere 
in quel blocco di memoria allocata richiedono di dimensionare la memoria 
esprimendola in byte.
  ciao e grazie anticipatamente per le risposte
NOTA: ho parlato di funzioni che esulano da ANSI C ma solo per chiarire
bene il caso specifico. Spero di non essere comunque OT.


Puoi usare qualsiasi tipo di puntatore per puntare a qualsiasi cosa A
PATTO CHE la memoria sia allineata correttamente. Il char* può puntare
a memoria allineata al byte, per cui vai tranquillo.
Ciao!

 come è stata chiamata la shmget() nel programma.
Attento ai bytes che allochi:
500 kB = 500 * 1 kB = 500 * 1024 B = 512000 bytes
allo stesso modo:
250 kB = 256000 bytes
malloc() prende come argomento il numero di bytes.
-- 
Vincenzo Mercuri

 250 kB = 256000 bytes
Si riconosce subito che sei della vecchia guardia! :)
Anche io faccio fatica ad adattarmi agli standard
internazionali per cui 1kB = 1000 byte !!! :-)
ciao
Giacomo

On Sep 6, 6:36 pm, Giacomo Degli Esposti

Non è possibile evitare il link: 
http://xkcd.com/394/
;-)
Ciao!

 
Ho ben presente. :)
Io ho scritto:
500k B
mettendo volutamente uno spazio perchè non venisse confuso con kB.
Che intendevo dire? Considerando che in gergo comune il k messo dopo
un numero sta per "migliaia":
500,000 Bytes
Dove la "," sta per carattere di separatore delle migliaia.
Dovendo allocare un certo quantitativo di bytes, diciamo qualche
centinaio di kilobytes, per rapidità ho ragionato in termini di
centinaia di migliaia di Bytes.

 
Eh eh. :)


Grazie.
Puoi farmi un esempio di un puntatore che può puntare a memoria non 
allineata al B? Ad esempio una risposta potrebbe essere un puntatore ad 
una struttura grande 13 B?


Per esempio anche un puntatore int* non potrebbe puntare a molte
locazioni puntate da un char*. Tipicamente su un x86 un 'int'
deve avere un 4-bytes 'boundary'. Penso che la tua scelta di
usare char* per i tuoi scopi, come ha detto anche FtM, è ottima.
-- 
Vincenzo Mercuri

 centinaia di migliaia di Bytes.
Perdonami, e infatti era strano quello spazio tra
k e B. Non sono abituato a quella notazione :-)
-- 
Vincenzo Mercuri

On 6 Set, 18:36, Giacomo Degli Esposti

Ahahah... :-) ma sono giovane! (almeno spero)


:-) ho riso di gusto...
ho un problema con il server delle news e per rispondere
a questi messaggi uso iGoogle...spero di risolvere il problema..

 500 kB = 500 * 1 kB = 500 * 1024 B = 512000 bytes
Quello sarebbe 500 kiB  ;)
Pleg


In effetti sarebbe meglio usare il prefisso binario 'ki'.
Ma ancora dicono 'kilo-byte' quindi il prefisso è quello
del sistema SI, quindi kB. Ma ripeto, sono d'accordo con te,
dovremmo abituarci a dire 'kibi-byte' :-)
-- 
Vincenzo Mercuri

 dovremmo abituarci a dire 'kibi-byte' :-)
Il problema e' che lo so e so anche perche' e' una buona idea, ma non
riusciro' mai a dire kibibyte davanti ai colleghi senza sentirmi un
coglione... :)
E anche scritto, lo uso in quelle poche occasioni dove e'
assolutamente necessario, pena "storie dell'orrore". Ad esempio: un kB
di memoria e' universalmente compreso come 1024 B, ma in
telecomunicazioni (mi pare) si usino i prefissi correttamente, quindi
1 kB = 1000 B (d'altro canto non avrebbe senso per loro usare le
potenze del due).  Quindi se trasferiamo 1 kB di dati su una linea che
va a 1 kB/s ci mettiamo:
(1 kB) / (1 kB/s) = (1024 B) / (1000 B/s) = 1.024 s
che fa accapponare la pelle :)
Pleg

 che fa accapponare la pelle :)
e ma infatti avrebbero dovuto pensarci fin dall'inizio, era scontata
la differenza tra 1 kg = 10^3 g e 1 kB = 2^10 B (dove il 'kilo' perde
di significato, e da quando 10^3 = 2^10 ??).
Ma si sa, siamo imperfetti, gli uomini non sono in grado di vedere al
di là del proprio naso...non tutti almeno.
-- 
Vincenzo Mercuri


char c;
char *p_char =&c;
int *p_int;
p_int = (int*)p_char;
non è detto che p_char sia allineato in maniera adeguata per essere
convertito a int * (provoca infatti un UB)
Ciao!