[英]Having some problems with VS2013
我只是從vc6 ++切換到vs2013,發現它們之間有很多差異。 就像使用scanf_s代替scanf一樣,用cmath代替math.h getch-> _getch
我應該注意其他主要區別嗎?
順便說一句,這是什么意思? “錯誤C2668:'pow':對重載的模糊調用”
這是我的代碼,它是一個簡單的加密程序
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<math.h>
int encode1(int d,int n);
int encode2(int d,int n);
int encode3(int d,int n);
int decode1(int d,int n);
int decode2(int d,int n);
int decode3(int d,int n);
int main(void)
{
char ans, exit;//Used to exit the program
puts("Program starts");
int d = 0, n, temp;
char s;
unsigned number;
printf("Please choose one of the followings \n");
printf("1)Encrypting\t2)Decrypting(q to quit)\n");
scanf("%d",&number);
while (number!= 1 && number != 'q'&& number != 2)
{
printf("Wrong choice, retry\n");
number = getchar();
}
if(number!='q')
{
printf("Please type in the digit of your password\n");
scanf("%d", &n);
getchar();
}
switch (number)
{
case 1: temp = encode1(d, n);
printf("%d\n", temp);
break;
case 2: temp = decode1(d, n);
printf("%d\n", temp);
break;
default:break;
}
puts("Press any key to continue");
exit = _getch();
puts("Program ends");
return 0;
}
int encode1(int d, int n)
{
int b, c[100], i, j, t, r, e[100];
puts("Please type in your password to generated the key(integers only)");
scanf("%d", &b);
for (i = 0; i<n+1; i++)
{
c[i] = b % 8;
b = b / 8;
}
for (i = 0; i<n+1; i++)
{
d = d * 10 + c[i];
}
r = encode2(d,n);
return r;
}
int encode2(int b, int n)
{
int c[100], i, j, t, r, d = 0;
for (i = 0; i<n+2; i++)
{
c[i] = b % 8;
b = b / 8;
}
for (i = 0; i<n+2; i++)
{
d = d * 10 + c[i];
}
r = encode3(d,n);
return r;
}
int encode3(int b, int n)
{
int c[100], i, j, t, r, d = 0;
for (i = 0; i<n+3; i++)
{
c[i] = b % 8;
b = b / 8;
}
for (i = 0; i<n+3; i++)
{
d = d * 10 + c[i];
}
return d;
}
int decode1(int d, int n)
{
puts("Type in the key to retrieve your password");
scanf("%d", &d);
int a[100], t, x;
int c[100], i, j, e[100], k, g, u = 0, r;
for (i = 0, j = n+3; i<n+3, j>0; j--, i++)
{
k = pow(10, j);
e[i] = d / (k);
}
for (i = 0, j = n+2; j >= 0, i<n+3; i++, j--)
{
g = pow(10, j + 1);
k = pow(10, j);
c[i] = (d - e[i] * g) / k;
}
for (i = 0, j = n+2; i<n+3, j >= 0; i++, j--)
{
t = c[j];
a[i] = t;
}
for (i = 0, j = n+2; i<n+3, j >= 0; i++, j--)
{
r = pow(8, j);
u += a[i] * r;
}
x = decode2(u,n);
return x;
}
int decode2(int d, int n)
{
int a[100], t;
int c[100], i, j, e[100], k, g, u = 0, r, x;
for (i = 0, j = n+2; i<n+2, j>0; j--, i++)
{
k = pow(10, j);
e[i] = d / (k);
}
for (i = 0, j = n+1; j >= 0, i<n+2; i++, j--)
{
g = pow(10, j + 1);
k = pow(10, j);
c[i] = (d - e[i] * g) / k;
}
for (i = 0, j = n+1; i<n+2, j >= 0; i++, j--)
{
t = c[j];
a[i] = t;
}
for (i = 0, j = n+1; i<n+2, j >= 0; i++, j--)
{
r = pow(8, j);
u += a[i] * r;
}
x = decode3(u,n);
return x;
}
int decode3(int d, int n)
{
int a[100], t;
int c[100], i, j, e[100], k, g, u = 0, r, x;
for (i = 0, j = n+1; i<n+1, j>0; j--, i++)
{
k = pow(10, j);
e[i] = d / (k);
}
for (i = 0, j = n; j >= 0, i<n+1; i++, j--)
{
g = pow(10, j + 1);
k = pow(10, j);
c[i] = (d - e[i] * g) / k;
}
for (i = 0, j = n; i<n+1, j >= 0; i++, j--)
{
t = c[j];
a[i] = t;
}
for (i = 0, j = n; i<n+1, j >= 0; i++, j--)
{
r = pow(8, j);
u += a[i] * r;
}
return u;
}
您為什么不發布發布該錯誤的代碼? 只是猜測,您的代碼中包含如下內容:
int a = 1;
int b = 2;
double result = pow(a, b);
問題是傳遞給pow
兩個參數都是int
,但是math.h
中沒有pow
重載,而這需要兩個int
。 編譯器告訴您它在重載方面遇到了麻煩,因為在這種情況下最佳可行函數並不是唯一的。
您可以通過將第一個參數轉換為合適的類型(例如double
來解決此問題。
double result = pow((double)a, b);
一般而言,由於有許多更改,因此如果可以縮小問題范圍,那就太好了。您是否還計划轉換舊版MFC代碼?
但是,發布您的錯誤后,我最近升級了幾個舊項目,因此我可能會為您提供幫助。
將C11標准與您正在其下運行的Visual Studio版本(最有可能是C99)進行比較。
C99帶來的最大變化如下:
length可變長度數組
initialize指定的初始值設定項
◾類型通用數學庫
◾新數據類型:long long,_Complex,_Bool
◾限制指針
◾變量的混合聲明
◾內聯功能
◾以//開頭的單行注釋
C11的最大變化:
旨在替代傳統不安全功能的一組更安全的標准功能。 對於典型的C程序員而言,C11的最大變化是其標准化的多線程支持。
新的C11頭文件聲明了用於創建和管理線程,互斥鎖,條件變量和_Atomic類型限定符的函數。 另一個新的頭文件聲明用於不間斷對象訪問的設施。 最后,C11引入了一個新的存儲類說明符_Thread_local(C ++ 11的thread_local的C等效語言)。 多個線程不共享聲明為_Thread_local的變量。 而是,每個線程都獲得其唯一副本。
信息來自: http : //blog.smartbear.com/codereviewer/c11-a-new-c-standard-aiming-at-safer-programming/
如果有時間,請閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.