【问题标题】:Problems passing struct pointers and "conflicting types" errors传递结构指针和“冲突类型”错误的问题
【发布时间】:2012-06-13 17:58:52
【问题描述】:

我正在编写一个基于给定输入排列名称列表的程序。这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN 19 //names no longer than 19 chars
#define MAXPEOPLE 10

struct genderinfo {
    char** winning;
    char** names;
    int** scores;
};


char** allocnames(int num);
int** allocratings(int num, int num2);
void inputdata(int numpeople, struct genderinfo *male, struct genderinfo *female, FILE* fp);
void permute(int permuteset[], int k, int numpeople, struct genderinfo *male, struct     genderinfo *female, int *maxLindex);
void swap(int permuteset[],int i, int j);
void compare(int permuteset[], struct genderinfo *male, struct genderinfo *female, int *maxLindex, int numpeople);

///write free functions for struct arrays

int main () {

FILE* fp = fopen("matching.txt", "r");

struct genderinfo male;
struct genderinfo female;

//loop variables
int numdates, i, j, k;

//other variables
int numpeople, maxLindex = 0, difference;

fscanf(fp, "%d", &numdates);

for(i=1; i <= numdates; i++) {

    fscanf(fp, "%d", &numpeople);
    //printf("%d possible couples\n", numpeople);

    //allocate memory for arrays of names
    male.names = allocnames(numpeople);
    female.names = allocnames(numpeople);
    male.winning = allocnames(numpeople);
    female.winning = allocnames(numpeople);

    //allocate memory for score arrays
    male.scores = allocratings(numpeople, numpeople);
    female.scores = allocratings(numpeople, numpeople);
    int permuteset[numpeople];

    //fill permute set with 0-k, these will serve as array indexes to compare against malenames array
    //format used will be malenames[i][permuteset[i]] femalenames[permuteset[i]][i] to index the scores
    for(k=0; k<numpeople; k++)
        permuteset[k] = k;

    inputdata(numpeople, &male, &female, fp);
    permute(permuteset, 0, numpeople, &male, &female &maxLindex);

    printf("Matching #%d: Maximum Score = %d\n\n", i, maxLindex);

    for (j=0; j<numpeople; j++){

            printf("%s %s\n", male.winning[j], female.winning[j]);
    }

    printf("\n\n");

}

return 0;

}

char** allocnames(int num) {

int i;

char** names = (char**)malloc(num*sizeof(char*));

for(i=0; i < num; i++)
    names[i] = (char*)malloc(MAX_LEN+1);

return names;

}

int** allocratings(int num, int num2) {

int i;

int** ratings = (int**)malloc(num*sizeof(int*));

for(i=0; i < num; i++)
    ratings[i] = (int*)malloc(num2*sizeof(int));

return ratings;

}

void inputdata(int numpeople, struct genderinfo *male, struct genderinfo *female, FILE* fp) {

int i, j;

for (i=0; i < numpeople; i++) {
    fscanf(fp, "%s", male->names[i]);
    //printf("%s ", malenames[i]);
}

for (i=0; i < numpeople; i++) {
    fscanf(fp, "%s", female->names[i]);
    //printf("%s ", femalenames[i]);
}

for (i=0; i < numpeople; i++) {
    for (j=0; j < numpeople; j++) {
        fscanf(fp, "%d", &male->scores[i][j]);
        //printf("%d ", malescores[i]);
    }
}

for (i=0; i < numpeople; i++) {
    for(j=0; j < numpeople; j++) {
        fscanf(fp, "%d", &female->scores[i][j]);
        //printf("%d ", femalescores[i][j]);
    }
}
}

void permute(int permuteset[], int k, int numpeople, struct genderinfo *male, struct genderinfo *female, int *maxLindex) {

int i;

if (k == numpeople) {

    compare(permuteset, &male, &female, &maxLindex, numpeople);
}

else {

     // Loop through each possible starting letter for index k,
     // the first index for which we have a choice.
     for (i=k; i<numpeople; i++) {

         // Place the character stored in index j in location k.
         swap(permuteset, k, i);

         // Print out all of the permutations with that character
         // just chosen above fixed.
         permute(permuteset, 0, numpeople, &male, &female &maxLindex);

         // Put the original character that used to be there back
         // in its place.
         swap(permuteset, i, k);
     } //end i for
 } //end else

}

void swap(int permuteset[], int i, int j) {

int temp = permuteset[i];
permuteset[i] = permuteset[j];
permuteset[j] = temp;

}

//This function will take a permutation in and compare malescores[i] to
//femalescores[permuteset[i]]
//if malescores[i] > femalescores[permuteset[i]] scoresum += bla blah else if.... etc.

//copy malenames[i] and femalenames[permuteset[i]] into winning couples
//with if statements above

//malescores[i][permuteset[i]]
//femalescores[permuteset[i]][i]]
void compare(int permuteset[], struct genderinfo *male, struct genderinfo *female, int *maxLindex, int numpeople) {

int temp_maxLindex, i, j, minlike;

for(i=0; i<numpeople; i++){

    if (male->scores[i][permuteset[i]] > female->scores[permuteset[i]][i])
        minlike = female->scores[permuteset[i]][i];

    else
        minlike = male->scores[permuteset[i]][i];

    temp_maxLindex += minlike;

    if (temp_maxLindex > maxLindex) {
        maxLindex = temp_maxLindex;

        for(j=0; j<numpeople; j++){

            strcpy(male->winning[j], male->names[i]);
            strcpy(female->winning[j], female->names[permuteset[i]]);

        } //j for

    } //if

} //i for

}

我收到了这些错误,其中一个与我传递给我的 inputdata 函数的内容有关,还有一堆关于冲突类型的其他错误?我现在一直在修改代码,但无处可去。在这一点上,我只是想让代码运行,这样我就可以调试算法等等,非常感谢任何帮助。

D:\School\Summer 2012\CS1\Assignments\2\main.c||In function 'main':|
D:\School\Summer 2012\CS1\Assignments\2\main.c|61|error: invalid operands to binary & (have 'struct genderinfo *' and 'int')|
D:\School\Summer 2012\CS1\Assignments\2\main.c|61|error: too few arguments to function 'permute'|
D:\School\Summer 2012\CS1\Assignments\2\main.c|17|note: declared here|
D:\School\Summer 2012\CS1\Assignments\2\main.c|35|warning: unused variable 'difference' [-Wunused-variable]|
D:\School\Summer 2012\CS1\Assignments\2\main.c||In function 'permute':|
D:\School\Summer 2012\CS1\Assignments\2\main.c|139|warning: passing argument 2 of 'compare' from incompatible pointer type [enabled by default]|
D:\School\Summer 2012\CS1\Assignments\2\main.c|19|note: expected 'struct genderinfo *' but argument is of type 'struct genderinfo **'|
D:\School\Summer 2012\CS1\Assignments\2\main.c|139|warning: passing argument 3 of 'compare' from incompatible pointer type [enabled by default]|
D:\School\Summer 2012\CS1\Assignments\2\main.c|19|note: expected 'struct genderinfo *' but argument is of type 'struct genderinfo **'|
D:\School\Summer 2012\CS1\Assignments\2\main.c|139|warning: passing argument 4 of 'compare' from incompatible pointer type [enabled by default]|
D:\School\Summer 2012\CS1\Assignments\2\main.c|19|note: expected 'int *' but argument is of type 'int **'|
D:\School\Summer 2012\CS1\Assignments\2\main.c|153|error: invalid operands to binary & (have 'struct genderinfo **' and 'int *')|
D:\School\Summer 2012\CS1\Assignments\2\main.c|153|warning: passing argument 4 of 'permute' from incompatible pointer type [enabled by default]|
D:\School\Summer 2012\CS1\Assignments\2\main.c|133|note: expected 'struct genderinfo *' but argument is of type 'struct genderinfo **'|
D:\School\Summer 2012\CS1\Assignments\2\main.c|153|error: too few arguments to function 'permute'|
D:\School\Summer 2012\CS1\Assignments\2\main.c|133|note: declared here|
D:\School\Summer 2012\CS1\Assignments\2\main.c||In function 'compare':|
D:\School\Summer 2012\CS1\Assignments\2\main.c|194|warning: comparison between pointer and integer [enabled by default]|
D:\School\Summer 2012\CS1\Assignments\2\main.c|195|warning: assignment makes pointer from integer without a cast [enabled by default]|
||=== Build finished: 10 errors, 7 warnings ===|

【问题讨论】:

  • 您应该包含调用导致错误的函数的代码 - permute() 和 compare() 代码。也包括具体的错误。
  • 在显示错误的地方添加完整的编译器输出也会有所帮助!
  • 我添加了带有错误消息的完整代码。我已经对其进行了更改,以将男性和女性数组清理为结构。看看
  • 首先:将结构定义放在使用它们的函数声明之前。
  • 哦哇,愚蠢的错误。更新了帖子中的错误哈。似乎与我在将数组合并到结构之前最初遇到的错误相同。

标签: c arrays pointers memory-management compiler-errors


【解决方案1】:
--- permute.c.OLD   2012-06-14 22:48:06.760926525 +0200
+++ permute.c   2012-06-14 22:47:37.344810744 +0200
@@ -21,7 +21,7 @@

 ///write free functions for struct arrays

-int main () {
+int main (void) {

 FILE* fp = fopen("matching.txt", "r");

@@ -32,7 +32,7 @@
 int numdates, i, j, k;

 //other variables
-int numpeople, maxLindex = 0, difference;
+int numpeople, maxLindex = 0; // difference;

 fscanf(fp, "%d", &numdates);

@@ -58,7 +58,7 @@
         permuteset[k] = k;

     inputdata(numpeople, &male, &female, fp);
-    permute(permuteset, 0, numpeople, &male, &female &maxLindex);
+    permute(permuteset, 0, numpeople, &male, &female, &maxLindex);

     printf("Matching #%d: Maximum Score = %d\n\n", i, maxLindex);

@@ -136,7 +136,7 @@

 if (k == numpeople) {

-    compare(permuteset, &male, &female, &maxLindex, numpeople);
+    compare(permuteset, male, female, maxLindex, numpeople);
 }

 else {
@@ -150,7 +150,7 @@

          // Print out all of the permutations with that character
          // just chosen above fixed.
-         permute(permuteset, 0, numpeople, &male, &female &maxLindex);
+         permute(permuteset, 0, numpeople, male, female, maxLindex);

          // Put the original character that used to be there back
          // in its place.
@@ -191,8 +191,8 @@

     temp_maxLindex += minlike;

-    if (temp_maxLindex > maxLindex) {
-        maxLindex = temp_maxLindex;
+    if (temp_maxLindex > *maxLindex) {
+        *maxLindex = temp_maxLindex;

         for(j=0; j<numpeople; j++){

总结:缺少 kommaas、太多 & 符号、缺少星号。

我没有检查语义错误,我认为它们仍然存在。 (permute() 中的无限递归调用看起来很可疑)

我还建议从 malloc() 的返回值中删除强制转换并使用成语 p = malloc N * sizeof *p); 但这会进一步增加差异的大小。

【讨论】:

  • 那么在main中通过引用传递参数后在函数中通过引用传递是非法的吗?我认为这是因为您本质上是在传递参考“参考”? (不存在)。因此,考虑到我上面所说的,这意味着在您已经通过引用将变量传递到的函数中,您只需使用您在上次发布的更正中说明的指针?
  • 恐怕你不是很懂指针。 (或者我误解了你的意图)对于主要,“男性”和“女性”对象是结构。它可以通过指针将它们传递给其他函数,使用func( &amp;male); 接收函数将它们视为指针(例如:pmale)。如果接收函数想递归调用自己,它已经是指针,所以它仍然可以使用func( pmale );。不需要&符号,(除非您希望递归函数更改指针,目前这对我来说没有意义)有问题的函数是 permute() 和 compare() BTW。
  • 很酷,我是按照这些思路思考的。感谢您的帮助和澄清。
【解决方案2】:

我只是在这里猜测,因为您在发布此内容时并未给出导致错误的代码,而是作为这些函数的参数列表

void permute(int permuteset[], int k, int numpeople, char** winningmales, char** winningfemales, char** malenames, char** femalenames, int** malescores,
         int** femalescores, int *maxLindex);

void compare(int permuteset[], char** winningmales, char** winningfemales, char** malenames, char** femalenames, int** malescores, int**femalescores,
         int *maxLindex, int numpeople);

非常大,当您报告 int*int** 之间的错误时,我想知道您是否在调用上述函数的地方不小心弄错了参数的顺序???

正如我所说,这只是一个猜测,但可能值得调查。

【讨论】:

  • 由于您要为两种性别传递相同的信息,因此您可以将并行项分组到一个结构中并使函数调用更不容易出现拼写错误:struct gender_info { char** winning; char** names; int** scores; }。使用这种结构,您的函数将采用 6 个参数而不是 10 个。
  • 我认为您需要包含一些代码,说明您在哪里调用给您错误的函数。
  • 我已编辑完整代码并将其发布到原始帖子中。现在的问题类似,但输入数据函数存在错误以及“冲突类型”问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2020-07-27
相关资源
最近更新 更多