| | |
| Stránka: 1 z 1
| [ Príspevkov: 6 ] | |
Autor | Správa |
---|
Registrovaný: 15.04.12 Prihlásený: 06.06.13 Príspevky: 23 Témy: 10 |
mam takuto funkciu Kód: int pole() { FILE *fr; char s1[30]; char s2[30]; char s3[30]; char s4[30]; int c1,c2,x=0,pz=0; float f1=0; float *p_x;
fr=fopen(ZAJAZDY,"r"); if(fr == NULL){printf("Neotvoreny subor\0"); return 1;}
while (feof(fr) == 0){ fgets(s1 , 30 , fr); fgets(s2 , 30 , fr); fgets(s3 , 30 , fr); fscanf(fr,"%d\n", &c1); fscanf(fr,"%lf\n", &f1); fgets(s4 , 30 , fr); fscanf_s(fr,"%d\n", &c2); pz++; } p_x = ((float*) malloc(pz * sizeof(float))); rewind(fr); while (feof(fr) == 0){ fgets(s1 , 30 , fr); fgets(s2 , 30 , fr); fgets(s3 , 30 , fr); fscanf(fr,"%d\n", &c1); fscanf(fr,"%lf\n", &f1); fgets(s4 , 30 , fr); fscanf(fr,"%d\n", &c2); *(p_x+x)=f1; x++;
} return 0; }
a hadze mi chybu ze stack around variable f1 is corupted neviem kde je chyba predtym mi to islo a podla mna je to spravne ale tak fakt neviem prosim ak by ste sa nato mrkli
|
|
Registrovaný: 24.07.10 Prihlásený: 19.11.22 Príspevky: 107 Témy: 28 Bydlisko: Bratislava |
myslím, že máš problém v pointerovej aritmetike nemôžeš dať *(p_x+x) lebo float má veľkosť 2 ak sa nemýlim. Použi radšej niečo ako: *(p_x+sizeof(float)*x)=f1; alebo x-ko inkrementuj ako x+=sizeof(float);
_________________ silentaslash || tiwdaym || tou(x)? NTB: ASUS ROG G752VS (KBL)-GB393T, CPU: Intel Core i7 7700HQ Kaby Lake, Display: 17.3" LED 3840x2160 IPS matný, RAM: 32GB DDR4, GPU: NVIDIA GeForce GTX 1070 8GB GDDR5, SSD: SSD 256GB PCIe + WD Blue PC SSD 1 TB M.2 HDD: 2TB Seagate Barracuda Laptop OS: Windows 10 64-bit Periférie: monitor: 4k 28" ASUS MG28UQ klávesnica: Corsair Gaming straf Cherry MX Silent (US) myš: A4tech Bloody J90 Core 3 kovové pojazdy NAS: Synology DiskStation DS1517 + 8GB HDD: RAID5 (synology): WD Red Plus 4TB + 2x Seagate IronWolf 4 TB Wifi: ASUS RT-AC87U AC2400 Mobil: OnePlus 3T, 64GB |
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 17.11.2012 13:41 | |
|
silentasflash píše: nemôžeš dať *(p_x+x) lebo float má veľkosť 2 ak sa nemýlim Mýliš, to by bolo veľmi divné, keby float mal byty (na akejkoľvek platforme) A samozrejme môže to tak urobiť. Keď pripočítaš k pointru jednotku, prejde sa na ďalšiu adresu (ktorá sa vypočíta práve ako píšeš - p+sizeof(*p)) Toto robí Cčko za teba automaticky. Ty by si sa teda posunul o sizeof(float) prvkov dopredu Ja tam vidím problém skôr v tom, že format pre float je %f (nie %lf, ten je pre double)
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 24.07.10 Prihlásený: 19.11.22 Príspevky: 107 Témy: 28 Bydlisko: Bratislava |
no tak ako má tam viac chýb v podstate je to úplne strašné takto by to malo vyzerať správne: Kód: int pole() { FILE *fr; char s1[30]; char s2[30]; char s3[30]; char s4[30]; int c1,c2,x=0,pz=0; float f1=0; float *p_x;
fr=fopen(ZAJAZDY,"r"); if(fr == NULL){printf("Neotvoreny subor\n"); //na koniec riadku sluzi \n nie \0 return 1;}
while (feof(fr) == 0){ fgets(s1 , 30 , fr); fgets(s2 , 30 , fr); fgets(s3 , 30 , fr); fscanf(fr,"%d\n", &c1); fscanf(fr,"%f\n", &f1); //kedze chces pracovat s floatom, musis aj nacitat ako float, inak prepisujes nejaku inu pamet, preto pouzijes %f nie %lf //totiz %lf-om nacitavas do typu double, ktory ma 4B float ma len 2B fgets(s4 , 30 , fr); fscanf(fr,"%d\n", &c2); //nechapem preco pouziovas fscanf_s ked to je len projekt do skoly staci ti fscanf pz++; } p_x = ((float*) malloc(pz * sizeof(float))); rewind(fr); while (feof(fr) == 0){ fgets(s1 , 30 , fr); fgets(s2 , 30 , fr); fgets(s3 , 30 , fr); fscanf(fr,"%d\n", &c1); fscanf(fr,"%f\n", &f1); //opet - nie %lf ale %f fgets(s4 , 30 , fr); fscanf(fr,"%d\n", &c2); *(p_x+x)=f1; //mas na vyber bud takto x++; /*alebo to mozes urobit aj takto: *p_x=f1; p_x+=sizeof(float); alebo este jedna moznost p_x[x]=f1; x++; */
} return 0; } opravy sú popísané v komentároch v kóde, kukni btw mám taky pocit, že potrebuješ pracovať s tým poľom aj mimo funkcie, potom si skús teda funkciu nejako upraviť aby ti returnovala to pole a nejakú veľkosť toho poľa, to už nechávam na tebe
_________________ silentaslash || tiwdaym || tou(x)? NTB: ASUS ROG G752VS (KBL)-GB393T, CPU: Intel Core i7 7700HQ Kaby Lake, Display: 17.3" LED 3840x2160 IPS matný, RAM: 32GB DDR4, GPU: NVIDIA GeForce GTX 1070 8GB GDDR5, SSD: SSD 256GB PCIe + WD Blue PC SSD 1 TB M.2 HDD: 2TB Seagate Barracuda Laptop OS: Windows 10 64-bit Periférie: monitor: 4k 28" ASUS MG28UQ klávesnica: Corsair Gaming straf Cherry MX Silent (US) myš: A4tech Bloody J90 Core 3 kovové pojazdy NAS: Synology DiskStation DS1517 + 8GB HDD: RAID5 (synology): WD Red Plus 4TB + 2x Seagate IronWolf 4 TB Wifi: ASUS RT-AC87U AC2400 Mobil: OnePlus 3T, 64GB |
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 17.11.2012 15:18 | |
|
silentasflash: V ktorom vesmíre je float 2 bytový?! Float má podľa štandardu IEEE 32 bitov, double má potom dva krát toľko. Aj v v drvivej väčšine mikrontrolérov nájdeš tento štandard a žiadny iný.
A stále tam pripočítavaš sizeof(float)... nedáš si povedať.
_________________ Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám! |
|
Registrovaný: 24.07.10 Prihlásený: 19.11.22 Príspevky: 107 Témy: 28 Bydlisko: Bratislava |
okok sú to 4B nie 2B a double má 8B písal som, že si nepamätám presne, ale to je detail dôležitý je ten rozdiel ok ok v tých pointeroch máš tiež pravdu, pomýlil som si to vzhľadom k inému projektu, kt. som robil, už mám z toho plnú hlavu
takže problém bol len v tom načítavaní pri scanf si tam nemal dať %lf ale len %f konec
_________________ silentaslash || tiwdaym || tou(x)? NTB: ASUS ROG G752VS (KBL)-GB393T, CPU: Intel Core i7 7700HQ Kaby Lake, Display: 17.3" LED 3840x2160 IPS matný, RAM: 32GB DDR4, GPU: NVIDIA GeForce GTX 1070 8GB GDDR5, SSD: SSD 256GB PCIe + WD Blue PC SSD 1 TB M.2 HDD: 2TB Seagate Barracuda Laptop OS: Windows 10 64-bit Periférie: monitor: 4k 28" ASUS MG28UQ klávesnica: Corsair Gaming straf Cherry MX Silent (US) myš: A4tech Bloody J90 Core 3 kovové pojazdy NAS: Synology DiskStation DS1517 + 8GB HDD: RAID5 (synology): WD Red Plus 4TB + 2x Seagate IronWolf 4 TB Wifi: ASUS RT-AC87U AC2400 Mobil: OnePlus 3T, 64GB |
|
| Stránka: 1 z 1
| [ Príspevkov: 6 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|