Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Random_Suffle en C++Builder??? (https://www.clubdelphi.com/foros/showthread.php?t=86666)

ecfisa 22-09-2014 18:42:21

Hola aguml.
Cita:

Empezado por aguml (Mensaje 481844)
veo que tu usas strings y no usas memoria dinamica como es mi caso...

Estoy usando asignación dinámica, fijate las lineas entre comentarios:
Código PHP:

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  
int rows CSpinEdit1->Value;
  
int cols CSpinEdit2->Value;

  
/* ------------------------------- */
  
string **v;

  
= new string*[rows];
  for(
int i 0rowsi++) v[i] = new string[cols];
  
/* ------------------------------- */

  
for(int f 0rowsf++)
    for(
int c 0colsc++)
      
v[f][c] = StringGrid1->Cells[c][f].c_str();

  
random_shuffle(&v[0], &v[rows]);
  ... 

Y tenes razon sobre que solo mezcla las líneas. Hace años que no empleaba esa función y lo había echo sobre arreglos de una dimensión.
Otra duda que tengo es si random_shuffle se comporta como se espera cuando la matriz no es cuadrada... Voy a revisar nuevamente y cualquier novedad te aviso.

Saludos :)

aguml 22-09-2014 20:20:33

tienes razon, gracias por tu interes.

aguml 22-09-2014 22:08:37

amigo encontré esto por internet y creo que es lo que necesitamos para que funcione correctamente: http://c-faq.com/aryptr/dynmuldimary.html

aguml 23-09-2014 14:06:55

Amigo asi lo he dejado:
Código PHP:

void __fastcall TFormPrincipal::ButtonBarajarMatrizClick(TObject *Sender)
{
        
//En este form pedimos el numero de columnas y filas
        
FormDimension->ShowModal();

        
//Obtenemos memoria para nuestro array
        
= new int*[filas];
    
v[0] = new int[filas columnas];
    for(
int i 1filasi++)
        
v[i] = v[0] + columnas;

        
//En este form rellenamos el array
        
FormRellenado->ShowModal();

        
String s;

        
Memo1->Lines->Clear();
        
Memo1->Lines->Add("Matriz original");

        
//Mostramos el array original
        
for(int f 0filasf++) {
                
"";
                for(
int c 0columnasc++)
                        
String(v[f][c]) +",";
                
Memo1->Lines->Add(s);
        }
        
Memo1->Lines->Add("");
        
Memo1->Lines->Add("Matriz modificada");

        
//Barajamos los valores del array
        
random_shuffle(&v[0][0], &v[filas-1][columnas]);

        
//Mostramos el array barajado
        
for(int f 0filasf++) {
                
"";
                for(
int c 0columnasc++)
                        
IntToStr(v[f][c]) +",";
                
Memo1->Lines->Add(s);
        }

        
//Liberamos la memoria del array
        
delete [] v[0];
        
delete [] v;


Funciona perfecto y ya he entendido como hace para que la memoria sea contigua. Lo que hace es que a la primera fila le asigna la memoria necesaria para todo el array y luego trabaja con el como siempre y así tenemos toda la memoria correlativa.
Una duda que tengo es si la liberacion de memoria es correcta como la hago o dejo parte sin liberar.

aguml 23-09-2014 14:54:00

Otra cosa, a ver si puedes aplicar eso a tu ejemplo ya que he estado probando y se ve que algo me falla porque al barajar me muestra basura.


La franja horaria es GMT +2. Ahora son las 01:52:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi