22:43
language: polish language: english
Błędy kompilacji
Na moim komputerze program się kompiluje, po wysłaniu na STOS nie chce
Co oznacza błąd "error C2679: binary ’<<’ : no operator found which takes a right-hand operand of type ’std::string’…"
Co oznacza błąd "error C4700: uninitialized local variable ... used"
Co oznacza błąd "error C4715: ... not all control paths return a value"
Co oznacza błąd "error C4716: ... must return a value"
Co oznacza błąd "error C4717: ...: recursive on all control paths, function will cause runtime stack overflow"
Co oznacza błąd "error LNK2005: ... already defined in ..."
Co oznacza błąd "fatal error LNK1169: one or more multiply defined symbols found"
Błędy wykonania
Co to jest "ślad stosu"
Co to oznacza wyjątek "naruszenie ochrony dostępu"
Co to oznacza wyjątek "przepełnienie stosu"
Co to oznacza wyjątek "zabroniona operacja"

Błędy kompilacji

Na moim komputerze program się kompiluje, po wysłaniu na STOS nie chce
Zachowanie takie może mieć kilka przyczyn:
  • niezgodność kompilatorów – jeżeli korzystasz z niestandardowych rozszerzeń kompilatora (np. inline asembler)
  • błędy C4700, C4715, C4716, C4717 – domyślnie kompilator zgłasza te uwagi jako ostrzeżenia, ale usterki te są na tyle poważne, że należy je wyeliminować (inaczej stałyby się kolejnymi błędami "u mnie działa, na STOSie nie")
Co oznacza błąd "error C2679: binary ’<<’ : no operator found which takes a right-hand operand of type ’std::string’…"
Na początku programu brakuje #include<string>.
Co oznacza błąd "error C4700: uninitialized local variable ... used"
Błąd ten mówi, że w programie wykorzystana jest zmienna, która nie została zainicjalizowana, np.
int z; // powinno być np. z = 5;
printf("%d", z);
Zazwyczaj powoduje to tylko ostrzeżenie kompilatora, ale tu należy tę usterkę bezwzględnie poprawić.
Co oznacza błąd "error C4715: ... not all control paths return a value"
W kodzie istnieje funkcja, która w jakimś przypadku nie zwraca wartości. Np.:
int fn(int p) {
	if(i == 0) return 3;
	//brak else return ...;
	}
Zazwyczaj powoduje to tylko ostrzeżenie kompilatora, ale tu należy tę usterkę bezwzględnie poprawić.
Co oznacza błąd "error C4716: ... must return a value"
W kodzie istnieje funkcja, która, mimo deklaracji, nie zwraca wartości. Np.:
int fn(int p) {
	printf("%d", p);
	//brak return ...;
	}
Zazwyczaj powoduje to tylko ostrzeżenie kompilatora, ale tu należy tę usterkę bezwzględnie poprawić.
Co oznacza błąd "error C4717: ...: recursive on all control paths, function will cause runtime stack overflow"
W kodzie istnieje funkcja, która jest nieskończenie rekursywna. Wywołanie takiej funkcji zakończy się błędem przepełnienia stosu. Np.:
int fn(int p) {
	//brak np. if(p == 0) return 0;
	return 1 + fn(p-1);
	}
Zazwyczaj powoduje to tylko ostrzeżenie kompilatora, ale tu należy tę usterkę bezwzględnie poprawić.
Co oznacza błąd "error LNK2005: ... already defined in ..."
Co oznacza błąd "fatal error LNK1169: one or more multiply defined symbols found"
Błąd ten mówi, że w programie znalazła się więcej niż jedna funkcja o danej nazwie (np. dwa main-y). Prawdopodobnie zostały zgłoszone dwa pliki, z których każdy jest kompletnym rozwiązaniem (np. raz wskazując plik z dysku, drugi raz wklejając kod, którego domyślną nazwą jest main.cpp). Należy usunąć jeden z tych plików i wysłać ponownie zgłoszenie.

Błędy wykonania

Co to jest "ślad stosu"
Jest to historia wykonania programu. Na szczycie znajduje się funkcja w której się znajdujemy (opisana w formacie <plik>: <numer linii> <nazwa funkcji i jej parametry>), poniżej znajduje się funkcja (i miejsce w tej funkcji), z której wywołaliśmy funkcję na szczycie stosu, dalej jest miejsce, skąd wywołaliśmy drugą funkcję itd.. Naciśnięcie znaku + przy nazwie pliku spowoduje rozwinięcie sekcji z zawartością zmiennych lokalnych w momencie wywołania.
Co to oznacza wyjątek "naruszenie ochrony dostępu"
Wyjątek ten mówi, że program próbował uzyskać dostęp do pamięci, do której nie ma prawa. Najczęstsze przyczyny to wyjście poza tablicę, użycie wskaźnika o wartości NULL lub użycie wskaźnika bez przypisania mu wartości. Komentarz do wyjątku (linia niżej) mówi, czy próbowano odczytać czy zapisać zabroniony obszar oraz podaje jego adres. Jeżeli adres ten nie jest NULL, ale jest bardzo mały (np. 0x00000004 czy 0x00000010), oznacza to, że próba dotyczyła pola struktury, której adres miał wartość NULL (np. *p = NULL; p->next = 4;).Wartość adresu 0xCCCCCCCC najprawdopodobniej oznacza użycie niezainicjalizowanego wskaźnika (zmiennej lokalnej), 0xDDDDDDDD lub 0xFEEEFEEE użycie zwolnionej pamięci, 0xABABABAB,c0xCDCDCDCD lub 0xBAADF00D użycie niezainicjalizowanego wskaźnika w obszarze pamięci przydzielonej dynamicznie.
Co to oznacza wyjątek "przepełnienie stosu"
Oznacza on albo zbyt głęboką rekurencję (jeżeli w śladzie stosu widać wiele kolejnych wywołań powtarzających się funkcji) albo wyczerpanie się miejsca na zmienne lokalne. O ile zadanie nie określa inaczej, stos ma rozmiar 1020KB. Jeżeli funkcja main deklaruje tablicę na 0.5MB, woła funkcję f1, która deklaruje tablicę na 0.3MB i woła funkcję f2, która potrzebuje kolejne 0.3MB, to w momencie wywołania f2 zostanie rzucony wyjątek przepełnienia stosu – potrzeba 1.1MB, gdy dostępne jest tylko 1MB.
Co to oznacza wyjątek "zabroniona operacja"
Sygnalizuje on próbę wykonania operacji, która nie jest dozwolona na STOSie. Są to operacje takie jak tworzenie nowych procesów, wątków, otwieranie plików (o ile zadanie tego nie wymaga), czy nawiązywanie połączeń sieciowych. Wyjątek ten zgłaszany jest także w momencie próby alokacji bloku pamięci o większym niż dozwolony w zadaniu rozmiarze (o ile nie zaznaczono inaczej, zadanie nie posiada limitu rozmiaru alokacji).
Uwaga: Funkcja system próbuje utworzyć nowy proces, nie należy więc wołać system("pause"); na końcu programu.