Hola todos,
Soy iniciante en esto y no concigo entender muy bien sus respuesta .
El programa es:
delphi
type matriz = array of array of double; Pmatriz = ^matriz; PPmatriz = ^Pmatriz; var a : PPmatriz; procedure xxx (var a:PPmatriz); cdecl; external 'Matrizdinamica.dll' name '?simplx@@YAXPAPANHHHHHPAH11@Z'; begin linha:= 3; coluna:= 5; GetMem (a, linha*coluna *Sizeof(double)); for i := 1 to coluna do begin for j := 1 to linha do begin a^[j,i]:= 4; end; end; 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.