天道酬勤,学无止境

c

c语言中的链表实现不使用双指针(Linked list implementation in c without using double-pointer)

问题 我用C语言实现了一个简单的链表,但是不使用双指针(**)可以实现吗?我想只使用单指针来实现相同的程序。 #include <stdio.h> #include <stdlib.h> struct node { int data; struct node *next; }; void push(struct node** head_ref, int new_data) { struct node* new_node = (struct node*) malloc(sizeof(struct node)); new_node->data = new_data; new_node->next = (*head_ref); (*head_ref) = new_node; } void append(struct node** head_ref, int new_data) { struct node* new_node = (struct node*) malloc(sizeof(struct node)); struct node *last = *head_ref; /* used in step 5*/ new_node->data = new_data; new_node->next = NULL; if (*head_ref == NULL) { *head_ref =

2021-09-21 18:09:16    分类:技术分享    c   pointers   data-structures   linked-list

Valgrind 非法指令 AVX(Valgrind illegal instruction AVX)

问题 使用 valgrind 评估我的程序时收到一些错误。 更准确地说,我收到了类似的错误 vex amd64->IR:未处理的指令字节:0xC5 0xF8 0x28 0x0 0xC5 0xF8 0x29 0x45 ... ...非法指令 我将问题隔离为一个非常简单的示例 #include <immintrin.h> int main() { float f __attribute__((aligned(16))); // No need to be aligned f = 2.0f; __m128 a = _mm_broadcast_ss(&f); return 0; } 该程序使用带有选项 -mavx 的 gcc 编译。 如果使用 SSE2 指令 _mm_set1_ps,则会发生相同的错误,但仅在使用 -mavx 编译时才会发生。 使用 -msse2 编译程序时,valgrind 不会报告任何错误。 我怀疑这是一个 valgrind 错误,但找不到关于 x86 的任何报告。 我的机器是 Core-i7 Sandy-Bridge 和 valgrind 3.7.0 版。 如果有人有更好的 valgrind 替代方案来进行寄存器感知编程,我想知道。 提前致谢 回答1 您使用的是 2011 年 11 月发布的非常旧的 valgrind 3.7.0。它不支持 AVX/AVX2。 3.8

2021-09-21 18:08:08    分类:技术分享    c++   c   valgrind

将字符串数组传递给函数 C(Passing array of strings to functions C)

问题 我目前对如何将字符串数组传递给函数感到困惑。 我创建了一个一维数组。 我所做的方法有效,但似乎是多余的,我认为有更好的方法可以做到这一点,但我不确定如何。 我试图找到一种方法,可以一次将所有 4 个元素传递给函数。 这是我的代码示例。 #include <stdio.h> #include <string.h> #include <ctype.h> void sort(char *,char *,char *, char *);//Function prototype int main() { char *string_database[4]={'\0'}; string_database[0]="Florida"; string_database[1]="Oregon"; string_database[2]="California"; string_database[3]="Georgia"; sort(string_database[0],string_database[1],string_database[2],string_database[3]); return 0; } void sort(char *string1, char *string2, char *string3, char *string4) { printf("The string is= %s

2021-09-21 17:56:03    分类:技术分享    c   arrays   string   function

将字符串数组传递给函数 C(Passing array of strings to functions C)

问题 我目前对如何将字符串数组传递给函数感到困惑。 我创建了一个一维数组。 我所做的方法有效,但似乎是多余的,我认为有更好的方法可以做到这一点,但我不确定如何。 我试图找到一种方法,可以一次将所有 4 个元素传递给函数。 这是我的代码示例。 #include <stdio.h> #include <string.h> #include <ctype.h> void sort(char *,char *,char *, char *);//Function prototype int main() { char *string_database[4]={'\0'}; string_database[0]="Florida"; string_database[1]="Oregon"; string_database[2]="California"; string_database[3]="Georgia"; sort(string_database[0],string_database[1],string_database[2],string_database[3]); return 0; } void sort(char *string1, char *string2, char *string3, char *string4) { printf("The string is= %s

2021-09-21 17:53:28    分类:技术分享    c   arrays   string   function

打包结构/避免填充(pack struct / avoid padding)

问题 我有以下结构: struct SkipListNode{ void *data; // 8 bytes uint8_t size; // 1 byte // 7 bytes padding here... void *next[1]; // dynamic array, 8 bytes each "cell" }; 我正在使用malloc()并且我分配的空间比sizeof(SkipListNode) ,所以我要扩展next[]数组。 我想避免7 bytes浪费。 我可以完全删除 size 字段,但是我应该在数组末尾保留单个NULL (8 个字节)。 然而,这无助于减小尺寸。 我应该使用__ attribute__((__ packed__))还是有一些不同的方法可以做到这一点? 这也必须在 C 和 C++ 下编译。 编译器是gcc。 回答1 #include <stdio.h> #include <stdint.h> struct SkipListNode{ void *data; // 8 bytes uint8_t size; // 1 byte void *next[1]; }; struct SkipListNode_pack{ void *data; // 8 bytes uint8_t size; // 1 byte void *next[1]; } _

2021-09-21 17:47:01    分类:技术分享    c++   c   gcc   struct

Ti-Calculator 上的多语言编程(Multiple Language Programming on Ti-Calculator)

问题 我对在我的 Ti-84 plus 计算器上使用除 Ti-Basic(如 Java、C 和 Python)之外的不同语言进行编程感兴趣。 我的计算器是否支持这一点,如果不支持,市场上是否有任何计算器能够做到这一点? 提前致谢! (这个想法是,当我在家里无法使用我的电脑时,我可以拿出我的袖珍计算器并开始编程并在旅途中测试一些想到的算法。) 它不一定是计算器,只要是便宜且可编程的东西,我可以随身携带的东西。 回答1 TI 的计算器可让您在 z80 汇编中对它们进行编程! 不幸的是,TI 没有包含一种使用助记符在计算中编程的方法(不过有一些方法。稍后会详细介绍)。 但是,您可以通过使用AsmPrgm (或Asm84CPrgm或Asm84CEPrgm ,取决于您拥有的计算)标记启动程序,然后输入一系列与汇编指令相对应的操作码,直接在 TI-BASIC 程序编辑器中输入机器代码. 例如,这是一个什么都不做的程序: AsmPrgm 00 C9 直接转换(忽略必要的预处理器指令)为: NOP ;no-op RET ;return to the OS. If this is omitted, the program will remain in execution forever, requiring a RAM clear to exit 此页面有更多相关信息,但请注意,“十六进制代码

2021-09-21 17:42:18    分类:技术分享    java   python   c   calculator   ti-basic

getchar() 在 c 中不起作用(getchar() not working in c)

问题 getchar() 在下面的程序中不起作用,谁能帮我解决这个问题。 我尝试 scanf() 函数代替 getchar() 然后它也不起作用。 我无法找出问题的根本原因,任何人都可以帮助我。 #include<stdio.h> int main() { int x, n=0, p=0,z=0,i=0; char ch; do { printf("\nEnter a number : "); scanf("%d",&x); if (x<0) n++; else if (x>0) p++; else z++; printf("\nAny more number want to enter : Y , N ? "); ch = getchar(); i++; }while(ch=='y'||ch=='Y'); printf("\nTotal numbers entered : %d\n",i); printf("Total Negative Number : %d\n",n); printf("Total Positive number : %d\n",p); printf("Total Zero : %d\n",z); return 0 ; } 该代码已从“Yashvant Kanetkar”一书中复制 回答1 那是因为scanf()在输入中留下了尾随的换行符。 我建议更换这个:

2021-09-21 17:34:03    分类:技术分享    c   while-loop   char   scanf   getchar

pthread_create 内存泄漏(pthread_create memory leak)

问题 我使用 C 语言和 Linux 作为我的编程平台。 在我的应用程序中,我调用 pthread_create。 然后我使用 ps 命令行工具检查我的应用程序的内存使用情况,它在 VSZ 列中添加了 4。 但是问题是当pthread_create函数处理程序退出时,内存中添加的4个没有释放。 然后当应用程序再次调用 pthread_create 时,再次添加一个 4 值,直到它变大。 我试过 pthread_join ,似乎内存还在变大。 谢谢。 回答1 ps不是衡量内存泄漏的正确工具。 当你释放内存时,你不能保证减少进程的 vsize,这是由于内存碎片和避免不必要的系统调用。 valgrind是一个更好的工具。 回答2 您应该在您创建的每个 pthread 上使用 pthread_detach 或 pthread_join(但不能同时使用两者)。 pthread_join 等待线程完成; pthread_detach 表示您不打算等待它(因此该实现可以在线程终止时自由回收与该线程关联的存储)。 同上 Artelius 所说的关于 ps 不是诊断内存泄漏的正确工具。 回答3 当你说但问题是当 pthread_create 函数处理程序退出时 作为线程执行完成后退出的一部分,您是否在执行显式 pthread_exit(NULL)? 此外,pthread_exit()

2021-09-21 17:32:34    分类:技术分享    c   linux

'^' 标记前的语法错误(Syntax error before '^' token)

问题 我刚刚在已经成功运行绘图的应用程序中将 core-plot 升级到最新版本。 我按照相当简单的说明操作,但是在 UIView.h 中出现了 20 个语法错误。 似乎我并不孤单,但还没有人发布过该问题的解决方案。 一个例子: 这段代码来自 UIView.h + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); 给出编译错误“'^'标记之前的语法错误”: /var/folders/UO/UOZJs7XuF5iROp2HMSTlz++++TI/-Caches-/com.apple.Xcode.501/CompositeSDKs/iphonesimulator-iPhoneSimulator4.0-drysryiarqddqccmfooifrjfbivi/System/Library/Frameworks/UIKit.framework

2021-09-21 17:32:08    分类:技术分享    iphone   c   objective-c   xcode   core-plot

sleep/nanosleep 是否通过使用忙等待方案来工作?(Does sleep/nanosleep work by utilizing a busy wait scheme?)

问题 我想知道 sleep/nanosleep 是如何在内部实现的? 考虑这个代码: { // on a thread other than main() thread while(1) { //do something sleep(1); } } CPU 是否会进行持续的上下文切换以检查是否完成了 1 秒的睡眠(即内部忙等待)。 我怀疑它是这样工作的,效率太低了。 但是它是如何工作的呢? 同样的问题适用于 nanosleep。 注意:如果这是特定于实现/操作系统的,那么我怎么可能实现一个不会导致持续上下文切换的更有效的方案? 回答1 此处不能保证确切的实现,但您可以期待一些属性。 通常sleep (3) 是非常不准确的,因为 Linux 'man sleep 3' 状态甚至可以使用SIGALM (信号)来实现。 所以这绝对不是关于性能。 这绝对不是关于自旋锁,所以不能是 CPU 密集型的。 nanosleep是完全不同的动物,即使使用自旋锁也可以实现。 哪个更重要,至少在 Linux nanosleep man 是在第 2 节,它是系统调用,所以至少它应该包括切换到内核模式。 你真的需要它的高分辨率吗? 更新 当我看到您的评论时,我确实推荐select()用法,因为man select 3状态: #include <stdio.h> #include <stdlib.h>

2021-09-21 17:11:45    分类:技术分享    c++   c   posix   sleep