2009-06-24 16 views
9

Este es el código que quiero tratar de escribir:C: Uso de la función 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; 
} 

Mi problema es que quiero ver si es posible utilizar memset para hacer todas las entradas de una matriz para ser un número distinto de 0. Sin embargo, después de pasar por esa línea, el contenido de la matriz cambia a un número muy pequeño (0). Me pregunto qué estoy haciendo mal en este caso con el uso de la función memset(). Espero que esta no sea una publicación duplicada, ya que parece que ninguna de las preguntas relacionadas sugeridas mientras estoy escribiendo esto.

Respuesta

9

Al convertir un doble en int solo crea el número binario 00001010 (10 en binario), y ese es el valor que se memset'ed. Ya que es un char, cada uno de sus flotadores en realidad está recibiendo el patrón de bits 00001010 00001010 00001010 00001010.

+0

es decir, ¿tiene sentido usarlo para restablecer las entradas de una matriz a ceros, prácticamente hablando? – stanigator

+0

Eso o si está configurando una matriz char que tiene algún otro valor que sea relevante. –

+0

O cualquier valor de byte único. El más común es probablemente 0, pero también es probable que se use mucho 0xFF. –

7

No. memset toma un solo byte y lo escribe en la matriz. Un flotante es un tipo de múltiples bytes.

EDITAR: Sí, sé que memset toma una int. Pero solo usa un char sin signo (un solo byte) para completar.

15

Memset toma un int, pero lo convierte en un unsigned char, y luego se llena cada byte de flotador (sizeof (float) se probablemente 4) con ese patrón de bits. Si esto es C++, prefieren fill lugar:

#include <algorithm> 
using namespace std; 

//... 

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

Gran sugerencia. Examinaré usarlo. – stanigator

+1

Y si está en C no en C++, busque variantes de memset específicas de la plataforma que escriban patrones más grandes que un solo carácter. Hay memset_pattern4 por ejemplo si lo tienes. O instrucciones SIMD. –

2

realmente su intento es un poco engañoso, memset trabaja en bytes .. realmente usar un flotador para el valor memset no tiene ningún sentido!

El formato flotante solo tiene 23 + 1 bits para mantissa y 8 bits para el exponente ... cuando escribe valores de bytes sin procesar (usando memset) dentro de un flotante, no sabe lo que está obteniendo porque está estableciendo valores que será interpretado de una manera diferente!

En su fragmento, también lo convierte en (int) convirtiendo un flotante de 4 bytes que contiene 10.0f en un entero de 4 bytes que contiene el valor 10 .. pero como se dijo antes si establece un flotante con 10 (= 0x0a) terminará obteniendo 0x0A0A0A0A que no es 10.0f en formato flotante, puede ser cualquier valor (también algo muy cercano a 0, como en su caso).

En realidad memset es útil cuando se desea inicializar un array de caracteres (ya que se obtiene efectivamente ese valor para cada Char porque son de 1 byte) o cuando se quiere configurar todo a 0 (NULL) que funciona para cada tipo básico de datos ...

3

¿Por qué no simplemente un simple lazo for?

+3

La necesidad de velocidad es una respuesta. – EvilTeach

+0

El objetivo de mi pregunta en realidad. – stanigator

+0

Todo lo que memset va a hacer es configurar la memoria un byte a la vez. Un bucle for se comprime a través de bytes sizeof (arry) sizeof (float) bytes a la vez. ¡Y sin la sobrecarga de una llamada de función! –

Cuestiones relacionadas