我正在尝试解决我得到的一个家庭作业问题。我应该创建一个链表和一个数组。链表的元素是一个由三个整数组成的结构和一个指向下一个节点的指针。数组的元素也是三个整数的结构。 将这些特定结构放入链表和数组的条件是当给定矩阵满足:i+j 等于特定迭代中矩阵中的元素(其中 i 和 j 是迭代元素(。
Severity Code Description Project File Line Suppression State Error C2040 'createThreeArr': 'threesome *(int **,int,int,int)' differs in levels of indirection from 'int ()'
我在这篇文章的标题中显示了此错误,谁能帮助我理解为什么会发生这种情况?我做错了什么?
#include <stdio.h>
#include <stdlib.h>
typedef struct threesome
{
int sum;
int i;
int j;
}threesome;
typedef struct list
{
threesome data;
struct list* next;
}list;
int createArrayAndList(int** arr, int rows, int cols, threesome** resArr, list** resList)
{
int num;
*resList = createThreeList(arr, rows, cols, &num);
*resArr = createThreeArr(arr, rows, cols, num);
return num;
}
threesome* createThreeArr(int** arr, int rows, int cols, int num) {
threesome* new_array;
int i, j, k;
if (!num) return NULL;
new_array = (threesome*)malloc(sizeof(threesome)*num);
k = 0;
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++)
if (arr[i][j] == i + j) {
new_array[k].sum = arr[i][j];
new_array[k].i = i;
new_array[k].j = j;
k++;
}
return new_array;
}
list* createThreeList(int** arr, int rows, int cols, int* length_list) {
int i, j, count = 0;
list *head = NULL, *temp1 = NULL, *temp2 = NULL;
for (i = 0; i < rows; i++)
for (j = 0; j < cols; j++) {
if (arr[i][j] == (i + j)) {
temp2 = (list*)malloc(sizeof(list));
temp2->data = createThree(i + j, i, j);
temp2->next = NULL;
if (!count) {
head = temp2;
temp1 = head;
count++;
continue;
}
else {
temp1->next = temp2;
temp1 = temp1->next;
count++;
continue;
}
}
}
*length_list = count;
return head;
}
threesome createThree(int num, int i, int j) {
threesome strc;
strc.sum = num;
strc.i = i;
strc.j = j;
return strc;
}
你有:
int createArrayAndList(int** arr, int rows, int cols, threesome** resArr, list** resList)
{
int num;
*resList = createThreeList(arr, rows, cols, &num);
*resArr = createThreeArr(arr, rows, cols, num);
return num;
}
threesome* createThreeArr(int** arr, int rows, int cols, int num) {
…
createArrayAndList()
中对createThreeArr()
的调用隐式声明createThreeArr()
(对createThreeList()
的调用大致相同(:
extern int createThreeList();
extern int createThreeArr();
这些函数返回具有未定义(但不是可变(参数列表的int
。
当编译器遇到threesome* createThreeArr(int** arr, int rows, int cols, int num) {
时,它会认为这不是你之前说的!并生成错误消息。
在调用函数之前声明或定义函数。 C99需要它。 如果你这样做,你会得到更好的错误检查。 您可以在使用static
函数之前定义它,而无需预先声明它。
static threesome *createThreeArr(int **arr, int rows, int cols, int num);
static list *createThreeList(int **arr, int rows, int cols, int *length_list);
static threesome createThree(int num, int i, int j);
static int createArrayAndList(int** arr, int rows, int cols, threesome** resArr, list** resList);
static int createArrayAndList(int **arr, int rows, int cols, threesome **resArr, list **resList)
{
…
}
…
如果是我的代码,则除main()
之外的所有函数都将static
(如上所述(;如果它们在此源文件之外可见,它们将在标头中声明,并且标头将包含在此处以及使用函数的其他任何位置。