#visual-studio-2012 #clr
#visual-studio-2012 #clr
Вопрос:
У меня есть следующий код мини-игры (написанный в среде CLR, не заслуживающий полного прочтения):
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
using namespace System;
char map[15][15 1]={
"###############",
"#.............#",
"#.............#",
"#....#####....#",
"#.............#",
"#.............#",
"#.............#",
"######...######",
"#.............#",
"#.............#",
"#.............#",
"#....#####....#",
"#.............#",
"#.............#",
"###############"};
int x1,y1,x2,y2;
int val(int x, int y){
if(map[y][x]=='#') return 0;
if(x==x1 amp;amp; y==y1) return 0;
if(x==x2 amp;amp; y==y2) return 0;
return 1;
}
int main(array<System::String ^> ^args)
{
int x, y;
while(1){
cin>>x>>y;
if(x<0 || x>=15 || y<0 || y>=15 || map[y][x]=='#')
continue;
break;
}
while(1){
cin>>x1>>y1;
if(x1<0 || x1>=15 || y1<0 || y1>=15 || map[y1][x1]=='#')
continue;
break;
}
while(1){
cin>>x2>>y2;
if(x2<0 || x2>=15 || y2<0 || y2>=15 || map[y2][x2]=='#')
continue;
break;
}
system("cls");
for(int i=0;i<15; i) cout<<map[i]<<endl;
int d1=1,d2=1,choq=0;
while(1){
Sleep(100);
Console::SetCursorPosition(x,y);
cout<<".";
if(_kbhit()){
int dir=_getch();
if(dir==72){//ar
if(val(x,y-1)) y-=1;
else choq;
}
if(dir==75){//izq
if(val(x-1,y)) x-=1;
else choq;
}
if(dir==77){//der
if(val(x 1,y)) x =1;
else choq;
}
if(dir==80){//ab
if(val(x,y 1)) y =1;
else choq;
}
if(dir=='s' || dir=='S')
break;
}
Console::SetCursorPosition(x1,y1);
cout<<".";
Console::SetCursorPosition(x2,y2);
cout<<".";
if(map[y1 d1][x1]=='#' || (y1 d1==y amp;amp; x1==x)){
if(y1 d1==y amp;amp; x1==x) choq;
d1=-d1;
}
if(map[y2 d2][x2]=='#' || (y2 d2==y amp;amp; x2==x)){
if(y2 d2==y amp;amp; x2==x) choq;
d2=-d2;
}
y1 =d1;
y2 =d2;
Console::SetCursorPosition(x1,y1);
cout<<"#";
Console::SetCursorPosition(x2,y2);
cout<<"#";
Console::SetCursorPosition(x,y);
cout<<"#";
Console::SetCursorPosition(0,16);
cout<<choq <<" choques.";
}
Console::SetCursorPosition(0,17);
cout<<"Simulacion terminada.";
getchar();
getchar();
return 0;
}
Но когда я компилирую, я получаю ошибки, в которых говорится, что они x1, y1
имеют тип double (_cdecl*)(double)
. Если я заменю их имена на x_1, y_1
, проблема будет решена. Но почему это происходит? Я не могу найти это определение нигде во включенных заголовках, и IntelliSense не намекает мне о параметрах или типе, когда я пишу x1(
. Более того, Visual Studio 2012 не жалуется на строку
int x1,y1,x2,y2;
это переопределение.
Можете ли вы помочь мне разобраться в этом поведении?
Ответ №1:
Они являются устаревшими функциями Posix. Вы получили их из <math.h>
, добавленные <iostream>
.
Найденный вами обходной путь в порядке вещей. Эти варианты имен пришли из эпохи, когда программистам приходилось нажимать клавишу shift левой ногой, компьютеры все еще конкурировали с настольными калькуляторами, а сброс коротких имен идентификаторов в глобальное пространство имен не был такой большой проблемой, как сегодня. Имя идентификатора, подобное «y1», подходит для имени аргумента или локальной переменной.
Не так хорошо для глобальных переменных. Используйте описательные имена для глобальных файлов, вам все равно нужно нажать всего несколько клавиш. Функция автозаполнения редактора — ваш друг. Читатель вашего кода будет вам благодарен, как и компилятор.
Комментарии:
1. Да, я знаю, что структура моего кода не самая лучшая, я не собираюсь, чтобы в нем когда-либо было более 100 строк 🙂 Это действительно странная ошибка, спасибо за ваш ответ!
Ответ №2:
Раньше я часто получал подобную ошибку в Microsoft Developer Studio 6; это перестало происходить, когда я обновился до Visual Studio 2010. Я не знаю о версии 2012.
Было определение для y1 (но не x1), скрытое глубоко в заголовках. Попробуйте щелкнуть правой кнопкой мыши на «y1» и выбрать «Показать определение» из всплывающего окна.