- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这个程序的基本思想是实现一个通用的排序链表,它从用户那里获取函数(我有一个主文件,其中包含这两个文件但什么都不做)。编辑:问题是我的声明是在结构之前声明的。
我的标题:
#ifndef GADT_H
#define GADT_H
#include <stdio.h>
//typedef declaration
typedef void* ELM;
typedef void* SLN;
typedef void* HEAD;
typedef enum { success, outOfMem, badArgs, failure} RESULT;
HEAD SLCreate(ELM head_val, ELM(*create_elm)(), void(*cpy_elm)(ELM, ELM),
int(*cmp_elm)( ELM, ELM), void(*free_elm)(ELM),
void(*print_elm)( ELM), ELM(*add_elm_to_elm)(ELM, ELM));
void SLDestroy(HEAD head);
RESULT SLAddListElement(HEAD* head, ELM node);
RESULT SLRemoveElement(HEAD* head, ELM node);
SLN SLFindElement(HEAD head, ELM node);
void SLAddToElement(HEAD* head, ELM toEl, ELM addEl);
void SLPrintElements(HEAD head);
#endif
我的c文件:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "gadt.h"
//static funcs:
static void sortLinkedList(HEAD* head);
static void nodeDataSwap(Node* nodeOne, Node* nodeTwo);
typedef struct Node{
ELM data;
struct Node * next;
//Functions associated with the struct.
ELM(*create_elm)();
void(*cpy_elm)(ELM, ELM);
int(*cmp_elm)( ELM, ELM);
void(*free_elm)(ELM);
void(*print_elm)( ELM);
ELM(*add_elm_to_elm)(ELM, ELM);
}Node;
/************************************************************************
* function name: SLCreate
* The input: a pointer to a value(void*), pointers to functions
that are associated with the struct.
* The output: void*
* the operation: creates the a pointer to a new linked list
and initializes its functions.
*************************************************************************/
extern HEAD SLCreate(ELM head_val, ELM(*create_elm)(), void(*cpy_elm)(ELM, ELM),
int(*cmp_elm)( ELM, ELM), void(*free_elm)(ELM),
void(*print_elm)( ELM), ELM(*add_elm_to_elm)(ELM, ELM)){
HEAD head;
Node* pToFirstNode=(Node*)malloc(sizeof(Node));
if (pToFirstNode!=NULL){ //if the allocation hasn't failed
pToFirstNode->data=(ELM)create_elm();
cpy_elm(pToFirstNode->data, head_val);
pToFirstNode->next=NULL;
//initializing functions assosiated with Head.
pToFirstNode->cpy_elm=cpy_elm;
pToFirstNode->create_elm=create_elm;
pToFirstNode->cmp_elm=cmp_elm;
pToFirstNode->free_elm=free_elm;
pToFirstNode->print_elm=print_elm;
pToFirstNode->add_elm_to_elm=add_elm_to_elm;
head=pToFirstNode; //so both of them point ot the same place
return head;
}
return;
}
/************************************************************************
* function name: SLAddListElement
* The input: the head of the list and the node to be created
* The output: integer-RESULT (outOfMem, Succes)
* the operation:goes to the end of the linked list, allocates memory at the end
and copies node to it.
*************************************************************************/
extern RESULT SLAddListElement(HEAD* head, ELM node){
Node* currNode=(Node*)(*head);
Node* lastNode=(Node*)(*head);
while(currNode->next!=NULL){
lastNode=currNode;
currNode=currNode->next;
}
currNode=(Node*)malloc(sizeof(Node));
if(currNode==NULL){
return outOfMem;
}
//inserting functions into currNode
currNode->add_elm_to_elm=lastNode->add_elm_to_elm;
currNode->cpy_elm=lastNode->cpy_elm;
currNode->create_elm=lastNode->create_elm;
currNode->free_elm=lastNode->free_elm;
currNode->print_elm=lastNode->print_elm;
currNode->cmp_elm=lastNode->cmp_elm;
//inserting data into currNode
currNode->cpy_elm(currNode->data,node);//calls the function from head.
currNode->next=NULL;
//sort the list
sortLinkedList(head);
return success;
}
extern void SLDestroy(HEAD head){
Node* currNode=(Node*)head;
Node* subsequentNode=(Node*)head; //next node after previous
//need two pointers because after i free the first one
//i dont have access to the next node.
while(currNode->next!=NULL){
subsequentNode=subsequentNode->next;
currNode->free_elm(currNode->data);
free(currNode);
currNode=subsequentNode;
}
}
static void sortLinkedList(HEAD* head){
Node* currNode=(Node*)(*head);
while(currNode->next=NULL);
if(currNode->cmp_elm(currNode->data,currNode->next->data) > 0){
nodeDataSwap(currNode,currNode->next);
}
}
static void nodeDataSwap(Node* nodeOne, Node* nodeTwo){
void * temp;
temp=nodeOne->data;
nodeOne->data=nodeTwo->data;
nodeTwo->data=temp;
}
extern void SLPrintElements(HEAD head){
Node* nodePointer=(Node*)head;
nodePointer->print_elm(nodePointer->data);
while (nodePointer=NULL){
printf("\n\t");
nodePointer->print_elm(nodePointer->data);
}
}
这些是我得到的错误:PICTURE
我觉得问题与我的结构定义有关,但我不确定,希望得到一些帮助
最佳答案
您的类型定义有问题。永远不要在 typedef 类型中隐藏指针!
typedef void* HEAD; // DANGER!! DANGER!! DANGER!!
...
extern RESULT SLAddListElement(HEAD* head, ELM node){
Node* currNode=(Node*)head; // <= BOOM
HEAD*
表示 void **
最后。您将 head
将他指向某物的指针转换为 Node*
这是指向结构的指针。这很可能是间接级别的不匹配。
即使您的文本编辑器中没有出现红色小东西,Visual Studio 的错误消息也应该包含一些文本和一些行信息。您应该始终在问题中包含错误消息,以便更好地进行分析。
编辑:缺少 header 也可能是一个问题:
#include "Gadf.h" <== Probably you want gadt.h
关于c - 尝试实现一个从用户那里获取功能的通用链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41637454/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!