Tag: 参数传递

数组大小不正确

#include void Heapify(int num[], int start, int end) { int root = start; while(root*2+1<=end) { // at least one child exists int swap = root; int lchild = root*2+1; int rchild = root*2+2; if(num[swap]<num[lchild]){ swap = lchild; } if(rchild<=end && num[swap]=0){ Heapify(num,start, end); if(start==0) break; start= start-1; } } void heapsort(int num[]) { int length=sizeof(num)/sizeof(num[0]); […]

gcc中的运行时参数(反向va_args / varargs)

我正在尝试对我正在研究的微控制器的解释器进行一些改进。 为了执行内置函数,我目前有这样的东西(虽然有点快): function executeBuiltin(functionName, functionArgs) { if (functionName==”foo”) foo(getIntFromArg(functionArgs[0])); if (functionName==”bar”) bar(getIntFromArg(functionArgs[0]),getBoolFromArg(functionArgs[1]),getFloatFromArg(functionArgs[2])); if (functionName==”baz”) baz(); … } 但它适用于资源非常有限的嵌入式设备(ARM),我需要大幅减少代码大小。 我想做的是有一个通用函数来调用具有不同参数的其他函数 – 如下所示: function executeBuiltin(functionName, functionArgs) { functionData = fast_lookup(functionName); call_with_args(functionData.functionPointer, functionData.functionArgumentTypes, functionArgs); } 所以我希望能够调用标准的C函数并将其传递给它所需的任何参数(可能都是不同的类型)。 为此,我需要一个call_with_args函数。 我想避免重写每个函数来采取argc + argv。 理想情况下,每个被调用的函数都是完全标准的C函数。 这里有一个关于这个问题的讨论 – 但自1993年撰写该帖以来,有什么变化吗? 特别是当我在ARM上运行时,参数位于寄存器而不是堆栈中。 即使它不在标准C中,是否有任何GCC具体可以完成? 更新:看起来尽管根据规范行为是“未定义的”,看起来因为C调用的方式工作,你可以传递更多的参数到一个函数而不是它期望的一切都很好,所以你可以解压缩所有将参数放入uint32s数组中,然后可以将每个uint32传递给该函数。 这使得为​​调用编写“漂亮”代码变得更加容易,并且它似乎运行得很好(在32位平台上)。 唯一的问题似乎是传递64位数字并编译为64位x86,因为在这种情况下它似乎做了一些特别奇怪的事情。

为什么不需要将参数传递给qsort比较器函数?

以下代码取自此处 。 * qsort example */ #include #include int values[] = { 40, 10, 100, 90, 20, 25 }; int compare (const void * a, const void * b) { return ( *(int*)a – *(int*)b ); } int main () { int n; qsort (values, 6, sizeof(int), compare); for (n=0; n<6; n++) printf ("%d ",values[n]); […]

获取错误Xlib:显示“:24.0”时缺少扩展名“RANDR”。 GTK

我收到这个错误,不知道为什么……请看看我的按钮数组,也许我搞砸了那里,我不确定…我得到的错误是: Xlib: extension “RANDR” missing on display “:24.0”. 之后没有任何事情发生,这意味着我的计划根本没有运行…. #include /* Our new improved callback. The data passed to this function * is printed to stdout. */ static void callback (GtkWidget *widget, gpointer data) { system ((gchar *) data); } /* another callback */ static gboolean delete_event (GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_main_quit […]

在C中传递变量参数

有人知道经典C中如何传递变量参数吗? 我今天做了一些调试,大多数常规参数都是通过堆栈传递的。 但是,似乎这不适用于变量参数。 这些参数是否存储在其他地方,如常量字符串? 提前致谢!

传递具有未确定数量的参数的函数,并使用可变参数调用它

我想创建一个函数“lazy”,它接受一个具有未确定数量的参数作为参数的函数。 我需要什么类型或必须完成哪些演员表? 然后我想在函数“evaluate”中执行该事情。 然后我如何将之前传递的参数传递给传递函数指针的“lazy”函数? 一些代码来说明我的问题: char *function_I_want_to_call(void *foo, type bar, …); // the arguments are unknown to lazy() and evaluate() typedef struct { ??? func; va_list args; } lazy_fcall; void lazy(lazy_fcall *result, ??? func, …) { // which type do I need here? va_start(result->_args, fund); result->func = func; } void *evaluate(lazy_fcall *to_evaluate) { return to_evaluate->func(expand_args(to_evaluate->args)); […]

理解main的一个不常见的参数

在大学编程竞赛中提出了以下问题。 我们被要求猜测输出和/或解释它的工作原理。 不用说,我们都没有成功。 main(_){write(read(0,&_,1)&&main());} 一些简短的谷歌搜索引导我到这个确切的问题,在codegolf.stackexchange.com中codegolf.stackexchange.com : https://codegolf.stackexchange.com/a/1336/4085 在那里,它解释了它的作用: Reverse stdin and place on stdout ,但不是如何 。 我也在这个问题上找到了一些帮助: 主要的三个参数,以及其他混淆的技巧,但它仍然没有解释main(_) , &_和&&main()工作。 我的问题是,这些语法如何工作? 它们是我应该知道的东西,因为它们仍然相关吗? 如果不是直接的答案,我会感激任何指针(资源链接等)。

x86调用约定:堆栈传递的参数应该是只读的吗?

似乎最先进的编译器将堆栈传递的参数视为只读。 请注意,在x86调用约定中,调用者将参数压入堆栈,并且被调用者使用堆栈中的参数。 例如,以下C代码: extern int goo(int *x); int foo(int x, int y) { goo(&x); return x; } 由OS X 10.10中的clang -O3 -c gc -S -m32编译成: .section __TEXT,__text,regular,pure_instructions .macosx_version_min 10, 10 .globl _foo .align 4, 0x90 _foo: ## @foo ## BB#0: pushl %ebp movl %esp, %ebp subl $8, %esp movl 8(%ebp), %eax movl %eax, -4(%ebp) leal […]

无法使用变量参数实现函数

我试图用变量参数实现函数,但是将垃圾值作为输出。我在尝试自己实现之前已经参考过这篇文章 。可以任何人帮我解决这段代码,因为我无法理解这段代码中的错误。 /* va_arg example */ #include /* printf */ int FindMax (int n, …) { int i,val,largest,*p; p=&n; p+=sizeof(int); largest=*p; for (i=1;ival)?largest:val; } return largest; } int main () { int m; m= FindMax (7,702,422,631,834,892,104,772); printf (“The largest value is: %d\n”,m); return 0; }

使用system命令传递参数

我有一个可执行程序,可以运行在网络中的几个PC中。 首先它获得主机名(pc-001 .. pc-013等)。 然后我需要根据其主机名在偶数PC和(server2)上安装一个网络驱动器(server1)。 我的问题是我使用系统调用来运行dos命令’net use’ system (“net use x: \\\\server1\\shares /user:username pass”); 如何将变量传递给用户名? username是我知道其值的主机名,所有计算机的pass都相同。