Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 15.10.2015, 21:18   #1
The Majk
Član
 
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
Određen forumom 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;
}
}
The Majk je offline   Odgovor sa citatom ove poruke
Stara 15.10.2015, 21:27   #2
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.085
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom Re: Transponovanje matrica C++ ne kapiram sto ne radi?

Za početak, scanf("%d $d", treba dvaput %d a ne dolar d
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 16.10.2015, 9:55   #3
The Majk
Član
 
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
Određen forumom Re: Transponovanje matrica C++ ne kapiram sto ne radi?

Citat:
voodoo_ kaže: Pregled poruke
Za početak, scanf("%d $d", treba dvaput %d a ne dolar d

Slazem se ali izbacuje gresku i kod zauzimanje memorije za pokazivace to mi najvise nije jasno. To me najvise buni?!
The Majk je offline   Odgovor sa citatom ove poruke
Stara 16.10.2015, 19:57   #4
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.085
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom 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)
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 17.10.2015, 11:02   #5
The Majk
Član
 
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
Određen forumom Re: Transponovanje matrica C++ ne kapiram sto ne radi?

Citat:
voodoo_ kaže: Pregled poruke
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.

Hvala!!!
The Majk je offline   Odgovor sa citatom ove poruke
Stara 20.10.2015, 13:56   #6
The Majk
Član
 
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
Određen forumom 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;
}
The Majk je offline   Odgovor sa citatom ove poruke
Stara 20.10.2015, 14:03   #7
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.085
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom Re: Transponovanje matrica C++ ne kapiram sto ne radi?

Aj formatiraj ovo u CODE tag sa tabulacijom, ništa ne vidim ovako.
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 20.10.2015, 14:09   #8
The Majk
Član
 
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
Određen forumom 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;
}
The Majk je offline   Odgovor sa citatom ove poruke
Stara 20.10.2015, 14:31   #9
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.085
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom 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?
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 21.10.2015, 22:05   #10
The Majk
Član
 
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
Određen forumom 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.
The Majk je offline   Odgovor sa citatom ove poruke
Stara 21.10.2015, 22:28   #11
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.085
Zahvaljeno 4.923 puta na 2.859 poruka
Određen forumom 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.
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 22.10.2015, 0:07   #12
The Majk
Član
 
Član od: 5.12.2014.
Poruke: 100
Zahvalnice: 0
Zahvaljeno jedanput na jednoj poruci
Određen forumom Re: Transponovanje matrica C++ ne kapiram sto ne radi?

Citat:
voodoo_ kaže: Pregled poruke
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.
hvala!!!
The Majk je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


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


Sva vremena su po Griniču +2 h. Sada je 20:14.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com