我需要採用以下代碼並使用mpz_替換使用我自己的代碼的調用。通過更改起始代碼在c中進行基本乘法
void Product32(void *a, void *b, void *c, unsigned int wa,
unsigned int ba, unsigned int wb, unsigned int bb, unsigned int
*wc, unsigned int *bc){
mpz_t x,y,z;
mpz_init(x);
mpz_init(y);
mpz_init(z);
/* Cast a and b into short integers of size 32 bits */
unsigned int *int_a = (unsigned int *) a;
unsigned int *int_b = (unsigned int *) b;
/* Now int_a can be view as an array of words of size 32
* bits */
/* Similarly for int_b */
//printf("%lu %lu \n", int_a[0], int_a[*sa - 1]);
//printf("%lu %lu \n", int_b[0], int_b[*sb - 1]);
mpz_import(x, wa, ORDER, WORDBYTES, ENDIAN, NAILS, a);
mpz_import(y, wb, ORDER, WORDBYTES, ENDIAN, NAILS, b);
mpz_mul(z,x,y);
c = mpz_export(c, wc, ORDER, WORDBYTES, ENDIAN, NAILS, z);
}
我遇到的問題是,我不明白是什麼mpz_import或mpz_export完成的,而我尋找一個問題的答案已經來到了空。
我也覺得我的類型是完全錯誤的。
我忘了調用Product32的主函數,因爲我知道問題不存在;上面的代碼工作,下面的代碼不會。
這是我有:
/* Since we are working with string of potentially different lengths,
first we need to be able to make the two strings of equal length. */
int makeEqualLength(int arr1[], int arr2[])
{
int len1 = sizeof(arr1);
int len2 = sizeof(arr2);
int i;
if (len1 < len2)
{
for (i = 0 ; i < len2 - len1 ; i++)
arr1[i] = arr1[i+1];
arr1[0] = 0;
return len2;
}
else if (len1 > len2)
{
for (i = 0 ; i < len1 - len2 ; i++)
arr2[i] = arr2[i+1];
arr2[0] = 0;
}
return len1; // If len1 >= len2
}
void Product32(void *a, void *b, void *c, unsigned int wa,
unsigned int ba, unsigned int wb, unsigned int bb, unsigned int
*wc, unsigned int *bc){
/* Cast a and b into short integers of size 32 bits */
unsigned int *int_a = (unsigned int *) a;
unsigned int *int_b = (unsigned int *) b;
unsigned int *int_c = (unsigned int *) c;
/* Now int_a can be view as an array of words of size 32
* bits */
/* Similarly for int_b */
//printf("%lu %lu \n", int_a[0], int_a[*sa - 1]);
//printf("%lu %lu \n", int_b[0], int_b[*sb - 1]);
int n = makeEqualLength(int_a, int_b);
unsigned int i,j,k;
double p;
for (k = 0; k < n; i++){
int_c[k] = 0;
}
for (i = n - 1; i >= 0; i--){
double d = 0;
for (j = n - 1; j >= 0; j--){
p = (int_a[i]) * (int_b[j]) + int_c[i + j] + d;
int_c[i + j] = p % 32;
int_c = p/32
}
int_c[i + n] = d;
}
}
爲什麼不在函數參數中聲明'a''等於'unsigned int *',看到函數知道它是什麼? – 2014-12-04 21:34:26
我假設你的意思是將聲明更改爲無效的無符號整型*?我無法在主函數中將呼叫更改爲Product32。事實上,我根本不允許改變主要功能。因此,我無法更改函數參數。 – sydwys8 2014-12-04 21:48:21
爲什麼不呢?調用者使用的參數不是'unsigned int *'嗎? – 2014-12-04 21:55:30