Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 10 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.12
Prihlásený: 28.11.12
Príspevky: 7
Témy: 2
Príspevok NapísalOffline : 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.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 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!
Offline

Užívateľ
Užívateľ
Segmentation fault

Registrovaný: 24.08.12
Prihlásený: 09.02.19
Príspevky: 59
Témy: 0
Príspevok NapísalOffline : 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)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.12
Prihlásený: 28.11.12
Príspevky: 7
Témy: 2
Príspevok Napísal autor témyOffline : 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.


Offline

Užívateľ
Užívateľ
Segmentation fault

Registrovaný: 24.08.12
Prihlásený: 09.02.19
Príspevky: 59
Témy: 0
Príspevok NapísalOffline : 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)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.12
Prihlásený: 28.11.12
Príspevky: 7
Témy: 2
Príspevok Napísal autor témyOffline : 26.11.2012 18:58

Skusim. Dik.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.12
Prihlásený: 28.11.12
Príspevky: 7
Témy: 2
Príspevok Napísal autor témyOffline : 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 :(


Offline

Užívateľ
Užívateľ
Segmentation fault

Registrovaný: 24.08.12
Prihlásený: 09.02.19
Príspevky: 59
Témy: 0
Príspevok NapísalOffline : 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)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.12
Prihlásený: 28.11.12
Príspevky: 7
Témy: 2
Príspevok Napísal autor témyOffline : 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;
}


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.12
Prihlásený: 28.11.12
Príspevky: 7
Témy: 2
Príspevok Napísal autor témyOffline : 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. :D


Odpovedať na tému [ Príspevkov: 10 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. segmentation fault

v Assembler, C, C++, Pascal, Java

10

981

12.11.2007 13:19

m@-nX Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. QtCreator : Segmentation fault

v Assembler, C, C++, Pascal, Java

1

349

27.12.2010 19:39

Forty- Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Segmentation fault - C

v Assembler, C, C++, Pascal, Java

11

964

09.05.2011 22:20

M4rek Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Segmentation fault v C

v Assembler, C, C++, Pascal, Java

0

317

30.01.2012 19:13

KocuR Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. string v C = segmentation fault

v Assembler, C, C++, Pascal, Java

1

286

05.11.2011 12:01

Fico Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. General protection fault

v Operačné systémy Microsoft

0

516

27.08.2008 20:57

misso Zobrazenie posledných príspevkov


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

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra