Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Tìm số nguyên tố dùng Metaprogramming template lỗi Fatal Error C1202?

  1. #1
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Mặc định Tìm số nguyên tố dùng Metaprogramming template lỗi Fatal Error C1202?

    Ngồi tìm trong diễn đàn thì tìm thấy code tính số fibonaci dùng Metaprogramming template. Nên cũng code thử xem có thế ứng dụng nó vào những thứ khác không. Và đây là kết quả:
    Tính số mũ. Có thể tính được 2^63 trong thời gian 0.003s và giá trị cũng đạt giới hạn của long long. @@~
    C++ Code:
    1. template<int number, int mu, int mu2 = mu>
    2. struct Exponent
    3. {
    4.     static long long const value  = Exponent<number, mu - 1>::value * number;
    5. };
    6.  
    7. template<int number, int mu>
    8. struct Exponent<number, mu, 1>
    9. {
    10.     static long long const value = number;
    11. };
    12.  
    13. template<int number, int mu>
    14. struct Exponent<number, mu, 0>
    15. {
    16.     static long long const value = 1;
    17. };

    Tính giai thừa.
    C++ Code:
    1. template<int number, bool done = (number < 2)>
    2. struct Factorial
    3. {
    4.     static long long const value  = Factorial<number - 1>::value * number;
    5. };
    6. template<int number>
    7. struct Factorial<number, true>
    8. {
    9.     static long long const value = 1;
    10. };

    Fibonacci
    C++ Code:
    1. template<int number, bool done = (N < 2)>
    2. struct Fibonacci
    3. {
    4.     static  long long const value  =Fibonacci<number - 1>::value + Fibonacci<number - 2>::value + 1;
    5. };
    6. template<int number>
    7. struct Fibonacci<number, true>
    8. {
    9.     static  long long const value  =number;
    10. };

    Và cuối cùng, tèn tén ten... cuối cùng cũng đến.
    Kiểm tra số nguyên tố. Chưa xét các số đặt biệt từ 0...3. Cái struct này toi ở số nguyên số 1511, Visual studio 11 đạt giới hạn số phiên bản của struct , không thể kiểm tra xa hơn đc.

    Nhưng với các số không phải nguyên số vd: 22222263 thì vô tư. :-| Code cái này xong, bây giò đọc lại còn thấy ong ong cái đầu. hjx..
    C++ Code:
    1. template <long number, long i = 5, long j = 2, int mod = number % i, bool bDone = (i >= number - 1)>
    2. struct Primes
    3. {
    4.     static bool const value = Primes<number, i + j, 6 - j>::value;
    5. };
    6.  
    7. template <long number, long i, long j, int mod>
    8. struct Primes<number, i, j, mod, true>
    9. {
    10.     static bool const value = (number % 2 != 0 && number % 3 != 0);
    11. };
    12.  
    13. template <long number, long i, long j>
    14. struct Primes<number, i, j, 0, false>
    15. {
    16.     static bool const value = false;
    17. };

    Cái giới hạn của Metaprogramming template là không thể dùng khi run-time đc và số lượng tối đa "phiên bản" của struct có thể tạo ra. Các bác nào biết cách khắc phục cũng như sửa đổi code kiểm tra số nguyên tố thì làm ơn comment.
    Đã được chỉnh sửa lần cuối bởi doicanhden : 16-04-2012 lúc 03:24 AM.
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  2. #2
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Bài tính số mũ nên dùng giải thuật kiểu nhị phân hơn (a^n = (a^n/2)*(a^n/2)), như vậy sẽ làm giảm số lần tạo struct, giảm thời gian biên dịch.
    Về cái số struct tối đa, vs thế nào không rõ nhưng gcc thì cho phép tùy chọn giới hạn qua tùy chọn ftemplate-depth

    C++11 có thêm một thứ có công dụng tương tự nhưng đơn giản hơn nhiều là constexpr, tìm hiểu thử xem.

  3. #3
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Bài tính số mũ nên dùng giải thuật kiểu nhị phân hơn (a^n = (a^n/2)*(a^n/2)), như vậy sẽ làm giảm số lần tạo struct, giảm thời gian biên dịch.
    Về cái số struct tối đa, vs thế nào không rõ nhưng gcc thì cho phép tùy chọn giới hạn qua tùy chọn ftemplate-depth

    C++11 có thêm một thứ có công dụng tương tự nhưng đơn giản hơn nhiều là constexpr, tìm hiểu thử xem.
    Thg vs của tôi nó ko hiểu constexpr, chẳng lẽ vs11 lại không support C++11? Hay phải điều chỉnh gì?
    http://www.cprogramming.com/c++11/c++11-compile-time-processing-with-constexpr.html
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

Các đề tài tương tự

  1. lỗi error LNK2019: unresolved external symbol _main referenced khi dùng template<class T>
    Gửi bởi security_216 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 02-11-2013, 01:45 PM
  2. Lỗi LINK : fatal error LNK1000: Internal error during IncrBuildImage của VS2008?
    Gửi bởi nguyenquoc trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 3
    Bài viết cuối: 05-08-2011, 06:08 PM
  3. Error 1 fatal error LNK1000: Internal error during IncrBuildImage?
    Gửi bởi nthung trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 07-11-2010, 09:22 PM
  4. lỗi LINK : fatal error LNK1000: Internal error during IncrBuildImage
    Gửi bởi quicksilver89 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 06-11-2010, 12:50 AM
  5. Error 31 fatal error LNK1104: cannot open file
    Gửi bởi duytuyen26 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 14-09-2010, 10:15 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn