Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
Postano: 15:04 čet, 24. 4. 2008 Naslov: Alokacija, relokacija |
|
|
U jednom zadatku treba napisati funkciju koja ce matrici na kraj dodati jedan redak u kojem ce pisati sume stupaca.
U mainu je ta matrica dinamički alocirana na neku m*n dimenziju, i ja sam pokušala u funkciji realcirati novi redak za tu matricu ovako:
[code:1]
void f(double **a, int m ,int n)
{
a= (double**) realloc (a, (m+1)*sizeof (double*));
a[m+1] = (double *) malloc(n*sizeof(double));
[/code:1]
i kada izvođenje programa dođe do tog dijela, javlja mi grešku i neće dalje ništa.
molim da mi ukažete ne moju sigurno jako glupu pogrešku...
U jednom zadatku treba napisati funkciju koja ce matrici na kraj dodati jedan redak u kojem ce pisati sume stupaca.
U mainu je ta matrica dinamički alocirana na neku m*n dimenziju, i ja sam pokušala u funkciji realcirati novi redak za tu matricu ovako:
Kod: |
void f(double **a, int m ,int n)
{
a= (double**) realloc (a, (m+1)*sizeof (double*));
a[m+1] = (double *) malloc(n*sizeof(double));
|
i kada izvođenje programa dođe do tog dijela, javlja mi grešku i neće dalje ništa.
molim da mi ukažete ne moju sigurno jako glupu pogrešku...
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
|
[Vrh] |
|
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
Postano: 18:07 čet, 24. 4. 2008 Naslov: |
|
|
Opet neće, evo cijeli kod:
[code:1]
#include <stdio.h>
void f(double **a, int m ,int n)
{
int stupac, red;
a= (double**) realloc (a, (m+1)*sizeof (double*));
a[m] = (double *) malloc(n*sizeof(double));
for(stupac=0; stupac < n; stupac++)
{
double suma=0;
for(red=0; red<m +1; red++)
suma+=a[red][stupac];
a[m][stupac]=suma;
}
return;
}
int main(void){
double **a;
int brojRedaka, brojStupaca, red, stupac;
scanf("%d %d", &brojRedaka, &brojStupaca);
a= (double **) malloc (brojRedaka * sizeof(double *));
for(red=0; red<brojRedaka; red++)
a[red]= (double *) malloc (brojStupaca * sizeof(double));
printf ("ucitajte.\n");
for(red=0; red<brojRedaka; red++)
for(stupac=0; stupac<brojStupaca; stupac++)
scanf("%lf", &a[red][stupac]);
printf("ispis.\n");
for(red=0; red<brojRedaka; red++)
{
for(stupac=0; stupac<brojStupaca; stupac++)
printf("%5g", a[red][stupac]);
printf("\n");
}
f(a, brojRedaka, brojStupaca);
printf("Novi ispis\n");
for(red=0; red < brojRedaka+1; red++)
{
for (stupac=0; stupac < brojStupaca; stupac++)
printf("%5g", a[red][stupac]);
printf("\n");
}
for(red=0; red<brojRedaka+1; red++) free(a[red]);
free(a);
scanf("%%");
return 0;
}
[/code:1]
Opet neće, evo cijeli kod:
Kod: |
#include <stdio.h>
void f(double **a, int m ,int n)
{
int stupac, red;
a= (double**) realloc (a, (m+1)*sizeof (double*));
a[m] = (double *) malloc(n*sizeof(double));
for(stupac=0; stupac < n; stupac++)
{
double suma=0;
for(red=0; red<m +1; red++)
suma+=a[red][stupac];
a[m][stupac]=suma;
}
return;
}
int main(void){
double **a;
int brojRedaka, brojStupaca, red, stupac;
scanf("%d %d", &brojRedaka, &brojStupaca);
a= (double **) malloc (brojRedaka * sizeof(double *));
for(red=0; red<brojRedaka; red++)
a[red]= (double *) malloc (brojStupaca * sizeof(double));
printf ("ucitajte.\n");
for(red=0; red<brojRedaka; red++)
for(stupac=0; stupac<brojStupaca; stupac++)
scanf("%lf", &a[red][stupac]);
printf("ispis.\n");
for(red=0; red<brojRedaka; red++)
{
for(stupac=0; stupac<brojStupaca; stupac++)
printf("%5g", a[red][stupac]);
printf("\n");
}
f(a, brojRedaka, brojStupaca);
printf("Novi ispis\n");
for(red=0; red < brojRedaka+1; red++)
{
for (stupac=0; stupac < brojStupaca; stupac++)
printf("%5g", a[red][stupac]);
printf("\n");
}
for(red=0; red<brojRedaka+1; red++) free(a[red]);
free(a);
scanf("%%");
return 0;
}
|
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 18:22 čet, 24. 4. 2008 Naslov: |
|
|
Kada realociras nesto, onda trebas promijeniti vrijednost pointera, a buduci da to radis u funkciji, onda ti treba pointer na taj pointer.
Ovako:
[code:1]
void f(double ***a, int m ,int n)
{
int stupac, red;
*a= (double**) realloc (*a, (m+1)*sizeof (double*));
(*a)[m] = (double *) malloc(n*sizeof(double));
for(stupac=0; stupac < n; stupac++)
{
double suma=0;
for(red=0; red<m +1; red++)
suma+=(*a)[red][stupac];
(*a)[m][stupac]=suma;
}
return;
}
[/code:1]
Kada realociras nesto, onda trebas promijeniti vrijednost pointera, a buduci da to radis u funkciji, onda ti treba pointer na taj pointer.
Ovako:
Kod: |
void f(double ***a, int m ,int n)
{
int stupac, red;
*a= (double**) realloc (*a, (m+1)*sizeof (double*));
(*a)[m] = (double *) malloc(n*sizeof(double));
for(stupac=0; stupac < n; stupac++)
{
double suma=0;
for(red=0; red<m +1; red++)
suma+=(*a)[red][stupac];
(*a)[m][stupac]=suma;
}
return;
}
|
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
tihy Forumaš(ica)


Pridružen/a: 19. 09. 2006. (09:43:16) Postovi: (76)16
Spol: 
Lokacija: varaždin
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 20:47 čet, 24. 4. 2008 Naslov: |
|
|
Ali ako funkcija treba dodati redak, onda relokacija spada unutra, a ne prije poziva funkcije, ne? :?
Inace, ovako kako je napisan zadatak, moze se sloziti i da funkcija samo vraca novu matricu:
[code:1]double **f(double **a, int m, int n) {
int stupac, red;
a = (double **)realloc(a, (m+1) * sizeof (double*));
a[m] = (double *)malloc(n * sizeof(double));
for(stupac=0; stupac < n; stupac++) {
double suma=0;
for (red = 0; red < m+1; ++red)
suma += a[red][stupac];
a[m][stupac]=suma;
}
return a;
}[/code:1]
@Marko: Ima li onaj [tt]return;[/tt] neku svrhu? :-k
Ali ako funkcija treba dodati redak, onda relokacija spada unutra, a ne prije poziva funkcije, ne?
Inace, ovako kako je napisan zadatak, moze se sloziti i da funkcija samo vraca novu matricu:
Kod: | double **f(double **a, int m, int n) {
int stupac, red;
a = (double **)realloc(a, (m+1) * sizeof (double*));
a[m] = (double *)malloc(n * sizeof(double));
for(stupac=0; stupac < n; stupac++) {
double suma=0;
for (red = 0; red < m+1; ++red)
suma += a[red][stupac];
a[m][stupac]=suma;
}
return a;
} |
@Marko: Ima li onaj return; neku svrhu?
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
tihy Forumaš(ica)


Pridružen/a: 19. 09. 2006. (09:43:16) Postovi: (76)16
Spol: 
Lokacija: varaždin
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
tihy Forumaš(ica)


Pridružen/a: 19. 09. 2006. (09:43:16) Postovi: (76)16
Spol: 
Lokacija: varaždin
|
|
[Vrh] |
|
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
Postano: 12:44 pet, 25. 4. 2008 Naslov: |
|
|
[quote="mdoko"]Kada realociras nesto, onda trebas promijeniti vrijednost pointera, a buduci da to radis u funkciji, onda ti treba pointer na taj pointer.
[/quote]
Moram priznati da mi ovaj dio nije jasan.U analognom primjeru iz druge grupe je trebalo dodati stupac i tamo smjestiti produkte redaka. Napravila sam napraviti program gdje funkcija prima matircu a, doda joj jedan stupac i ne vraća ništa.
[code:1]
void **f(int **a, int m, int n)
{int red, stupac;
for(red=0; red<m; red++)
a[red] = (int*)realloc(a[red], (n+1)*sizeof(int));
zb
for(red=0; red<m; red++)
{
int produkt=1;
for(stupac=0; stupac<n; stupac++)
produkt*=a[red][stupac];
a[red][n]=produkt;
}
}
[/code:1]
I dio poziva i ispisa te nove matrice:
[code:1]
f(a, brojRedaka, brojStupaca);
ispis(a, brojRedaka, brojStupaca + 1);
[/code:1]
Dakle, ona je uspjela promijeniti matricu a iz maina. Zašto tu nisam morala koristiti ***? Niti je ona morala vraćati novu matricu, nego je jednostavno promijenila staru, a stekla sam dojam, da funkcija to ne može zbog onoga pointera na pointer ***.
mdoko (napisa): | Kada realociras nesto, onda trebas promijeniti vrijednost pointera, a buduci da to radis u funkciji, onda ti treba pointer na taj pointer.
|
Moram priznati da mi ovaj dio nije jasan.U analognom primjeru iz druge grupe je trebalo dodati stupac i tamo smjestiti produkte redaka. Napravila sam napraviti program gdje funkcija prima matircu a, doda joj jedan stupac i ne vraća ništa.
Kod: |
void **f(int **a, int m, int n)
{int red, stupac;
for(red=0; red<m; red++)
a[red] = (int*)realloc(a[red], (n+1)*sizeof(int));
zb
for(red=0; red<m; red++)
{
int produkt=1;
for(stupac=0; stupac<n; stupac++)
produkt*=a[red][stupac];
a[red][n]=produkt;
}
}
|
I dio poziva i ispisa te nove matrice:
Kod: |
f(a, brojRedaka, brojStupaca);
ispis(a, brojRedaka, brojStupaca + 1);
|
Dakle, ona je uspjela promijeniti matricu a iz maina. Zašto tu nisam morala koristiti ***? Niti je ona morala vraćati novu matricu, nego je jednostavno promijenila staru, a stekla sam dojam, da funkcija to ne može zbog onoga pointera na pointer ***.
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 14:58 pet, 25. 4. 2008 Naslov: |
|
|
Je, ali dodavanje stupca je produljavanje svih redaka, sto znaci da ne mijenjas [tt]a[/tt], nego samo sve [tt]a[i][/tt]-jeve. 8)
Je, ali dodavanje stupca je produljavanje svih redaka, sto znaci da ne mijenjas a, nego samo sve a[i]-jeve.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 14:04 sub, 26. 4. 2008 Naslov: |
|
|
[quote="ekatarina"]A zar nisu i oni isto pointeri, pa zašto mi tu ne treba vrijednost pointera da bi ga promijenila, kako reče mdoko?[/quote]
Treba ti i mijenjas ju, [b]ali[/b]:
[b]Dodavanje retka:[/b]
[code:1]a = (double**)realloc(a, (m+1)*sizeof(double*));
a[m] = (double*)realloc(a, n*sizeof(double));[/code:1]
[b]Dodavanje stupca:[/b]
[code:1]for (i = 0; i < m; ++i)
a[i] = (double*)realloc(a, (n+1)*sizeof(double));[/code:1]
Dakle, kad dodajes redak, mijenjas varijablu [tt]a[/tt], pa ju moras i vratiti u glavni program; kad dodajes stupac, mijenjas elemente od [tt]a[/tt] (dakle "varijable" [tt]a[i][/tt]"), ali ne i samu varijablu [tt]a[/tt], pa ju ne trebas niti vracati iz funkcije. :)
Jasnije? :D
ekatarina (napisa): | A zar nisu i oni isto pointeri, pa zašto mi tu ne treba vrijednost pointera da bi ga promijenila, kako reče mdoko? |
Treba ti i mijenjas ju, ali:
Dodavanje retka:
Kod: | a = (double**)realloc(a, (m+1)*sizeof(double*));
a[m] = (double*)realloc(a, n*sizeof(double)); |
Dodavanje stupca:
Kod: | for (i = 0; i < m; ++i)
a[i] = (double*)realloc(a, (n+1)*sizeof(double)); |
Dakle, kad dodajes redak, mijenjas varijablu a, pa ju moras i vratiti u glavni program; kad dodajes stupac, mijenjas elemente od a (dakle "varijable" a[i]"), ali ne i samu varijablu a, pa ju ne trebas niti vracati iz funkcije.
Jasnije?
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
|
[Vrh] |
|
tihy Forumaš(ica)


Pridružen/a: 19. 09. 2006. (09:43:16) Postovi: (76)16
Spol: 
Lokacija: varaždin
|
|
[Vrh] |
|
tihy Forumaš(ica)


Pridružen/a: 19. 09. 2006. (09:43:16) Postovi: (76)16
Spol: 
Lokacija: varaždin
|
Postano: 15:19 pon, 28. 4. 2008 Naslov: |
|
|
zadatak je da program treba ispisati sumu svih elemenata a[i][j] t.d. i+j prost broj, i napisati f-ju koja ce matrici na kraj dodati redak u kojem ce pisati sume stupaca
[code:1]#include <stdio.h>
#include <stdlib.h>
int prost(int n){
int i;
n = (n < 0? -n: n);
if(n==0 || n==1) return 0;
for(i=2; i<n; ++i)
if((n%i) == 0) return 0;
return 1;
}
double **dodaj(double **a, int b, int c){
int i, j;
double sum;
a=(double**)realloc(a,(b+1)*sizeof(double*));
a[b]=(double*)malloc(c*sizeof(double));
for(j=0; j<c; j++){
sum=0;
for(i=0; i<b; ++i)
sum += a[i][j];
a[b][j] = sum;
}
//return a;
}
int main(void){
int b, c, i, j;
double **a, sum = 0;
scanf("%d %d", &b, &c);
a=(double**)malloc(b*sizeof(double*));
for(i=0; i<b; ++i)
a[i]=(double*)malloc(c*sizeof(double));
for(i=0; i<b; ++i)
for(j=0; j<c; ++j) scanf("%lf", a[i][j]);
for(i=0; i<b; ++i)
for(j=0; j<c; ++j)
if(prost(i+j)) sum += a[i][j];
printf("\nSuma je %g.", sum);
dodaj(a, b, c);
for(i=0; i<=b; ++i){
for(j=0; j<c; ++j)
printf("%g", a[i][j]);
printf("\n");
}
for(i=0; i<=b; ++i) free(a[i]);
free(a);
scanf("%%");
return 0;
}[/code:1]
jel ovo radi kako treba?
zadatak je da program treba ispisati sumu svih elemenata a[i][j] t.d. i+j prost broj, i napisati f-ju koja ce matrici na kraj dodati redak u kojem ce pisati sume stupaca
Kod: | #include <stdio.h>
#include <stdlib.h>
int prost(int n){
int i;
n = (n < 0? -n: n);
if(n==0 || n==1) return 0;
for(i=2; i<n; ++i)
if((n%i) == 0) return 0;
return 1;
}
double **dodaj(double **a, int b, int c){
int i, j;
double sum;
a=(double**)realloc(a,(b+1)*sizeof(double*));
a[b]=(double*)malloc(c*sizeof(double));
for(j=0; j<c; j++){
sum=0;
for(i=0; i<b; ++i)
sum += a[i][j];
a[b][j] = sum;
}
//return a;
}
int main(void){
int b, c, i, j;
double **a, sum = 0;
scanf("%d %d", &b, &c);
a=(double**)malloc(b*sizeof(double*));
for(i=0; i<b; ++i)
a[i]=(double*)malloc(c*sizeof(double));
for(i=0; i<b; ++i)
for(j=0; j<c; ++j) scanf("%lf", a[i][j]);
for(i=0; i<b; ++i)
for(j=0; j<c; ++j)
if(prost(i+j)) sum += a[i][j];
printf("\nSuma je %g.", sum);
dodaj(a, b, c);
for(i=0; i<=b; ++i){
for(j=0; j<c; ++j)
printf("%g", a[i][j]);
printf("\n");
}
for(i=0; i<=b; ++i) free(a[i]);
free(a);
scanf("%%");
return 0;
} |
jel ovo radi kako treba?
|
|
[Vrh] |
|
ekatarina Forumaš(ica)

Pridružen/a: 25. 11. 2007. (19:22:50) Postovi: (161)16
Spol: 
|
Postano: 16:15 pon, 28. 4. 2008 Naslov: |
|
|
[quote]Kada realociras nesto, onda trebas promijeniti vrijednost pointera, a buduci da to radis u funkciji, onda ti treba pointer na taj pointer.
[/quote]
[quote]Dakle, kad dodajes redak, mijenjas varijablu a, pa ju moras i vratiti u glavni program[/quote]
Ako sam dobro shvatila, onda tvoj program neće uspjeti dodati matrici jedan redak, jer nisi upotrijebila ***
Citat: | Kada realociras nesto, onda trebas promijeniti vrijednost pointera, a buduci da to radis u funkciji, onda ti treba pointer na taj pointer.
|
Citat: | Dakle, kad dodajes redak, mijenjas varijablu a, pa ju moras i vratiti u glavni program |
Ako sam dobro shvatila, onda tvoj program neće uspjeti dodati matrici jedan redak, jer nisi upotrijebila ***
|
|
[Vrh] |
|
|