• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błędy kompilacji Visual Studio 2017 c++

+1 głos
263 wizyt
pytanie zadane 13 marca w C i C++ przez qbic22562 Nowicjusz (210 p.)
Czesć wszystkim!

Zaczynam pisac pierwsze aplikacje okienkowe, przerabiajac kurs MZ. Średnio podoba mi sie środowisko Borland wiec postanowiłem, że zainstaluje Visual Studio 2017. Wiem, że może jest to za bardzo rozbudowane środowisko dla początkującego, ale bardzo przyciąga mnie design, no cóż, jestem osobą, która przywiązuje dużą wagę do takich aspektów. Przechodząc do meritum, napotkałem problemy i to przy 'testowym' kompilowaniu wczesniej napisanej przeze mnie aplikacji konsolowej, która pisałem w code blocks, która rzecz jasna działała poprawnie w tamtym środowisku.

Próbowałem na różne sposoby, importując, wklejając kod; ale program nie chce się kompilować. Co poradzić w takiej sytuacji? Co jest tego przyczyną? Czy dzieje się tak w każdym środowisku? Do tej pory myślałem, że kod który napisze jest uniwersalny i odpale go w każdym środowisku :/

Pozdrawiam i z góry dziękuje, za pomoc w rozwiazaniu problemu!
komentarz 13 marca przez Criss Mędrzec (152,420 p.)
Pokaż kod i błędy.

4 odpowiedzi

0 głosów
odpowiedź 13 marca przez k222 Pasjonat (21,560 p.)

Fajnie jakbyś pokazał kod, ale tak w ciemno to jedną z rzeczy specyficznych w VS jest to że ona potrzebuje dodatkowej biblioteki - chyba to ta:

#include "stdafx.h"

i może wklejając ją po prostu usunąłeś - więc to sprawdź

komentarz 13 marca przez Sebastian Fojcik Nałogowiec (42,510 p.)

Z tym #include "stdafx.h" to nieprawda, że VS potrzebuje tej biblioteki.

Wystarczy przy tworzeniu projektu (w VS 2017) nie wybierać "Windows Console Application", tylko "Windows Desktop Wizard", a następnie wybrać "Console Application", "Empty Project" i odznaczyć niepotrzebne "śmieci":

0 głosów
odpowiedź 13 marca przez qbic22562 Nowicjusz (210 p.)
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <conio.h>
#include <windows.h>

using namespace std;

const int BLACK = 0;
const int BLUE = 1;
const int GREEN = 2;
const int CYAN = 3;
const int RED = 4;
const int MAGENTA = 5;
const int BROWN = 6;
const int LIGHTGRAY = 7;
const int DARKGRAY = 8;
const int LIGHTBLUE = 9;
const int LIGHTGREEN = 10;
const int LIGHTCYAN = 11;
const int LIGHTRED = 12;
const int LIGHTMAGENTA = 13;
const int YELLOW = 14;
const int WHITE = 15;

static int __BACKGROUND = BLACK;
static int __FOREGROUND = LIGHTGRAY;


int xr[100000], yr[100000], licznik, punkty = 10000;

void gotoxy(int x, int y);
void textbackground(int color);
void textcolor(int color);
int wherex();
int wherey();
void cursorOff();
void cursorOn();
string pl(string text);
void center_txt(string text);
void ramka_1(int xp, int yp, int xk, int yk);
void ramka_2(int xp, int yp, int xk, int yk);

void potega();
double oblicz(bool war);
void losuj();
void sprawdz();
void szereg_symulacji();

int main()
{
	char c;
	do
	{
		system("CLS");
		textcolor(CYAN); gotoxy(2, wherey() + 1);
		cout << "------------------------OPIS-----------------------" << endl; gotoxy(2, wherey() + 1); textcolor(LIGHTGRAY);
		cout << "Obliczanie prawdopodobienstwa dla losowo wybranego " << endl; gotoxy(2, wherey() + 1);
		cout << "punktu okregu, czy wyznaczona za jego pomoca       " << endl; gotoxy(2, wherey() + 1);
		cout << "cieciwa, jest dluzsza od promienia tego okregu.    " << endl; gotoxy(2, wherey() + 1);
		cout << "Domyslna ilosc punktow: " << punkty << endl;                  gotoxy(2, wherey() + 1); textcolor(CYAN);
		cout << "---------------------------------------------------" << endl;
		ramka_1(1, 1, 54, wherey());

		cout << endl << endl;

		gotoxy(2, wherey() + 2);
		cout << "------------------------MENU-----------------------" << endl; gotoxy(2, wherey() + 1); textcolor(LIGHTGRAY);
		cout << "1. Przeprowadz pojedyncza symulacje                " << endl; gotoxy(2, wherey() + 1);
		cout << "2. Zmien domyslna ilosc punktow {10...10000}       " << endl; gotoxy(2, wherey() + 1);
		cout << "3. Przeprowadz szereg symulacji                    " << endl; gotoxy(2, wherey() + 1);
		cout << "4. Wyjscie!                                        " << endl; gotoxy(2, wherey() + 1); textcolor(CYAN);
		cout << "---------------------------------------------------" << endl;
		ramka_1(1, wherey() - 12, 54, wherey());
		textcolor(LIGHTGRAY); gotoxy(1, wherey() + 2); cursorOff();

		c = getch();
		switch (c)
		{
		case '1': oblicz(false);
			break;
		case '2': cout << " Wprowadz domyslna ilosc punktow: ";
			cin >> punkty;
			break;
		case '3': szereg_symulacji();
			break;
		}
	} while (c != '4');

	return 0;
}

int potega(int a, int n)
{
	int wynik = 1;
	if (n != 0)
	{
		for (int i = 0; i<n; i++)
			wynik = wynik * a;
		return wynik;
	}
	else
		return wynik;
}

void losuj()
{
	int x, y, i = 0;
	srand(time(NULL));

	while (i<punkty)
	{
		x = rand() % 401;
		y = rand() % 401;
		double sprawdz = sqrt(potega(200 - x, 2) + potega(200 - y, 2));
		if (sprawdz<200)
		{
			xr[i] = x;
			yr[i] = y;
			i++;
		}
	}
	return;
}

void sprawdz()
{
	licznik = 0;
	for (int i = 0; i<punkty; i++)
	{
		double cieciwa = 2 * (sqrt(potega(200, 2) - potega(200 - xr[i], 2) - potega(200 - yr[i], 2)));
		if (cieciwa>200)
			licznik++;
	}
	return;
}

double oblicz(bool war)
{
	losuj();
	sprawdz();
	double(pr) = double(licznik) / double(punkty);

	cout << " Prawdopodobienstwo wynosi: " << pr << endl;

	if (war == false)
	{
		cout << " Nacisnij dowolny klawisz, by kontynuowac.." << endl;
		while (getch() == '\0');
	}
	else
		return pr;
}

void szereg_symulacji()
{
	int n;
	int suma = 0, a;
	cout << " Podaj ilosc symulacji: ";
	cin >> n;
	system("CLS");

	for (int i = 0; i<n; i++)
	{
		cout << i + 1 << ".";
		suma = suma + oblicz(true);
		if (n<100)
			Sleep(50);
	}

	cout << "Nacisnij dowolny klawisz, by kontynuowac.." << endl;
	while (getch() == '\0');
	return;
}

void gotoxy(int x, int y)
{
	COORD c;
	c.X = x - 1;
	c.Y = y - 1;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

void textbackground(int color)
{
	__BACKGROUND = color;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
		__FOREGROUND + (color << 4));
}

void textcolor(int color)
{
	__FOREGROUND = color;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
		color + (__BACKGROUND << 4));
}

void textattr(int _attr)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), _attr);
}

int wherex()
{
	CONSOLE_SCREEN_BUFFER_INFO info;

	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
	return info.dwCursorPosition.X + 1;
}

int wherey()
{
	CONSOLE_SCREEN_BUFFER_INFO info;

	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
	return info.dwCursorPosition.Y + 1;
}

void cursorOff()
{
	CONSOLE_CURSOR_INFO Info;

	GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Info);
	Info.bVisible = 0;
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Info);
}

void cursorOn()
{
	CONSOLE_CURSOR_INFO Info;

	GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Info);
	Info.bVisible = -1;
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Info);
}

string pl(string text)
{
	char c;
	for (int i = 0; i<text.length(); i++)
	{
		switch (text[i])
		{
		case 'ą': c = 165; break;
		case 'ć': c = 134; break;
		case 'ę': c = 169; break;
		case 'ł': c = 136; break;
		case 'ń': c = 228; break;
		case 'ó': c = 162; break;
		case 'ś': c = 152; break;
		case 'ż': c = 190; break;
		case 'ź': c = 171; break;
		case 'Ą': c = 164; break;
		case 'Ć': c = 143; break;
		case 'Ę': c = 168; break;
		case 'Ł': c = 157; break;
		case 'Ń': c = 227; break;
		case 'Ó': c = 224; break;
		case 'Ś': c = 151; break;
		case 'Ż': c = 189; break;
		case 'Ź': c = 141; break;
		default:   c = text[i];
		}
		text[i] = c;
	}
	return text;
}

void center_txt(string text)
{
	gotoxy(1 + (80 - text.length()) / 2, wherey());
	cout << text << endl;
}

void ramka_1(int xp, int yp, int xk, int yk)
{
	char lg = 218,
		ld = 192,
		pg = 191,
		pd = 217,
		linia_poz = 196,
		linia_pion = 179;

	gotoxy(xp, yp); cout << lg;
	gotoxy(xp, yk); cout << ld;
	gotoxy(xk, yp); cout << pg;
	gotoxy(xk, yk); cout << pd;
	for (int i = xp + 1; i <= xk - 1; i++)
	{
		gotoxy(i, yp); cout << linia_poz;
		gotoxy(i, yk); cout << linia_poz;
	}
	for (int i = yp + 1; i <= yk - 1; i++)
	{
		gotoxy(xp, i); cout << linia_pion;
		gotoxy(xk, i); cout << linia_pion;
	}
}

void ramka_2(int xp, int yp, int xk, int yk)
{
	char lg = 201,
		ld = 200,
		pg = 187,
		pd = 188,
		linia_poz = 205,
		linia_pion = 186;

	gotoxy(xp, yp); cout << lg;
	gotoxy(xp, yk); cout << ld;
	gotoxy(xk, yp); cout << pg;
	gotoxy(xk, yk); cout << pd;
	for (int i = xp + 1; i <= xk - 1; i++)
	{
		gotoxy(i, yp); cout << linia_poz;
		gotoxy(i, yk); cout << linia_poz;
	}
	for (int i = yp + 1; i <= yk - 1; i++)
	{
		gotoxy(xp, i); cout << linia_pion;
		gotoxy(xk, i); cout << linia_pion;
	}
}


Błąd (aktywny)    E0349    żaden operator "<<" nie pasuje do tych argumentów operacji  (274)    

Błąd    C4996    'getch': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getch. See online help for details.    (174) 

Błąd    C4996    'getch': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getch. See online help for details.    (151)   

Błąd    C4996    'getch': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _getch. See online help for details.    (79)      

 

 

komentarz 13 marca przez qbic22562 Nowicjusz (210 p.)

Udało mi się już rozwiązać problem dotyczący getch(), ale dalej nie rozumiem czego dotyczy błąd z operatorem "<<". 

Co do 

#include "stdafx.h"

to nie pomaga, pisze, że nie może otworzyć zródła "stdafx.h"

 

komentarz 13 marca przez k222 Pasjonat (21,560 p.)

Co do biblioteki to otwórz nowy projekt i zobacz czy nie masz czasem już jej lub jakiejś innej tam wklejonej - jak tak to weź tamtą, jak nie to możesz spróbować czy coś typu Hello World zadzaiła bez dodatkowych bibliotek, jak tak to może nie trzeba - ja pamiętam że mi kiedyś krzyczało o tą bibliotekę ale nie wiem.

Co do błędu to spróbuj wszędzie zamienić getch na _getch czy zadziałą, poza tym tutaj: he POSIX name for this item is deprecated. wydaje się że rozwiązali ten problem, możesz poczytać i zrobić to samo

komentarz 13 marca przez Qwerty96 Stary wyjadacz (13,680 p.)
Brakuje #include <string>. Co do reszty błędów, to masz napisane co powinieneś zrobić: zmienić getch na _getch.
0 głosów
odpowiedź 13 marca przez qbic22562 Nowicjusz (210 p.)
Dobrze, moge troszke podsumowac:

1. Musiałem dodac biblioteke <string>

2. Wszystkie getch() zamienic na _getch()

3. Obyło sie bez "stdafx.h"

Sprawdziłem działanie tego programu i innych które pisałem, teraz wszystko śmiga więc dziękuję za pomoc. Temat do zamknięcia, chyba, że ktoś jest wstanie wytłumaczyć z czego wynikają takie rożnice w kompilacji w różych środowiskach, chętnie poczytam :)
0 głosów
odpowiedź 13 marca przez Sebastian Fojcik Nałogowiec (42,510 p.)
edycja 13 marca przez Sebastian Fojcik

Co do <string>, to wiele środowisk dołącza tą bibliotekę do kompilacji jakby automatycznie. Bez Twojej wiedzy. Dlatego złą praktyką jest niedodawanie <string>, bo później wychodzą takie problemy, z którymi się tutaj spotkałeś, że coś się nie kompiluje. 

Osobiście również korzystam z Visual Studio, myślę, że Twoja decyzja o zmianie była słuszna, a VS szybko nauczy Cię dbać o takie drobnostki, bo jest bardziej rygorystyczny niż GCC, w którym zapewne wcześniej kompilowałeś projekty.

Różnica pomiędzy _getch() a getch(), to decyzja Microsoftu. Musisz wiedzieć coś o konwencjach w nazewnictwie funkcji i bibliotek. Otóż,

- jeśli jakaś biblioteka jest standardową biblioteką C++, która powinna być dostępna na każdym systemie, gdzie kompilujesz swój program, to jej nagłówek przybiera formę <nazwa>, czyli: nie ma ".h" na końcu, np. <string> <cmath> <iostream> <fstream>  itd.

- jeśli jakaś biblioteka nie jest standardową biblioteką C++, ale mimo to została dołączona przez środowisko jako standardowa (czyli możesz ją sobie dołączyć do projektu w ostrych nawiasach), to jej nazwa przybiera formę <nazwa.h>. Takie biblioteki, to m. in. wszystkie stare biblioteki z języka C: <string.h> <math.h> <stdio.h> <ctype.h> (C++ ma swoje odpowiedniki <cstring> <cmath> <cstdio> <cctype> i to z nich należy korzystać), ale takie nazwy mają również biblioteki specyficzne dla danego systemu, czyli np. takie, które możesz dołączyć tylko do programu na Windowsie, np. <Windows.h> <conio.h> - tych bibliotek nie ma na Linuksie.

I teraz dochodzimy do kwestii nazewnictwa funkcji z takich bibliotek. Microsoft uznał, że: jeśli biblioteka nie jest standardową biblioteką C++, a mimo to została dołączona jako standardowa (np. <conio.h>), to funkcje z takiej biblioteki będą poprzedzone znakiem "_". Służy to temu, aby nie zajmować nazw programiście, bo jak dołączysz taką bibliotekę, to już nie możesz używać nazwy "getch". Dzięki tej konwencji - możesz :-)

Drobna uwaga: pisałem wyżej, że "Microsoft uznał". Na oficjalnej stronie Microsoftu z dokumentacją conio.h jest napisane, że nazwa "getch" została zamieniona na "_getch" z uwagi na zgodność ze standardem ISO C++. Niestety nie mam wystarczającej wiedzy, aby potwierdzić, czy rzeczywiście standard języka wymaga takiego nazewnictwa (jakoś innym środowiskom i autorom bibliotek nie pali się do zmiany).

https://msdn.microsoft.com/pl-pl/library/ms235446.aspx

"stdafx.h" to dodatek, który znajdziesz w projektach Visual Studio i w skrócie (wielkim) służy, do optymalizacji programu konsolowego. Po prostu szybciej aplikacja działa dzięki temu. Osobiście nigdy z tego nie korzystałem.

Jakbyś miał jakieś pytania, to pytaj śmiało :-)

komentarz 14 marca przez qbic22562 Nowicjusz (210 p.)
Dzięki za odpowiedz, dowiedziałem się nawet więcej niż potrzebowałem :)

Skoro mogę pytać śmiało, to chętnie spytam jeszcze o kilka aspektów związanych z VS :)

Jako, ze zaczynam pisac aplikacje okienkowe (wlasciwie w tym celu pobrałem VS) to mógłbyś wytłumaczyć jak to ugryźć? Czy da się to robic jak w Borlandzie, tj. czy ma się jakieś gotowe klasy, które można rozmieszczać graficznie? Gdzieś wyczytałem, ze w przypadku C++ jest to niemożliwe, ze Microsoft wspiera takie rozwiązanie tylko  dla C#.
komentarz 14 marca przez Sebastian Fojcik Nałogowiec (42,510 p.)
Dobrze wyczytałeś. C# się wyśmienicie nadaje do pisania aplikacji okienkowych (jest bardzo podobny do C++, jest tylko w pełni obiektowy). Visual Studio daje Ci 2 możliwości wygodnego tworzenia aplikacji okienkowych w C#.

1. Windows Forms - dosyć wiekowa technologia, ale ma mnóstwo gotowych do użycia funkcji.

2. WPF - stosunkowo młode rozwiązanie, które przy tworzeniu aplikacji pozwala oddzielić mechanikę aplikacji od jej wyglądu (przyciski, pola edycyjne itd.)

Możesz z powodzeniem przerobić obiektówkę w C++ i zacząć pisać aplikację w C#. Jeśli jednak bardzo chcesz wykorzystać wiedzę z C++ i pisać aplikacje okienkowe w sposób drag&drop (przeciągnij i upuść), to może powinieneś się zainteresować Qt?

Qt to zbiór bibliotek oraz środowisko w jednym. Nie jest to przestarzałe rozwiązanie, ma całe mnóstwo gotowych funkcji, całkiem bogatą społeczność w Internecie, więc na pewno łatwo będzie Ci zacząć. No i Qt pozwala tworzyć też aplikacje na Androida nawet, ale to już troszkę wyższy poziom abstrakcji :-)
komentarz 14 marca przez qbic22562 Nowicjusz (210 p.)
Czytałem troszkę i znalazłem jak zastosować (nie wiem czy to dobre słowo?) WindowsForms dla C++ w VS. Tutaj link dla zainteresowanych:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/e6fbde42-d872-4ab3-8000-41ab22a4a584/visual-studio-2017-windows-forms?forum=winformsdesigner

Jest to chyba rozwiązanie przestarzałe, a na pewno bez wsparcia; w każdym razie spróbuje się troszkę pobawić. Na razie postanowiłem, że przerobie do końca kurs obiektówki pana Zelenta, próbując adaptować niektóre projekty do VS. Potem zapewne spróbuje z QT lub C# :)

Podobne pytania

0 głosów
1 odpowiedź 610 wizyt
0 głosów
1 odpowiedź 36 wizyt
0 głosów
1 odpowiedź 143 wizyt
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

57,459 zapytań

102,435 odpowiedzi

211,298 komentarzy

29,237 pasjonatów

Przeglądających: 386
Pasjonatów: 28 Gości: 358

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...