Mảng lớn trong GMP


8

Nếu tôi muốn sử dụng mảng lớn, hãy nói mpz_t A [100000], tôi đã nhận được "Lỗi phân đoạn (lõi bị đổ)" trong quá trình biên dịch. Có cách nào dễ dàng hơn để giải quyết điều này?


4
Bạn đã thử phân bổ nó một cách linh hoạt thay vì tĩnh? Đôi khi phân bổ tĩnh đi trên ngăn xếp trong khi động đi vào heap. Ngoài ra, bạn có thể thay đổi kích thước ngăn xếp của mình và xem nếu điều đó khắc phục vấn đề. Dù không biết bạn đang sử dụng hệ thống nào, tôi không thể nói cho bạn biết làm thế nào để làm điều đó.
tpg2114

Câu trả lời:


6

Nhận xét của tpg2114 là tại chỗ. Thử:

/* 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);

Nếu malloccuộc gọi ở đây gây ra lỗi, bạn không có đủ bộ nhớ trong hệ thống của mình.

Nếu bạn quan tâm đến việc sử dụng một mảng tĩnh trên ngăn xếp, thì bạn có thể thử tăng kích thước giới hạn ngăn xếp trong Linux bằng ulimitlệnh.


Cảm ơn rất nhiều. Trong quá trình biên dịch của tôi, tôi đã nhận được cảnh báo sau "khai báo ngầm không tương thích của hàm tích hợp 'malloc' [được bật theo mặc định]". Tuy nhiên nó hoạt động.
12290

1
@ user12290 thật tuyệt, tôi đã sửa mẫu mã để bao gồm đúng stdlib.h
Aron Ahmadia

1
Vì tình yêu của tất cả những điều tốt đẹp và đúng đắn trong thế giới này, hãy đặt một free(A)ví dụ trong đó!
Bill Barth

Đủ công bằng, cố định.
Aron Ahmadia

Làm thế nào để sử dụng mảng A? Nếu tôi thử: mpz_set_ui (A [4], 1212121); sau đó tôi đã nhận được lỗi memmory.
Adam

2

Bạn cũng có thể cân nhắc sử dụng mpz_classtrong C ++ ( ref .) Thay vì mpz_t. Nó có thể làm cho số học chính xác tùy ý đơn giản.

Đây là một ví dụ ngẫu nhiên:

#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;
}

Được biên dịch với ví dụ:

g++ [[filename]] -lgmp -lgmpxx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.