| | |
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Autor | Správa |
---|
Registrovaný: 25.11.12 Prihlásený: 28.11.12 Príspevky: 7 Témy: 2 | Napísal Najiva: 25.11.2012 17:32 | |
|
Zdravím, potreboval by som pomoct s programom v C. Mal by nasobit polynomy. Problem je s dynamickou alokaciou pamate. Neviem kde je chyba. Vedel by mi PROSIIIIM niekto poradit ako to opravit? Citácia: #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { int *a, *b, *c, n1, n2, i, j;
if((c = (int*)malloc(10*sizeof(int)))== NULL){ printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} if((a = (int*)malloc(10*sizeof(int)))== NULL) { printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} if ((b = (int*)malloc(10*sizeof(int))) == NULL){ printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} printf("Zadejte stupen polynomu A:\n"); if(scanf("%d", &n1)!=1) { printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 1; } if(n1<0) { printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 2; } else { printf("Zadejte koeficienty polynomu A:\n"); for (i=0; i<=n1; i++) { if(scanf("%d", &a[i])!=1){ printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 5; } } } printf("Zadejte stupen polynomu B:\n"); if(scanf("%d", &n2)!=1) { printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 3; } if(n2<0) { printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 4; } else { printf("Zadejte koeficienty polynomu B:\n"); for (i=0; i<=n2; i++) { if(scanf("%d", &b[i])!=1) { printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 6; } } for (j=0; j<(n1+n2+1); j++) {c[j]=0;} } for (j=0; j<(n1+n2+1); j++) { for (i=0; i<=j; i++) { if ((j-i)<=n2 && i<=n1) c[j]=a[i]*b[j-i]+c[j]; } V c[j] by mali byt ulozene koeficienty vysledneho polynomu. Pre niektore vstupy to funguje. Pre niektore to da segmentation fault.
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 25.11.2012 18:22 | |
|
Pán Vagner určite spomínal silný nástroj menom valgrind. Skompiluj si program s debug symbolmi takto: gcc -g -Wall -pedantic main.c a pusti to cez valgrind valgrind ./a.out a chybu určite nájdeš
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 24.08.12 Prihlásený: 09.02.19 Príspevky: 59 Témy: 0 | Napísal faraon: 25.11.2012 22:36 | |
|
Určitě budeš počítat jen s polynomy méně než 10. stupně? Já jsem to před pár dny testoval až do 100000, takže výsledek měl nejvyšší mocninu ^200000!
_________________ "Existuje pouze jeden člověk, který má méně přátel než Bill Gates, a tím je Saddám Husajn." (Paul Grayson) |
|
Registrovaný: 25.11.12 Prihlásený: 28.11.12 Príspevky: 7 Témy: 2 | Napísal autor témy Najiva: 26.11.2012 17:41 | |
|
No ja prave neviem ako spravne alokovat tu pamat. Tych 10 som tam dal len tak aby som to odskusal. Ale teraz neviem co tam dosadit, kedze tej dynamickej alokacii este uplne nerozumiem.
|
|
Registrovaný: 24.08.12 Prihlásený: 09.02.19 Príspevky: 59 Témy: 0 | Napísal faraon: 26.11.2012 18:00 | |
|
Takže příklad, první polynom bude třetího stupně, takže ^3, ^2, ^1, ^0, čili čtyři koeficienty. Z toho ti vyjde: malloc((n1+1)/sizeof(int)). Druhý polynom bude třeba pouze 2. stupně, ale alokace proběhně stejně jednoduše po jeho zjištění: malloc((n2+1)/sizeof(int)) A teprve potom můžeš vypočítat stupeň výsledku, jako součet obou nejvyšších mocnin, a alokovat pro něj paměť (opět s rezervou pro nultou mocninu), zkusíš to už sám? ;-)
_________________ "Existuje pouze jeden člověk, který má méně přátel než Bill Gates, a tím je Saddám Husajn." (Paul Grayson) |
|
Registrovaný: 25.11.12 Prihlásený: 28.11.12 Príspevky: 7 Témy: 2 | Napísal autor témy Najiva: 26.11.2012 18:58 | |
|
Skusim. Dik.
|
|
Registrovaný: 25.11.12 Prihlásený: 28.11.12 Príspevky: 7 Témy: 2 | Napísal autor témy Najiva: 26.11.2012 19:37 | |
|
if((c = (int*)malloc((n1+n2+2)/sizeof(int)))== NULL){ printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} if((a = (int*)malloc((n1+1)/sizeof(int)))== NULL) { printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} if ((b = (int*)malloc((n2+1)/sizeof(int))) == NULL){ printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} Segmentation fault
|
|
Registrovaný: 24.08.12 Prihlásený: 09.02.19 Príspevky: 59 Témy: 0 | Napísal faraon: 27.11.2012 5:52 | |
|
I takhle? Kód: {zjistím potřebnou velikost} printf("Zadejte stupen polynomu A:\n"); .....
{alokuji paměť} if((a = (int*)malloc((n1+1)/sizeof(int)))== NULL) .....
{načtu data} printf("Zadejte koeficienty polynomu A:\n"); .....
{zjistím potřebnou velikost podruhé} printf("Zadejte stupen polynomu B:\n"); .....
{alokuji druhou paměť} if ((b = (int*)malloc((n2+1)/sizeof(int))) == NULL) .....
{načtu další data} printf("Zadejte koeficienty polynomu B:\n"); .....
{vypočítám a alokuji velikost pro výsledek} if((c = (int*)malloc((n1+n2+2)/sizeof(int)))== NULL) .....
{zpracuji data} for (j=0; j<(n1+n2+1); j++) {c[j]=0;} .....
{tady už můžu a i b uvolnit} free(a); free(b);
{vypíšu výsledky a uvolním zbytek paměti) ..... free(c);
_________________ "Existuje pouze jeden člověk, který má méně přátel než Bill Gates, a tím je Saddám Husajn." (Paul Grayson) |
|
Registrovaný: 25.11.12 Prihlásený: 28.11.12 Príspevky: 7 Témy: 2 | Napísal autor témy Najiva: 27.11.2012 18:38 | |
|
Keď to sptavím tak ako si napísal, tak to nefunguje už vobec. V premennych su strasne velke cisla. Neviem si stym rady. S vypisom som si tiež nevedel rady, tak som ho robil komplikovane ešte v cykle, hned po vlozeni konecnej hodnoty koeficientu do c[j] s exponentom n1+n2-j . Nieje chyba niekde tam? Citácia: #include <stdio.h> #include <stdlib.h>
int main(int argc, char *argv[]) { int *a, *b, *c, n1, n2, i, j;
printf("Zadejte stupen polynomu A:\n"); if(scanf("%d", &n1)!=1) { printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 1; } if(n1<0) { printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 2; } else { if((a = (int*)malloc((n1+1)*sizeof(int)))== NULL) { printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} printf("Zadejte koeficienty polynomu A:\n"); for (i=0; i<=n1; i++) { if(scanf("%d", &a[i])!=1){ printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 5; } } } printf("Zadejte stupen polynomu B:\n"); if(scanf("%d", &n2)!=1) { printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 3; } if(n2<0) { printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 4; } else { if ((b = (int*)malloc((n2+1)*sizeof(int))) == NULL){ printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} printf("Zadejte koeficienty polynomu B:\n"); for (i=0; i<=n2; i++) { if(scanf("%d", &b[i])!=1) { printf("Nespravny vstup.\n") ; #ifndef __PROGTEST__ system("PAUSE"); #endif return 6; } } } if((c = (int*)malloc((n1+n2+1)*sizeof(int)))== NULL){ printf("Chyba pri alokaci pameti, program bude ukoncen"); return 7;} for (j=0; j<(n1+n2+1); j++) { for (i=0; i<=j; i++) { if ((j-i)<=n2 && i<=n1) c[j]=a[i]*b[j-i]+c[j]; } if (c[j]!=0) { if (j==0) { if (c[j]<-1 && (n1+n2-j)!=1 && (n1+n2-j)!=0) printf("%+dx<sup>%d</sup>", c[j], (n1+n2-j)); if (c[j]<-1 && (n1+n2-j)==1) printf("%+dx", c[j]); if (c[j]==-1 && (n1+n2-j)==1) printf("-x"); if (c[j]==1 && (n1+n2-j)==1) printf("x"); if (c[j]>1 && (n1+n2-j)==1) printf("%dx", c[j]); if (c[j]>1 && (n1+n2-j)!=1 && (n1+n2-j)!=0) printf("%dx<sup>%d</sup>", c[j], (n1+n2-j)); if (c[j]>1 && (n1+n2-j)==0) printf("%d", c[j]); if (c[j]<-1 && (n1+n2-j)==0) printf("%d", c[j]); if (c[j]==1 && (n1+n2-j)!=0 && (n1+n2-j)!=0) printf("x<sup>%d</sup>", (n1+n2-j)); if (c[j]==-1 && (n1+n2-j)!=0 && (n1+n2-j)!=0) printf("-x<sup>%d</sup>", (n1+n2-j)); } else { if ((c[j]<-1 || c[j]>1) && (n1+n2-j)!=1 && (n1+n2-j)!=0) printf("%+dx<sup>%d</sup>", c[j], (n1+n2-j)); if ((c[j]<-1 || c[j]>1) && (n1+n2-j)==1) printf("%+dx", c[j]); if (c[j]==-1 && (n1+n2-j)==1) printf("-x"); if (c[j]==1 && (n1+n2-j)==1) printf("x"); if (c[j]==-1 && (n1+n2-j)==0) printf("%+d", c[j]); if (c[j]==1 && (n1+n2-j)==0) printf("%+d", c[j]); if ((c[j]<-1 || c[j]>1) && (n1+n2-j)==0) printf("%+d", c[j]); if (c[j]==1 && (n1+n2-j)!=0 && (n1+n2-j)!=0) printf("+x<sup>%d</sup>", (n1+n2-j)); if (c[j]==-1 && (n1+n2-j)!=0 && (n1+n2-j)!=0) printf("-x<sup>%d</sup>", (n1+n2-j)); } } } free(a); free(b); free(c); printf("\n"); #ifndef __PROGTEST__ system("PAUSE"); #endif return 0; }
|
|
Registrovaný: 25.11.12 Prihlásený: 28.11.12 Príspevky: 7 Témy: 2 | Napísal autor témy Najiva: 27.11.2012 19:08 | |
|
Tak holt nejak sa mi to podarilo. Skusil som predtym nez budem vkladat do pola hodnoty ho najprv vynulovat. Kazdopadne uz to nehlasi segmentation fault ale: Program překročil přidělenou maximální dobu běhu. Apon prijemna zmena.
|
|
| Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| segmentation fault v Assembler, C, C++, Pascal, Java | 10 | 981 | 12.11.2007 13:19 m@-nX | | QtCreator : Segmentation fault v Assembler, C, C++, Pascal, Java | 1 | 349 | 27.12.2010 19:39 Forty- | | Segmentation fault - C v Assembler, C, C++, Pascal, Java | 11 | 964 | 09.05.2011 22:20 M4rek | | Segmentation fault v C v Assembler, C, C++, Pascal, Java | 0 | 317 | 30.01.2012 19:13 KocuR | | string v C = segmentation fault v Assembler, C, C++, Pascal, Java | 1 | 286 | 05.11.2011 12:01 Fico | | General protection fault v Operačné systémy Microsoft | 0 | 516 | 27.08.2008 20:57 misso |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|