June 26, 2002
Hej!
Ska göra ett litet program i C (obs ej C++) som kan addera lr multiplicera 2 rationella tal. Ska lösa detta mha en struct med täljare och nämnare på det sätt jag gjort nedan.. Men när jag ska läsa in data till dessa structer mha av scanf kraschar programmet 🙁 Nån som vet varför?
Tacksam för snabb hjälp.. har tentamen om 24h :S
****************************************************
#include
struct rat_tal
{
int t;
int n;
};
typedef struct rat_tal Rat_tal;
Rat_tal* add(Rat_tal *a, Rat_tal *b)
{
Rat_tal *res;
res -> t = ((a -> t)*(b -> n))+((b -> t)*(a -> n));
res -> n = (a -> n)*(b -> n);
return res;
}
Rat_tal* mul(Rat_tal *a, Rat_tal *b)
{
Rat_tal *res;
res -> t = (a -> t) * (b -> t);
res -> n = (a -> n) * (b -> n);
return;
}
int main()
{
Rat_tal *a;
Rat_tal *b;
Rat_tal *res;
printf("tal1 taljare: ");
scanf("%dn",&(a -> t));
printf("tal1 namnare: ");
scanf("%dn",&(a -> n));
printf("tal2 taljare: ");
scanf("%dn",&(b -> t));
printf("tal2 namnare: ");
scanf("%dn",&(b -> n));
res = add(a,b);
printf("tal1+tal2= %d/%dn", res->t, res->n);
res = mul(a,b);
printf("tal1*tal2= %d/%dn", res->t, res->n);
system("PAUSE");
}
****************************************************
June 26, 2002
ren wrote: Det är för att pekarna till dina structar är onitierade och pekar på oallokerat minnet.
Hur löser jag initieringen av pekarna då?
Det går tydligen inte ens att skriva:
int main()
{
Rat_tal *a;
a -> t = 0;
..osv
ren wrote: Varför använder du perkare till dina struktar över huvud taget?
Använder pekare till dom efter en lärares råd.. att inte använda sig av pekare ska tydligen innebära mkt mer krävande parameteröverföring (vet att det här ex är litet, men mest som principsak)
ren wrote: Funktionen mul resturnerar inget resultat, vilket är fel.
Woops, glömt o skriva i.. löst 🙂
ren wrote: Använd inte "n" i scanf funktionerna.
Mmkay, antar att scanf byter rad själv efter imatning?
Tack för hjälpen 🙂
July 28, 2003
Du måste ju allokera structarna någonstans, sedan skapa pekare som pekar till dessa structar. En pekare som in pekar på någonting vettigt går inte att använda (det krashar, som du har märkt).
I main() t.ex. behöver du inga pekare:
Rat_tal a, b, ret;
scanf(...) etc
add(&ret, &a, &b);
Observera att ret skickas med till add; det är enda sättet kunna använda en pekare för resultatet. ret ska då heller inte deklareras i add().
I just det här fallet är det lite onödigt med pekare. För varje argument kommer 4 byte kopieras (förutsatt att du sitter på en 32-bits maskin). Hade du inte använt pekare hade 8 byte kopierats per argument. Om du har 64-bits maskin kommer det inte vara någon skillnad alls...
January 15, 2004
OM du annars verkligen, verkligen vill använda pekar till structarna så får väl allokera dom.
#include<stdlib.h>
Rat_tal *a,*b;
a = malloc(sizeof(Rat_tal));
b = malloc(sizeof(Rat_tal));
/* använd a och b */
free(a);
free(b);
Glöm i så fall inte heller att se om allokeringen lyckats med t.ex.
if(a == NULL)
{
/* felhanteringskod */
}
1 Guest(s)