Großes Array in GMP

8

Wenn ich ein großes Array verwenden möchte, z. B. mpz_t A [100000], wurde während der Kompilierung "Segmentierungsfehler (Core Dumped)" angezeigt. Gibt es einen einfacheren Weg, dies zu lösen?

user12290
quelle
4
Haben Sie versucht, es dynamisch statt statisch zuzuweisen? Manchmal werden statische Zuordnungen auf dem Stapel gespeichert, während dynamische auf dem Heap gespeichert werden. Alternativ können Sie Ihre Stapelgröße ändern und prüfen, ob das Problem dadurch behoben wird. Ohne zu wissen, auf welchem ​​System Sie sich befinden, kann ich Ihnen jedoch nicht sagen, wie Sie das tun sollen.
tpg2114

Antworten:

6

Der Kommentar von tpg2114 ist genau richtig. Versuchen:

/* at top */
#include <stdlib.h>

/* definition */
mpz_t *A;

/* initialization of A */
A = (mpz_t *) malloc(100000 * sizeof(mpz_t));
if (NULL == A) {
    printf("ERROR: Out of memory\n");
    return 1;
}

/* no longer need A */
free(A);

Wenn der mallocAufruf hier einen Fehler auslöst, ist in Ihrem System nicht genügend Speicher verfügbar.

Wenn Sie ein statisches Array auf dem Stapel verwenden möchten, können Sie versuchen, die Stapelbegrenzungsgröße unter Linux mit dem ulimitBefehl zu erhöhen .

Aron Ahmadia
quelle
Vielen Dank. Während meiner Kompilierung erhielt ich die folgende Warnung "Inkompatible implizite Deklaration der eingebauten Funktion 'malloc' [standardmäßig aktiviert]". Es funktioniert jedoch.
user12290
1
@ user12290 großartig, ich habe das Codebeispiel so korrigiert, dass es stdlib.h
Aron Ahmadia
1
Geben Sie für die Liebe zu allem, was in dieser Welt gut und richtig ist, ein free(A)Beispiel!
Bill Barth
Fair genug, behoben.
Aron Ahmadia
Wie verwende ich das A-Array? Wenn ich es versuche: mpz_set_ui (A [4], 1212121); dann habe ich einen Erinnerungsfehler bekommen.
Adam
2

Sie können auch die Verwendung mpz_classin C ++ ( Ref .) Statt in Betracht ziehen mpz_t. Es kann eine Arithmetik mit beliebiger Genauigkeit einfach machen.

Hier ist ein zufälliges Beispiel:

#include <gmp.h>
#include <gmpxx.h>
#include <iostream>
using namespace std;

int main() {
  mpz_class A[100000];
  for(int i=0;i<100000;i++) A[i]=142412+i;

  for(int i=0;i<100000;i++) cout << i << " " << A[i] << endl;

  return 0;
}

Zusammengestellt mit zB:

g++ [[filename]] -lgmp -lgmpxx
Douglas S. Stones
quelle