[ 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 | 2
NapísalOffline : 25.11.2012 17:32 | Segmentation fault

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 | 3
NapísalOffline : 25.11.2012 18:22 | Segmentation fault

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 | 0
NapísalOffline : 25.11.2012 22:36 | Segmentation fault

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 | 2
Napísal autor témyOffline : 26.11.2012 17:41 | Segmentation fault

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 | 0
NapísalOffline : 26.11.2012 18:00 | Segmentation fault

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 | 2
Napísal autor témyOffline : 26.11.2012 18:58 | Segmentation fault

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 | 2
Napísal autor témyOffline : 26.11.2012 19:37 | Segmentation fault

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 | 0
NapísalOffline : 27.11.2012 5:52 | Segmentation fault

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 | 2
Napísal autor témyOffline : 27.11.2012 18:38 | Segmentation fault

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 | 2
Napísal autor témyOffline : 27.11.2012 19:08 | Segmentation fault

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


 [ Príspevkov: 10 ] 


Segmentation fault



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 Backend

10

1056

12.11.2007 13:19

m@-nX

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

QtCreator : Segmentation fault

v Backend

1

423

27.12.2010 19:39

Forty-

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

Segmentation fault - C

v Backend

11

1052

09.05.2011 22:20

M4rek

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

Segmentation fault v C

v Backend

0

408

30.01.2012 19:13

KocuR

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

string v C = segmentation fault

v Backend

1

354

05.11.2011 12:01

Fico

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

General protection fault

v Windows

0

604

27.08.2008 20:57

misso



© 2005 - 2026 PCforum, edited by JanoF