首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >传递多个参数

传递多个参数
EN

Stack Overflow用户
提问于 2012-08-28 14:38:54
回答 2查看 352关注 0票数 2

我正在尝试将现有的C函数转换为Erlang,但我在理解它如何工作时遇到了一些问题。假设我在C中有以下函数:

代码语言:javascript
运行
复制
    void(int *x,int *y,int z,int a)
    {
     if(z<a)
      {
     *x = z + a;
     *y = z - a;
      }
     }

我该如何在Erlang中将其作为函数模块来编写呢?我知道通常你写你的函数,它会返回一个操作。但是,如果我必须对多个变量进行计算呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-28 15:02:12

您可以返回如下元组:{X,Y}

下面是一个函数,它将作为输入给出的两个值加倍:

代码语言:javascript
运行
复制
-module(my_module).
-export([doubleus/2]).

doubleus(X, Y) ->
    {X*2, Y*2}.

在shell中:

代码语言:javascript
运行
复制
1> c(my_module).
{ok, my_module}
2> {A, B} = my_module:doubleus(3,4).
{6, 8}
票数 8
EN

Stack Overflow用户

发布于 2012-08-28 16:09:06

使用指针操作-意味着您可能会更改内存中某些位置的状态(对于顺序流来说,这并不是那么糟糕)。

但在并发环境中,这可能会间接导致指向该位置的每个进程发生不可预测的变化(特别是在竞态条件下)。

这就是为什么Java中有这么多面向并发的机制。

但这不是Erlang的方式。一般来说,Erlang中没有指针,也没有共享内存。

例如,您可以在元组{ X, Y, Z, A }中存储状态,并将其从一个函数传递到另一个函数。有时你的函数会返回新的状态元组。

在上面的上下文中,您的函数可能如下所示:

代码语言:javascript
运行
复制
-module( my_module ).
-export( [ f/1 ] ).

f( { _X, _Y, Z, A } ) when Z < A -> { Z + A, Z - A, Z, A };
%% othervise - don't change the state
f( State ) -> State.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12153967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档