Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

como hago este cast

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: como hago este cast Responder citando

Hola

adaptando un codigo para realizar un cast, me aparece el siguiente error en este codigo


void __fastcall TForm2::escritura_datos(double pesos[], double valor[], double umbral_act[])
{
Table3->First();
Table3->Edit();

//~~~~~~~~~~~~escritura~para~el~peso~de~las~neuronas~de~proceso~~~~~~~~~~~~~~~//

Application->ProcessMessages();
std::auto_ptr< Classes::TMemoryStream >
stream_peso_neuronas_proc(new Classes::TMemoryStream);

stream_peso_neuronas_proc.get()->Position = 0;


std::vector<bool> tmp;
double *pesos_end = pesos+1048576;

std::transform
(
pesos, // Desde el inicio del 'vector'
pesos_end, // Hasta el final del 'vector'
std::back_inserter(tmp), // Salida
double_a_bool // Función de conversión
);


Application->ProcessMessages();
stream_peso_neuronas_proc.get()->Write(tmp, (1048576 * sizeof(bool)) ); /*aqui, en esta linea*/
stream_peso_neuronas_proc.get()->Position = 0;

Application->ProcessMessages();
Table3Peso_neurona_proc->LoadFromStream(stream_peso_neuronas_proc.get());
...

en la linea indicada arriba en el codigo me aparece un error que dice

E2034 Cannot convert 'vector<allocator<bool> >' to 'const void *'

me imagino que debo hacer un cast, pero no se de que tipo.

Agradezco cualquier sugerencia.

Gracias y disculpen las molestias
_________________
"Cállate, o di algo mejor que el silencio"
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

La línea quedaría así:

  stream_peso_neuronas_proc->Write(&tmp[0], (1048576 * sizeof(bool)) );

por cierto, no tienes necesidad de poner ".get()" cada vez, por ejemplo, esta línea:

  stream_peso_neuronas_proc.get()->Position = 0;

la dejaríamos así:

  stream_peso_neuronas_proc->Position = 0;
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola _Leo

ya hice el cambio en la linea que me indicó, pero cuando ejecuto el codigo me marca error en la linea

stream_peso_neuronas_proc->Write(&tmp[0], (1048576 * sizeof(bool)) );

y no se por que.

El mensaje dice asi

EAccessViolation with message 'Access Violation at address 00604B2D in module final.exe'...

No se el por qué. Alguna sugerencia?

Gracias
_________________
"Cállate, o di algo mejor que el silencio"
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

El error se debe a como se almacena internamente el vector bool, que en este ejemplo estamos presuponiendo que seria en 1 byte (o varios) al usar sizeof, pero el vector de tipo bool almacena cada valor en 1 bit ... no se si me entiendes ... de todos modos si no quieres cambiar mucho el ejemplo bastaría con cambiar todas las coincidencias de "bool" por "BYTE".

Y otra solución, mirando mejor el código que has puesto, podríamos quitar el vector bool y guardar la conversión directamente en el MemoryStream. La cosa quedaría más resumida y debería funcionar:
Código:
...

std::auto_ptr<TMemoryStream> stream_peso_neuronas_proc(new TMemoryStream);

double* pesos_end = pesos + 1048576;
stream_peso_neuronas_proc->Size = sizeof(bool) * 1048576;

// Aquí hacemos el cambio mas importante, al convertirlo
// almacenamos el valor directamente en el MemoryStream
std::transform(pesos, pesos_end,
  static_cast<bool*>(stream_peso_neuronas_proc->Memory), double_a_bool);

...

(en este caso nos sobran todos los "->Position", ya que al hacerlo así la posición esta en 0 siempre)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.