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

Czemu Borland C++ ma problem z dzieleniem przez zero a Visual Studio nie?

Object Storage Arubacloud
+2 głosów
720 wizyt
pytanie zadane 11 kwietnia 2015 w C i C++ przez Piotr Skóra Użytkownik (680 p.)

Witam ponownie
Znalazłem kod, który przekształca macierz na macierz odwrotną. Było by spoko gdyby nie to że w Visual Studio 2013 działa, ale w Borland c++ builder 6 wywala błąd z dzieleniem przez zero.
Oto kod:

#include <vcl.h>
#pragma hdrstop
#include <iostream>
#include <ctime>
//---------------------------------------------------------------------------
using namespace std;
#pragma argsused
int main(int argc, char* argv[])
{
        int W;
	cout << "podaj rozmiar macierzy ";
	cin >> W;
	float **Tab;
	float **t;
	int i, j, k;
	Tab = new float *[W];
	t = new float*[W];
	for (j = 0; j<W; j++)Tab[j] = new float[j];
	for (j = 0; j<W; j++)t[j] = new float[j];
	cout << "macierz pierwotna\n\n";
	for (i = 0; i<W; ++i)
	{
		for (j = 0; j<W; ++j)
		{
			Tab[i][j] = rand() % 10;
			cout << Tab[i][j] << " ";
		}
		cout << "\n";
	}

	for (i = 0; i<W; i++)
	{
		Tab[i][i] = 1 / Tab[i][i];
		for (j = 0; j<W; j++) if (j != i)
		{
			Tab[j][i] = Tab[j][i] * Tab[i][i];
			for (k = 0; k<W; k++) if (k != i)
			{
				Tab[j][k] -= Tab[j][i] * Tab[i][k];
				if (j == (W - 1))
					Tab[i][k] = -(Tab[i][k] * Tab[i][i]);
			}
		}
	}

	cout << "\nmacierz odwrotna\n\n";
	int w = W - 1;
	for (j = 0; j<w; j++) Tab[w][j] = -(Tab[w][j] * Tab[w][w]);

	for (i = 0; i<W; i++)
	{
		for (j = 0; j<W; j++)
		{
			cout.width(10);
			cout << Tab[i][j] << " ";
		}
		cout << endl;
	}
	cout << "\n PRESS ENTER";
	cin.sync();
	cin.get();
	for (i = 0; i<W; ++i)
	{
		delete[] Tab[i];
		delete[] t;
	}
	delete[] Tab;
	delete[] t;
	return 0;
}

I faktycznie, dzielenie przez 0 występuje. Ale czemu w Visualu radzi sobie z tym problemem a w builderze nie?

Przez ten błąd zrezygnowałem z pisania tego samodzielnie, a tu się okazuje że mogłem pisać dobrze tylko w złym kompilatorze ^.^' Dodatkowo mam sporo napisane w Borland a Visual mnie nie lubi i mi się wywala+zawiesza, dlatego zależy mi żeby liczenie macierzy było w Borland c++ builder. Jakiś pomysł jak to obejść? 
Dodaje screen erroru :)Komunikat błędu

 

związane z odpowiedzią na: C++ Builder 6 - macierz odwrotna

3 odpowiedzi

+1 głos
odpowiedź 11 kwietnia 2015 przez daan Pasjonat (17,640 p.)
wybrane 12 kwietnia 2015 przez Piotr Skóra
 
Najlepsza
Spójrz na to w jaki sposób usuwasz tablice dwuwymiarowe, usuwasz każdą inaczej dalczego ?  U mnie visual krztusi się właśnie w momencie jak zaczyna się zwalnianie pamięci. Zakomentuj ten fragment ze zwalnianiem pamięci i powiedz czy coś się zmieni, a przy okazji mógłbyś wskazać gdzie to dzielenie niby występuje ? :P
komentarz 11 kwietnia 2015 przez Piotr Skóra Użytkownik (680 p.)
Tak jak napisałem to nie jest mój kod, też miałem problem z tym zwalnianiem pamięci, ale postanowiłem skopiować kod taki jak był podany.

w 25 linijce losuje liczby, faktycznie czasami może nie wylosować 0, ale mi za każdym razem losowało ^^
Jak już wylosuje jakieś 0 to w 33 linijce Borland wywala błąd z dzieleniem przez 0. Tak jak wspomniałem Visual nie ma z tym problemu.
komentarz 11 kwietnia 2015 przez daan Pasjonat (17,640 p.)
U mnie w visualu program cały czas się wywala przy zamykaniu. Faktycznie tam może wystąpić dzielenie przez zero nie zauważyłem tej linijki wcześniej :D ale po uruchomieniu na przekątnej nie mam żadnego 0 a mimo to nie moge zamknąć tego programu poprawnie, także coś tu nie gra ale jeszcze nie znalazłem konkretnej przyczyny :) Jak coś znajde to napisze
komentarz 11 kwietnia 2015 przez daan Pasjonat (17,640 p.)
for (j = 0; j<W; j++)Tab[j] = new float[j];
    for (j = 0; j<W; j++)t[j] = new float[j];

No i coś mam, ten kod nie stworzy nam nam poprawnie tablic kwadratowych :) new float[W] powinno być :) Ten zapis float[j] stworzy nam w efekcie tablice "schodkową" każdy wiersz będzie miał inną ilość elementów - przy późniejszej próbie zwolnienia pamięci chcemy usunąć dane znajdującę się poza zakresem co powodowało błędy :)

komentarz 11 kwietnia 2015 przez Piotr Skóra Użytkownik (680 p.)
A to sorki za brzydki kod, ja w Visualu mało pracuję bo nawet przy tworzeniu pustego projektu i kompilowaniu na mnie krzyczy z błędami, ale to inna bajka.
komentarz 11 kwietnia 2015 przez daan Pasjonat (17,640 p.)
a co do problemu z dzieleniem przez zero są 2 opcje : albo poprawić ten fragment z dzieleniem żeby wykrywał kiedy jest 0 i przeciwdziałał temu, albo losować liczby z przedziału od 1 do X :)
komentarz 11 kwietnia 2015 przez Piotr Skóra Użytkownik (680 p.)

I właśnie tu jest mój główny problem.
Moje macierze do policzenia zazwyczaj wyglądają tak ( zera zawsze są w tych miejscach)
MAcierz
I muszę policzyć macierz odwrotną do tego, szukam po internetach sposobów bo sam nie potrafię tego rozwiązać. Na pewno da się to policzyć, MATLAB liczy ^^

W każdym razie dzięki za pomoc, może coś wymyśle na te zera.

komentarz 12 kwietnia 2015 przez Piotr Skóra Użytkownik (680 p.)

Mały spam, ale....
Dodałem takie coś przed dzieleniem

if (Tab[i][i]==0);
                else

Na razie sprawdziłem na jednej macierzy i się zgadzają wyniki ^^ 

komentarz 12 kwietnia 2015 przez daan Pasjonat (17,640 p.)

no to dobrze :D jednak polecałbym bardziej czytelniejszy zapis 

if(Tab[i][j] != 0) Tab[i][i] = 1 / Tab[i][i];
+1 głos
odpowiedź 12 kwietnia 2015 przez Kabotyn Mądrala (5,650 p.)
Właściwie to nie śledzę wątku i nie wiem czy sobie poradziłeś, ale jak nie to:

https://forum.pasja-informatyki.pl/4153/c-builder-6-macierz-odwrotna?show=7958#a7958  ;-)
komentarz 13 kwietnia 2015 przez Piotr Skóra Użytkownik (680 p.)
Dzięki wielkie, zaraz będę sprawdzał czy uda mi się odpalić :P
–2 głosów
odpowiedź 11 kwietnia 2015 przez PiotrK Użytkownik (580 p.)
Skoro kompilator nie wywali błędu przy dzieleniu przez zero to raczej wtedy jest on "zły".

Podobne pytania

0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 20 marca 2017 w C i C++ przez konrad99 Gaduła (4,090 p.)
0 głosów
2 odpowiedzi 152 wizyt
pytanie zadane 31 maja 2015 w C i C++ przez Ins0mniaC Obywatel (1,400 p.)
0 głosów
1 odpowiedź 190 wizyt
pytanie zadane 11 lipca 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...