从派生中调用基函数

我在C中使用了本教程示例inheritance和多态 ,因为我根据我的确切要求对其进行了自定义,当我尝试调用基函数时它会抛出错误。 问题:为什么它在employee.c的第8行和可能的解决方案中失败 ((Employee *)self)->super.display(self); // Sementation fault: 11 下载项目 main.c中 #include “person.h” #include “employee.h” #include int main() { Person* person = newPerson(“John Doe”); Employee* employee = newEmployee(“Jane Doe”, “Acme”, 40000); person->display(person); // displaying Person object puts(“——“); employee->display((Person*)employee); // displaying employee info return 0; } Person.h #ifndef _PERSON_H #define _PERSON_H #include typedef struct Person Person; […]

使C lib的一部分“私有”

我正在开发一个共享库,由于代码很大,我决定将它拆分为许多头文件和源文件,就像任何正常程序一样:)。 问题是大多数这些标题都是供内部使用的,即我不希望它们可以从我的库外部访问。 因此,我正在考虑将它们全部移动到一个大的源文件中,并且仅提供可见的标题。 这样做是个好主意吗? 我应该担心能见度吗? 谢谢

strstr找不到子字符串但缓冲区包含值

我正在尝试使用STM32F407V6T6和CubeMx UART 。 我的UART工作正常。 我在比较缓冲区时遇到的问题:我使用strstr()来检查我的缓冲区是否包含有效的子字符串。 这是代码: uint8_t buff[10]; int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); Green_Blink(100); Orange_Blink(100); Blue_Blink(100); Red_Blink(100); __HAL_UART_ENABLE_IT(&huart2, UART_IT_TC); __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE); HAL_Delay(1000); while (1) { HAL_UART_Transmit_IT(&huart2, (uint8_t *)”AT\r\n”, 5); Orange_Blink(100); HAL_Delay(1000); HAL_UART_Receive_IT(&huart2, buff, 10); buff[9] = ‘\0’; if (buff[6] == ‘O’ && buff[7] == ‘K’) { Green_Blink(1000); //Blinks } if (strstr((char*)buff, “OK”)) { […]

在一个结构中的数组并填充他

目前我有一个研究项目,我和一个朋友真的不知道如何解决问题的一部分。 所以,这是一个C项目。 我有2个结构: struct Lib { char letter; int capacity; int size; char** words[200000]; }; typedef struct Lib Library; struct Program { char* loadedFileName[50]; FILE* f; Library* dictionary; int totalwords; }; typedef struct Program Program; 而这个function: void fillDicoFromFile(Program* startup){ rewind(startup->f); while(!feof(startup->f) && !ferror(startup->f)){ char* word = malloc(sizeof(char) * 30); fscanf(startup->f, “%s”, word); int indexLib = […]

将char数组转换为(负)整数; 因为“array – ‘0’”行而无法编译

所以我有这个代码: #include int main(void) { char arr[BUFSIZ]; arr[BUFSIZ – 1] = ‘\0’; fgets(arr, sizeof(arr), stdin); int x = arr – ‘0’; printf(“%d\n”, x); } 当我尝试使用clang的make编译它时,我收到此错误: $ make test clang -ggdb3 -O0 -std=c99 -Wall -Werror test.c -lm -o test test.c:9:9: error: incompatible pointer to integer conversion initializing ‘int’ with an expression of type ‘char *’ [-Werror,-Wint-conversion] […]

C指定大于数据类型范围的值

在C int类型中,可以具有以下+ ve范围的值2,147,483,647 来源 : https : //msdn.microsoft.com/en-IN/library/s3f49ktz.aspx 我想知道如果我指定大于int的值可以容纳,如何截断值或者确切地存储什么,如果我这样做会发生什么 int var = 2147483648;

我在结构指针上调用free()correclty吗?

因此,在测试我的结构时,我使用以下方法。 你可以看到我在方法末尾的指针上调用free。 这是正确的吗? void test() { VariableVector *labelVector = initVariableVector(); VariableVector *variableVector = initVariableVector(); // do some stuff with labelVector and variableVector free(labelVector); free(variableVector); } 这是我的struct init方法的样子: Variable* initVariable(char *variableName, char *arrayOfElements, int32_t address) { Variable* initializedVariable = malloc(sizeof(Variable)); if (initializedVariable != NULL ) { initializedVariable->variableName = variableName; initializedVariable->arrayOfElements = arrayOfElements; initializedVariable->address = address; return […]

使用plain C创建COM对象

根据MSDN文档 ,您可以创建一个COM对象来访问VB中的Internet Explorer; Dim IE As SHDocVw.InternetExplorer Set IE = CreateObject(“InternetExplorer.Application”) 据我所知,COM对象应该与语言无关。 因此,我认为应该可以在普通C(非C ++)中执行此操作。 如何在Windows操作系统上使用纯C创建任何COM对象?

根据第三方库链接到库

我正在创建一个依赖于其他库( libpng , libX11等)的库。 我想知道是否有可能(例如某些标志)用户二进制文件不能直接链接到第三方库,而是通过我的lib间接链接。 这是一个例子: libb.c (作为第三方库) int get21() { return 21; } liba.c (作为我的lib) int get21(); int get42() { return get21() * 2; } main.c (作为用户代码) int get21(); int get42(); int main() { printf(“42 = %d\n21 = %d\n”, get42(), get21()); return 0; } 汇编 $ gcc -fPIC -shared libb.c -o libb.so $ gcc […]

使用fork()的子进程和父进程

我遇到了问题,我需要制作一个程序来制作9个子进程,之后我必须进行3秒的倒计时并使这9个进程等待来自父亲的信号,在他们收到这个信号后,每个孩子们应该说他是什么孩子(如果他是孩子#1,#2,#3等……,按照他们的顺序)。 我所做的就是在这里,一切都很好,我想,直到我作为一个孩子说的部分,我的号码是什么,我不知道怎么做,因为每个孩子都是不同的进程,他们不共享内存,信号不能使用参数,现在我在名为“处理程序”的函数上打印PID,但是如何打印我的号码,作为一个孩子? #include #include #include #include #include #include void handler(int x); int main() { pid_t child[9]; pid_t child_pid; for (int i = 0; i < 9; ++i) { child_pid = fork(); child[i] = child_pid; if (child_pid == 0) break; if (child_pid < 0) { perror("fork()"); exit(EXIT_FAILURE); } } if (child_pid == 0) { signal(SIGUSR1, handler); […]