Błąd "Run-time check failure #2 - S"

0

Dobry wieczór, mógłby ktoś mi znaleźć winowajcę błędu? Kompilator niestety z jakiegoś powodu wyświetla tylko "run-time check failure #2 - S", więc nawet nie wiem jaka zmienna może to powodować.. A sam albo jestem ślepy, albo za głupi żeby go znaleźć :P Program ma obliczać minimalny prostokąt ograniczający wprowadzane obiekty.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void point(int *minx, int *miny, int *maxx, int *maxy) {
	int x, y;

	scanf("%d%d", &x, &y);
	if (x < *minx) *minx = x;
	if (x > *maxx) *maxx = x;
	if (y < *miny) *miny = y;
	if (y > *maxy) *maxy = y;
}

void circle(int *minx, int *miny, int *maxx, int *maxy) {
	int x, y, r;

	scanf("%d%d%d", &x, &y, &r);
	if ((x - r) < *minx) *minx = x - r;
	if ((x + r) > *maxx) *maxx = x + r;
	if ((x - r) < *miny) *miny = y - r;
	if ((x + r) > *maxy) *maxy = y + r;

}

void line(int *minx, int *miny, int *maxx, int *maxy) {
	int x1, x2, y1, y2;

	scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
	if (x1 < x2) {
		if (x1 < *minx) *minx = x1;
		if (x2 > *maxx) *maxx = x2;
	}
	else {
		if (x2 < *minx) *minx = x2;
		if (x1 > *maxx) *maxx = x1;
	}

	if (y1 < y2) {
		if (y1 < *miny) *miny = y1;
		if (y2 > *maxy) *maxy = y2;
	}
	else {
		if (y2 < *miny) *miny = y2;
		if (y1 > *maxy) *maxy = y1;
	}

}

void main() {
	int t, n, minx, maxx, miny, maxy;
	char type;

	scanf("%d", &t);
	while (t--) {
		minx = 10000, maxx = -10000, miny = 10000, maxy = -10000;
		scanf("%d", &n);
		while (n--)
		{
			scanf("%s", &type);
			if (type == 'p') point(&minx, &miny, &maxx, &maxy);
			else if (type == 'c') circle(&minx, &miny, &maxx, &maxy);
			else line(&minx, &miny, &maxx, &maxy);

		}
		printf("%d %d %d %d", minx, miny, maxx, maxy);
	}
} 

Wiem, że straszny tu burdel, ale przede wszystkim chcę zrobić wpierw tak, żeby program zadziałał, a potem spróbuję go uporządkować :P

2
scanf("%s", &type);

%s oczekuje stringa, %c jest od znaku.

0

O! Dzięki! Tylko.. czemu program działał dopóki pętla się nie zakończyła? Z czego to wynika?

2

Funkcja scanf pod podany adres (&type) zapisuje ciąg znaków odczytany ze strumienia wejściowego. W pamięci wartość typu char ma jakiś adres, lecz pamięć znajdująca się za tym adresem jest wykorzystywana przez program, jednak do innych celów, jak np. trzymanie ramki stosu. Dopóki funkcja main się nie kończy, to wszystko działa, ale jak już chce zakończyć swe działanie, to kompilator ma za zadanie zwolnić miejsce zajmowane przez zmienne lokalne czy adres powrotu. Te informacje w jakiejś formie są zapisane gdzieś w pamięci, możliwe, że w nadpisywanej przestrzeni adresowej. No i teraz kompilator chce coś zrobić, ale ma niepoprawne dane (nadpisane przez scanf) przez co wywalany jest runtime error.

Mam nadzieję, że nie ma za dużo błędów w tym, co napisałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1