memcpy no copia nada o no?

No entiendo por qué la matriz t1 está vacía. Como sé, memcpy no debería preocuparse por los tipos subyacentes de los objetos. ¿Qué piensas? %)

cout << sizeof(float) << sizeof(int) << endl;

float *t1= (float *)malloc(20*sizeof(float));
memset(t1,0x00,20*sizeof(float)); 

int *t2= (int *)malloc(20*sizeof(int));
for (int i=0; i<20; i++) 
    t2[i]=i;  

memcpy(t1,t2,20*sizeof(int));

for (int i=0; i<20; i++) 
    printf("%f\t", (float)t1[i]); 

Sé lo que significa la conversión de tipos. Ok, cometí algunos errores. ¡Fue un descuido!

PD ¡Fue una muestra para entender cómo funciona memcpy!

preguntado el 24 de agosto de 12 a las 09:08

Has etiquetado esto como "C", pero estás usando cout? -

lo siento, es código mixto)) -

Las (float) cast es completamente inútil: los argumentos de función variable se promueven de forma predeterminada. (Y t1[i] is ya haya utilizado De tipo float!) ¿Estás copiando/pegando fragmentos de código de otro lugar? -

Sé lo que significa la conversión de tipos. Ok, cometí algunos errores. ¡¡Fue un descuido!! Y ahora mi reputación está abajo. Es maravilloso. Gracias a todos. -

La única pregunta que realmente puedo ver aquí es '¿Qué piensas?', una pregunta muy pobre que estoy seguro de que todos podemos estar de acuerdo. Aparte de eso, está utilizando una mezcla dolorosa de código C incorrecto y código C++ incorrecto. Ni siquiera se ha tomado el tiempo de explicar qué resultado está obteniendo y qué esperaba obtener. -

6 Respuestas

La función memcpy copia bits, literal. Entonces, está copiando bits de una matriz de enteros a una matriz flotante: hay muy pocas posibilidades de que el contenido coincida con la representación de coma flotante. Entonces obtienes una matriz llena de cosas que tienen poco sentido para tu formato de coma flotante.

En pocas palabras, en el nivel más bajo, 1 y 1.0f lucir tremendamente diferente.


El elenco (float)t1[i]) realmente no hace nada desde t1[i] ya es float.

Respondido 24 ago 12, 09:08

Está bien. Entonces memcpy es una función útil: Myosotis

@Leila si fuera inútil, no creo que existiera. - tu préstamo estudiantil

@Leila No es inútil, está hecho para otros usos :-) - cnicutar

@cnicutar Solo un poco, pero tu "no hay posibilidad" no es del todo correcto. Es un comportamiento indefinido, y en realidad hay una arquitectura en la que funciona. (Uno de los mainframes de Unisys, por lo que dudo seriamente que el OP lo esté usando). james kanze

@cnicutar No es que sea realmente relevante para el OP: dado que la pregunta también está etiquetada como Visual Studios, sabemos que no está trabajando en un mainframe Unisys. - james kanze

Su matriz no está "vacía", a pesar de sus protestas. Solo tiene un valor muy, muy pequeño: su máquina usa el estándar IEEE754 para representar puntos flotantes. En ese estándar, la palabra con todos ceros representa el valor 0.0. La siguiente palabra más grande (es decir, la que se obtiene sumando 1 a los bits subyacentes) representa el siguiente valor de punto flotante más grande, que es un valor anormal extremadamente pequeño. Cuando usted printf este valor con precisión estándar (¿6 decimales?), simplemente se redondea a cero.

Aquí hay una respuesta tangencialmente relacionada mío en una pregunta similar.

contestado el 23 de mayo de 17 a las 11:05

Veo que tienes razón. Puedo ver estos pequeños valores con cout << t1[i]; - Myosotis

Punto totalmente quisquilloso: la última revisión de IEEE 754 (2008) cambió "denormal" a "subnormal". - pete becker

@PeteBecker: Jaja, interesante :-) - Kerrek SB

Está forzando los valores enteros 0, 1, 2, 3, 4, 5 .. 20 en flotantes. Floats e ints usan diferentes representaciones subyacentes y, de entrada, creo que esos valores son muy, muy pequeños y se imprimirán como 0 a menos que cambie el formato para incluir mucha precisión.

Respondido 24 ago 12, 09:08

La disposición de los bits es diferente en un int y un float. Incluso si las cosas se copian bien, no podrá entenderlo.

Cambie a

for (int i=0; i<20; i++) 
  printf("%d\t", (int)t1[i]);

y verás cosas copiadas.

Respondido 24 ago 12, 09:08

memcpy copia la memoria como bytes y no le importa qué tipos subyacentes se han almacenado en la ubicación de la memoria. Los enteros en la memoria se almacenan en un formato diferente al de los flotantes, por lo que básicamente lo que termina en t1 podría ser, pero no necesariamente, valores de punto flotante válidos.

Respondido 24 ago 12, 09:08

Como está usando C++, puede usar las funciones de C++ en su lugar, como std::vector

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;
int main(){
    cout << sizeof(float) << sizeof(int) << endl;
    std::vector<float> floatVector;
    std::vector<int> intVector;

    for (int i = 0; i < 20; i++)
    {
        intVector.push_back(i);
    }
    floatVector.resize(intVector.size());

    std::copy(intVector.begin(), intVector.end(), floatVector.begin());
    for (int i = 0; i < 20; i++)
    {
        cout << "element[" << i << "]: " << floatVector[i] << std::endl;
    }
}

Respondido 24 ago 12, 09:08

Es bueno. Pero uso Memory_alloc de la biblioteca c6accel (compartiendo memoria con DSP). No puedo representar estos datos con un objeto vectorial. - Myosotis

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.