2009-06-24 22 views
9

Questo è il codice che voglio provare a scrivere:C: Usando la funzione memset

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <string.h> 
#include <malloc.h> 

int main(int argc, char *argv[]) 
{ 
    float arry[3] = {0}; 

    memset(arry, (int) 10.0, 3*sizeof(float)); 

    return 0; 
} 

mio problema è che io voglio vedere se è possibile utilizzare memset per rendere ogni ingresso di una matrice di essere un numero diverso da 0. Tuttavia, dopo aver attraversato quella linea, il contenuto dell'array diventa un numero molto piccolo (0). Mi chiedo cosa sto facendo male in questo caso con l'uso della funzione memset(). Spero che questo non sia un post duplicato, in quanto nessuna delle domande correlate suggerite durante la digitazione sembra essere.

risposta

9

Il casting di un numero doppio in un numero int crea semplicemente il numero binario 00001010 (10 in binario), e questo è il valore che è memset. Dato che si tratta di un carattere, ognuno dei tuoi oggetti mobili riceve effettivamente il pattern di bit 00001010 00001010 00001010 00001010.

+0

vale a dire che ha senso utilizzarlo per ripristinare le voci di un array su zeri, in pratica? – stanigator

+0

Quello o se si sta impostando un array di caratteri che ha qualche altro valore che è rilevante. –

+0

O qualsiasi valore a byte singolo. Il più comune è probabilmente 0, ma è probabile che anche l'0xFF venga usato molto. –

7

No. memset accetta un singolo byte e lo scrive nell'array. Un float è un tipo multi-byte.

EDIT: Sì, so che memset prende un int. Ma usa solo un char senza segno (un singolo byte) da riempire.

15

Memset accetta un int, ma lo inserisce in un char unsigned e quindi riempie ogni byte di float (sizeof (float) è probabilmente 4) con quel modello di bit. Se questa è la C++, preferiscono invece fill:

#include <algorithm> 
using namespace std; 

//... 

fill (arry,arry+3,10.0); 
+0

Ottimo suggerimento. Cercherò di usarlo. – stanigator

+1

E se sei in C non C++, cerca varianti di memset specifiche per piattaforma che scrivano pattern più grandi di un singolo char. C'è memset_pattern4 per esempio se ce l'hai. O istruzioni SIMD. –

2

In realtà la tua prova è un po 'fuorviante, memset lavora su byte .. in realtà utilizzando un galleggiante per il valore memset non ha alcun senso!

Il formato float ha solo 23 + 1 bit per mantissa e 8 bit per esponente .. quando si scrivono valori di byte non elaborati (utilizzando memset sarà interpretato in un modo diverso!

Nello snippet lo si gira anche su (int) trasformando un float di 4 byte contenente 10.0f in un intero di 4 byte contenente il valore 10 .. ma come detto prima se si memset di un float con 10 (= 0x0a) finirai per ottenere 0x0A0A0A0A che non è 10.0f in formato float, può essere qualsiasi valore (anche qualcosa molto vicino a 0, come nel tuo caso).

realtà memset è utile quando si desidera inizializzare un array di caratteri (in quanto si ottiene in modo efficace che il valore per ogni char, perché sono 1 byte di lunghezza) o quando si desidera impostare tutto a 0 (NULL) che funziona per ogni tipo di dati di base ..

3

Perché non solo un semplice ciclo for?

+3

Il bisogno di velocità è una risposta. – EvilTeach

+0

L'intero punto della mia domanda in realtà. – stanigator

+0

Tutti i memset che stanno per fare è impostare la memoria un byte alla volta. Un ciclo for comprenderà i byte sizeof (arry) byte di dimensione (float) alla volta. E senza il sovraccarico di una chiamata di funzione! –

Problemi correlati