2010-12-06 4 views
3

J'ai des problèmes quand j'ai des entiers et des nombres flottants dans mes messages de forme et les reçois dans mon fichier ebin où j'ai des fichiers de poutre. J'espère que quelqu'un peut m'aider.piaulements et fichiers erlang beam dans ebin

npower.yaws

<erl> 
kv(K,L) -> 
{value, {K, V}} = lists:keysearch(K,1,L), V.   
out(A) -> 
L = yaws_api:parse_post(A), 
N = kv("number", L), 
    npower62:math3(N). 
    </erl> 

npower62.erl compilées dans un fichier de faisceau
de -module (npower62).
-export ([math3/1]).

math3 ([N]) ->
Number = N,
Nsquare = Nombre * Nombre,
{html, io_lib: Format ("carré de ~ c = ~ w", [N, Nsquare ])}.

me donne carré de 3 = 2601
au lieu de
carré de 3 = 9
j'ai essayé d'utiliser Number = list_to_integer (atom_to_list (N)) (travail ne marche pas)
i ont essayé de utiliser Number = list_to_float (atom_to_list (N)) (travail ne marche pas)
j'ai essayé d'utiliser Number = list_to_integer (N) (ne marche pas travail)

Répondre

0

d'abord, vous pouvez affiner la portée que votre math3/1 fonction d'un cappts:

-module(npower62). 
-export([math3/1]). 

math3(N) when is_number(N) -> 
    N2 = N * N, 
    io_lib:format("square of ~p = ~p", [N, N2]). 

Notez que nous avons réécrit la fonction un peu. Il n'accepte plus une liste, mais n'importe quel nombre, N seulement. En outre, la chaîne de format que vous avez passée à io_lib:format/2 était totalement désactivée, voir man -erl io.

Nous pouvons maintenant attaquer le code pian:

<erl> 
    kv(K,L) -> 
     proplists:get_value(K, L, none). 

    out(A) -> 
    L = yaws_api:parse_post(A), 
    N = kv("number", L), 
    none =/= N, %% Assert we actually got a value from the kv lookup 

    %% Insert type mangling of N here so N is converted into an Integer I 
    %% perhaps I = list_to_integer(N) will do. I don't know what type parse_post/1 
    %% returns. 

    {html, npower62:math3(I)} 
</erl> 

Notez que votre fonction kv/2 peut être écrit avec une fonction de recherche de proplists. Dans votre variante du code, retour de kv/2 était la valeur {value, {K, V}} qui jamais être correct dans votre version de math3/1. proplists:get_value/3 renvoie uniquement la pièce V. Notez également que j'ai hissé {html, ...} à ce niveau. C'est un mauvais style de laisser npower62 le gérer car il ne devrait rien savoir du fait qu'il est appelé de l'intérieur du pian.

Mon devinez est que vous devez appeler list_to_integer (N). Le moyen le plus simple de comprendre cela est d'utiliser un appel à error_logger:info_report([{v, N}]) et de rechercher le RAPPORT INFO dans le shell ou dans le fichier journal et de voir le terme N. TL; DR: Le problème est que vos valeurs ne correspondent pas partout. Vous êtes donc confronté à de nombreux accidents de la fonction que le pian attrape, enregistre et survit. Cela vous embrouille alors sans fin.

De même, testez la fonction npower62:math3/1 depuis le shell erl. De cette façon, vous auriez trouvé que c'était faux dès le départ, réduisant votre confusion.

+0

A travaillé super !!! Vous donnez de bonnes réponses pratiques! Mais Que faire si le nombre entré n'est pas un nombre entier? Et si c'est un flotteur? par exemple. 1.2? Comment faire une situation où nous voulons gérer un entier OU un flottant (dans notre fichier npower.yaws? – user532826

+0

J'utiliserais probablement 'string: to_float' et' string: to_integer' L'astuce consiste à tester l'entier en premier et alors essayez le flotteur s'il y a quelque chose qui n'a pas été analysé –

+0

@IGIVECRAPANSWERS: 'none =/= N' ne va pas affirmer que vous avez obtenu walue.' false none =: = N' ou 'true = none =/= N' –