2014-10-28 5 views
0

Я просто переключаюсь с vc6 ++ на vs2013 и узнаю, что между ними существует много различий. Как использование scanf_s вместо зсапЕ, CMATH вместо math.h Геч -> _getchИмея некоторые проблемы с VS2013

Есть ли другие главное отличие, что я должен быть в курсе

И, кстати, что же это значит? «ошибка C2668:„пау“: неоднозначный вызов перегруженной»

Вот мои коды, это простая программа шифрования

#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; 
} 
+1

VC6 ++? !! Да, вы столкнетесь с множеством изменений. Я буду удивлен, если у кого-то есть даже довольно полный список, но я полагаю, что это не помешает спросить. Сообщение об ошибке сообщает вам, что 'pow' имеет более одного определения, и ваш вызов не подходит ни одному из них. –

+0

Вы все еще можете использовать 'scanf', предупреждения об этом можно игнорировать. –

+0

« неоднозначный вызов перегрузки »предполагает, что вы используете компилятор C++, а не C. – chux

ответ

1

Почему не вы разместить код, который дает вам эту ошибку? Просто угадать, у вас есть что-то в коде, который выглядит как:

int a = 1; 
int b = 2; 
double result = pow(a, b); 

Вопрос заключается в том, что оба аргументов, передаваемых pow являются int s, но нет перегрузки pow в math.h, что бы два int сек , Компилятор сообщает вам, что у него возникают проблемы при перегрузке, поскольку в этом случае наилучшая жизнеспособная функция не уникальна.

Вы можете исправить это путем заливки первого параметра для соответствующего типа, такие как double:

double result = pow((double)a, b); 

Больше в целом, так как есть много много изменений, это должно быть хорошо, если вы могли бы уменьшить объем вашего вопроса .. Планируете ли вы также конвертировать устаревший код MFC?

Однако, разместите свои ошибки, я недавно обновил несколько старых проектов, чтобы я мог вам помочь.

0

Сравните стандарты C11 с версией Visual Studio, с которой вы работаете, скорее всего, C99.

Наибольшие изменения, внесенные C99 являются:

◾Variable массивы длины

◾Designated Инициализаторы

◾Type-родовое математике библиотека

◾New: типы данных долго долго, _Complex , _Bool

Ограничительные указатели

◾Intermingled объявления переменных

◾Inline функции

комментарии ◾One строки, начинающиеся с //

Наибольшие изменения в С11:

Новый набор безопасных стандартных функций, направленных на замените традиционные небезопасные функции. Для типичного программиста на C самым большим изменением в C11 является стандартизованная поддержка многопоточности.

Новый заголовочный файл C11 объявляет функции для создания и управления потоками, мьютексами, переменными условий и классификатором типа _Atomic. Другой новый заголовочный файл объявляет возможности доступа к объектам без прерывания. Наконец, C11 представляет новый спецификатор класса хранения _Thread_local (эквивалент C для потока C++ 11 thread_local). Переменная, объявленная _Thread_local, не разделяется несколькими потоками. Скорее, каждый поток получает уникальную копию.

Информация Вытащил От: http://blog.smartbear.com/codereviewer/c11-a-new-c-standard-aiming-at-safer-programming/

хорошо читать, если у вас есть время.

Смежные вопросы