Generowanie 10 liczb pierwszych w czasie kompilacji

0

Wbrew pozorom nie jest to takie proste zadanie, bo co bym nie zrobił to kompilator czepia się, że a to w funkcji constexpr daję std::cout czy czepia sie wskaźnika na tablicę:
main.cpp5: error: modification of ‘tab’ is not a constant-expression
Podobnie z std::array<int, 10>.
Próbowałem różnych sposobów i nie wiem co tu zrobić by zapamiętać te 10 liczb pierwszych w czasie kompilacji. Ktoś wie może co w poniższym kodzie zmodyfikować?

#include <stdio.h>
#include <iostream>
#include <assert.h>
#include <array>


constexpr bool generateFibonacciNumbers(int n, int expectedNum, int currNum, int tab[10])
{
    if(n < 2)
        n = 2;
    bool isDividerFound = false;
    for(int i=2; i*i <= n; ++i)
    {
        if(n%i == 0)
        {
            isDividerFound = true;
            break;
        }
    }
    
    if(!isDividerFound)
    {
        tab[currNum] = n;
        ++currNum;
    }
        
    if(currNum == expectedNum)
        return true;
        
    return generateFibonacciNumbers(n+1, expectedNum, currNum, tab);
}

int main()
{
    int tab[10];
    static_assert(generateFibonacciNumbers(0,10,0,tab), ""); //jak tak dajesz i ci sie skompiluje to masz pewność, że w czasie kompilacji sie te liczby wygenerowały
    std::cout << "First 10 numbers:" << std::endl;
    for(int i=0; i<10; ++i)
        std::cout << tab[i] << std::endl;

    return 0;
}
1

Jakie jest zadanie? Nie wiem kto pisał ten komentarz, ale jest w nim błąd. static_assert nie może mieć obserwowalnych efektów ubocznych

0

Zadanie to generowanie 10 liczb pierwszych w czasie kompilacji
A więc std::couta dać nie możemy by wypisac liczby na ekran no bo to w czasie runtimu sie robi, więc trzeba zapamiętać liczby w jakimś kontenerze, tablicy. I tu mam problem jak zapamiętać jak to sie nie kompiluje.

1

Możesz je po prostu zwrócić z funkcji.

template<int N = 10>
constexpr std::array<int, N> gen_fib()
{
	std::array<int, N> ret = {0, 1};
	for(size_t i = 2; i < N; i++) {
		ret[i] = ret[i-1] + ret[i-2];
	}
	return ret;
}

int main()
{
	constexpr auto arr = gen_fib<10>();
	constexpr array<int, 10> expected{0,1,1,2,3,5,8,13,21,34};
	static_assert(arr == expected);
	DBG_CONT(arr);
}

https://wandbox.org/permlink/7Gihxsw3pLVZPPUR

1

Zadanie jest głupie, bo po co pisać kod na liczenie czegoś, co dużo szybciej można wpisać ręcznie?
Co innego, gdy zbiór jest duży lub nie da się wszystkiego z pamięci wypisać.

constexpr Eratostenes sive

created by
MarekR22
1 year ago

1 użytkowników online, w tym zalogowanych: 0, gości: 1