|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
15.10.2015, 21:18 | #1 |
Član
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
|
Transponovanje matrica C++ ne kapiram sto ne radi?
Dakle programer na pocetnom nivou prekucao zadatak iz knjige u pitanju je transponovanje matrica, okruzenje visual studio 2015. Sintaksa je iz C-a a ne iz C++ ali svejedno ne radi. Meni ne radi izbacuje error i to osam. Ako moze neko da mi objasni sto ne radi a primer je prekucan iz knjige. Ludi dobre volje pomagajte, evo koda
#include "stdafx.h" #include<stdio.h> #include <stdlib.h> using namespace std; int main() { while (1) { int **a, **b, i, j, n, m; printf("\n\nEnter dimension of matrix:\t"); scanf("%d $d", &m, &n); if (m <= 0 || n <= 0)break; a = malloc(m*sizeof(int*)); for (i = 0;i < m;i++) { a[i] = malloc(n*sizeof(int)); printf("%2d. vrsta? ", i + 1); for (j = 0;j < n;scanf("%d", &a[i][j + 1])); } b = malloc(n*sizeof(int*)); for (i = 0;i < n;i++) { b[i] = malloc(m*sizeof(int)); for (j = 0;j < m;j++)b[i][j] = a[j][i]; } for (i = 0;i < m;free(a[i++]));free(a); a = b;i = m;m = n;n = i; printf("\n Transponovana matrica:\n"); for (i = 0;i < m;i++) { for (j = 0;j < n;printf("5%d", a[i][j++])); printf("\n"); } for (i = 0;i < m;free(a[j++]));free(a); return 0; } } |
15.10.2015, 21:27 | #2 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
Za početak, scanf("%d $d", treba dvaput %d a ne dolar d
|
16.10.2015, 9:55 | #3 |
Član
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
|
16.10.2015, 19:57 | #4 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
Ajde probaj da napraviš prazan projekat, pa u njega dodaj C fajl (ne CPP), pa ubaci kod i probaj tako, time ćeš naterati kompajler da radi u C režimu. C++ ima strožiji type checking od C, a malloc vraća jednostruki pokazivač, moguće da C++ ne dozvoljava izjednačavanje jednostrukog i dvostrukog pokazivača (makar ne bez kastovanja).
edit: Evo sad sam probao u Visual Studiju 2013, definitivno je problem do strožijih provera u C++ režimu, dakle kad alociraš memoriju za **a i **b, moraš da kastuješ u odgovarajući tip pokazivača (odnosno pokazivač na pokazivač): a = (int**) malloc(m*sizeof(int*)); b = (int**) malloc(n*sizeof(int*)); U C-u, fala bogu, ne moraš jer typechecking faktički ne postoji (osim između integerskih tipova i tipova sa pokretnom tačkom, između ostalog zato što ne idu u iste registre prilikom ALU operacija). Dakle, ili ubaci ova kastovanja u postojeći projekat, ili napravi nov projekat kao čist C. Poslednja ispravka: voodoo_ (16.10.2015 u 20:10) |
17.10.2015, 11:02 | #5 | |
Član
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
Citat:
Hvala!!! |
|
20.10.2015, 13:56 | #6 |
Član
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
Moze pitanje zasto se ne treba osloboditi memorija i za matricu b???
Evo koda koji radi zilion puta probao ako i matricu b oslobodim puca program?!! #include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; int main() { int **a, **b, m, n, j, i, k, z, q = 0, t=0, s = 0; cout << "\n Enter dimension of matrix:\t"; cin >> m; cin >> n; a = (int**) new int[m]; for (i = 0;i < m;i++) { a[i] = new int[n]; for (j = 0;j < n;j ++ ) { *(a[i] + j)= rand() % 100+1; s += *(a[i] + j); q++; } } for (i = 0;i < m;i++) { for (j = 0;j < n;j++) { t++; cout << "\nElement number\t"<< t <<"\tof matrix is:\t" << *(a[i] + j); } } cout << "\n\n Sum of elements of matrx is:\t" << s << endl; cout<< "\n Number of matrix elements is:\t" << q << endl; b = (int**) new int[n]; for (i = 0;i < n;i++) { b[i] = new int[m]; for (j = 0;j < m;j++) { b[i][j] = a[j][i]; } } a = b; i= m; m = n; n= i; cout << "\n\nPrint matrix transposition "; for (i = 0;i < m;i++) { for (j = 0;j < n;j++) { t++; cout << "\nElement number\t" << t << "\tof matrix is:\t" << *(a[i] + j); } } cout <<"\nFree memory\n"; for (k = 0;k < m;k++)delete a[k]; delete a; return 0; } |
20.10.2015, 14:03 | #7 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
Aj formatiraj ovo u CODE tag sa tabulacijom, ništa ne vidim ovako.
|
20.10.2015, 14:09 | #8 |
Član
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
Kod:
#include "stdafx.h" #include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; int main() { int **a, **b, m, n, j, i, k, q = 0, t=0, s = 0; cout << "\n Enter dimension of matrix:\t"; cin >> m; cin >> n; a = (int**) new int[m]; for (i = 0;i < m;i++) { a[i] = new int[n]; for (j = 0;j < n;j ++ ) { *(a[i] + j)= rand() % 100+1; s += *(a[i] + j); q++; } } for (i = 0;i < m;i++) { for (j = 0;j < n;j++) { t++; cout << "\nElement number\t"<< t <<"\tof matrix is:\t" << *(a[i] + j); } } cout << "\n\n Sum of elements of matrx is:\t" << s << endl; cout<< "\n Number of matrix elements is:\t" << q << endl; b = (int**) new int[n]; for (i = 0;i < n;i++) { b[i] = new int[m]; for (j = 0;j < m;j++) { b[i][j] = a[j][i]; } } for (k = 0;k < m;k++)delete[]a[k]; delete[]a; a = b; i= m; m = n; n= i; cout << "\n\nPrint matrix transposition "; for (i = 0;i < m;i++) { for (j = 0;j < n;j++) { t++; cout << "\nElement number\t" << t << "\tof matrix is:\t" << *(a[i] + j); } } cout <<"\nFree memory\n"; for (k = 0;k < m;k++)delete []a[k]; delete []a; return 0; } |
20.10.2015, 14:31 | #9 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
Na kom mestu u programu si pokušao da uradiš brisanje "b" pa je počelo da puca?
|
21.10.2015, 22:05 | #10 |
Član
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
medju poslednjim redovima, red pre return 0, na mesti gde se oslobodja memorija i za matricu a.
|
21.10.2015, 22:28 | #11 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
Obrati pažnju da si u jednom trenutku na sredini programa uradio "a = b". Time nisi iskopirao sadržaj matrice "b" u matricu "a", već si samo uperio pokazivač "a" na isti blok memorije na koji pokazuje "b". Zbog toga, nadalje je potpuno isto da li tom bloku pristupaš preko pokazivača "a" ili "b", jer gađaju isti deo memorije. Samim tim, kada na kraju programa uradiš oslobađanje memorije na koju pokazuje "a" (pozivima funkcije "delete"), tu memoriju više ne možeš da čačkaš (jer je operativni sistem već evidentirao da si je oslobodio) i ne možeš ponovo da pokušaš oslobađanje jer si prethodnim oslobađanjem izgubio dalje pravo pristupa tom bloku.
|
22.10.2015, 0:07 | #12 | |
Član
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
|
Re: Transponovanje matrica C++ ne kapiram sto ne radi?
Citat:
|
|
Bookmarks sajtovi |
|
|
Slične teme | ||||
tema | temu započeo | forum | Odgovora | Poslednja poruka |
Problem sa uploadom - ne radi | Boris1990 | Internet tehnologije | 0 | 5.9.2012 7:40 |
dugme za restart ne radi posle zamene HDD-a novim | Purple | Kvarovi | 5 | 25.7.2012 10:13 |
Prilikom pokretanja instalacije Windowsa tastatura ne radi | mica1709 | Kvarovi | 5 | 1.3.2012 9:28 |
Program Radi Kod Mene A Ne Radi Kod Druga | Delete | Kvarovi | 13 | 26.8.2011 11:03 |
Mikrofon ne radi u Counter Strike-u | Jenkiduduldu | Mrežne igre | 2 | 30.4.2009 18:31 |