Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  KIIRESTI abi vaja: struktuurid C-s 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:  
1dumbpcuser
HV Guru

liitunud: 05.03.2002




sõnum 09.06.2010 22:14:24 KIIRESTI abi vaja: struktuurid C-s vasta tsitaadiga

Suhteliselt algaja olen ja vajaks väga kiiresti abi struktuuridega.
Ülesandeks on lugeda algandmed failist sisse ja paigutada need struktuuri, mis koosneb täisarvulistest suurustest Kaal ja Kogus. (Indeksi lisasin ise, kuna vaja teada, mitu elementi on.)
Hiljem oleks siis vaja ka neid andmeid sealt struktuurist kätte saada ja kasutada icon_rolleyes.gif

Kood hetkel selline:

# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
/*
# define "sv.txt" sv
# define "vv.txt" vv
*/
typedef struct {
        int Kaal;
        int Kogus;
        int idx;
        }Pomm;
       
int main(){
FILE *in;
in=fopen("sv.txt","r");
Pomm *a;
a=(Pomm*)malloc(sizeof(Pomm));
Pomm *g;
g=malloc(sizeof(Pomm));
int c[1000], b[1000];
int i;
while(!feof(in)){
                 i=0;
                 fscanf(in, "%d %d", &c[i], &b[i]);
                 printf("%d\t%d\n", c[i],b[i]);
                 i++;
}
fclose(in);
c[0]=a->Kaal;
b[0]=a->Kogus;
printf("Vihti kaaluga %d on %d tükki\n", a->Kaal, a->Kogus);

c[2]=g->Kaal;
b[2]=g->Kogus;
printf("Vihti kaaluga %d on %d tükki\n", g->Kaal, g->Kogus);

getchar();
return;
}


sv.txt on sisendfail, millel prooviks sisu selline:
10   3
25   4
100   2
250   3
500   2
750   3
1000   2
2000   1
2500   2

Seega asi on mul väga segane ses suhtes.
Kui oleks rohkem aega, siis pusiks ise veel edasi, aga on äärmiselt kiire sellega.

Tänan abistajaid juba ette!

_________________
O: Low-profile pci bracket
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 95
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
etk
HV kasutaja
etk

liitunud: 10.10.2006




sõnum 09.06.2010 22:27:32 vasta tsitaadiga

c[0]=a->Kaal;
b[0]=a->Kogus;

kas see vastupidi ei peaks olema ehk
a->Kaal=c[0];
a->Kogus=b[0];

sest seda pidi sa ju omistad stuktuuri elemendile Kaal ja Kogus väärtudes mis on siis c[0] ja b[0] ning järgnevalt printf lausest järeldan, et sa seda just siiski teha üritadki

esimene asi, mis silma hakkas

btw, et endal kood selgems oleks ei maksa vägapalju kasutada sellisedi lühikesi muutujanimesid nagu "c" ja "b" jne kuna need võivad sassi minna, eriti kui nädalakene hiljem koodi vaatad ja aru üritad saada, mis toimub

edit:
vaatasin veel korra su postitust ja mõistan paremini, mida sul teha vaja oleks, ei hakka koodi siia päris kirjutama vaid annan suuna ja loodan, et sul on aega niipalju, et kood ise kirjutada, usun, et see on palju harivam.

nimelt, ma ei usu, et sul oleks üldse vaja neid "c" ja "b" arraysid vaid sul oleks vaja hoopis structide array moodustada kus igasse stucti loetakse siis vastav kaal ja kogus sisse.
selleks, et ei oleks vaja kohe algul teha mingit üüratut structide arrayd võid läheneda while(!feof()) tsükliga, kus tsükli alguses realloc() abil suurendatakse structide arrayd ühe võrra, loetakse uude array elementi info ja liigutakse edasi.
selle tulemusena saad sa täpselt nii mitmest elemendist koosneva struct array kui mitu elementi sa sisse loed ja isa struct element sisaldab endas ühte kaalu kogust ja vastavat pommide arvu, mis sellise kaaluga on sv.txt failis.

midagi arusaamatusk jäi ütle, üritan seletada
ja edu
Kommentaarid: 44 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 42
tagasi üles
vaata kasutaja infot saada privaatsõnum
1dumbpcuser
HV Guru

liitunud: 05.03.2002




sõnum 09.06.2010 22:39:54 vasta tsitaadiga

Sellest sain isegi, lihtsan nii üritasin asja "õppida" proovimise teel.
Selles omistamises oli Teil õigus, need olid tagurpidi icon_rolleyes.gif

_________________
O: Low-profile pci bracket
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 95
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
etk
HV kasutaja
etk

liitunud: 10.10.2006




sõnum 09.06.2010 22:50:26 vasta tsitaadiga

ega proovides õpibki, niiet õige mõte
Kommentaarid: 44 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 42
tagasi üles
vaata kasutaja infot saada privaatsõnum
1dumbpcuser
HV Guru

liitunud: 05.03.2002




sõnum 09.06.2010 23:34:54 vasta tsitaadiga

Nüüd on vist tiba parem (lisaks prindib ta tulemused ka faili):
Spoiler Spoiler Spoiler


Kuigi ta prindib kõigi a[i] väärtused, jookseb program kusagil getchar() juures kokku eusa_think.gif.
Samuti ei ilmunud midagi konsooli (ja jooksis kokku) kui kommenteerisin while-tsüklis kaks esimest printf-lauset välja icon_rolleyes.gif

_________________
O: Low-profile pci bracket
Kommentaarid: 100 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 95
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
etk
HV kasutaja
etk

liitunud: 10.10.2006




sõnum 10.06.2010 08:16:55 vasta tsitaadiga

esiteks, alati kui kasutada malloc, realloc, calloc vms, tuleb free() ka kasutusele võtta, et lõpus vabastada mälu
teiseks, mina isiklikult oleksin kasutanud Pomm *a; mitte *a[1] kuna piisab täitsa ühemõõtmelisest massiivist, seega oleks while esimene lause a = realloc(a, (i+1)*sizeoff(Pomm)); ning while tsüklis mallocit ei kasutaks
mallocist hoiduksin kuna see tagastab tühja sisuga pointeri, realloc aga tagastab pointeri teise suurusega arrayle hoides seal sees oleva info alles. seega kui sa teed realloc arrayle kus on juba 6 elementi sees ja seejärel malloc siis sa sujuvalt kustutad kõik eelnevad ära, kuna sa aga samas tsüklis kohe ka välja faili kirjutad, siis sa ei pruugi seda märgata. Võin eksida muidugi aga selle kontrolliks tee väljund faili trükkimine eraldi for tsükliga, mis käib 0-st i-ni ja kirjutab väljundfaili a[i] sisu. Kui ma eksin, siis hoolimata mallocist peaks ta ilusit sul kõik sisse loetud arvud teises tsüklid väljundfaili kirjutama. Kui ma ei eksi, siis ka kirjutab ainult viimasena sisse loetud info ning kõik teised kohad arrayd viitavad NULL-le, mis võib aga ei pruugi programmi crashida

ja kui võimalik, siis getchar()-i ka mitte kasutada aga antud harjutuse puhul las siis olla. getchari vajadusest saaksid määda kui programmi otse käsurealt(command promt, või terminal, vastavalt siis kas win või unix) käivitad

free(a) tuleks panna peale while tsüklit, see vabastab mälu mis sa oled allokeerinud a-le programmi käigus

kui IDE-d kasutad, mis debugi võimaldab, siis pane selles käima ja käi rida haaval kood läbi ning vaata muutujate sisu, annab ehk aimu mis kus ja kuidas on ning ehk seletab ka seda, miks programm crashib
Kommentaarid: 44 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 42
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 10.06.2010 11:06:10 vasta tsitaadiga

Pomm *a[1];
a[1]=(Pomm*)malloc(sizeof(Pomm));
See koht tundub kuidagi väga kahtlane. Defineerid ühe elemendise pointerite massiivi ning omistad teisele massiivi elemendile väärtuse ilma, et massiivile endale oleksid veel mälu eraldanud. Kui soovid luua Pomm elementide massiivi siis peaks see vist olema umbes nii:
Pomm *a;
a=(Pomm*)malloc(sizeof(Pomm));
Seal siis luuakse esialgu üheainsa elemendiga massiiv. Kui vaja rohkem, siis lihtsalt korruta eraldatava mälu hulk läbi elementide arvuga.

Üldiselt soovitaks soojalt tutvuda dünaamilise mälu kasutamise põhimõtetega, hetkel tundub et oled millestki väga valesti aru saanud.

_________________
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
etk
HV kasutaja
etk

liitunud: 10.10.2006




sõnum 10.06.2010 11:36:29 vasta tsitaadiga

noh, kui arvestada, et dünaamilist mälu soovitasin mina kastuada ei maksa kohe väga kurja häält teha
kuigi jah pean nõustuma, et ise jäin ka seda kohta imelikult silmitsema


kui tahad lihtsamalt siis jäta dünaamiline mälu hetkel kõrvale ja tegele ainult konstantsete suurustega, tehes Pomm a[n] ja jättes pointerid sinnapaika, teeb alguses elu lihtsamaks
õppimise mõttes aga soovitan dünaamilisega edasi jännata kuni hakkama ja aru saad, hiljem on parem.
Kommentaarid: 44 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 42
tagasi üles
vaata kasutaja infot saada privaatsõnum
mark11
HV vaatleja

liitunud: 28.01.2006




sõnum 10.06.2010 19:15:52 vasta tsitaadiga

https://foorum.hinnavaatlus.ee/viewtopic.php?t=92709
Kommentaarid: 1 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 1
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  KIIRESTI abi vaja: struktuurid C-s
[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.