Domanda

Sto lavorando su un'applicazione p2p che usa gli alberi di hash.

Le scrivo le funzioni di costruzione albero di hash (publ / 4 e publ_top / 4), ma non riesco a vedere come risolvere publ_top / 4.

cerco di costruire un albero con 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

Il codice in questione è qui:

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

Dove pensate che il problema è?

Grazie, Andreas

È stato utile?

Soluzione

Guardando il codice posso vedere una questione che avrebbe generato quel particolare errore di eccezione

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.

Nella prima dichiarazione di funzione si corrispondono contro la lista vuota. Nella seconda dichiarazione è partita con un elenco di lunghezza (almeno) 2 ([F,S|T]). Cosa succede quando FullLevelLen è diverso da 1 e RestOfLevel è una lista di lunghezza 1? . (Suggerimento: Si otterrà l'errore precedente)

L'errore sarebbe stato più facile da individuare se si farebbe corrispondenza modello sugli argomenti della funzione, forse qualcosa di simile a:

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) ->
%     ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top