Question

Je travaille sur une application p2p qui utilise des arbres de hachage.

Je suis en train d'écrire les fonctions de construction d'arbre de hachage (publ / 4 et publ_top / 4), mais je ne vois pas comment résoudre publ_top / 4.

J'essaie de construire un arbre avec publ / 1:

nivd:publ("file.txt").

prints hashes...

** exception error: no match of right hand side value [67324168]
     in function  nivd:publ_top/4
     in call from nivd:publ/1

Le code en question est ici:

http://github.com/AndreasBWagner/nivoa/blob/886c624c116c33cc821b15d371d1090d3658f961 /nivd.erl

Où pensez-vous que le problème est?

Merci, Andreas

Était-ce utile?

La solution

En regardant votre code, je vois un problème qui générerait cette erreur particulière d'exception

publ_top(_,[],Accumulated,Level) ->
    %% Go through the accumulated list of hashes from the prior level
    publ_top(string:len(Accumulated),Accumulated,[],Level+1);

publ_top(FullLevelLen,RestofLevel,Accumulated,Level) ->
  case FullLevelLen =:= 1 of
    false -> [F,S|T]=RestofLevel,
      io:format("~w---~w~n",[F,S]),
      publ_top(FullLevelLen,T,lists:append(Accumulated,[erlang:phash2(string:concat([F],[S]))]),Level);
    true -> done
  end.

Dans la première déclaration de fonction match contre la liste vide. Dans la deuxième déclaration vous match contre une liste de longueur (au moins) 2 ([F,S|T]). Qu'est-ce qui se passe quand FullLevelLen est différent de 1 et RestOfLevel est une liste de longueur 1? . (Astuce: Vous obtiendrez l'erreur ci-dessus)

L'erreur serait plus facile à repérer si vous le feriez match de motif sur les arguments de la fonction, peut-être quelque chose comme:

publ_top(_,[],Accumulated,Level) ->
    %% Go through the accumulated list of hashes from the prior level
    publ_top(string:len(Accumulated),Accumulated,[],Level+1);

publ_top(1, _, _, _) ->
    done;

publ_top(_, [F,S|T], Accumulated, Level) ->
    io:format("~w---~w~n",[F,S]),
    publ_top(FullLevelLen,T,lists:append(Accumulated,[erlang:phash2(string:concat([F],[S]))]),Level);

%% Missing case:
% publ_top(_, [H], Accumulated, Level) ->
%     ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top