¿Qué hace el & # 8220; desajuste de cabeza & # 8221; error de compilación significa?
-
05-07-2019 - |
Pregunta
Intento escribir código para imprimir el carácter Z.
zzzzzzz
z
z
z
z
z
zzzzzzz
Pero cuando compilo este código, arroja
D:\erlang\graphics>erlc zeez2.erl
d:/erlang/graphics/zeez2.erl:19: head mismatch
d:/erlang/graphics/zeez2.erl:6: function zeez/3 undefined
No puedo solucionar este error. No encontré lo que estaba mal en mi poder.
¿Por favor uno me sugiere?
Gracias.
-module(zeez2).
-export([main/0]).
main() ->
L = 8,
zeez( false ,1, L). % line 6
zeez(true, M,M) ->
init:stop();
zeez(false, M, N) ->
io:format("~p~n", [zeez(z, N-M)] ),
zeez(M rem N =:= 0, M + 1, N );
zeez(true, M, N) ->
io:format("~p~n", [zeez(space, N-M)] ), % line 16
zeez(M rem N =:= 0, M + 1 , N );
zeez(space, M) ->
io:format("~p~n", ["-" ++ zeez(space, M-1)] );
zeez(space, 0) ->
"Z";
zeez(z, M) ->
io:format("~p~n", ["Z" ++ zeez(z, M-1)] );
zeez(z,0) ->
"Z".
Solución
el problema es que ha mezclado 2 funciones:
zeez / 2 y zeez / 3
Si termina la función zeez / 3 finalizándola con un punto y no con un punto y coma, debería compilar:
zeez(true, M, N) ->
io:format("~p~n", [zeez(space, N-M)] ), % line 16
zeez(M rem N =:= 0, M + 1 , N ); <-- should end with .
El mensaje de error significa, 'oye, estoy en zeez / 3 y has arrojado una cláusula de 2 arity, wtf?'
Otros consejos
Está intentando definir dos funciones, la primera con 3 parámetros (zeez / 3) y otra con 2 parámetros (zeez / 2). El error de falta de coincidencia del cabezal se debe a que la función zeez / 3 en la línea anterior debe terminarse con un '.'.
I.e. porque ha finalizado la función zeez / 3 anterior con un ';', espera que la siguiente declaración sea otra coincidencia para zeez / 3:
zeez(true, M, N) ->
io:format("~p~n", [zeez(space, N-M)] ), % line 16
zeez(M rem N =:= 0, M + 1 , N ).
zeez(space, M) ->
io:format("~p~n", ["-" ++ zeez(space, M-1)] );
También debe tener en cuenta que el compilador le dará advertencias sobre " ... la cláusula anterior en la línea xxx siempre coincide con " debido al ordenamiento de zees (espacio, 0) y zeez (espacio, M). Debería poner zees (espacio, 0) antes de zeez (espacio, M), porque es más específico.