- Futott egy Geekbench kört egy új HTC készülék
- Milyen okostelefont vegyek?
- DIGI Mobil
- Redmi Watch 4 - olcsó hús, sűrű a leve
- Garmin Forerunner 255 Music - nem csak futóknak
- OnePlus 7 - magabiztos folytatás
- iPhone topik
- Realme 9 Pro+ - szükséges plusz?
- Apple Watch Sport - ez is csak egy okosóra
- Okosóra és okoskiegészítő topik
Hirdetés
-
Toyota Corolla Touring Sport 2.0 teszt és az autóipar
lo Némi autóipari kitekintés után egy középkategóriás autót mutatok be, ami az észszerűség műhelyében készül.
-
Ilyen lesz az Astor: Blade of the Monolith
gp A C2 Game Studio nemrég átnevezett játéka a tervek szerint jövő hónap végén debütál.
-
Az Apple iPadOS-t is megrendszabályozza az EU
it Az EB közölte: az Apple iPad táblagépekre írt iPadOS rendszere is kapuőrnek számít, az üzleti felhasználókra gyakorolt fontossága miatt.
Új hozzászólás Aktív témák
-
Noobi
tag
válasz Benmartin #355 üzenetére
Az egyenletesnek már az elején.......
A memóriásra van két variációm, de sztem nem jó...var1:
#include<conio.h>
#include <iostream>
using namespace std;
main()
{
int i = 1024;
float f = -1.2;printf("A %d erteke a memoriaban: %p\n",i, i);
printf("A %f erteke a memoriaban: %p\n",f, f);getch();
}de ennél kicsit "sántít" a lebegőpontos....
var2:
#include <stdio.h>
#include <conio.h>
int main()
{
int n;
float m;
printf("Kerem a \/fixpontos\/ szamot: ");
scanf("%d", &n);
printf("Fixpontosan: ");
char *p = (char *) (&n);
for (int i = 0; i < sizeof(int); ++i, ++p)
{
printf("%02X ", (int) (unsigned char) (*p));
}
getch();{
printf("\nKerem a \/lebegopontos\/ szamot: ");
scanf("%f", &m);
char *p = (char *) (&m);
for (int i = 0; i < sizeof(float); ++i, ++p)
{
printf("%02X ", (int) (unsigned char) (*p));
}
getch();
return 0;
}
}
Nah így állok.... nem tudom hogy melyik lenne az elfogadható..... de a másodfokúshoz hozzá sem tudok fogni -
sghc_toma
senior tag
válasz Benmartin #546 üzenetére
Szia!
Igazad van, beadandóimban én sem mindig csinálok teljes input-validációt, mert minek. Viszont ez tudatos. Azért említettem meg a dolgot, mert ha a kezdő programozóba belerögzül, hogy gets, és nem ismeri annak veszélyeit, akkor simán elképzelhető, hogy production code-ban is használni fogja.
in asm we trust
-
félisten
válasz Benmartin #572 üzenetére
Hali!
Nos, a getch() ill a conio.h mióta C létezik azóta van és használják. Még a tankönyvek is mindenféle extra magyarázat nélkül alkalmazzák. Persze ma 2008-at írunk, és nem 1990-es évek elején vagyunk. Ezért teljesen egyetértek veled abban, hogy manapság(de csakis manapság), már más megoldásokkal kell(ene) operálni.
Az viszont elég szomorú, hogy 2008-ban olyan feladatokat kapnak a tanulók, amikhez Console Application-okhoz kell nyúlni"márpedig egyetemen úgy tudom standard ANSI C-t tanítanak."
Ehhez annyi a hozzáfűznivalóm, hogy ha ANSI C-t vagy CPP-t is tanítanak, akkor legalább olyan fejlesztőkörnyezetek segítségével(CodeGear Builder, VS C#, VS CPP) mutatnák meg a programozás rejtelmeit, szépségeit, amiket a későbbiekben hasznosítani is lehet.Mire gondolok? példáúl: írjuk ki 1-től 10-ig a számokat. Primitív feladat. De akkor legalább tennék hozzá hogy mondjuk egy StringGrid objektumban, annak legalább van értelme, nem pedig 80x25-ös karakteres képernyőn "maszatolni". A FOR ciklus ugyanaz, de legalább megismerkedne egy objektummal is egyúttal, ami hasznos is. Vagy
A korábbiakban volt olyan feladat hogy "sakktáblát" kellen kirajzolni, azon elhelyezni valamilyen betűt. Lehet pixelekkel dolgozni, ha ki tud rakni egy pixelt, adott színnel, adott helyre, akkor ki tud rajzolni is egy sakktáblát is(ami legalább hasonlít is valamelyest ), azután megtanulna két pixelt összekötni, már tudna vonalat rajzolni, ha tud vonalat rajzolni akkor azt meg lehetne forgatni 3D-be is, ha az is megy és tetszik a dolog, akkor meg neki lehet ugrani a DirectX programozásnak is... De nem, inkább a scanf() fx-t tanulja meg mert az fontos...
Tudom, hogy ezt most nagyon leegyszerűsítettem, de remélem a lényeg érthető belőle.
Mégegyszer: teljesen egyetértek a hozzászólásoddal, csak ez úgy "kikivánkozott" belőlem.
Fire.
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
félisten
válasz Benmartin #783 üzenetére
Hali!
Ez szép...
Egy kérésem azért lenne, privbe vagy ide beraknád nekem a kódot?
(és gyakorlati kódot kérnék, nem elméletit, komolyan érdekelne a megoldásod )Fire.
[ Szerkesztve ]
Mindenki tudja, hogy bizonyos dolgokat nem lehet megvalósítani, mígnem jön valaki, aki erről nem tud, és megvalósítja. (Albert Einstein)
-
blaces
tag
válasz Benmartin #880 üzenetére
Szia!
kijavítottam (így értettem a javítást):
#include <stdio.h>
int main(){
int n;
char elso, masodik, p, k, o;
int i=1;
int elsonyer=0;
int masodiknyer=0;
scanf("%d", &n);
while(i<=n){
scanf("%s %s", &elso, &masodik);
if(elso=='p' && masodik=='k')
elsonyer+=1;
else if(elso=='p' && masodik=='o')
masodiknyer+=1;
else if(elso=='k' && masodik=='p')
masodiknyer+=1;
else if(elso=='k' && masodik=='o')
elsonyer+=1;
else if(elso=='o' && masodik=='p')
elsonyer+=1;
else if(elso=='o' && masodik=='k')
masodiknyer+=1;
i++;
}
if (elsonyer>masodiknyer)
printf("elso\n");
else if (elsonyer<masodiknyer)
printf("masodik\n");
else
printf("dontetlen\n");
return 0;
}De még mindig ugyanaz a baja...
Viszont ha scanf("%c %c",&elso, &masodik)-ot használok, akkor hajlando másodjára is bekérni a karaktereket, de ugyanúgy döntetlent ír ki
-
blaces
tag
válasz Benmartin #882 üzenetére
Köszi, megy!
Miért kellett globálisan deklarálni? Valahányszor csináltunk valamit a laboron, akkor mindig main-en belül volt a deklarálás, meg a globális változónak úgy tudom akkor van jelentősége ha több függvényt használok.
és a scanf("%s %s", &elso, &masodik)-nál azért kellett %s %c helyet, mert a %s után karakterlánc (elso, masodik van), és nem pedig egy karakter( pl: a, b)?
Csak szeretném érteni, miért így jó a program
-
blaces
tag
válasz Benmartin #884 üzenetére
Köszönöm
A while és a scanf közé raktam az fflush(stdin) függvényt
while(i<=n){
fflush(stdin);
scanf("%c %c",&elso,&masodik);és így simán ment %c-vel is, és köszönöm hozzá a magyarázatot érthető volt és sokat segített! Ekkor már ugye nem volt a %s-es hiba így elkezdtem kísérletezni.
Kiszedtem a globális változókat (char elso, masodik) és beraktam a main()-be. És érdekes módon ment! Hibátlanul
-
Benmartin
senior tag
válasz Benmartin #1101 üzenetére
De megírtam, hogy ne csak dumáljak itt:
#include <stdio.h>
#define MAX_FAJLNEV_HOSSZ 100
FILE * filelist, * file;
char name[MAX_FAJLNEV_HOSSZ+1], * block;
unsigned int h;
int main()
{
filelist = fopen("filelist.txt","r");
while(!feof(filelist))
{
fscanf(filelist,"%s",name);
file = fopen(name,"r");
fseek (file,0,SEEK_END);
h = ftell(file);
rewind(file);
block = (char *) malloc(h);
fread(block,1,h,file);
block += 4;
fclose(file);
fopen(strcat(name,"_jav.txt"),"w");
fwrite(block,1,h-4,file);
fclose(file);
}
fclose(filelist);
return 0;
} -
Jester01
veterán
válasz Benmartin #1102 üzenetére
Ajjjaj ilyen rossz példával ne kábítsuk szegény tanulókat
Hirtelen ennyi:1. te nem a sorok elejéről szedted le az első 4 karaktert
2. az fscanf visszatérési értékét célszerű ellenőrizni, nem pedig a feof-ot
3. %s formátummal nem olvasunk fájlneveket (sem) mert megáll a szóközöknél
4. az fscanf-ben nincs hossz limit
5. teljesen felesleges betölteni a memóriába a fájlt
6. strcat-hoz hiányzik a megfelelő #include
7. malloc-hoz hiányzik a megfelelő #include
8. a malloc void*-ot ad vissza, csúnyán néznek azokra akik ezt cast-olják
9. a lefoglalt memóriát nem szabadítod fel
10. a változók globálisak nem lokálisak
11. az ftell nem unsigned int-et ad vissza
12. hibakezelés teljes hiányaJester
-
Jester01
veterán
válasz Benmartin #1105 üzenetére
Azért kötözködtem, mert tanuláshoz rossz példa.
2. Izé, kipróbáltad? Mert nem működik, mivel a feof csak azután lesz igaz, hogy túlmész a fájl végén. Tehát előfordulhat, hogy eggyel többször fut a ciklusod és az utolsó alkalommal ki tudja milyen adatra. Ehhez csak az kell, hogy az utolsó sor végén is legyen egy soremelés (márpedig ez normális dolog). Egyébként is pl. %d esetén vagy bonyolultabb formátumstringnél abból tudod, hogy sikerült-e beolvasni valamit. ellenkező esetben könnyen végtelen ciklus lehet (ugyanis olyankor a fscanf nem eszi meg a hibás adatot, de feof sem lesz)
3. sajnos de. sőt, még ékezeteket is. sokat szívok ezekkel én is a munkám során, főleg linux-windows közötti másolgatás nagy élmény (meg a kalapos vs. rendes ő/ű)
4. az azért van, hogy annyit kezel a programod, addig ok. de sehol nem biztosítod, hogy ne is legyen több. Az fscanf jelen formájában vidáman megesz többet is és szép buffer overflow lesz belőle. Ezt is jobb idejekorán megtanulni.
5. igen, és ez a rossz. már miért is ne lehetne egy 120GB-os fájlt feldolgozni csak azért mert nincs 120GB memóriám.
6-7. már hogyne kellene. Amelyik függvénynek nincs prototípusa, azt alapból int visszatérési értékkel feltételezi a fordító. Márpedig sem a malloc sem pedig az strcat nem int-tel tér vissza. És ha az int véletlen nem binárisan kompatibilis a void* illetve a char* típusokkal (pl 64 bites rendszer esetén) akkor az instant segfault.
10. szerintem nem fölösleges, jobb ha az újonc azt látja hogy a változókat a lehető legszűkebb körben deklaráljuk
11. azt te honnan tudod? És ha 5GB-os fájlra akarom futtatni? Vagy 128kB-osra 16 bites rendszeren?
12. ja és akkor nem kell. pl ha egy fájl (vagy sor) véletlen nincs 4 karakter akkor a program összeomlása az rendben van?Jester
-
Sk8erPeter
nagyúr
válasz Benmartin #1102 üzenetére
Hali!
Köszi, hogy megírtad, de ez a program igen érdekes dolgokat csinál
A végeredmény az lesz, hogy MINDEN karakter után tesz egy szóközt. Egy fájlnál az összes sortörést is kitörölte (mondjuk nem értem, hogy ezt a másiknál miért nem tette).
Szemléltetésként ilyen lesz: [link] (itt épp php-kódokat másoltam ki pdf-ből, a sorszámozást ki akartam szedni, de ez a lényeg szempontjából tök mindegy)Első lefordításnál ilyen hibát dob:
(már a while(!feof(filelist))-nél baja van)
Gondolom ezért is működik hibásan többek közt...
Aztán már le sem akar fordulni (létrehozni az exe-t), na mindegy, itt valami nagyon nem jó...
De azért thx. Egy javított verzió jól jönne... Előre is köszi!Egyébként az "általános kérdéseket" hajnali fél 5 közeledtével fogalmaztam meg, így simán elképzelhető, hogy hülye kérdést tettem fel...
(#1103) doc: igazából mindkettő... de inkább gyakorolni szeretnék C-ben.
Nem használok Linuxot (egyelőre). Tehát elsősorban a C-s megoldás érdekelne.
Nyilván létezik egyébként olyan külső program (pl. Lupas Rename), amivel lazán megoldható, de abból nem lehet tanulni.(#1104) Jester01: Esetleg tudnál egy javított változatot mutatni?
[ Szerkesztve ]
Sk8erPeter
-
Sk8erPeter
nagyúr
válasz Benmartin #1109 üzenetére
"mert nem volt '\n' a sor végén." De itt pont különálló, sortöréssel elválasztott sorokról van szó... bár lehet, hogy félreértelek...
Milyen fordítóval próbáltad? Nálam most Visual Studio 2003 van fent (azért használom ezt egyelőre, mert egyetemen is ezt használják szoftver laboron, nem akarom, hogy a fordító különbözősége miatt ott jelentkezzen egy hiba, amire nem számítok)
Most még mindig csak azt nem tudom, hogyan is kéne akkor megoldani a feladatot, na majd próbálkozom...
Azért kérdeztem egyébként, hogy mivel olvastassam be az adatokat, mert lehetne fscanf(), fgets(), fgetc(), fread(), és még ki tudja, hány függvénnyel is elvégeztetni ezt a feladatot (fgetc nyilván nem jó, meg fscanf sem, asszem annak is van valami szóköz-problémája).
Valami olyasmire gondoltam egyébként, hogy a progi a beolvasáskor az első /n-ig elmegy, eltárol egy sort valamilyen tömbbe vagy akármibe, és ezt úgy adja ki, hogy az 5. karaktertől lesz kiírva. Végül is ha tömbként kezelem, akkor elvileg a 0. elemtől kezdi, akkor elég lenne csak hozzáadni +4-et, hogy kezdje onnan, nem?Sk8erPeter
-
Jester01
veterán
válasz Benmartin #1109 üzenetére
5. Nem, de miért nem írod egyből jóra a programot? Azért, hogy extra pénzt kaszálj majd a professional verzióért ami nagyobb fájlokat is tud kezelni? Igen, lefordul, csak esetleg nem működik. Ráadásul a változó argumentumot használó függvényeknek ansi C szerint is kötelező a prototípus (pl. fscanf, printf) tehát általában az stdio.h bizony nem elhagyható. Az meg, hogy egy adott fordító esetleg mit eszik meg és mit nem, abszolút nem befolyásolja hogy mi van a szabványban vagy hogy mi a helyes.
6-7. melyik részének mondasz ellent? Annak, hogy int a prototípus nélküli függvények visszatérési értéke vagy annak, hogy pl. 64 biten piszkosul megszívod ha int-et használsz pointer helyett?
A többire pedig továbbra is csak azt tudom mondani, hogy lehetőleg ne ezt tanítsd egy kezdőnek.
Jester
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- MSI GTX 1660 ti armor oc
- AirPods Pro, hibátlan
- HP Zbook Firefly 16 G10 (865S8EA) Mobile Workstation - ÚJ - 16" notebook - i7-1360P, 32GB
- Asus TUF FX505GE - 15,6"FHD IPS - i7-8750H - 16GB - 512GB SSD - GTX 1050 Ti - Win11 - Magyar
- ASUS ROG STRIX Z370-H GAMING + Intel Core i5-8600K + SK Hynix 16GB DDR4 2666MHz - Számla + Garancia