¿Qué hace el & # 8220; desajuste de cabeza & # 8221; error de compilación significa?

StackOverflow https://stackoverflow.com/questions/1802680

  •  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".
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top