天道酬勤,学无止境

c

MPI_Gatherv: Garbage values received in root's array

问题 我正在尝试在C中实现MPI_Gatherv函数。 根据我的程序,包括 root 在内的每个进程都应该创建一个大小等于 ( process' rank + 1 ) 的本地数组,它将在所有单元格中保持进程的排名。 然后将这个本地数组收集到根的 rcv_array 中。 不知何故,我得到了垃圾值。 有人可以告诉我我做错了什么吗? 我也是 MPI 的新手,很难理解 MPI_Gatherv 的disp和rcv_count 。 我的代码: #include<stdio.h> #include<mpi.h> #include<stdlib.h> int sum(int); int main(int argc, char **argv){ int proc_count, proc_rank, root = 0; int *localdata = NULL; int *rcv_array = NULL; int *disp = NULL; int *rcv_count = NULL; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &proc_count); MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank); if(proc_rank == root){ rcv_array = malloc((sum

2022-07-11 09:57:46    分类:技术分享    c   arrays   mpi

Create dual-stack socket on all loopback interfaces on Windows

问题 我试图在 Windows 7 上创建一个双栈套接字,用于监听 127.0.0.1 和 ::1 接口。 我不想听所有接口(0.0.0.0),只是环回接口。 对于双栈​​套接字,我发现我需要禁用 IPV6_V6ONLY 选项。 我创建了一个示例应用程序,它就是这样做的(见下文)。 当应用程序运行时, netstat -an给我以下输出: TCP 0.0.0.0:27015 0.0.0.0:0 LISTENING TCP [::1]:27015 [::]:0 LISTENING 在 ::1 上使用 putty 连接时,一切正常。 但是,当我尝试连接到 127.0.0.1 时,我得到“连接被拒绝”。 在禁用 V6ONLY 选项的“::”IPv6 地址上创建套接字时,我能够按预期连接 IPv4 和 IPv6。 那么,如何创建一个同时侦听 IPv4 和 IPv6 环回接口的套接字? 我用于测试的示例应用程序,改编自这里: #include "stdafx.h" #undef UNICODE #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <stdlib.h> #include <stdio.h> // Need to link

2022-07-11 09:50:59    分类:技术分享    c   sockets   winapi   ipv6

Failure while unicast data from kernel to user space via netlink

问题 我是内核开发的新手,并且在通过 netlink 套接字将数据从内核空间投射到用户空间时遇到问题。 send_nat()函数将从内核模块调用以将用户定义的结构 nat_mntr写入 netlink 套接字。 但是即使我在cfg中尝试了不同的配置, nlmsg_unicast()也一直失败。 请帮助我找出我的代码中有什么问题。 用户定义的.c int no_data_request = 1; EXPORT_SYMBOL(no_data_request); int request_pid = 0; // PID of requesting process EXPORT_SYMBOL(request_pid); void send_nat(struct sock *nl_sk, struct nat_mntr *nat_data, int pid, int group, gfp_t flags, int *sock_closed){ struct nlmsghdr *nlh; struct sk_buff *skb_out; int msg_size; int res = 200; #define MYPROTO 31 printk(KERN_DEBUG "%s: Entered \n", __FUNCTION__); if ( nat_data == NULL ){ printk

2022-07-11 09:46:39    分类:技术分享    c   module   linux-kernel   netlink

In C on linux how would you implement cp

问题 我在谷歌代码上发现了超过 50 行的代码,这对于我正在尝试做的事情完全没有必要。 我想用 C 做一个非常简单的cp实现。 这样我就可以使用缓冲区大小并查看它如何影响性能。 我只想使用像read()和write()这样的 Linux API 调用,但我没有运气。 我想要一个定义为特定大小的缓冲区,以便可以将 file1 中的数据读入缓冲区,然后写入 file2 并继续直到 file1 达到 EOF。 这是我尝试过的,但它没有做任何事情 #include <stdio.h> #include <sys/types.h> #define BUFSIZE 1024 int main(int argc, char* argv[]){ FILE fp1, fp2; char buf[1024]; int pos; fp1 = open(argv[1], "r"); fp2 = open(argv[2], "w"); while((pos=read(fp1, &buf, 1024)) != 0) { write(fp2, &buf, 1024); } return 0; } 它的工作方式是./mycopy file1.txt file2.txt 回答1 这段代码有一个重要的问题,即不管你读了多少字节,你总是写1024字节。 还: 您不检查命令行参数的数量。 您不检查源文件是否存在

2022-07-11 09:46:32    分类:技术分享    c   linux   copy

MPI_Gatherv is not collecting data correctly

问题 我正在尝试使用MPI_Gatherv收集不同大小的数组,但由于某种原因,它只收集第一个处理器中的第一个对象。 当我执行上述 for 循环时,我从 xPos 和 yPos 获得正确的值,但是当我将数据收集到 xFinal 和 yFinal 数组并打印出值时,我只得到第一个 x 和 y。 所以基本上第一个对象的 (x,y) 为 (0,0) 并且我有 10 个对象,并且所有对象仅在它应该引用的实际对象具有不同 (x, y) 以防万一,counts[rank] 和 displs 绝对是正确的,因为我以前用它们来 scatterv。 我是否错误地使用了gatherrv? 还是我打印不正确? for ( a = 0; a < size; a++) { if (rank == a) { for ( i = 0 ; i < counts[rank]; i++) { printf("from procs %d: %lE %lE\n", rank, xPos[i], yPos[i]); } } } MPI_Gatherv(&xPos, counts[rank], MPI_DOUBLE, &xFinal, counts, displs, MPI_DOUBLE,0, MPI_COMM_WORLD); MPI_Gatherv(&yPos, counts[rank], MPI_DOUBLE,

2022-07-11 09:46:28    分类:技术分享    c   parallel-processing   mpi   writetofile

gcc gives error while using fmod()

问题 fmod 的示例代码: #include <stdio.h> #include <math.h> int main(void) { double x = 0.14527, y = 3.14159; printf("fmod(x, y) = %.6lf\n", fmod(x, y)); return 0; } 编译: $ gcc main.c -o main 我明白了 /tmp/ccztJO01.o:在函数“主”中: main.c:(.text+0x4d): 未定义对“fmod”的引用 collect2: ld 返回 1 个退出状态 然后我在谷歌上找到了这个: $ gcc -lm main.c -o main 我为什么要使用-lm ,它到底是什么? 从哪里可以得到更多关于 gcc 的详细信息? 回答1 回答2 当我输入gcc -lm main.c -o main时,仍然出现链接器错误。 我需要编写gcc main.c -lm -o main才能正常工作。 如果它以另一种方式为您工作,那有点奇怪。 我知道链接器会找到在 main.c 中声明的符号(即double fmod(double,double) ),但只有在稍后找到它的定义时才解决它(即在libm.a中)。 长话短说,图书馆必须(至少一次)放置在使用它们的地方的“右侧”。 回答3 抱怨的不是编译器,而是链接器ld 。

2022-07-11 09:45:24    分类:技术分享    c   gcc   ld   modulo   libm

Rename a list with value of another one

问题 我尝试实现一个用 C 语言编写的程序,其中我有两个链表,我需要创建第三个链表,其中第一个链表的所有值最终根据它们的顺序重命名为第二个链表的值. 更新的第三个列表中的任何值都不应该重复,它应该返回错误。 查看下面给出的示例以了解该程序的工作原理: 例 1 A = [a, b, c, d] B = [e, f] 第三个将是: C = [e, f, c, d] 例 2 A = [a, b, c, d] B = [a, e] 第三个将是: C = [a, e, c, d] 例 3 A = [a, b, c, d] B = [c, d] 这应该返回一个错误,因为 C 将 C = [c, d c, d] 但它不能有重复的值。 例 4 A = [a, b, c, d] B = [b, a] 这不应该返回任何错误,因为 C 将 C = [b, a, c, d] (没有重复值,列表 A 的前两个元素将使用列表 B 的前两个元素重命名)。 您可以在下面找到我的想法,但我对这个问题的不同解决方案感兴趣 T //Temp C //Result for (int i = 0; i < |A|; i++) { if(i > length of B && T is not empty) { //One or more elements were not been renamed return ERROR

2022-07-11 09:44:56    分类:技术分享    c   linked-list   rename

Very large array - C array vs C++ array. Visual Studio - exceeds max (268435456)

问题 我正在尝试创建一个非常大的数组,然后我得到以下错误。 char largearray[1744830451]; 警告 LNK4084:总图像大小 1750372352 超过最大值(268435456); 图像可能无法运行 有人告诉我可以使用 C-array 而不是 C++ 。 我不确定我是否完全理解我朋友的反应。 我目前正在使用 Visual Studio 6.0 C++ 。 我是否需要让另一个编译器直接执行 C 语言,或者它是一种如何声明需要更改的数组的方法? 如果我需要更改编译器,有人有建议吗? 回答1 char array[size]语法意味着该数组将在已编译程序的数据部分中创建,而不是在运行时分配。 Win32 PE 代码不能超过 256MB(根据链接器的错误消息),但您声明的数组长度为 1.6GB。 如果你想要一个 1.6GB 的数组,请使用malloc (不要忘记调用free !) ...但是你到底为什么要运行 VC6? 回答2 如果您预先定义了大小,那么您将被限制为堆栈大小(堆栈大小较小但速度更快),因此最好动态定义大小,这意味着您的数据存储在堆中(堆大小较大但有点比堆栈慢)。 看看 http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html,它解释了堆栈和堆的区别。

2022-07-11 09:44:31    分类:技术分享    c++   c   arrays   visual-studio-6

Programatically compile the C code in c# windpws forms using CodeDom?

问题 我正在制作一个 C 编译器,我必须知道是否可以使用 CodeDom 在 c# 中编译 C 代码,目前我正在使用以下代码来编译 c# windows 形式的 C# 代码? 有没有简单的方法来编译 C 语言的代码? using System.CodeDom.Compiler; using System.Diagnostics; using Microsoft.CSharp; private void button1_Click(object sender, System.EventArgs e) { CSharpCodeProvider codeProvider = new CSharpCodeProvider(); ICodeCompiler icc = codeProvider.CreateCompiler(); string Output = "Out.exe"; Button ButtonObject = (Button)sender; textBox2.Text = ""; System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters(); //Make sure we generate an EXE, not a DLL parameters

2022-07-11 09:31:33    分类:技术分享    c#   c   winforms

Change Content-type using libcurl

问题 我有这个代码: #include <curl/curl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_URL, "localhost/rest-v1/devices/did1/tasks"); curl_easy_setopt(curl,CURLOPT_PORT,22080); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "{\"hello\" : \"darkness\"}"); res = curl_easy_perform(curl); } curl_easy_cleanup(curl); return 0; } 当我运行它时,我在控制台上得到这个打印: * Trying 127.0.0.1... * TCP_NODELAY set * Connected to localhost (127.0.0.1) port 22080 (#0) > POST

2022-05-17 05:31:32    分类:技术分享    c   http   post   http-headers   libcurl