Übergeben von Ganzzahlen beliebiger Größe von Prolog an C

Lesezeit: 1 Minute

Benutzer-Avatar
wiederholen

Im Moment lerne ich, wie man SICStus Prolog mit C-Code verbindet.

Ich möchte eine C-Implementierung von “Hamming-Gewicht” von Ganzzahlen beliebiger Größe in SICStus Prolog Version 4 haben/verwenden/sehen.

Es scheint mir, dass ich C-Funktionen zum Testen von Termtypen (SP_is_integer) und C-Funktionen zum Zugreifen auf Prolog-Terme (SP_get_integer, SP_get_integer_bytes) benötige.

Ich bin mir jedoch nicht sicher, wie ich SP_get_integer_bytes auf tragbare, robuste Weise verwenden soll. Könnten Sie mir bitte einen gut gemachten soliden C-Code zeigen, der genau das tut?

  • SP_get_integer_bytes() ist für Ganzzahlen mit beliebiger Genauigkeit.

    – Pro Mildner

    3. März 2015 um 15:57 Uhr

Benutzer-Avatar
Per Mildner

Verwenden Sie es etwa so:

SP_term_ref tr = ... some term ...
int native = 0; // want portable, little endian
size_t buf_size = 0;

if (!SP_get_integer_bytes(tr, NULL, &buf_size, native)
    // if buf_size was updated, then there was not really an error
    && buf_size == 0)
{
    // Something wrong (e.g., not an integer)
    return ERROR;
}

// here buf_size > 0
void *buffer = SP_malloc(buf_size);

if (buffer == NULL)
{
    return ERROR;
}

if (!SP_get_integer_bytes(tr, buffer, &buf_size, native))
{
    // Something wrong. This would be surprising here
    error();
}

// Here buffer contains buf_size bytes, in
// twos-complement, with the least significant bytes at lowest index.
// ... do something with buffer ...

// finally clean up
SP_free(buffer);

  • Dies funktioniert mit jeder ganzen Zahl. Dies funktioniert mit jedem Puffer (z. B. könnten Sie einen statischen Puffer verwenden, der normalerweise groß genug ist, und dann einen dynamischen Puffer zuweisen, wenn die Ganzzahl zu groß ist, um in den statischen Puffer zu passen).

    – Pro Mildner

    4. März 2015 um 8:18 Uhr

1345930cookie-checkÜbergeben von Ganzzahlen beliebiger Größe von Prolog an C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy