GMP: Initialisierung mehrerer Variablen

8

Sie können eine GMP-Variable 'mpz_t n' als mpz_init (n) initialisieren.

Die Dokumentation sais 'void mpz_inits (mpz_t x, ...) Initialisiere eine NULL-terminierte Liste von mpz_t-Variablen und setze ihre Werte auf 0.'

Ich bin mir nicht sicher, was eine 'NULL-terminierte Liste' hier bedeutet.

%Vor%

Ist das obige der richtige Weg, um a, b und c zu initialisieren?

    
MinjaeKim 06.08.2014, 14:12
quelle

2 Antworten

7

Ja, das ist richtig.

In C gibt es keine implizite Möglichkeit für variadic Funktionen (wie mpz_inits ) zu wissen, wie viele Argumente übergeben werden. Verschiedene Funktionen tun dies auf verschiedene Arten. Zum Beispiel verwendet die *printf -Familie die Formatzeichenfolge, um die Anzahl / Typen der zusätzlichen Argumente zu bestimmen. In anderen Fällen wie mpz_inits verwenden sie einen NULL-Terminator, um das Ende der Liste zu markieren (ähnlich wie das Nullzeichen NULL das Ende einer Zeichenkette markiert).

NULL-terminiert bedeutet einfach, dass das Ende einer Liste mit ansonsten unbestimmter Länge durch das Argument %code% signalisiert wird.

    
Drew McGowen 06.08.2014, 14:19
quelle
2

Wenn in C ein Prototyp mit einer Ellipse endet, können die Typen der entsprechenden Argumente nicht überprüft werden. Daher müssen Sie sicherstellen, dass der Typ des letzten Arguments korrekt ist. Da mpz_inits Zeiger auf mpz_ptr erwartet, müssen Sie hier einen Null-Zeiger auf diesen Typ angeben, z. mit einem Cast:

%Vor%

oder

%Vor%

Beachten Sie, dass das Umwandeln in einen anderen Zeigertyp wie void * nicht garantiert auf allen Plattformen funktioniert, insbesondere wenn die Größe der Zeigertypen unterschiedlich ist. Nun, ob solche Plattformen existieren / GMP unterstützt solche Plattformen ist ein anderes Problem ... Aber andere Probleme könnten auch von fortgeschrittenen Compiler-Optimierungen kommen. Daher ist es besser, den C-Standard genau einzuhalten.

    
vinc17 08.05.2016 22:22
quelle

Tags und Links