C: scanf o structer. Snabb hjälp önskas!|Programmering / Grafisk formgivning|Forum|Nordichardware

Search
Forum Scope


Match



Forum Options



Minimum search word length is 3 characters - maximum search word length is 84 characters
Lost password?
The forums are currently locked and only available for read only access
sp_Feed sp_TopicIcon
C: scanf o structer. Snabb hjälp önskas!
jeremy1984
Kommer du hit ofta?
Medlem
Forum Posts: 315
Member Since:
June 26, 2002
sp_UserOfflineSmall Offline
1
December 10, 2005 - 11:20 pm
sp_Permalink sp_Print

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");
}

****************************************************

ren
Kommer du hit ofta?
Medlem
Forum Posts: 833
Member Since:
January 15, 2004
sp_UserOfflineSmall Offline
989908
December 11, 2005 - 12:36 am
sp_Permalink sp_Print

Det är för att pekarna till dina structar är onitierade och pekar på oallokerat minnet.

Varför använder du perkare till dina struktar över huvud taget?

Funktionen mul resturnerar inget resultat, vilket är fel.

Använd inte "n" i scanf funktionerna.

jeremy1984
Kommer du hit ofta?
Medlem
Forum Posts: 315
Member Since:
June 26, 2002
sp_UserOfflineSmall Offline
989925
December 11, 2005 - 1:23 am
sp_Permalink sp_Print

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 🙂

Avatar
dae
Kommer du hit ofta?
Medlem
Forum Posts: 410
Member Since:
July 28, 2003
sp_UserOfflineSmall Offline
989983
December 11, 2005 - 10:33 am
sp_Permalink sp_Print

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...

ren
Kommer du hit ofta?
Medlem
Forum Posts: 833
Member Since:
January 15, 2004
sp_UserOfflineSmall Offline
990014
December 11, 2005 - 11:41 am
sp_Permalink sp_Print

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 */
}
Forum Timezone: Europe/Stockholm
Most Users Ever Online: 1030
Currently Online:
Guest(s) 88
Currently Browsing this Page:
1 Guest(s)
Top Posters:
Andreas Galistel: 16287
Jonas Klar: 15897
ilg@dd: 10810
Nyhet: 10607
Mind: 10550
Ctrl: 10355
Gueno: 9881
Guest: 9344
Snorch: 8881
Callister: 8468
Newest Members:
PetrbonFU PetrbonFU
Karine Bembry
Dolores Mcdaniels
Anibal McLeish
Francisca Alt
Alfie Everhart
Lester Huitt
Orlando Jorgensen
Mikki Lundgren
Dakota Kozlowski
Forum Stats:
Groups: 11
Forums: 59
Topics: 146630
Posts: 1300967

 

Member Stats:
Guest Posters: 2
Members: 79425
Moderators: 0
Admins: 11
Administrators: nordicadmin, Henrik Berntsson, Anton Karmehed, Carl Holmberg, Joel Oscarsson, Mikael Linnér, Mikael Schwartz, Andreas Paulsson, Nickebjrk, Mattias Pettersson, EmxL