Возникли проблемы с 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;
}

person azgt    schedule 28.10.2014    source источник
comment
ВК6++?!! Да, вы столкнетесь с множеством изменений. Я удивлюсь, если у кого-нибудь есть хоть какой-нибудь достаточно полный список, но я полагаю, что спросить не помешает. Сообщение об ошибке сообщает вам, что pow имеет более одного определения, и ваш вызов не соответствует ни одному из них.   -  person Carey Gregory    schedule 28.10.2014
comment
Вы все еще можете использовать scanf, предупреждения об этом можно игнорировать   -  person M.M    schedule 28.10.2014
comment
неоднозначный вызов перегруженного предполагает, что вы используете компилятор C++, а не C.   -  person chux - Reinstate Monica    schedule 29.10.2014
comment
Я думаю, что VS2013 предоставляет только вариант C++,   -  person azgt    schedule 30.10.2014


Ответы (2)


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

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

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

Это можно исправить, приведя первый параметр к подходящему типу, например double:

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

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

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

person gmas80    schedule 28.10.2014

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

Самые большие изменения, внесенные C99, заключаются в следующем:

◾Массивы переменной длины

◾Назначенные инициализаторы

◾Общая математическая библиотека типов

◾Новые типы данных: long long, _Complex, _Bool

◾ограничить указатели

◾Перемешанные объявления переменных

◾Встроенные функции

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

Самые большие изменения в C11:

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

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

Информация взята с: http://blog.smartbear.com/codereviewer/c11-a-new-c-standard-aiming-at-safe-programming/

Доброго чтения, если у вас есть время.

person Mike_V    schedule 28.10.2014