Set di un array di strutture contenente bit field con memset

di il
2 risposte

Set di un array di strutture contenente bit field con memset

Ciao a tutti,
il mio obbiettivo e' settare tutti i bits di un array di struct che contiene dei bit fields al valore "1". Una cosa che sapevo dall'esperienza ma che non so spiegare con esattezza e' il fatto che la memset non funziona, nel senso che mi inizializza solo il primo campo della struct di ogni elemento dell'array e non tutti i bit appartenenti ad essa; la mia domanda e' perche'? Ho una reminescenza riguardo al fatto che e' un problema dipendente dalla memset ma non so indirizzarlo alla risposta finale.
Allego un po' di codice in modo che possa essere piu' chiaro il mio caso

typedef struct testStruct_s
{
	int var  : 2;
	int var2 : 2;
} testStruct_t;

void main()
{
	testStruct_t structure[2];
	
	// Supponiamo scriva nella mia struct qualcosa
	structure[0].var  = 3;
	structure[0].var2 = 2;
	structure[1].var = 2;
	structure[1].var2 =  3;
	
	memset(structure,1 , sizeof(structure));
}
In questo caso var avra' il valore "1" mentre var2 sara' a "0".
Le volte che ho dovuto settare qualche valore in campi di questo tipo ho sempre preso campo per campo e settato un valore.
Grazie mille per il supporto.

2 Risposte

  • Re: Set di un array di strutture contenente bit field con memset

    Ciao. Vado a memoria e rispondo di fretta, quindi controlla tutto.

    Per quel che mi sovviene, memset() lavora sui char (cioè, in definitiva, sui byte) di una certa porzione di memoria il cui punto di inizio è dato dal primo parametro. Se tu imposti ogni char su 1, succede che "setti" solamento il primo bit del char, non tutti i bit! (00000001) In effetti dovresti usare come secondo parametro un valore che "copra" tutti i bit del char. A memoria non riesco a ricordare se venga considerato o meno il segno, né come (verifica tu), però penso proprio che usare 0xFF (255 in esadecimale, ovvero la "capienza" massima di un byte senza segno: 11111111) come secondo parametro possa andare bene. Ripeto: VERIFICA TUTTO QUEL CHE HO DETTO, perché sto andando a memoria e non sono quel gran esperto.
  • Re: Set di un array di strutture contenente bit field con memset

    Grande Aldo, grazie per la risposta.
    Dunque, hai risposto correttamente riguardo al fatto che la memset ragiona in termini di 1 byte alla volta e tutto fila anche per l'inizializzazione ad "1"del solo primo bit.
    Per i miei check ancor prima di postare ovviamente, ho usato Visual Studio il quale non so che compilatore usi e con che configurazione, avevo gia' provato ad inizializzare tutto ad 0xFF ma debuggando i valori non sono quelli attesi.
    Comunque, il core del mio post era rinverdire il perche' non si riuscisse ad inizializzare tutto con la memset e a quello ci sono arrivato (mannaggia a me ). Grazie!
Devi accedere o registrarti per scrivere nel forum
2 risposte