天道酬勤,学无止境

c

Calling C printf from assembly

I would like to call the printf function from C with two integers. My format string is: LC0: db "odd bits: %d, even bits: %d", 10, 0 I have the integer ob and eb: ob: DD 0 eb: DD 0 and then I do at the end: push dword [ob] push dword [eb] push LC0 call printf add esp,8 However, this gives me the result Odd bits: [ob], Even bits: [ob, repeated] then gives me a segmentation fault. Am I calling the printf function wrong? EDIT: I added LC1 as db "even bits: %d", 10 0, then redid: push dword [ob] push LC0 call printf push dword [eb] push LC1 call printf add esp, 8 This gives me a REVERSED result

2022-01-25 05:42:19    分类:问答    c   nasm

多个逗号分隔值的 getopt 错误处理(getopt error handling for multiple comma separated values)

问题 如何验证从命令行接收到的逗号分隔值的多个组合的字符串变量用于getopt? case 'a' : flaga=1; alg = optarg; printf("you entered option -a \"%s\"\n", optarg); if(strcmp(alg,"lr") == 0 ) { ....//valid } else if(strcmp(alg,"lda") == 0 ) { ....//valid } else if(strcmp(alg,"knn") == 0 ) { ...//valid } """"" """" else { printf("wrong value entered for option -a \n"); exit(); } 选项 -a 可以接受这些值: "knn","lda","lr","kart","nb","svm" 。 如果用户只传递单个值,上面的代码可以完美地处理错误。 但是选项 -a 可以接受多个值以逗号分隔, Eg : -a knn,lr,lda 用户可以以任何值的任意组合传递这些值! Eg : -a knn,lr,lda Eg : -a knn,lda.lr Eg : -a lda,lr 如何检查用户是否为选项 -a 传递了有效值? 我编写的上述代码包含在 switch case 中,如果仅传递选项 -a 的单个值

2022-01-25 05:41:48    分类:技术分享    c   validation   command-line   comma   getopt

如何在字符串中显示字符 \t?(how can I display the characters \t in a string?)

问题 晚上好,将“\ t”显示为文字值而不是文本格式的正确键序列是什么? 我的代码如下... 谢谢一堆。 main() { int c; while ((c = getchar()) != EOF) { if (c == ' ') c = "\t"; putchar(c); } } 所以澄清一下,我不想有一个选项卡式字符串,而是显示字符 \t。 回答1 您可以使用另一个反斜杠来转义反斜杠,即"\\t" 。 顺便说一句,您正试图将一个字符串(即多个字符)分配给一个int 。 这没有意义! 回答2 你真的不想要这样的东西吗? if (c == '\t') { printf("\\t"); } 回答3 转义反斜杠,因此"\\t" 。 回答4 要在字面上解释字符/字符串常量中的反斜杠,您必须使用另一个反斜杠对其进行转义。 此外,一次调用putchar()是不够的,因为您必须打印两个字符。 有了这个,你得到: putchar('\\'); putchar('t'); 回答5

2022-01-25 05:41:37    分类:技术分享    c   literals   escaping

Code::Blocks compiler not working

When I try to open Code::Blocks this message appears "Can't find compiler executable in your configuration search path's for GNU GCC compiler". and I can't run any projects.

2022-01-25 05:41:35    分类:问答    c   codeblocks

在用 C 编写的 Linux TCP/IP 服务器中处理 Ctrl-C(Handling Ctrl-C in a Linux TCP/IP Server written in C)

问题 我目前正在使用 Linux TCP/IP 服务器。 服务器程序在 C 中运行。我目前正在对其进行测试,但是每次使用 Ctrl-c 退出它时,它使用的端口都没有释放,它正在写入的数据库也没有解锁。 如何定义一个在收到 Ctrl+C 信号时退出的子程序? 回答1 查找setsockopt和SO_REUSEADDR 。 必须在旧的原始服务器进程的套接字上设置此选项,否则新的将无法绑定端口,直到TIME_WAIT期限到期。 回答2 @Bortds 通常不会立即释放端口,您必须等待一段时间。 我从我工作的一个服务器项目中找到了这个。 回答3 两种选择: 添加一个清理例程: int atexit(void (*function)(void)); 将 Ctrl+C 与:sighandler_t signal(int signum, sighandler_t handler); 正如 R 所指出的,sigaction 比信号更便携,但对于 Linux 来说可能不那么惯用。 警告:如果您的程序被 SIGKILL (Ctrl+/) 杀死或收到任何其他未处理的信号,则 atexit 例程将不会运行。

2022-01-25 05:37:18    分类:技术分享    c   linux   tcp

使用互斥体实现生产者/消费者(Implementing producers/consumers using mutex)

问题 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <semaphore.h> #define WORK_SIZE 1024 pthread_mutex_t work_mutex; char work_area[WORK_SIZE]; void *thread_start(void *); int main() { pthread_t a_thread; pthread_mutex_init(&work_mutex,NULL); pthread_create(&a_thread,NULL,thread_start,NULL); while(1) { pthread_mutex_lock(&work_mutex); printf("Enter some text\n"); fgets(work_area, WORK_SIZE, stdin); pthread_mutex_unlock(&work_mutex); } return 0; } void *thread_start(void *arg) { sleep(1); while(1) { pthread_mutex_lock(&work_mutex)

2022-01-25 05:32:42    分类:技术分享    c   multithreading   pthreads   posix   mutex

Windows 上的 UTC 时间戳(UTC time stamp on Windows)

问题 我在 C 中有一个带有 UTC 时间戳的缓冲区,我每十秒广播一次该缓冲区。 问题是两个数据包之间的时间差不一致。 经过 5 到 10 次迭代后,时间差变为 9、11 和 10。请帮我解决这个问题。 我使用<time.h>作为 UTC 时间。 回答1 如果您的时间戳只有 1 秒的分辨率,那么最低有效数字将始终存在 +/- 1 的不确定性(即在这种情况下为 +/- 1 秒)。 澄清:如果你只有 1 秒的分辨率,那么你的时间值是quantized的。 由这种量化值表示的实时t具有t..t+0.9999的范围。 如果您取两个这样的时间t0和t1的差,那么t1-t0的最大误差为-0.999..+0.999 ,量化时为+/-1秒。 因此,在您的情况下,您希望看到9..11秒范围内的差异值。 回答2

2022-01-25 05:29:49    分类:技术分享    c   windows

Why does a C array decay to a pointer when passed with size

I understand why an array decays to a pointer when passed to a function without specifying its size, eg.: void test(int array[]); Why does it do so when passed with the size? eg. void test(int array[3]); I am having trouble with sizeof under the latter function signature, which is frustrating as the array length is clearly known at compile time.

2022-01-25 05:26:49    分类:问答    c   arrays

Bison semantic predicate syntax error, stray '#'

So I am trying to use bison's semantic predicate feature, but I've been running into a few issues trying to have it work. The problem comes when I try to compile the generated .tab.c file with gcc. I am using gcc 7.1.0 and bison 3.0.4. Here's a snippet of the compile error: test2.tab.c: In function ‘yyuserAction’: test2.tab.c:811:12: error: stray ‘#’ in program if (! (#line 19 "test2.y" /* glr.c:816 */ ^ test2.tab.c:811:13: error: ‘line’ undeclared (first use in this function); did you mean ‘uint’? if (! (#line 19 "test2.y" /* glr.c:816 */ ^~~~ uint So I've taken bison's example for semantic

2022-01-25 05:12:09    分类:问答    c   bison

SPARC 程序集参数中的 printf 格式说明符?(printf format specifier in SPARC assembly argument?)

问题 你如何用 SPARC 程序集得到这个 C 的等价物: printf( "Hello, my name is %s.\n", name ); 使用函数原型: void printName( const char* msg, const char* name ) 其中 msg 是“你好,我的名字是 %s。\n”。 我知道我可以使用 .asciz 在数据段中定义“你好,我的名字是 %s。\n”而不需要第一个参数 msg,但是有没有办法将字符串传递给具有 % 的汇编函数s标识符在里面吗? char* 甚至可以接受格式标识符吗? 我尝试了以下方法,但我得到了核心转储。 C中的函数调用: char * msg = "Hello, my name is %s.\n"; char * name = "Foo"; printName( msg, name ); 部件: mov %i0, %o0 mov %i1, %o1 call printf, 2 nop 也许我没有正确接近函数原型? 回答1 我实际上并不确定您做错了什么,但是以下程序可以正常工作: .data s0: .asciz "foo %s\n" s1: .asciz "bar" .text .global main main: save %sp, -96, %sp set s0, %o0 set s1, %o1 call

2022-01-25 05:09:26    分类:技术分享    c   assembly   printf   sparc