PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ** operator, Zeiger auf Array



jay-t
16-08-2013, 07:07
In einer Funktion wird S4 **pcclist definert das ist:
long int **pcclist;

Zugreifen auf die einzelnen Elemente kann ich mit a = pcclist[x][y]

Jetzt möchte ich einen Zeiger auf pcclist an eine Funktion übergeben.
Nur wie mache ich das?

In pcclist sind die Befehle meiner VM gespeichert und das Array möchte ich an den JIT Compiler übergeben. Das Programm stürzt an der Stelle wo es den Opcode ausgeben soll ab.

Aufruf mit:

jit_compiler (&pcclist, &vmreg, ARG1, ARG2);

Der JIT Compiler:



#include "global_d.h"

#include <AsmJit.h>

// This is type of function we will generate
typedef S8 (*MyFn)();

extern "C" void jit_compiler (S4 **clist, struct vmreg *vmreg, S4 start, S4 end)
{
using namespace AsmJit;

// ================================================== ========================

S4 i;
S8 r1, r2, r3;
S8 r1v, r2v, r3v;

printf ("JIT - START\n");
printf ("start: %li\n", start);
printf ("end: %li\n", end);

for (i = start; i <= end; i++)
{
printf ("opcode: %li\n", clist[i][0]); /* crash */

switch (clist[i][0])
{
case ADD_L:
printf ("ADD_L\n");
r1 = clist[i][1]; r2 = clist[i][2]; r3 = clist[i][3];

r1v = vmreg->l[r1];
r2v = vmreg->l[r2];

printf ("r1v: %lli, r1v: %lli\n", r1v, r2v);

// Create assembler.
Assembler a;

// Log assembler output.
FileLogger logger(stderr);
a.setLogger(&logger);
// Prolog.

a.push (nbp);
a.mov (nbp, nsp);

a.mov (rax, r1v); /* r1v */
a.mov (rbx, r2v); /* r2v */

a.add (rax, rbx);
a.mov (nax, rax);

// Epilog.
a.mov (nsp, nbp);
a.pop (nbp);
a.ret ();

MyFn fn = function_cast<MyFn>(a.make());

vmreg->l[r3] = fn ();

MemoryManager::getGlobal()->free((void*)fn);
break;
}
}
}


Wie übergebe ich die Adresse von pcclist richtig?

sommerfee
16-08-2013, 07:17
Wie übergebe ich die Adresse von pcclist richtig?
Warum möchtest du die Adresse von pcclist übergeben? So wie ich das sehe, reicht es doch völlig, wenn du pcclist selber und damit die Adresse des Arrays übergibst:

jit_compiler (pcclist, &vmreg, ARG1, ARG2);

jay-t
17-08-2013, 12:31
extern "C" int jit_compiler (S4 ***clist, struct vmreg *vmreg, S4 start, S4 end)
{


Ist richtig. Ich brauche also drei Pointer Angaben vor clist: ***clist.
Dann geht es.