praegune kellaaeg 06.07.2025 15:26:56
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
UglyOgre
HV kasutaja

liitunud: 25.03.2004
|
26.04.2008 03:08:14
juhe koos C-s: floati tagastamisega mingi jama |
|
|
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:
|
typedef struct { short int id; int n_5; int n_4; int n_3; int n_2; int n_1; } movie_data;
|
ja on funktsioon:
c:
|
float avg_m_rating(movie_data arg){ float n_ratings; float s_ratings; float avg; n_ratings = arg.n_1 + arg.n_2 + arg.n_3 + arg.n_4 + arg.n_5; s_ratings = arg.n_1 + 2*arg.n_2 + 3*arg.n_3 + 4*arg.n_4 + 5*arg.n_5; avg = s_ratings/n_ratings; printf("sum: %.0f\n", s_ratings ); printf("total: %.0f\n", n_ratings ); return avg; }
|
mainis kutsun ta välja nii:
c:
|
float r_1; r_1 = avg_m_rating(m_data[m_id-1]);
|
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 |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
26.04.2008 12:12:44
|
|
|
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:
|
#include <stdio.h> typedef struct { short int id; int n_5; int n_4; int n_3; int n_2; int n_1; } movie_data; float avg_m_rating(movie_data arg) { float n_ratings; float s_ratings; float avg; n_ratings = arg.n_1 + arg.n_2 + arg.n_3 + arg.n_4 + arg.n_5; s_ratings = arg.n_1 + 2*arg.n_2 + 3*arg.n_3 + 4*arg.n_4 + 5*arg.n_5; avg = s_ratings/n_ratings; printf("sum: %.0f\n", s_ratings ); printf("total: %.0f\n", n_ratings ); return avg; } int main(int argc, char **argv) { movie_data m_data; m_data.id = 75; m_data.n_1 = 1; m_data.n_2 = 2; m_data.n_3 = 3; m_data.n_4 = 4; m_data.n_5 = 5; float r_1; r_1 = avg_m_rating(m_data); }
|
|
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
UglyOgre
HV kasutaja

liitunud: 25.03.2004
|
26.04.2008 13:50:28
|
|
|
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 |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
29.04.2008 14:08:48
|
|
|
UglyOgre kirjutas: |
Ja massiivist otsustasin loobuda lihtsalt seetõttu, et niiviisi tundus mu kood loetavam. |
c++:
|
printf("1: %d\n", arg.n_1); printf("2: %d\n", arg.n_2); printf("3: %d\n", arg.n_3); printf("4: %d\n", arg.n_4); printf("5: %d\n", arg.n_5);
|
vs
c++:
|
for (int i=0;i<5;i++){ printf("%d: %d\n", i+1, arg.n[i]); }
|
Maitse asi
_________________ 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 |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
29.04.2008 22:53:06
|
|
|
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 |
|
 |
tanzanite
HV kasutaja

liitunud: 13.05.2006
|
06.05.2008 13:08:23
|
|
|
Unroll the loop - duh.
c++:
|
printf("1: %d\n", arg.n[1]); printf("2: %d\n", arg.n[2]); printf("3: %d\n", arg.n[3]); printf("4: %d\n", arg.n[4]); printf("5: %d\n", arg.n[5]);
|
|
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
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.
|