Problems passing struct pointers and "conflicting types" errors

I am writing a program that permutes a list of names based on a given input. Here is my code

#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

}

I am getting these errors, one having to do with what im passing into my inputdata function, and a bunch of others about conflicting types?? I have been tinkering around with the code for a bit now and can't get anywhere. At this point I'm just trying to get the code to run so I can debug the algorithm and whatnot, any help is appreciated greatly.

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 ===|

Answers


--- 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++){

Summary: missing kommaas, too many ampersands, missing asterixes.

I have not checked for semantic errors, I presume they are still present. (the unbounded recursive call in permute() looks suspect)

I also advise to remove the casts from malloc()s return value and use the idiom p = malloc N * sizeof *p); But that would increase the size of the diff even more.


I am only guessing here as the code that is causing the error is not given by you at time of posting this, but as the list of your parameters to these functions

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);

is very large and as you report an error between an int* and int** I wonder if you have accidentally got the order of your arguments wrong in the places that you call the above functions???

As I say this is only a guess but it might be worth investigating.


Need Your Help

Web Deploy Failure: User Unauthorized

visual-studio-2015 publish webdeploy

I am using Visual Studio 2015 Community edition on my local machine. This issue occurs when I Build>Publish with the credentials I get pulled off of my Windows Server 2012 R2 which runs Parallel P...

Is this the issue of not logging in as root?

ruby linux ubuntu root pry

As far as i remember while installing ubuntu,the installer didn't ask me for the root password. It asked me to create an account just before preparing for the first time use.There i specified a use...