Thread: getting a "invalid operands to binary"

  1. #1
    Registered User
    Join Date
    Jan 2013
    Posts
    25

    getting a "invalid operands to binary"

    I am getting this error in lines that involve "ch[_]" in lines 27, 28, 29, 33, 42, 43, 44, and 48, heres the code:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    
    
    struct integer{
        int* digits;
        int size;
    };
    FILE *IFP;
    //convert string to int array
    
    
    
    
    struct integer* multiply(struct integer *p,  struct integer *q){
        struct integer *done = malloc(sizeof(struct integer));
        struct integer *temp = malloc(sizeof(int) * 1000000000);
        struct integer *ch = malloc(sizeof(char) * 1000000000);
        done->digits = malloc(sizeof(int) * (done->size + 1));
        int i = 0, j = 0, k = 0, d = 0, l1, l2;
        long int carry = 0;
    
    
        l1 = p->size - 1;
        l2 = q->size - 1;
        if (l1 >= l2){
            for (i = l2; i >= 0; i--){
                for (j = l1; j >= 0; j--){
                    ch[k] += (q->digits[i] * p->digits[j] + carry) % 10;
                    temp[k] = ch[k] % 10;
                    temp[k+1] = ch[k] / 10;
                    k++;
                    carry = (q->digits[i] * p->digits[j] + carry) / 10;
                }
                temp[k++] += carry;
                carry = 0;
                ch = temp;
                d++;
                k = d;
            }
        }else{
            for (i = l1; i >= 0; i--){
                for (j = l2; j >= 0; j--){
                    ch[k] += (q->digits[j] * p->digits[i] + carry) % 10;
                    temp[k] = ch[k] % 10;
                    temp[k+1] = ch[k] / 10;
                    k++;
                    carry = (q->digits[j] * p->digits[i] + carry) / 10;
                }
                temp[k++] += carry;
                carry = 0;
                ch = temp;
                d++;
                k = d;
            }
        }
        done->digits = temp;
        return done;
    }
    
    
    struct integer* convert_integer(char* stringInt){
        struct integer *converted = malloc(sizeof(struct integer));
        int length, i, *ints;
        ints = (int *)malloc(10001 * sizeof(int));
        length = strlen(stringInt);
        converted->size = length;
        for(i = length; i > 0; i--)
            ints[i - 1] = (stringInt[length - i]-48);
        converted->digits = ints;
        return converted;
    }
    
    
    void print(struct integer *a){
        int len = a->size;
        int i, j;
        for(i = 1000000000; i >= 0; i--){
            if (a->digits[i] != 0){
                for (j = i; j >= 0; j--){
                    printf("%d", a[j]);
                }
                break;
            }
            printf("\n");
        }
    }
    
    
    int main(){
        IFP = fopen("bigint.txt", "r");
        char *num1, *num2;
        num1 = (char *)malloc(10001 * sizeof(char));
        num2 = (char *)malloc(10001 * sizeof(char));
        struct integer *snum1 = malloc(sizeof(struct integer));
        struct integer *snum2 = malloc(sizeof(struct integer));
        struct integer *total = malloc(sizeof(struct integer));
        int i, j, runs = 0;
        fscanf(IFP, "%d", &runs);
        printf("runs: %d\n", runs);
        for (i = 0; i < runs; i++){
            fscanf(IFP, "%s %s", num1, num2);
            printf("Problem #%d: ", runs+1);
            snum1 = convert_integer(num1);
            print(snum1);
            printf(" * ");
            snum2 = convert_integer(num2);
            print(snum2);
            printf(" = ");
            total = multiply(snum1, snum2);
            //print(total);
        }
        free(snum1->digits);
        free(snum1);
        free(snum2->digits);
        free(snum2);
        fclose (IFP);
        return 0;
    }

  2. #2
    Registered User
    Join Date
    Jan 2013
    Posts
    25
    the lines appear to be off, sorry for this

  3. #3
    Ultraviolence Connoisseur
    Join Date
    Mar 2004
    Posts
    555
    Code:
    t.c:31:23: error: invalid operands to binary + (have ‘struct integer’ and ‘long int’)
    t.c:32:33: error: invalid operands to binary % (have ‘struct integer’ and ‘int’)
    t.c:33:35: error: invalid operands to binary / (have ‘struct integer’ and ‘int’)
    t.c:37:23: error: invalid operands to binary + (have ‘struct integer’ and ‘long int’)
    t.c:46:23: error: invalid operands to binary + (have ‘struct integer’ and ‘long int’)
    t.c:47:33: error: invalid operands to binary % (have ‘struct integer’ and ‘int’)
    t.c:48:35: error: invalid operands to binary / (have ‘struct integer’ and ‘int’)
    What the compiler is telling you is "I don't know how to <operator> a struct integer and an integer". Where <operator> is + & or / etc.. shown above. Meaning you can't perform mathematical operations on a "struct integer", only on integer/floating point types. So you have to reference a member INSIDE the "struct integer" instead and use THAT in the operator (as an operand). If you read the errors its actually quite clear the problem.

    EDIT:
    If it's not obvious "binary" in this case means "takes 2 arguments" ie, + takes 2 "operands" a + b, a and b are operands.

  4. #4
    Registered User
    Join Date
    Jan 2013
    Posts
    25
    okay i fixed it and now it is just crashing, any reason known?
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    
    
    struct integer{
        int* digits;
        int size;
    };
    FILE *IFP;
    struct integer* multiply(struct integer *p,  struct integer *q){
        struct integer *done = malloc(sizeof(struct integer));
        int *temp = malloc(sizeof(int) * 1000000000);
        int *ch = malloc(sizeof(char) * 1000000000);
        done->digits = malloc(sizeof(int) * (done->size + 1));
        int i = 0, j = 0, k = 0, d = 0, l1, l2;
        long int carry = 0;
        l1 = p->size - 1;
        l2 = q->size - 1;
        if (l1 >= l2){
            for (i = l2; i >= 0; i--){
                for (j = l1; j >= 0; j--){
                    ch[k] += (q->digits[i] * p->digits[j] + carry) % 10;
                    temp[k] = ch[k] % 10;
                    temp[k+1] = ch[k] / 10;
                    k++;
                    carry = (q->digits[i] * p->digits[j] + carry) / 10;
                }
                temp[k++] += carry;
                carry = 0;
                ch = temp;
                d++;
                k = d;
            }
        }else{
            for (i = l1; i >= 0; i--){
                for (j = l2; j >= 0; j--){
                    ch[k] += (q->digits[j] * p->digits[i] + carry) % 10;
                    temp[k] = ch[k] % 10;
                    temp[k+1] = ch[k] / 10;
                    k++;
                    carry = (q->digits[j] * p->digits[i] + carry) / 10;
                }
                temp[k++] += carry;
                carry = 0;
                ch = temp;
                d++;
                k = d;
            }
        }
        for(i = 1000000000; i >= 0; i--){
            if (temp[i] != 0){
                for (j = i; j >= 0; j--){
                    printf("%d", temp[j]);
                }
                break;
            }
            printf("\n");
        }
        done->digits = temp;
        return done;
    }
    
    
    struct integer* convert_integer(char* stringInt){
        struct integer *converted = malloc(sizeof(struct integer));
        int length, i, *ints;
        ints = (int *)malloc(10001 * sizeof(int));
        length = strlen(stringInt);
        converted->size = length;
        for(i = length; i > 0; i--)
            ints[i - 1] = (stringInt[length - i]-48);
        converted->digits = ints;
        return converted;
    }
    
    
    int main(){
        IFP = fopen("bigint.txt", "r");
        char *num1, *num2;
        num1 = (char *)malloc(10001 * sizeof(char));
        num2 = (char *)malloc(10001 * sizeof(char));
        struct integer *snum1 = malloc(sizeof(struct integer));
        struct integer *snum2 = malloc(sizeof(struct integer));
        struct integer *total = malloc(sizeof(struct integer));
        int i, j, runs = 0;
        fscanf(IFP, "%d", &runs);
        for (i = 0; i < runs; i++){
            fscanf(IFP, "%s %s", num1, num2);
            printf("Problem #%d: ", i + 1);
            snum1 = convert_integer(num1);
            for(j = 0; j < snum1->size; j++)
                printf("%d",snum1->digits[snum1->size - j - 1]);
            printf(" * ");
            snum2 = convert_integer(num2);
            for(j = 0; j < snum2->size; j++)
                printf("%d",snum2->digits[snum2->size - j - 1]);
            printf(" = ");
            total = multiply(snum1, snum2);
        }
        free(snum1->digits);
        free(snum1);
        free(snum2->digits);
        free(snum2);
        fclose (IFP);
        return 0;
    }

  5. #5
    Registered User
    Join Date
    May 2009
    Posts
    3,125
    Code:
    void print(struct integer *a){
        int len = a->size;
        int i, j;
        for(i = 1000000000; i >= 0; i--){ /* Mistake in this Line */
            if (a->digits[i] != 0){       /* Off by one  mistake in this line */
                for (j = i; j >= 0; j--){ /* or in this line */
                    printf("%d", a[j]);   /* Mistake in this Line */
                }
                break;
            }
            printf("\n");
        }
    }
    Tim S.
    "...a computer is a stupid machine with the ability to do incredibly smart things, while computer programmers are smart people with the ability to do incredibly stupid things. They are,in short, a perfect match.." Bill Bryson

  6. #6
    Registered User
    Join Date
    May 2009
    Posts
    3,125
    You are allocating enough space that it might be crashing because it fails.

    int *temp = malloc(sizeof(int) * 1000000000); /* I estimate this as 4000 MB the normal safe amount is around 10 MB */

    Code:
        int *temp = malloc(sizeof(int) * 1000000000);
        if (temp == NULL){
            fprintf(stderr, "malloc of temp failed\n");
            exit(1);
        }
    When I added the above it it printed the failed message.


    Tim S.
    Last edited by stahta01; 01-25-2013 at 09:15 PM.
    "...a computer is a stupid machine with the ability to do incredibly smart things, while computer programmers are smart people with the ability to do incredibly stupid things. They are,in short, a perfect match.." Bill Bryson

  7. #7
    Algorithm Dissector iMalc's Avatar
    Join Date
    Dec 2005
    Location
    New Zealand
    Posts
    6,318
    Your program attempts to allocate 5GB, plus an uninitialised amount (done->size) which could easily also be up to another 4GB.
    A 32-bit process in Windows, for example, can only allocate 2GB in total, and usually not all at once.
    You need to be a lot starter about your allocation requests.
    My homepage
    Advice: Take only as directed - If symptoms persist, please see your debugger

    Linus Torvalds: "But it clearly is the only right way. The fact that everybody else does it some other way only means that they are wrong"

  8. #8
    Registered User
    Join Date
    May 2009
    Posts
    3,125
    FYI: I posted test code for someone else doing what appears to be the same assignment in this thread.
    http://cboard.cprogramming.com/c-pro...ing-about.html
    "...a computer is a stupid machine with the ability to do incredibly smart things, while computer programmers are smart people with the ability to do incredibly stupid things. They are,in short, a perfect match.." Bill Bryson

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. No operator matches "[]" these operands And error C2248
    By VolcanoWolcano in forum C++ Programming
    Replies: 2
    Last Post: 06-07-2012, 06:56 AM
  2. Replies: 6
    Last Post: 08-17-2009, 09:43 AM
  3. invalid operands to binary %
    By Mathsniper in forum C Programming
    Replies: 3
    Last Post: 12-03-2005, 10:21 PM
  4. An error "invalid combination of operands and opcodes"!!
    By praseodeveloper in forum C++ Programming
    Replies: 4
    Last Post: 10-20-2005, 01:00 AM
  5. invalid operands to binary ^ ?
    By seal in forum C Programming
    Replies: 14
    Last Post: 09-13-2005, 04:59 PM
Website Security Test