Ir al contenido


Foto

punteros dobles y matrices en DELPHI


  • Por favor identifícate para responder
21 respuestas en este tema

#21 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 11 febrero 2014 - 07:45

Hola todos,
Soy iniciante en esto y no concigo entender muy bien sus respuesta :(.

El programa es:



delphi
  1. type
  2.   matriz = array of array of double; 
  3.   Pmatriz = ^matriz;
  4.   PPmatriz = ^Pmatriz;
  5.  
  6. var
  7.   a : PPmatriz;
  8.  
  9. procedure xxx (var a:PPmatriz); cdecl; external 'Matrizdinamica.dll' name '?simplx@@YAXPAPANHHHHHPAH11@Z';
  10. begin
  11.   linha:= 3;
  12.   coluna:= 5;
  13.   GetMem (a, linha*coluna *Sizeof(double));
  14.   for i := 1 to coluna do
  15.   begin
  16.     for j := 1 to linha do
  17.     begin
  18.       a^[j,i]:= 4;
  19.     end;
  20.   end;
  21. end;



No he conseguido encontrar el problema, tengo un error de access violation, no se si esta escrito correctamente o no.........., solo deseo usar una matriz ponteiro de ponteiro (en C++ **matriz), que viene de una dll de C++ y que todos sus elementos sean igual a 4


El código anterior parece que se refiere a un procedimiento en una dll que luego implementas desde delphi...

Para aclarar un poco las cosas, si lo consigo:
1- Una matriz en C se representa por un puntero a su primer elemento. Creo que esto lo tienes claro.
2- Una matriz de dos dimensiones en C es una matriz de matrices, por lo tanto estamos hablando de una matriz de punteros (un puntero a un puntero), cada uno de los cuales apunta a una matriz de segundo nivel.
3- Si quieres implementar lo anterior a bajo nivel, tienes que reservar memoria para una matriz de n punteros y después, reservar el espacio para cada una de las submatrices. Seguidamente debes asignar a cada elemento (puntero) de la matriz de primer nivel, el puntero a cada matriz de segundo nivel. Finalmente asignas los valores de los elementos de las matrices.

Lo anterior sería la representación de como trabaja C a bajo nivel. Aunque, en principio, delphi trabaja de forma sintáctica muy diferente de C, hablando de matrices dinámicas, a bajo nivel trabajan igual.

Dicho esto, la variable matriz en delphi (marices dinámicas) es un puntero al primer elemento de la matriz, y hablando de matrices de dos dimensiones, es un puntero a un puntero.

Trabaja desde delphi con la sintaxis de delphi, asigna tu matriz bidimensional en tu doble bucle, y luego pasa como parámetro de tu función en la dll escrita en C, el nombre de la variable de tu matriz bidimensional.

Si quieres trabajar a bajo nivel (más complicado y sujeto a más errores) visita el enlace que te dejé o mira el código que expuse más arriba. En ese código, uso la API VirtualAlloc por cuestión de eficiencia, pero puedes usar igualmente GetMem, el resultado funcional sería el mismo.

Mi consejo es que trabajes a lato nivel y cuando lo entiendas bien, te aventures a bucear.

Otro detalle es que traduzcas bien la declaración de la función C de la dll, o tendrás desagradables errores.

Espero haberme explicado con claridad, a veces no es mi fuerte.  :)


Saludos.
  • 0

#22 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 12 febrero 2014 - 05:59

Yo cambiaría el modelo y crearía funciones en la Dll para el manejo de la matriz,  es mucho más sencillo exportar funciones que memoria.

Ej.  SetDim(X, Y, Z);
Function GetElement(X, Y, Z) : Double;
Function SetElement(X,Y,X, Valor) : Boolean;

Algo así.

Una Dll en Windows se puede llamar desde .NET, C, Java, etc.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.