Wpis z mikrobloga

#programowanie #cpp Mam pytanie odnośnie tego kodu. Program ma służyć do odczytywania, dodawania, mnożenia i testowania sumy wyniku macierz. Przy funkcji mnożenia macierzy zaznaczyłem miejsce w którym program mi się sypie ( visual nie pokazuje błędów po prostu crashuje program) oraz nie jestem pewien jak dokładnie zrobić funkcję to testowania tego czy suma dodawania wcześniej pobranych tablic, jest zgodna z takim samym realnym wynikiem tychże macierzy. ps. Wiem że trzeba dodać usuwanie tablic. ktoś coś ?
  • 20
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@lukaszwasyl: 1) nie zwalniasz pamieci
2) nie ładnie używasz zmiennch globalnych
3) masz niezainicjowane początkowe wartości tablica[i][j] a robisz na nich operacje +=
4) przy operacjach ktore wykonujesz na macierzy 1 i 2 - musisz miec raczej tyle samo kolumn co wierszy inaczej na pierwszy rzut oka właśnie pójdzie program w krzaki....
  • Odpowiedz
@Kaczus2B: o punkcie 1 mówiłem w ostatnim zdaniu,a punkt drugi jest dla uproszczenia wstawiony przez ćwiczeniowca ( daje nam pliki txt i na tej bazie budowalismy program )Inne grzechy poprawię.
  • Odpowiedz
@lukaszwasyl lepiej byłoby stworzyć jakąś prostą strukturę "macierz" w której będziesz przechowywać jej wymiary i wskaźnik na pamięć gdzie chcesz przechowywać liczby, wtedy każda macierz będzie miała swoje wymiary i z nich będziesz korzystać. Twoje rozwiązanie że zmiennymi globalnym ma jakikolwiek sens tylko jeżeli macierze są tych samych wymiarów, a że nie można mnożyć macierzy np 3x4 * 3x4 więc Twoje macierze musiałyby być kwadratowe. Tak jak ktoś wcześniej pisał, zaleca
  • Odpowiedz
  • 0
@KostekZgubina wspomniałem że zmienne globalne ,zostaly narzucane przez ćwiczeniowca tylko i wyłącznie w tym przykładzie ( i zrobił to świadomie ) wiem że liczba wierszy musi się zgadzać z liczbą kolumn drugiej macierzy. Nie przerabiałem jeszcze kontenerów :X TAK WIEM ŻE trzeba zwalniać pamięć ale chciałem to już zrobić na końcu :x
  • Odpowiedz
@KostekZgubina: @rotflolmaomgeez: @Saly: @Kaczus2B: @AwizisieAkat: Okej są jakieś poprawki. edit
a) zwalniam pamięć ( mam nadzieję, że dobrze to zrobiłem )
b) poprawiłem mnożenie ( konstrukcja powinna być dobra )
c) nie uczyłem się jeszcze vektorów oraz nie wiem jak poprawnie wykorzystać tutaj struktury, przypominam, że zmienne globalne zostały podane celowo.
funkcja od testowania wyniku sumowania z plikiem txt zawierającym ten wynik
  • Odpowiedz
@lukaszwasyl: takie usuwanie tablicy nie działa (to co pod returnem się nie wykona). znajdź jakiś tutorial na temat dynamicznej alokacji pamięci, bo chyba nie wiesz kompletnie o co tu chodzi
  • Odpowiedz
@lukaszwasyl: Kod po returnie w funkcji nie zostanie wykonany (w tym wypadku to dobrze, ale to nie jest zwalnianie), próbujesz mnożyć po tym jak zwolniłeś pamięc....Używanie zmiennych typu double jako liczników, niezbyt dobry pomysł... Testowanie poprawności wyniku przez porównanie operatorem == przy liczbach zmiennoprzecinkowych, nienajlepszy pomysł, raczej powinienes liczyć różnicę, jako błąd...
  • Odpowiedz
@Kaczus2B: tak więc. W funkcjach po za main nie zwalniać pamięci ? ( typu double musi zwracać wartość dlatego wstawiam tam returny. ) Z tego co zrozumiałem aby pomnozyc po zainicjalizowaniu macierzy 1 i 2 mogę te macierze dopiero zwolnić po mnożeniu - czyli całe zwalnianie wrzucić przed returnem w funkcji main, zmieniłem już na typ int liczniki, ok nie pokazuje błędów. Testowanie poprawności - zamiast przyrównywać usuwać i przyrównywać
  • Odpowiedz
@lukaszwasyl: jeśli chodzi o zwalnianie, to tak w mainie przed returnem zwolnic
jeśli chodzi o testowanie, to fabs(wynik1 - odczytanywynik) < blad_aprobowany - to dobrze. Bo przy operacjach na liczbach zmiennoprzecinkowych błąd będzie występował, kwestia szczęścia, czy błędy sie zniosą, czy nie. Krótki artykuł o liczbach zmiennoprzecinkowych: http://kaczus.ppa.pl/art/liczbyzmiennoprzecinkowe,19.html takie liźnięcie tematu, ale warto miec pewne rzeczy na uwadze.
  • Odpowiedz
@lukaszwasyl oprócz tego co pisali ludzie wyżej to zmienił jeszcze jedna rzecz. Jest taka zasada DRY(dont repeat yourself). W skrócie, jeżeli jakiś kod masz napisać w kilku miejscach, to zamknij go w funkcję i wywołuj ta funkcje. W Twoim kodzie to będzie np wyświetlanie macierzy
  • Odpowiedz