簡體   English   中英

錯誤:二進制^(具有'double'和'double')的操作數無效-我不是在嘗試使用^作為冪運算符

[英]error: invalid operands to binary ^ (have ‘double’ and ‘double’) - I'm not trying to use ^ as a power operator

我一直在尋找答案,但找不到。 我不是要使用^作為冪運算符。

這是我的問題。 我正在嘗試從數字電視標准(物理層協議)中復制一個交織器。 這是一個學校項目。 這是我到目前為止在C中使用的代碼:

#include <sys/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>
#include <stdbool.h>
#include <string.h>
#include <complex.h>
#include <math.h>

int main()
{
    int Mmax = 32768; 
    int Nr = log10(Mmax)/log10(2);
    printf("Nr = %i \n",Nr);

    int Lfm = 42; 

    int i,j,k,l; 

    // Create array R'i 
    unsigned char Rli[Mmax][Nr];
    for (i = 0; i < Mmax; i++)
        memset(Rli[i], 0, sizeof(unsigned char)*(Nr));

    for (i = 0; i < Mmax; i++)
    {
        for(j = 1; j < Nr; j++)
        {
            if(i == 0 || i == 1)
            {
                Rli[i][j] = 0;
            }

            else if(i == 2)
            { 
                Rli[i][j] = 0;
                if(j == Nr - 2)
                    Rli[i][j] = 1;
            }

            else
            {
                Rli[i][j+1] = Rli[i-1][j]; 
            }
        }

        if(i > 2)
        {
            Rli[i][1] = (((Rli[i-1][14] ^ Rli[i-1][13] ) ^ Rli[i-1][12] ) ^ Rli[i-1][2]);
        }
        Rli[i][0] = 0;
    }

    // wire permutation for array R'i - creates array Ri

    unsigned char Ri[Mmax][Nr];
    for (i = 0; i < Mmax; i++)
        memset(Ri[i], 0, sizeof(unsigned char)*(Nr));   

    for (i = 0; i < Mmax; i++)
    {
        Ri[i][1] = Rli[i][8]; //Rli[i][7];
        Ri[i][2] = Rli[i][9]; //Rli[i][8];
        Ri[i][3] = Rli[i][14]; //Rli[i][13];
        Ri[i][4] = Rli[i][4]; //Rli[i][3];
        Ri[i][5] = Rli[i][6]; //Rli[i][5];
        Ri[i][6] = Rli[i][13]; //Rli[i][12];
        Ri[i][7] = Rli[i][3]; //Rli[i][2];
        Ri[i][8] = Rli[i][2]; //Rli[i][1];
        Ri[i][9] = Rli[i][12]; //Rli[i][11];
        Ri[i][10] = Rli[i][5]; //Rli[i][4];
        Ri[i][11] = Rli[i][10]; //Rli[i][9];
        Ri[i][12] = Rli[i][11]; //Rli[i][10];
        Ri[i][13] = Rli[i][1]; //Rli[i][0];
        Ri[i][14] = Rli[i][7]; //Rli[i][6];
    }

    // Offset generator Gk

    int Gmax = floor(Lfm/2);
    unsigned char Gk[Gmax][Nr];
    for (i = 0; i < Gmax; i++)
        memset(Gk[i], 0, sizeof(unsigned char)*Nr-1);

    for (k = 0; k < Gmax; k++)
    {
        for(j = 0; j < Nr; j++)
        {
            if(k == 0)
            { 
                Gk[k][j] = 1; 
            }

            else
            { 
                Gk[k][j+1] = Gk[k-1][j];
            }
        } 

        if(k > 0)
        { 
            Gk[k][0] = ( Gk[k-1][14] ^ Gk[k-1][13] );
        }

    }

    // interleaving sequence

    int Ndata = 26303; // numero de data 
    unsigned char Hl[Ndata];
    double H1[Ndata], H2[Ndata];
    memset(Hl, 0, sizeof(unsigned char)*Ndata);
    memset(H1, 0, sizeof(double)*Ndata);
    memset(H2, 0, sizeof(double)*Ndata);

    int p,indice;

    // loop from page 107 of the physical layer protocol.
    for (i = 0; i < Lfm; i++) 
    {
        for (k = 0; k < Mmax; k++) 
        {
            p = 0;
            for (j = 0; j < Nr; j++) // sum
            {
                if(j >= 0 && j <= Nr - 2)
                    H1[p] += Ri[k][j]*pow(2,j);
                else if(j >= 0 && j <= Nr - 1)
                    {
                    indice = floor(i/2);
                    H2[p] += Gk[indice][j]*pow(2,j);
                    }
            }
    /*****/ Hl[p] = ((i % 2)*pow(2,Nr-1) + H1[p] ) ^ H2[p]; /*****/
            if (Hl[p] < Ndata)
                p += 1;
        }
    }

當我嘗試編譯時,最后/ ***** /之間的行會產生錯誤。

freqint.c:146:43: error: invalid operands to binary ^ (have ‘double’ and ‘double’)

        Hl[p] = ((i % 2)*pow(2,Nr-1) + H1[p] ) ^ H2[p];

我想在那里進行XOR操作,但是我做不到。

我要從這里拿走。

交錯順序在第107頁的底部

如何編寫代碼以避免該錯誤消息並仍然執行XOR?

如評論中所述, ^運算符不能在double上使用,但是您不需要使用double

您正在使用兩個返回double pow函數,即powfloor

每次調用pow ,您將2作為基數。 通過將值1左移指數,可以更有效地將1提高到冪。

同樣,每次調用floor您都將整數值除以2 由於整數除法會自動刪除除法的余數(假設您僅使用正值),因此調用floor不會給您帶來任何好處。

因此,將pow(2,x)所有實例更改為(1 << x) ,並將floor(x/2)所有實例更改為(x/2) 然后,您可以將H1H2聲明為unsigned int數組,並且可以使用XOR運算符^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM