Pergunta

Estou tentando implementar uma função fatorial usando o modelo de agente com a língua.Meu objetivo é usar para criar ator para calcular cada parte sozinho e gerar um novo ator para fazer o próximo.Eu sou apenas um iniciante com D, então eu estou apenas aprendendo a usar a linguagem.Meu objetivo é expandir o factorial de implementação muito mais.Este é apenas um teste.

Aqui está o meu problema:Eu estou tentando implementar o fatorial utilizando a recursividade;o fato de que a função de criar um fato novo thread para o próximo número de uma linha, a menos que ele tenha alcançado a condição de base.

O meu código:

void fact(Tid tid)
{

        int fact = 1;
        receive
        (
        (int i)
        {
            if(i == 0)
            {
                writeln("End of recursion");
            }
            else
            {
                fact *= i;
                send(thisTid, i-1);
            }
        }
    );
    send(tid, fact);
}

void main()
{

        auto tid = spawn(&fact, thisTid);
        int x = 3;
        send(tid, x);
        auto fact = receiveOnly!(int);
        writeln(fact);
}

Eu nem sei se isso é possível, em qualquer caso, ele não funciona.Se eu tentar adicionar um spwn na verdade, a função retorna o seguinte erro:

src/main.d(62): Error: template std.concurrency.spawn does not match any function template declaration
/usr/include/x86_64-linux-gnu/dmd/phobos/std/concurrency.d(399): Error: template std.concurrency.spawn(T...) cannot deduce template function from argument types !()(int*,Tid)
src/main.d(63): Error: template std.concurrency.send does not match any function template declaration
/usr/include/x86_64-linux-gnu/dmd/phobos/std/concurrency.d(463): Error: template std.concurrency.send(T...) cannot deduce template function from argument types !()(_error_,int)

Assim, é possível fazer o que eu estou tentando fazer?Como?Se não, existe algum plano para fazer alguma coisa assim que possível?

Por favor, ajuda.

Foi útil?

Solução

Eu poderia ser a forma fora da base aqui, mas a partir dessa mensagem de erro ele olha para mim como dmd não está usando o fact o que você acha que ele está usando, em sua chamada para spawn.Você tem vários números inteiros chamado fact, e apesar de isso (obviamente cortada, pois não é de 400 linhas) exemplo nenhum deles entraria em conflito, o código completo o meu palpite é que um deles faz (porque &fact seria um int* se fact foi um int).

Tente renomear a função fatorial ou algo assim, e mudando o spawn chamada onde apropriado.Certifique-se de não alterar os números inteiros.

Outras dicas

Funciona bem para mim.O que DMD versão você está usando?Talvez tente atualizar para 2.059 se você já não estiver nele.

(Nota:Eu digo que funciona no que compila e executa.Ele não dá a resposta, porque escrever factreceive um número antes de retornar, então ele retorna apenas três.Você precisa ter o receive em um loop)

admin@poita ~% cat test.d
import std.stdio;
import std.concurrency;

void fact(Tid tid)
{
    int fact = 1;
    receive
    (
        (int i)
        {
            if(i == 0)
            {
                writeln("End of recursion");
            }
            else
            {
                fact *= i;
                send(thisTid, i-1);
            }
        }
    );
    send(tid, fact);
}

void main()
{
    auto tid = spawn(&fact, thisTid);
    int x = 3;
    send(tid, x);
    auto fact = receiveOnly!(int);
    writeln(fact);
}

admin@poita ~% dmd test.d
admin@poita ~% ./test
3
admin@poita ~%
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top