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

problem z kompilowaniem się kodu c++

Object Storage Arubacloud
0 głosów
183 wizyt
pytanie zadane 11 października 2020 w C i C++ przez antekelektronik Obywatel (1,120 p.)

witam , wiem że tytuł i pytanie może niezbyt dokładne ale mam problem. nie za bardzo nawet rozumiem tego błędu . robiłem spokojnie sobie obiektową aplikacje w konsoli z użyciem c++ kiedy kod przestał się kompilować , nie wiem dlaczego. opisy błędów też nie mówią za wiele. oto kod:

//KOPIA ZAPASOWA BO TO WAŻNE RZECZY:

//bylo wczesniej w oddzielnym pliku ale mialem problem z includowaniem
//char sp = 152; // ś si sp = polskie s
//char ap = 165; // ą oł sp = polskie a
//char ep = 169; // ę eł ep = polskie e
//char zi = 171; // ź zi zi = po prostu zi
//char lp = 136; // ł ly lp = polskie l
//char op = 162; //ó u op = polskie o
//char cp = 134; //ć ci cp = polskie c
//char np = 228; //ń ni np = polskie n




#include <iostream>
#include <Windows.h>
#include "elementy.h"
#include <cwchar>

using namespace std;

void startup();

int main() {
	//Naglowek n1;
	//n1.wczytaj();
	return 0;
}

void startup() { // te rzeczy na poczatku
	system("cls");
	cout << "KREATOR STRON INTERNETOWYCH !" << endl;
	cout << "\t\t made by antek :)" << endl;
	Sleep(1000);

	enter();
	system("cls");

	bool czynowosc = false;

	while (czynowosc == false) {
		cout << "kreator stron internetowych jest teraz obiektowy!" << endl << "1.wi" << ep << "cej" << endl << "2.pomi" << np;

	}
}

 

#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>

using namespace std;

//bylo wczesniej w oddzielnym pliku ale mialem problem z includowaniem
char sp = 152; // ś si sp = polskie s
char ap = 165; // ą oł sp = polskie a
char ep = 169; // ę eł ep = polskie e
char zi = 171; // ź zi zi = po prostu zi
char lp = 136; // ł ly lp = polskie l
char op = 162; //ó u op = polskie o
char cp = 134; //ć ci cp = polskie c
char np = 228; //ń ni np = polskie n

void enter();

class Naglowek {
private:
	string nazwa; //name (tresc)
	int rozmiar; //size (wielkosc)
	string kolor; // color (kolor)
	string bcgkolor; // background-color (kolor tla)
public:
	void wczytaj();

};

 

 

#include "elementy.h"

using namespace std;

void enter() { // po prostu enter aby kontynuowac :)
	cout << endl << "(enter aby kontynuowa" << cp << ")";
	_getch();
}

void Naglowek::wczytaj() {
	system("cls");
	cout << "WCZYTYWANIE KREATORA NAG"<<lp<<op<<"WKA...";
	Sleep(500);
	system("cls");

	cout << "wpisz tresc nag"<< lp << op << "wka: ";
	getline(cin, nazwa);
	enter();
	system("cls");

	wielkoscnaglowkagoto:

	string size; // zabezpieczenia jakby uzytkownik wpisal litere zamiast liczby
	cout << "wpisz wielko"<<sp<<cp<<" naglowka od 1 najmniejszy do 5 najwiekszy: ";
	getline(cin, size);
	
	// zamiana odpowiedzi na gotowy wynik
	// w HTML jest tak ze najwiekszy naglowek to h1 a najmniejszy to 5 , z tad te ify
	if (size == "1") rozmiar = 5;
	else if (size == "2") rozmiar = 4;
	else if (size == "3") rozmiar = 3;
	else if (size == "4") rozmiar = 2;
	else if (size == "5") rozmiar = 1;
	else { system("cls"); cout << "wprowad" << zi << " odpowiedni" << ap << " liczb" << ep << "! "; Sleep(1000); goto wielkoscnaglowkagoto; system("cls"); }

	enter();
	system("cls");
	
	naglowekkolor:

	cout << "wybierz kolor t" << lp << "a: ";
	cout << endl << "1.czarny";
	cout << endl << "2.czerwony";
	cout << endl << "3.z"<<op<<lp<<"ty";
	cout << endl << "4.zielony";
	cout << endl << "5.niebieski";
	cout << endl << endl << "wpisz odpowiedni" << ap << " liczb" << ep << ": ";
	
	int kolorek = 0; // tymczasowy bufor , po zakończeniu funkcji zostanie zniszczony
	cin >> kolorek;
	if (((((kolorek == 1) || (kolorek == 2)) || (kolorek == 3)) || (kolorek == 4)) || (kolorek == 5)) {} // kolejne zabezpieczenie (twm razem sprytniejsze)
	else {
		system("cls"); cout << "wpisz odpowiedni" << ap << " LICZB" << ep << "!"; Sleep(1500); goto naglowekkolor; system("cls");
	}
	switch (kolorek) {
	case 1: kolor = "black"; break;
	case 2: kolor = "red"; break;
	case 3: kolor = "yellow"; break;
	case 4: kolor = "green"; break;
	case 5: kolor = "blue"; break;
	}
	enter();
	system("cls");

	cout << "wybierz kolor tekstu:";
	cout << endl << "1.czarny";
	cout << endl << "2.czerwony";
	cout << endl << "3.z" << op << lp << "ty";
	cout << endl << "4.zielony";
	cout << endl << "5.niebieski";
	cout << endl << endl << "wpisz odpowiedni" << ap << " liczb" << ep << ": ";


	int  bgc; // tymczasowy bufor , po zakończeniu funkcji zostanie zniszczony. background color
	cin >> bgc;
	if (((((bgc == 1) || (bgc == 2)) || (bgc == 3)) || (bgc == 4)) || (bgc == 5)) {} // kolejne zabezpieczenie (twm razem sprytniejsze)
	else {
		system("cls"); cout << "wpisz odpowiedni" << ap << " LICZB" << ep << "!"; Sleep(1500); goto naglowekkolor; system("cls");
	}
	switch (bgc) {
	case 1: bcgkolor = "black"; break;
	case 2: bcgkolor = "red"; break;
	case 3: bcgkolor = "yellow"; break;
	case 4: bcgkolor = "green"; break;
	case 5: bcgkolor = "blue"; break;
	}
	enter();
	system("cls");
	
	//zakonczenie

	cout << "naglowek pomy" << sp << "lnie dodany!" << endl;
	enter();
	system("cls");
}

oraz jeszcze plik .log

 

main.obj : error LNK2005: Element "char sp" (?sp@@3DA) jest już zdefiniowany w elemencie elementy.obj
main.obj : error LNK2005: Element "char ap" (?ap@@3DA) jest już zdefiniowany w elemencie elementy.obj
main.obj : error LNK2005: Element "char ep" (?ep@@3DA) jest już zdefiniowany w elemencie elementy.obj
main.obj : error LNK2005: Element "char zi" (?zi@@3DA) jest już zdefiniowany w elemencie elementy.obj
main.obj : error LNK2005: Element "char lp" (?lp@@3DA) jest już zdefiniowany w elemencie elementy.obj
main.obj : error LNK2005: Element "char op" (?op@@3DA) jest już zdefiniowany w elemencie elementy.obj
main.obj : error LNK2005: Element "char cp" (?cp@@3DA) jest już zdefiniowany w elemencie elementy.obj
main.obj : error LNK2005: Element "char np" (?np@@3DA) jest już zdefiniowany w elemencie elementy.obj
C:\Users\Antek\source\repos\kreator stron internetowych 3\Debug\kreator stron internetowych 3.exe : fatal error LNK1169: znaleziono co najmniej jeden wielokrotnie zdefiniowany symbol
 

nie rozumiem za bardzo tych błędów i nie wiem czego mogą dotyczyć , te polskie znaki zadeklarowałem raz i tylko raz , sprawdzałem kilka razy kod i nic nie wypatrzyłem.  dlatego piszę tu pytanie o co może chodzić i jak to naprawić. jeśli czegoś brakuje proszę napisać w komentarzu , jestem początkującym i nie za wiele wiem jeszcze o programowaniu obiektowym . z góry dziękuję za wszystkie odpowiedzi

i jeszcze może ta informacja się przyda. programuję w Visual Studio 2019

2 odpowiedzi

+1 głos
odpowiedź 11 października 2020 przez Oscar Nałogowiec (29,290 p.)
wybrane 11 października 2020 przez antekelektronik
 
Najlepsza

Plik elementy.h inkludujesz do main i do elementy.cpp. Deklaracja "polskich literek" w ten sposób występuje 2 razy w całym programie. Masz 2 wyjścia:

- w pliku h oznaczyć te deklaracje jako extern a to co jest przesunąć do jednego z plików .cpp.

- w pliku .h oznaczyć te deklaracje jako static. Wtedy będą istniały ich wielokrotne kopie, ale nie będą podlegały linkowaniu, będą "do użytku wewnętrznego" w każdym z plików.

Musisz pamiętać, że #include to zwykle wstawienie tekstu z jednego pliku do drugiego, nie ma tutaj żadnej mądrości.

komentarz 11 października 2020 przez tkz Nałogowiec (42,000 p.)
Żadna z wymienionych opcji nie jest dobrym rozwiązaniem w tym przypadku.
komentarz 11 października 2020 przez antekelektronik Obywatel (1,120 p.)
dzięki , oznaczyłem jako static i wszystko działa
komentarz 11 października 2020 przez j23 Mędrzec (194,920 p.)
edycja 11 października 2020 przez j23

Ten static to słabe rozwiązanie, lepiej zrób te zmienne częścią typu wyliczeniowego (enum) zdefiniowanego wewnątrz klasy Naglowek (dziwna nazwa).

Trzymaj się prostej zasady: jeśli jakaś zmienna jest tylko do odczytu, definiuj ją jako const lub - jeśli jest ich więcej i tworzą jakąś grupę - użyj typu wyliczeniowego.

komentarz 12 października 2020 przez Oscar Nałogowiec (29,290 p.)
Lista polskich literek jako enum? Dziwne rozwiązanie.

- enum to typ, jaki sens mogło by mieć utworzenie zmiennej takiego typu.

- jaki to ma związek z klasą nagłówek? Powinno być bytem niezależnym, w oddzielnym pliku.

- wartości enuma zwykle są typu int, nie dało by się tego łatwo użyć w cout jak w linii 92, trzeba by zdefiniować operator << dla tego typu by nie została wypisana liczba.

 

A tak ogólnie, to kto dzisiaj stosuje dziwne strony kodowe. Jest unicode. Daaawno temu, jeszcze w czasach DOS pisaliśmy na studiach różne konwertery plików tekstowych zapisanych w różnych kodowaniach (było chyba z 10 "standardów").
komentarz 12 października 2020 przez j23 Mędrzec (194,920 p.)

Lista polskich literek jako enum? Dziwne rozwiązanie.

Nie mniej dziwne niż zmienne (static).

IMO kody znaków diakrytycznych powinien wpisywać bezpośrednio w literałach.

- jaki to ma związek z klasą nagłówek?

Zmienne używane są w metodach tej klasy, więc nie ma powodu "brudzić" globalną przestrzeń nazw jakimiś wewnętrznymi stałymi.

wartości enuma zwykle są typu int

Może być char, jeśli chcesz.

trzeba by zdefiniować operator << dla tego typu by nie została wypisana liczba.

Wystarczy zwykły static_cast<char>.

A tak ogólnie, to kto dzisiaj stosuje dziwne strony kodowe.

W Windowsie to nie jest takie proste, jeśli nie chcesz używać znaków szerokich.

 

0 głosów
odpowiedź 11 października 2020 przez tkz Nałogowiec (42,000 p.)
No nie zupełnie raz. Nie masz niczego, co by blokowało kompilator przed wielokrotnym włączeniem pliku nagłówkowego do solucji.

https://www.learncpp.com/cpp-tutorial/header-guards/
komentarz 11 października 2020 przez j23 Mędrzec (194,920 p.)
Taka blokada, choć słuszna, chroni przed wielokrotnym załączeniem nagłówka w ramach jednej jednostki kompilacji, a nie że w ogóle w projekcie. Błąd dalej by występował, bo definiuje zmienne globalne w nagłówku, który jest załączany w dwóch miejscach (ergo: definiowane są dwa razy te same zmienne globalne).

Podobne pytania

0 głosów
0 odpowiedzi 167 wizyt
pytanie zadane 31 października 2021 w Systemy operacyjne, programy przez KitKetPolska Nowicjusz (240 p.)
+1 głos
5 odpowiedzi 1,594 wizyt
0 głosów
1 odpowiedź 2,466 wizyt
pytanie zadane 19 sierpnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,555 zapytań

141,402 odpowiedzi

319,539 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...