praegune kellaaeg 22.06.2025 10:31:18
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
1dumbpcuser
HV Guru
liitunud: 05.03.2002
|
09.06.2010 22:14:24
KIIRESTI abi vaja: struktuurid C-s |
|
|
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
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 |
|
 |
etk
HV kasutaja

liitunud: 10.10.2006
|
09.06.2010 22:27:32
|
|
|
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 |
|
 |
1dumbpcuser
HV Guru
liitunud: 05.03.2002
|
09.06.2010 22:39:54
|
|
|
Sellest sain isegi, lihtsan nii üritasin asja "õppida" proovimise teel.
Selles omistamises oli Teil õigus, need olid tagurpidi
_________________ O: Low-profile pci bracket |
|
Kommentaarid: 100 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
95 |
|
tagasi üles |
|
 |
etk
HV kasutaja

liitunud: 10.10.2006
|
09.06.2010 22:50:26
|
|
|
ega proovides õpibki, niiet õige mõte
|
|
Kommentaarid: 44 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
42 |
|
tagasi üles |
|
 |
1dumbpcuser
HV Guru
liitunud: 05.03.2002
|
09.06.2010 23:34:54
|
|
|
Nüüd on vist tiba parem (lisaks prindib ta tulemused ka faili):
Spoiler 
# 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;
FILE *out;
in=fopen("sv.txt","r");
out=fopen("vv.txt", "a");
Pomm *a[1];
a[1]=(Pomm*)malloc(sizeof(Pomm));
int i=0;
while(!feof(in)){a[1]=realloc(a[1],(2+i)*sizeof(Pomm));
printf("a[%d] aadress on %d\t", i, a[i]);
a[2+i]=malloc(sizeof(Pomm));
printf("a[2+%d] aadress on: %d\n", i, &a[2+1]);
fscanf(in,"%d %d\n", &a[i]->Kaal, &a[i]->Kogus);
printf("a[%d]=%d %d\n",i, a[i]->Kaal, a[i]->Kogus);
fprintf(out,"a[%d]=%d %d\n", i, a[i]->Kaal, a[i]->Kogus);
i++;
}
fclose(in);
fclose(out);
getchar();
return;
}
|
Kuigi ta prindib kõigi a[i] väärtused, jookseb program kusagil getchar() juures kokku .
Samuti ei ilmunud midagi konsooli (ja jooksis kokku) kui kommenteerisin while-tsüklis kaks esimest printf-lauset välja
_________________ O: Low-profile pci bracket |
|
Kommentaarid: 100 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
0 :: |
95 |
|
tagasi üles |
|
 |
etk
HV kasutaja

liitunud: 10.10.2006
|
10.06.2010 08:16:55
|
|
|
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 |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
10.06.2010 11:06:10
|
|
|
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 |
|
 |
etk
HV kasutaja

liitunud: 10.10.2006
|
10.06.2010 11:36:29
|
|
|
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 |
|
 |
mark11
HV vaatleja
liitunud: 28.01.2006
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
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.
|