标签: argument-passing

在 C 和 C++ 中回调具有先前未知参数的函数

我正在考虑做一个take_timing函数,它将获取传递给它的任何函数的时间。对于任何函数来说,这都意味着调用者不知道该回调所采用的参数。它也需要回调的参数。但由于它不知道如何调用它,因此需要另一个回调函数,即回调的调用者,由函数用户编写。存根将是这样的:

void take_timing(
    void (*callback)(),
    void (*caller(void (*callback)(),void* args_struct),
    void* args_struct
)
{
    // Start timer

    caller(callback,args_struct);

    // Stop timer, read timings, record...
}

void some_caller(void (*callback)(),void* args_struct)
{
    // Cast "callback" to function signature
    // Cast args_struct to some struct with args
    // Call the callback with correct args signature
}
Run Code Online (Sandbox Code Playgroud)

我的问题来了:

  1. 是否可以?
  2. 它可以使用变量参数列表来使其变得简单吗?如何?我对此很无助...
  3. 有更好的方法吗?take_timing还是针对每个具体情况都做一个更好?
  4. 是否有与 C++ 一起使用的 OOP 设计模式?

我自己放弃了这个,但出于好奇把它放在这里,也许是一些非常有用的见解。

c c++ design-patterns callback argument-passing

1
推荐指数
1
解决办法
1542
查看次数

使用Tap Gesture识别器传递参数

之前曾以某种形式提出过这个问题,但我找不到适合我情况的答案.

简而言之:我正在为我的应用程序构建一个库模块.它由几个部分组成,每个部分都有许多缩略图.基本原则是图像查看器模块基于用户所在的部分以及他或她所使用的缩略图来模态地呈现和呈现.似乎很简单; 我需要的是在初始化图像查看器时传递两个int变量(一个用于剖面,一个用于图像),并且一切都是hunky-dory.

问题是UITapGestureRecognizer无法直接调用方法.它使用选择器,通过它我无法传递参数,更不用说两个了.我要找的是这样的:

[thumbnail004 setUserInteractionEnabled:YES];
UITapGestureRecognizer *tap004 = [[UITapGestureRecognizer alloc] 
                       initWithTarget:self
                       action:@selector(imageTappedWithSectionNumber:6
                                                      andImageNumber:4)];
[thumbnail004 addGestureRecognizer:tap004];
Run Code Online (Sandbox Code Playgroud)

有没有办法在使用UITapGestureRecognizer时直接使用参数调用方法?

如果没有,解决这个问题的一个明显方法是为每个图像点击创建单独的方法,如:

- (void) image1_1Tapped { 
  // View initialization by passing 1 and 1
  }
- (void) image1_2Tapped { 
  // View initialization by passing 1 and 2
  }
And so on...
Run Code Online (Sandbox Code Playgroud)

这是可能的,因为图像库不是动态的,但是,它将是世界上最丑陋的代码,我想不惜一切代价避免使用它.

必须有一个方法来做一个干净优雅的代码...!

进一步参考:1.我不使用IB; 我以编程方式做所有事情.传递一个论点是不够的; 我真的需要通过两个.

iphone argument-passing ios uitapgesturerecognizer

1
推荐指数
1
解决办法
3942
查看次数

Erlang:将记录传递给函数?

以下代码在编译时会发出警告:

23> c(passing_records).                                              
passing_records.erl:8: Warning: wrong number of arguments in format call
{ok,passing_records}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试运行它时,尝试将变量传递给名为 的记录时出现此错误pass

22> passing_records:record_passing([#pass{arg1=2,name="x",to_go=5}]).
* 1: record pass undefined
Run Code Online (Sandbox Code Playgroud)

代码如下:

-module(passing_records).
-export([record_passing/1]).
-record(pass, {arg1 ,
                name="",
                to_go=0}).  

record_passing( #pass{arg1 = ARG1, name = NAME, to_go = TO_GO}) ->
        io:format("~p ~p~n", [ARG1,NAME,TO_GO]).    
Run Code Online (Sandbox Code Playgroud)

erlang function record argument-passing

1
推荐指数
1
解决办法
1705
查看次数

函数参数求值顺序

我对调用 C++ 函数时函数参数的计算顺序感到困惑。我可能解释错了,所以请解释是否是这种情况。

例如,Charles Petzold 的传奇著作“Programming Windows”包含如下代码:

// hdc = handle to device context
// x, y = coordinates of where to output text
char szBuffer[64];
TextOut(hdc, x, y, szBuffer, snprintf(szBuffer, 64, "My text goes here"));
Run Code Online (Sandbox Code Playgroud)

现在,最后一个参数是

snprintf(szBuffer, 64, "My text goes here")
Run Code Online (Sandbox Code Playgroud)

它返回写入 char[] szBuffer 的字符数。它还将文本“My text go here”写入 char[] szBuffer。第四个参数是 szBuffer,它包含要写入的文本。但是,我们可以看到 szBuffer 填充在第五个参数中,告诉我们不知何故是表达式

// argument 5
snprintf(szBuffer, 64, "My text goes here")
Run Code Online (Sandbox Code Playgroud)

之前评估过

// argument 4
szBuffer
Run Code Online (Sandbox Code Playgroud)

好的。总是这样吗?评估总是从右到左进行?查看默认调用约定__cdecl

__cdecl 调用约定的主要特点是:

参数从右向左传递,并放置在堆栈中。

堆栈清理由调用者执行。

函数名称通过在其前面加上下划线字符 '_' 来修饰。

(来源: …

c++ winapi calling-convention argument-passing

1
推荐指数
1
解决办法
949
查看次数

C++ - 将数组传递给方法

这是一个类似于我定义的函数:

void Function( BYTE *data );
Run Code Online (Sandbox Code Playgroud)

我想做的是这样的事情:

Function( new BYTE { 0x00, 0x00 } );
Run Code Online (Sandbox Code Playgroud)

c++ arrays argument-passing

0
推荐指数
2
解决办法
2681
查看次数

C可变范围特定问题

这是一个特定的场景,我很长一段时间都不清楚(在范围方面).

考虑代码

#include <stdio.h>


typedef struct _t_t{
    int x;
    int y;
} t_t;

typedef struct _s_t{
    int a;
    int b;
    t_t t;
}s_t;

void test(s_t & s){
    t_t x = {502, 100};
    s.t = x;
}


int main(){
    s_t s; 
    test(s);

    printf("value is %d, %d\n", s.t.x, s.t.y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是

value is 502, 100
Run Code Online (Sandbox Code Playgroud)

对我来说有点混乱的是以下几点.声明

t_t x
Run Code Online (Sandbox Code Playgroud)

在函数测试的范围内声明.所以从我读到的关于C编程的内容来看,它应该是垃圾范围之外的.然而它返回了正确的结果.是因为行上的"="st = x; 将x的值复制到st?

编辑 - -

经过一些实验

#include <stdio.h>


typedef struct _t_t{
    int x;
    int y;
} t_t;

typedef struct _s_t{ …
Run Code Online (Sandbox Code Playgroud)

c++ scope parameter-passing pass-by-reference argument-passing

0
推荐指数
2
解决办法
398
查看次数

我在c中以这种方式使用argc/argv有什么问题?

这有效:

int main( int argc, char *argv[])
{
....
gtk_init(&argc, &argv);
....
Run Code Online (Sandbox Code Playgroud)

但这不是:

int WINAPI WinMain (HINSTANCE p1, HINSTANCE p2, LPSTR argv, int argc) { 
....
gtk_init(&argc, &argv);
....
Run Code Online (Sandbox Code Playgroud)

有人能指出那里有什么问题吗?

c argument-passing winmain

0
推荐指数
1
解决办法
681
查看次数

0
推荐指数
1
解决办法
145
查看次数

为什么这个Perl函数似乎只处理它的一些参数?

为什么

my $i=0;
my @arr=();

sub readall {
    foreach (@_) {
        $arr[$i] = shift @_;
        $i++;
    }
}

readall(1, 2, 3, 4, 5);
print "@arr"
Run Code Online (Sandbox Code Playgroud)

my $i=0;
my @arr=();

sub readall {
    foreach (@_) {
        $arr[$i] = shift @_;
        print $arr[$i];
        $i++;
    }
}

readall(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

只打印三个参数readall

为什么这个函数看起来应该表现得一样,处理所有五个参数?

sub readall {
    foreach (@_) {
        print $_;
    }
}

readall(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

这也读取了所有五个(但确实按照不同的原则操作):

my @arr=();

sub readall {
    push(@arr, @_);
}

readall(1, 2, …
Run Code Online (Sandbox Code Playgroud)

perl arguments argument-passing

0
推荐指数
1
解决办法
100
查看次数

Python函数参数传递顺序

以下代码不正确:

def add(a, b, c):
    return a + b + c
args = (2, 3)

add(a = 1, *args)
TypeError: add() got multiple values for keyword argument 'a'
Run Code Online (Sandbox Code Playgroud)

我已经在python docs中看到了一些示例,但是我仍然不知道为什么会有错误,有人可以详细解释吗?

python argument-passing

0
推荐指数
1
解决办法
1606
查看次数