Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  juhe koos C-s: floati tagastamisega mingi jama märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
UglyOgre
HV kasutaja
UglyOgre

liitunud: 25.03.2004



Autoriseeritud ID-kaardiga

sõnum 26.04.2008 03:08:14 juhe koos C-s: floati tagastamisega mingi jama vasta tsitaadiga

Võtan oma mure lühidalt kokku: tahan floati, aga funktsioon tagastab nan-i. Võibolla on asjas süüdi kellaaeg, mu puudulikud oskused või hoopis midagi muud, aga praegu ei oska seda muret kuskilt lahendama ka hakata.
On struktuur:
c:
  1. typedef struct {
  2.         short int id;
  3.         int n_5;
  4.         int n_4;
  5.         int n_3;
  6.         int n_2;
  7.         int n_1;
  8. } movie_data;

ja on funktsioon:
c:
  1. float avg_m_rating(movie_data arg){
  2.         float n_ratings;
  3.         float s_ratings;
  4.         float avg;
  5.        
  6.         n_ratings = arg.n_1 + arg.n_2 + arg.n_3 + arg.n_4 + arg.n_5;
  7.         s_ratings = arg.n_1 + 2*arg.n_2 + 3*arg.n_3 + 4*arg.n_4 + 5*arg.n_5;
  8.        
  9.         avg = s_ratings/n_ratings;
  10.        
  11.         printf("id: %d\n", arg.id);
  12.         printf("sum: %.0f\n", s_ratings);
  13.         printf("total: %.0f\n", n_ratings);
  14.         printf("1: %d\n", arg.n_1);
  15.         printf("2: %d\n", arg.n_2);
  16.         printf("3: %d\n", arg.n_3);
  17.         printf("4: %d\n", arg.n_4);
  18.         printf("5: %d\n", arg.n_5);
  19.         printf("avg: %f\n", avg);
  20.        
  21.         return avg;
  22. }


mainis kutsun ta välja nii:
c:
  1. float r_1;
  2. r_1 = avg_m_rating(m_data[m_id-1]);
  3. printf("### %f\n", r_1);
  4.  


ja konsooli tuleb:
id: 10036
sum: 44101
total: 11521
1: 415
2: 748
3: 2612
4: 4376
5: 3370
avg: 3.827879
### nan


mainis trükitud r_1 väärtus (###) peaks samuti 3.827879 tulema, kuid mingil põhjusel kaob see väärtus kuhugi musta auku. Kompilaatoriks on gcc 4.2.3, kui sest infost abi on. Kui keegi kogenum/värskema peaga midagi kasulikku oskab öelda, olen väga tänulik.
Kommentaarid: 19 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 16
tagasi üles
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 26.04.2008 12:12:44 vasta tsitaadiga

Su probleem peab olema kusagil mujal, kui selles koodis, mida sa siin näitad.

Üldse, su kood on üpris imelik. Milleks defineerida n_1, n_2, n_3 jne, kui saaks kasutada lihtsalt massiivi? Mul on tunne, et sa oled oma koodi siia foorumisse panekuks oluliselt muutnud.

Igal juhul katsu oma kood taandada mingi võimalikult lühikese jupini, kus endiselt probleem ilmneb. Minul järgnev kood igatahes töötas:

c:
  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.         short int id;
  5.         int n_5;
  6.         int n_4;
  7.         int n_3;
  8.         int n_2;
  9.         int n_1;
  10. } movie_data;
  11.  
  12. float avg_m_rating(movie_data arg) {
  13.         float n_ratings;
  14.         float s_ratings;
  15.         float avg;
  16.  
  17.         n_ratings = arg.n_1 + arg.n_2 + arg.n_3 + arg.n_4 + arg.n_5;
  18.         s_ratings = arg.n_1 + 2*arg.n_2 + 3*arg.n_3 + 4*arg.n_4 + 5*arg.n_5;
  19.  
  20.         avg = s_ratings/n_ratings;
  21.  
  22.         printf("id: %d\n", arg.id);
  23.         printf("sum: %.0f\n", s_ratings);
  24.         printf("total: %.0f\n", n_ratings);
  25.         printf("1: %d\n", arg.n_1);
  26.         printf("2: %d\n", arg.n_2);
  27.         printf("3: %d\n", arg.n_3);
  28.         printf("4: %d\n", arg.n_4);
  29.         printf("5: %d\n", arg.n_5);
  30.         printf("avg: %f\n", avg);
  31.  
  32.         return avg;
  33. }
  34.  
  35. int main(int argc, char **argv) {
  36.         movie_data m_data;
  37.         m_data.id = 75;
  38.         m_data.n_1 = 1;
  39.         m_data.n_2 = 2;
  40.         m_data.n_3 = 3;
  41.         m_data.n_4 = 4;
  42.         m_data.n_5 = 5;
  43.  
  44.         float r_1;
  45.         r_1 = avg_m_rating(m_data);
  46.         printf("### %f\n", r_1);
  47. }
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
UglyOgre
HV kasutaja
UglyOgre

liitunud: 25.03.2004



Autoriseeritud ID-kaardiga

sõnum 26.04.2008 13:50:28 vasta tsitaadiga

Suur tänu, nene, et sundisid mind probleemile kainelt lähenema. Kui asjad pulkadeks võtsin, selgus, et selle funktsiooni prototüüp oli puudu headerist. Laiskus maksis kätte, nüüd tean paremini. Ja massiivist otsustasin loobuda lihtsalt seetõttu, et niiviisi tundus mu kood loetavam.
Kommentaarid: 19 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 16
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 29.04.2008 14:08:48 vasta tsitaadiga

UglyOgre kirjutas:
Ja massiivist otsustasin loobuda lihtsalt seetõttu, et niiviisi tundus mu kood loetavam.

c++:
  1.         printf("1: %d\n", arg.n_1);
  2.         printf("2: %d\n", arg.n_2);
  3.         printf("3: %d\n", arg.n_3);
  4.         printf("4: %d\n", arg.n_4);
  5.         printf("5: %d\n", arg.n_5);
vs
c++:
  1.         for (int i=0;i<5;i++){
  2.                 printf("%d: %d\n", i+1, arg.n[i]);
  3.         }
Maitse asi icon_smile.gif
_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 29.04.2008 22:53:06 vasta tsitaadiga

Ka mulle tundub esimene variant loetavam. Teine variant nõuab mult omajagu mõtlemist, esimene on seevastu arusaadav pelgalt peale vaadates. Inimsilmale ilmselt meeldib ka see teatav harmoonilisus selles, kuidas esimeses variandis kõik printf-id kenasti üksteise all reas on.

Ometigi valiksin alati teise variandi, kuna korduste puudumine muudab selle koodi lihtsamini hallatavaks.
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tanzanite
HV kasutaja
tanzanite

liitunud: 13.05.2006




sõnum 06.05.2008 13:08:23 vasta tsitaadiga

Unroll the loop - duh.

c++:
  1.         printf("1: %d\n", arg.n[1]);
  2.         printf("2: %d\n", arg.n[2]);
  3.         printf("3: %d\n", arg.n[3]);
  4.         printf("4: %d\n", arg.n[4]);
  5.         printf("5: %d\n", arg.n[5]);
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  juhe koos C-s: floati tagastamisega mingi jama
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.