Problem z obsługą wyjątków

0

Pisze program, który ma za zadanie wyświetlać ip zależnie od dwóch parametrów konstruktora. Pierwszy parametr to nasze ip gdzie 3 ostatnie cyfry muszą być potęgą liczby 2. Drugi parametr odpowiada za ilość wyświetlanych ip'ków (int scope) i również musi być potęgą liczby 2. W trzecim jest źle podany drugi argument. Natomiast w czwartym źle są podane 3 ostanie cyfry, bo 138 nie jest potega 2, więc powinien wyświetlić się wyjątek. Kiedy próbuje to skompilować wywala mi błąd w 56 linijce:

Nieobsłużony wyjątek w lokalizacji 0x74DEC762 w Project9.exe: wyjątek języka Microsoft C++: std::basic_string<char,std::char_traits<char>,std::allocator<char> > w lokalizacji pamięci 0x010FFA94.: wystąpił wyjątek

Ktoś rozumie jak to naprawić?

Kod:


```#include<iostream>
#include<string>
#include<cstdlib>

using namespace std;

class IP {
protected:
	string ip;
	int scope;
public:
	IP(string ip, int scope) {
		this->ip = ip;
		this->scope = scope;
	};
	int getPieceIP(){
		string pieceIp = ip.substr(12, 3);
		int numPieceIp = atoi(pieceIp.c_str());

		int powOfTwo = 2;
		while (numPieceIp >= powOfTwo) {
			if (numPieceIp == powOfTwo) {
				return numPieceIp;
			}
			else powOfTwo = powOfTwo * 2;
		}
		if (numPieceIp < powOfTwo) {
			string wyjatek = "invalid IP number";
			throw wyjatek;
		}
		
	}
	string getNewIP(int a) {
		string mainIP = ip.substr(0, 12);
		string newIP = mainIP + to_string(a);
		return newIP;
	}
	void printIP(){
		int pieceIP = getPieceIP();
		int powOfTwo = 2;
		while (scope >= powOfTwo) {
			if (powOfTwo == scope) {
				while (scope != 0) {
					cout << getNewIP(pieceIP) << endl;
					++pieceIP;
					--scope;
				}
				cout << endl;
				
			}
			else powOfTwo = powOfTwo * 2;
		}
		if (scope < powOfTwo) {
			string wyjatek = "invalid range";
			throw wyjatek;
		}
	}

};

int main() {
	IP *ip1 = new IP("212.111.212.128", 2);
	IP *ip2 = new IP("212.112.212.128", 4);
	IP *ip3 = new IP("212.113.212.128", 6);
	IP *ip4 = new IP("212.114.212.138", 4);

	
	ip1->printIP();
	ip2->printIP();
	try
	{
		ip3->printIP();
	}
	catch (string w)
	{
		cout << "Exception - " << w << endl;
	}
	try
	{
		ip4->printIP();
	}
	catch (string w)
	{
		cout << "Exception - " << w << endl;
	}

	
	system("pause");
	return 0;
}
1

W printIP() w pętli while brak wyjścia z pętli. Przez to funkcja zawsze rzuca wyjątkiem.
Zmieniasz tam też wartość scope więc wywołanie ponownie printIP() (na tym samym obiekcie) będzie problemem.
Debugger bardzo pomaga w podobnych sytuacjach. Użyj go.

1

Istnieje sprytny sposób na sprawdzenie czy liczba jest potęgą dwójki

bool isPowerOfTwo(unsigned value)
{
  return (value && !(value & (value - 1)));
}
0

Zakładasz. że każdy element w adresie będzie miał dokładnie 3 cyfry ?

    int getPieceIP(){
        string pieceIp = ip.substr(12, 3);

Nie byłoby wygodniej użyć funkcji typu inet_pton(...) ?

https://stackoverflow.com/questions/5328070/how-to-convert-string-to-ip-address-and-vice-versa

1

Sam rzucasz ten wyjątek z:

        if (scope < powOfTwo) {
            string wyjatek = "invalid range";
            throw wyjatek;
        }

https://wandbox.org/permlink/0fJQh6FrAeV66NzY

Może napisz co ten paragram ma robić, bo to ewidentnie jest problem XY

0

Sory zapomniałem pokazać w jaki sposób program ma działać. Tutaj jak ma wyglądać output. Jest to zwykłe zadanie na laborki:

212.111.212.129

212.111.212.130

212.112.212.129

212.112.212.130

212.112.212.131

212.112.212.132

Exception - invalid range.

Exception - invalid IP number

0

Dobra naprawiłem. Wystarczyło warunek

if (scope < powOfTwo) {
				string wyjatek = "invalid range";
				throw wyjatek;
			}

umieścić w środku pętli while, a nie na zewnątrz jej

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