- gban: Ingyen kellene, de tegnapra
- Luck Dragon: Asszociációs játék. :)
- sziku69: Szólánc.
- sziku69: Fűzzük össze a szavakat :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- N€T0X|N: Stellar Blade után
- pr1mzejEE: Viszlát CoD2, CoD4, CS:GO!
- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- weiss: Pant* rant
- Bezzeg annak idején...
-
LOGOUT
Új hozzászólás Aktív témák
-
Sianis
addikt
Nem nem, nem arról van szó! Hanem van egy beépített függvénye, ami asszem 65000 szám után már ismétlődik, és van egy ami ettől sokkal, sokkal később veszi fel ugyanazt az értéket. Sajnos egy igazán jó véletlen szám generátor 1-2 millió forintba kerül, ezért van az, hogy a beépített igazából nem is annyira véletlen, mégis valamennyire használható...
-
Sianis
addikt
Sziasztok!
C programozás a téma...
Szükségem lenne egy véletlen szám generátorra, a C beépítettje nem a legjobb sajnos, valami olyan kéne, aminek nagy a ciklusideje(tehát nagyon sokára ismétli meg a számokat). Elvileg létezik is C alatt, csak nem tudom hogyan kell meghívni, pedig nagyon kéne... pls ha valakinek van ötlete, esetleg egy függvénye, ami 0-1 között generál véletlen számokat úgy, hogy azok bizotsan nem egyezzenek úgy 100000 vagy 1000000 időn belül... -
Jester01
veterán
válasz
emitter #1092 üzenetére
Ez most jónak tűnik, kivéve, hogy a temp változó mérete eggyel kisebb mint kellene, mert a fscanf tesz egy lezáró nulla byteot a beolvasott string végére. De hogy ettől fagy-e azt nem tudom. Esetleg a program másik részében lehet hiba. (Miért nem rakod ki az egészet a weboldalra?
)
Amúgy a k változóra nincs szükség, mert egyszerűen 4*j módon számítható. De ez nyilván nem hiba. Legközelebb holnap este leszek, remélem addig segít valaki más[Szerkesztve]
-
emitter
őstag
-
emitter
őstag
válasz
Jester01 #1090 üzenetére
Igen, elég zavaros volt, kijavítottam a hibákat. A fájlban a mezőket mátrix-formában tárolom, szal Enterrel a sorok végén, ezért kell először egy átmeneti temp-változóba olvasni.
Most ott tartok, h műxik a dolog, kiírja a képernyőre a fájl helyes tartalmát, de rögtön lefutás után feldob egy hibaüzit, h a ''0x7c...'' címen található utasítás ''0x00...'' mem.címre hivatkozott. stb.
[link]
és ha kell, itt a file [link] -
Jester01
veterán
válasz
emitter #1089 üzenetére
A temp az minek is? A c változót hol inicializálod? A ciklusban j miért 4*(*mx) -ig megy?
Gondolom azt akartad csinálni, hogy a temp-be beolvasod a sort, és aztán abból alakítod át a saját adattípusodra. Ez persze fölösleges, ha úgyis fgetc-t hívsz.for(i=0;i<*my;i++) //az allas beolvasasa
{
for(j=0;j<*mx;j++)
{
mezo[ i ][ j ].akna=fgetc(fs)-48;
mezo[ i ][ j ].reveal=fgetc(fs)-48;
mezo[ i ][ j ].mark=fgetc(fs)-48;
mezo[ i ][ j ].szomsz=fgetc(fs)-48;
printf(''%d'',mezo[ i ][ j ].akna);
}
MOD: az persze kérdés, hogy a mentett állásban táblasorok után van-e enter, vagy egy sor az egész. A fenti kód akkor működik, ha egy sor.
[Szerkesztve] -
emitter
őstag
válasz
Jester01 #1088 üzenetére
oks, megint igazad volt
most műxik, de futás után rögvest bezárja a konzolablakot, pedig nem kéne neki
ha főprogramból nem hívom meg a load() fv-t (kikommentezem), akkor ok a progi futása,
amúgy meg bezáródik
int load(char *fajl, int *mx, int *my, palya **mezo)
{
FILE *fs;
int i=0, j=0;
char c;
char *temp;
fs=fopen(fajl,''rt'');
fscanf(fs,''%d'',mx);
printf(''%d\n'',*mx);
fscanf(fs,''%d'',my);
printf(''%d\n\n'',*my);
mezo=malloc((*my)*sizeof(palya*)); //dinamikus memoriafoglalas
if(mezo==NULL)
{
fprintf(stderr,''\nKeves a memoria!\n'');
return -1;
}
for(i=0;i<(*my);i++)
{
mezo=malloc((*mx)*sizeof(palya));
if(mezo==NULL)
{
fprintf(stderr,''\nKeves a memoria!\n'');
return -1;
}
}
temp=(char*)malloc((*mx)*(*my)*sizeof(char));
for(i=0;i<*my;i++) //az allas beolvasasa
{
fscanf(fs,''%s'',temp);
printf(''%s'',temp);
for(j=0;j<(4*(*mx));j++)
{
mezo[ i ][ j ].akna=c-48;
mezo[ i ][ j ].reveal=fgetc(fs)-48;
mezo[ i ][ j ].mark=fgetc(fs)-48;
mezo[ i ][ j ].szomsz=fgetc(fs)-48;
printf(''%d'',mezo[ i ][ j ].akna);
}
printf(''\n'');
}
free(temp);
fflush(fs);
fclose(fs);
}
egy pillanatra látom felvillanni az ablak tartalmát, és kiírja rendesen a beolvasott cuccokat, de aztán nagy semmi -
emitter
őstag
válasz
Jester01 #1084 üzenetére
na, ma átnézettem a kódot az C-tanárommal, úgyhogy kicsit tisztább lett a kép a kimenő paramétereket illetően
azóta viszont újabb érdekes probléma adódott, futtatáskor ezt kapom:
[Warning] parameter names (without types) in function declaration
<pre>
int load(char *fajl, int *mx, int *my, palya **mezo)
{
...
char *temp;
...
temp=malloc((*mx)*(*my)*sizeof(char));
...
fscanf(fajl,''%s'',temp);
...
free(temp);
...
}
</pre><p></p>
[Szerkesztve] -
Hujikolp
őstag
ReJim akkor tudnál nekem segíteni??
-
Jester01
veterán
-
emitter
őstag
válasz
Jester01 #1081 üzenetére
na neeee!
ennyire nem lehetek lámer
kicsit le vagyok fáradva...
oks, így megy a dolog, köszi
viszont újabb kérdésem akadt:
ha egy fv-nek kimenő paraméterként akarok átadni int értékeket, azt gondolom érték szerint nem lehet, vagy igen?
ez így nem műxik, hogyan írjam át, h jó legyen?
...
void load(char *fajl, int *mx, int *my, palya **mezo)
{
...
fscanf(fajl,''%d'',&mx);
fscanf(fajl,''%d'',&mx);
...
}
...
int main()
{
int mx, my;
...
load(''proba.txt'', mx, my, mezo);
...
}
az mx, my változóknak a load fv adna értéket, kimenő paraméterként
szal mikor meghívom a load fv-t, nem adok át neki bemenő mx,my értéket, viszont azt akarom, h ő adjon vissza mx,my-t
remélem érthető vok -
emitter
őstag
válasz
Jester01 #1076 üzenetére
oké, értem
akkor hogyan tudom a beolvasott számok ascii értékei helyett a valódi értéküket megkapni?
van erre vmi konvertáló fv?
for(i=0;i<my;i++) //az allas beolvasasa
{
for(j=0;j<mx;j++)
{
mezo[ i ][ j ].akna=fgetc(fs);
printf(''%d'',mezo[ i ][ j ].akna);
}
temp=fgetc(fs); //EOL-karakter olvasása
printf(''\n'');
}
így 48, meg 49 értékeket ír ki -
-
Hujikolp
őstag
Tudja valaki hogy delphiben/pascalba hogyan kell lpt-ről beolvasni?
ReJim! Remélem ráéersz majd...
Jester01!
''DOS alatt a 0x378-as I/O portot kell írni/olvasni.
Windows alatt szintúgy, de csak kernel módban lehet.
Lehet a neten találni kész driver dllt.''
Ez most mit takar?
Keresek NOKIA 3410-est olcsón, csak az legyen a lényeg hogy telefonálásra lehessen használni. Buheráláshoz kell.
Mivel lehet *.MID-be tömöríteni zenét? -
Jester01
veterán
válasz
emitter #1070 üzenetére
remélem működni fog, mert ezt most hirtelen a szám-rendezősből írtam át
Sajna nem fog
qsort (tomb, elemszam, maxhossz*sizeof (char), string_cmp);
...
ahol maxhossz a tomb legnagyobb sztrigjének a hossza
Itt egy (char*) elemeket tartalmazó tömböt rendezel. Vagyis helyesen:
qsort (tomb, elemszam, sizeof(char*), string_cmp)
A stringek hossza nem számít. Amúgy jelen feladat esetén ha a string betûit rendezzük, akkor a generált permutációk már eleve a jó sorrendben jönnek ki. Tehát nem ilyen rendezés kell, hanem az eredeti (a számos), csak nem int hanem char típussal. -
Jester01
veterán
válasz
emitter #1075 üzenetére
fscanf példád azért nem jó, mert a \n whitespace, és mint ilyen, azt jelenti, hogy bármennyi bármilyen whitespace lehet ott. Helyette (ha mindenképp fscanf kell) a fscanf(f, ''%*[\n]'') lehet jó. Mit jelent az, hogy új sorra pozícionálni? Eldobni a sorból hátralévõ összes karaktert? fscanf(f, ''%*[^\n]%*[\n]'').
Az fgetc() karaktert olvas be.
A sor helyes, csak nem azt csinálja amire te feltehetõleg gondolsz. Az i egymás utáni hívások esetén 48 vagy 49 lesz (a 0 és az 1 ascii kódja). -
emitter
őstag
ha text-fájl olvasásakor új sorba akarok pozicionálni, azt hogyan kell?
fscanf(fajl,''\n'');
miért nem jó?
fgetc() karaktert olvas be vagy számot?
ez a sor helyes (ha i integer, és a fájlban egész számok vannak pl. 01001101)?
i=fgetc(fajl); -
Deark
csendes tag
válasz
emitter #1067 üzenetére
Eddig a betűk keverésére nem találtam lineáris algoritmust...
Gondoltam arra, hogy randomizálom az egészet és mindig megvizsgálom, hogy már megvan-e az adott string, de ez egy 10 betűs szónál túl sok lenne. Max 1 mp alatt le kéne futnia.
Gondoltam még arra is, hogy számrendszerekkel hozom össze valahogy. Tehát hogy olyan számrendszer, ahány karakteres a string. De még nem tom, hogy hogyan...
Szerintem a sok ciklus nem lenne ronda, azaz nem lenne baj, ha az. Max 10 betűs lehet a szó. (ezt nem kell ellenőrizni. alapból ilyen szavakkal lesz feltöltve.) -
emitter
őstag
az abc-rendezést meg így tudod megoldani:
<pre>
int string_cmp(char *c1, char *c2)
{
return strcmp (c1,c2);
}
...
int main(void)
{
char* tomb[elemszam];
...
qsort (tomb, elemszam, maxhossz*sizeof (char), string_cmp);
...
}
</pre><p>
ahol maxhossz a tomb legnagyobb sztrigjének a hossza
remélem működni fog, mert ezt most hirtelen a szám-rendezősből írtam át</p>
Jester01:
úgy látszik, rokon lelkek vagyunk
a kombinatorikát én is utáltam (meg még utálni is fogom), a rekurziót meg még nem használtam annyiszor, h ráérezzek a jelentőségére, egyelőre elég nehéz átlátni nekem egy rekurzív függvényt
[Szerkesztve] -
Jester01
veterán
Először rendezd abc sorrendbe a beadott szót. Ez gondolom menni fog.
Utána csinálj egy tömböt amiben jelzed, ha egy betűt már felhasználtál.
Alapesetben ez legyen csupa igaz érték (true/1).
Egy másik tömbben pedig a permutált indexeket gyűjtöd, ez alapesetben egyesével nő.
Rögvest írd is ki, mert ez lesz a legelső permutáció.
A következőt pedig úgy kapod meg, hogy az utolsó karaktertől elindulsz és mindig megkeresed a következő fel nem használt betűt. Ha már nincs ilyen, akkor lépsz eggyel visszább (ha nem tudsz, akkor kész vagy). Amint találtál egyet, ismét elindulsz előre és szépen veszed az első fel nem használt betűt.
Igy valahogy:for(i = len - 1; i >= 0; i--)
{
int current = indices[ i ];
used[current] = 0;
current = findnextunused(used, current + 1, len);
if (current < len)
{
indices[ i ] = current;
break;
}
}
if (i < 0)
{
break;
}
indices[++i] = findnextunused(used, 0, len);
for(i++; i < len; i++)
{
indices[ i ] = findnextunused(used, indices[i - 1] + 1, len);
}
A findnextunused függvényem második paramétere a keresés kezdőpozíciója.
A megtalált betűt be is jelöli, hogy használatban van.
Biztos van egyszerűbb módja, mindig is utáltam a kombinatorikát
Emitter: a rekurziót is utálomDe azért persze szoktam használni.
MOD: [ i ]
[Szerkesztve] -
emitter
őstag
a sorba rendezésre itt van egy, de ez csak számokat rak sorba, mingyá előkotrom a stringes verziót is
[link]
a betűk megkeverését (amit n! féleképp tudsz megtenni) szvsz vhogy rekurzióval kell (érdemes ) megoldani, a baj csak az, h nem tudom hogyanmajd vki okosabb megmondja a tutit
for ciklusokkal is lehetne, de ekkor szvsz annyi ciklus kéne amennyi a string hossza, ez a megoldás márpedig enyhén ronda -
-
Deark
csendes tag
Üdv. mindenkinek!
Sürgősen segítségre lenne szükségem. Egy programozási feladat megoldásához kérném a segítségeteket.
A feladat beolvasni fájlból egy szót és a betűit összekeverni. Az összes lehetséges variációt ki kell írni abc sorrendben egy másik fájlba. A bemenő szó 1-10 karakter. Egy karakter max 1x szerepel benne. Kis- és nagybetűk különbözőnek számítanak.
A kérdésem az lenne, hogy ezt hogyan valósítsam meg? Főleg az összes variáció megkeresésével van gondom. A programnyelv c/c++ , de ha más programnyelven (pl.: pascal, basic) tudtok hozzá anyagot, azt is megköszönném. Meg tudom oldani, hogy átírjam c-be.
Előre is nagyon köszönöm -
Jester01
veterán
válasz
Protezis #1060 üzenetére
Csak kicsit pontosítok: a hülye VC sehol nem keresi a fájlt. A relatív útvonalak mindig az aktuális munkakönyvtárhoz képest értendők. Ha a progidat egy másik dirben állva parancssorból indítom, akkor sem fogja megtalálni. Ha a progidat tartalmazó könyvtárra van szükséged, akkor a GetModuleFileName API függvénnyel kérdezd le az exe abszolút fájlnevét, és abból vágd le a könyvtár nevét.
-
Protezis
őstag
Ezt a retkes C++.... grrrr. Nem tudok megnyitni egy fájlt. C-ben simán megy, itt nem.
#include ''Graf.h''
#include <limits>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
Graf::Graf (/*char *fajlnev*/) {
FILE *fin;
fin=fopen(''feladat.be'',''r'');
fclose(fin);
}
Debugnál FCLOSE.C fájl kéne neki. Azt akarja olvasni. Hülye ez? -
Protezis
őstag
C++ -ban kellene egy kis segítség.
Graf.h:#ifndef GRAF_H
#define GRAF_H
class Graf {
vector<int> D;
vector<int> Apa;
deque<int> Sor;....
Graf.cpp:#include ''Graf.h''
#include <vector>
#include <deque>
#include <iostream>
using namespace std;
Graf::Graf (char *fajlnev) {....
Rögtön a Graf.h-ban hibát dob, miszerint: missing ; before < (a legelső vectoros sorban)
és missing storage-class or type specifiers... meg még 24 hiba, gondolom legtöbbjük ebből fakad.
Kellene deffiniálnom egy típust? De pl itt: [link] az Algorithms címszó alatti legelső progiban is így használja (meg mi is így vettük gyakon... már amennyit vettük az STL-t)</p></p>
[Szerkesztve]
[Szerkesztve] -
Hujikolp
őstag
válasz
Jester01 #1042 üzenetére
Az oprendszer nekem mindegy de ha lehet akkor XP. A nyelv lehetne magyar, mármint a menü meg ilyenek. Sajnos nem értek a programozáshoz ezért keresnék v.kit aki tud nekem segíteni. Ha van olyan program amivel lehet másikat készíteni azt is sívesn megnézném de lehet hogy boldogulok vele...
A program amit szeretnék készíteni, az a COM-1-ra készülne. Azt szeretném, hogy ha én leírok egy szöveget és rákattintok egy gombra, akkor azt kódolja be morse jelekbe, (amit én megtudok neki adni hogy mi legyen pl.:''a'' ''.-'' ) és a megfelelô ütemre a COM porton továbbítsa rövid és hosszú jeleket. Ha például egy ''a'' betüt szeretnék, akkor a COM-porton egy helyen (tökmindegy hol) lead egy pl.:5voltos feszültséget fél másodpercig (ez a rövid) és egy hosszabbat ez 1mp. Így tranzisztor segítségével egy másik áramkörbe tudom helyezni a morse impulzusokat. Az áramkör egy Rádió adó-vevő lenne, ami hang-pittyegésekkel továbítja a másik adónak ami most vevő. A másik adó veszi a jelet és továbbítja a másik PC COM portjához, ami ezután visszakódolja a morzejeleket és utána azt kiírja szövegesen.
Ennél szerintem részletesebben nem tudom leírni. (szerintem).
elöre is köszz -
-=ZS=-
tag
Hali mindenki!
Igen speciális problémám van, már utolsó esélyként irkálok mindenhova. Szóval Delphiben kellene egy komponenst készítenem, ami Clipper progi által készített adatbázisokat kezelne, indexekkel együtt, úgy, hogy teljesen kompatibilis legyen még a régi DOS-os rendszerrel. Valaki nem tudja: amikor a .cdx indexfileban lockolok, akkor hogy számítja ki, melyik bájtok legyenek lockolva? Ezek a bájtok a 0xFFFeFFFF-0xFFFFFFFF tartományból kerülnek ki, minden esetben, akár 1db levél van az indexben, akár 500MB a cucc... Hát nem sok reményt fűzök hozzá, de hátha szerencsém lesz. Köszi!
[Szerkesztve] -
_Petya_
őstag
válasz
Jester01 #1047 üzenetére
struct elem * Beletesz(struct elem *e,int szam) {
struct elem *seged;
seged = (struct elem *)malloc(sizeof(struct elem)) ; // csinalunk egy uj elemet
(seged->csat) = e; // aminek a pointere a sor elso elemere mutat
e = seged; // a sorra mutato pointert beallitjuk az uj elemre
(seged->sorszam) = szam ; // es kitoltjuk az ereteket
if (szam != 0)printf(''beletesz: %d'',szam) ;
return e;
}
int Kivesz(struct elem **e) {
struct elem *seged1; // ket segedpointerunk lesz
struct elem *seged2;
seged2 = *e; // seged2 az utolso elotti, seged 1 az utolso pont (illetve most az elso 2)
if (seged2 != NULL) { // ha van a sorban elem
if (seged2->csat != NULL) { // es legalabb ketto elem van a sorbwn
seged1 = seged2->csat;
while(seged1->csat != NULL) { // mindket pointerrel jobbra lepunk a lancban
seged2 = seged1;
seged1 = (seged1->csat);
}
seged2->csat=NULL;
printf(''kivesz: %d'',seged1->sorszam) ;
return (seged1->sorszam); // vegigmegyunk, amig seged1->csat == 0
} // es visszaterunk seged1 ertekevel, seged2 lesz a lanc vege
else { // ha csak egy elem van, akkor kivesszuk, e-t null-ra allitjuk (ures)
*e = NULL;
printf(''kivesz: %d'',seged2->sorszam) ;
return (seged2->sorszam);
}
}
return 0;
}
Átírtam így, dex = Kivesz(&asz);
-nél elszáll, m sőt itt is :
asz = Beletesz(asz,a) ;
j = asz;
fprintf(kifile,''%d '',asz->sorszam) ;szeirntem így is valami baja van. Mi lehet a gond?
Petya -
_Petya_
őstag
Üdv!
Az alábbi eljárás miért nem működik szerintetek?void Beletesz(struct elem *e,int szam) {
seged = malloc(sizeof(struct elem)) ;
(seged->csat) = e;
e = seged;
(seged->sorszam) = szam ;
if (szam != 0)printf(''beletesz: %d'',szam) ;
}
Ez a hívás:Beletesz(sor,18) ;
elvileg beletesz a sorba egy elemet, ki is írja, hogybeletesz:18
, de közvetlenül utána a sor == NULL... Mit csinálok rosszul?
Petya -
Jester01
veterán
válasz
Boolash #1043 üzenetére
Mail ment, de ide is beírom:
Azt leszámítva, hogy a bill() függvény nincs definálva sztm ez jó. Legalábbis szintaktikailag. Mi a pontos hibaüzenet?
Most pedig néhány megjegyzés:
1) A kiíratások után fflush(stdout) kell, nem pedig fflush(stdin).
2) Kerüld a gets() függvényt, mert nem ellenõrzi a hosszt. Mi történik, ha 15 karakternél hosszabb telefonszámot írok be? Helyette használhatod az fgets() függvényt.
3) A gotoxy varázslás helyett ajánlom, hogy nézz utána a printf formátumsztringeknek. Pl. egy ''%-30s %15s %-30s'' vagy hasonló szerintem megfelel a célnak.
De különben még mûködik is
[Szerkesztve] -
Boolash
aktív tag
sziasztok! én c ben írok egy telefonkönyv programot, de nem igazán akar lefutni. Megírtam a függvényeket sztem biztos jók, megadtam a függvényprototipusokat is, amik sztem szintúgy jók, de a fordító valamibe mindig beleköt. (álltalában a prototipusba... pedig sztem így jó..) Szóval nem tudna nekem valaki segíteni, hogy megnézi mit írtam.Aki segítene az irjon 1 mailt, vagy jelezze itt nekem, és elküldöm mailben a progit.
Előre is köszönöm! -
Hujikolp
őstag
Tud v.ki segíteni vagy mennyek inkább más topicba?
-
_Petya_
őstag
Üdv!
Elakadtam a programommal, csak a kérdéses részt másolom ide (a többit úgyis kikommenteztem), szóval ami itt van, annak futnia kellene...
struct ListaElem {
int pont;
struct ListaElem *kov;
};
struct ListaElem *sv,*ss,
void SorBa(int e) {
sv = malloc(sizeof(struct ListaElem)) ;
(sv->kov) = SzK;
SzK = sv;
(sv->pont) = e ;
}
int main(int argc, char *argv[]) {
SzK = NULL;
SorBa(1) ;
SorBa(2) ;
SorBa(3) ;
SorBa(4) ;
SorBa(5) ;
ss = SzK;
while (ss != NULL) {
fprintf(fout,''%d '',ss->pont) ;
ss = ss->kov;
}
return 0;
}
Tehát megpróbálom tesztelni a SorBa eljárást, de mindig segfault-ot dob. Van öteletek, hogy mi a baj?
Petya -
Hujikolp
őstag
Nemtudom hogy mennyir vág a témába de azért:
Olyan programot keresek amellyel programot lehet készíteni.
A program amit szeretnék készíteni, az a COM-1 portot tudja vezérelni. Azt szeretném, hogy ha én leírok egy szöveget, akkor azt kódolja be morse jelekbe, és a megfelelô ütemre a COM porton továbbítsa rövid és hosszú jelekben. Így tranzisztor segítségével egy másik áramkörbe tudom helyezni a morse impulzusokat. Az áramkr egy Rádió adó-vevő lenne. A másik adó veszi a jelet és továbbítja a másik PC COM portjához, ami ezután visszakódolja a morzejeleket és utána azt kiírja szövegesen.
Enyi lenne kb a lényeg. -
emitter
őstag
válasz
Jester01 #1033 üzenetére
ok, a save-t átírtam fprintf-re, magában működik is, azaz ha mainből így hívom:
save(''proba.txt'', mx, my, mezo);
akkor sikeresen elmenti
viszont ha a fájlnevet stringként akarom átadni, akkor fagy:save(fnev, mx, my, mezo);
mainben fnev-et így deklaráltam:char *fnev;
hol van a kutyi elásva? -
Jester01
veterán
válasz
emitter #1032 üzenetére
Azért mert neked kell előre lefoglalni a helyet a stringnek.
Ugyanez igaz a scanf-re is, gondolom ezért fagy a progid.
És ha már lefoglaltad a helyet, akkor biztosítani kell, nehogy túl sokat írj bele (ez az ún. buffer overrun, ami azon kívül, hogy bug még biztonsági rés is)
A helyet statikusan vagy dinamikusan foglalhatod. Pl. az itoa esetén legrosszabb esetben 12 byte hely kell, úgyhogy a char* s helyett írhatsz char s[ 12 ]-t.
De továbbra is ajánlom az fprintf-et mert akkor nem kell bufferrel szórakozni. -
emitter
őstag
válasz
Jester01 #1029 üzenetére
köszi az ötleteket, főként a pályaméretest
az itoa miért fog inic. területre írni? leírnád a helyes megoldást?
kicsit (nagyon!) átírtam a progit, a main-ben kezelem a fájl létezését, felülírását, stb, a save() pedig csak az adott névre elmenti az állást (ezen még javítani fogok)
szóval a kérdés, hogy a következő main-beli részlettel mi a gond:
(fnev string típusú)printf(''\nMilyen neven akarod elmenteni (xxx.txt): '');
scanf(''%s\n'',fnev);
f=fopen(fnev,''rt'');
if(f==NULL) //ha hiba van a megnyitaskor, azaz ha nincs ilyen
{ //nevu fajl, akkor elmentjuk egy ujba ezen a neven
// fflush(f);
// fclose(f);
save(fnev, mx, my, mezo);
}
_____________ a save() fv________________int save(char *fajl, int x, int y, palya **mezo) //parameter: a fajlnev,
{ //a jatek allasat tarolo 2D-s tomb (elemei 3-bitesek),
FILE *fs; //a tomb meretei
char *s;
int i=0, j=0;
fs=fopen(fajl,''wt'');
for(i=0;i<y;i++) //az allas fajlba irasa
for(j=0;j<x;j++)
{
itoa(mezo[ i ][ j ].akna,s,10);
fputs(s,fs);
}
fflush(fs);
fclose(fs);
return 1;
}
a progi legelőször bekéri a fájl nevét, aztán lefagy, pedig nem is létezett előtte a fájl -
Jester01
veterán
válasz
emitter #1028 üzenetére
1. A létező fájlt illene bezárni akkor is, ha a felhasználó nem kér felülírást.
2. Ha a c != 'i', akkor a return miatt visszatér, így a while-ban nincs is mit ellenőrizni. Amit különben is elrontottál, hiszen csak akkor lépne ki, ha a c egyszerre 'i' és 'n' is, ami lehetetlen.
3. Az itoa inicializálatlan területre fog írni. Ha szöveges mentést akarsz csinálni, akkor egyszerűbb az fprintf(f, ...) formát használni.Bináris mentéshez fwrite.
4. A mentésednek nem sok értelme lesz, ha nem írod bele a pálya méretét.
5. fclose előtt nem szükséges fflush (de nem is árt - ezt akár benne is hagyhatod) -
emitter
őstag
válasz
Jester01 #1027 üzenetére
igen, ez nekem nem nagyon szúrt szemet
, de köszi!
szóval:int save(char *fnev, int x, int y, palya **mezo) //parameter: a fajlnev,
{ //a jatek allasat tarolo 2D-s tomb (elemei 3-bitesek),
FILE *f; //a tomb meretei
char c;
char *s;
int i=0, j=0, temp=0;
if(!(f=fopen(fnev,''rt''))) //ha hiba van a megnyitaskor, azaz ha nincs ilyen
{ //nevu fajl, akkor nyitunk egy ujat ilyen neven
f=fopen(fnev,''wt'');
}
else //ha nincs hiba megnyitaskor, azaz letezik a fajl,
{ //megkerdezzuk, hogy felulirjuk-e
do
{
printf(''\nIlyen nevu fajl mar letezik. Felulirja? (i/n) '');
c=getch();
if(c=='i') //felulirjuk
{
fflush(f);
fclose(f);
f=fopen(fnev,''wt'');
}
else return 0; //sikertelen mentes, nem irjuk felul
}
while((c!='i')||(c!='n'));
}
for(i=0;i<y;i++) //az allas fajlba irasa
for(j=0;j<x;j++)
{
itoa(mezo[ i ][ j ].akna,s,10);
fputs(s,f);
}
fflush(f);
fclose(f);
return 1;
}
létrehozza a fájlt, de nem ír bele semmit
ha mégegyszer lefuttatom, már létezik ugye a fjl, megkérdezi h felülírja-e, ha ekkor 'i'-t nyomok, mégegyszer megkérdezi, majd megint...
(ha itt mást bill-t nyomok, akkor teszi a dolgát, nem írja felül)
mi lehet a bibi -
emitter
őstag
válasz
Jester01 #1025 üzenetére
huh, ez nehéz szülés volt!
én már teljesen belezavarodtam ezekbe az indexekbe, nélküled nem tudtam volna rájönni a hiba okára az tuti!
Tényleg, úgy jó, ahogy te írtad, még annyit kellett tenni, hogy a free()-nél is változtatni kellett:
<pre>for(i=0;i<my;i++) free(mezo[ i ]); //memoriafelszabaditas
free(mezo);</pre><p>
akkor ez a része ok
ha esetleg még van rá lehetőséged, megnéznéd, hogy a save() miért fagyasztja le a cumót?
1000thx!!!!!
szerk: arra is rájöttem, miért maradt le az egyik (meg az összes többi) hsz-ben az [ i ] : mert ez a ph-n a dőltbetű
[Szerkesztve]
[Szerkesztve] -
Jester01
veterán
válasz
emitter #1024 üzenetére
Ez az eredeti verzió. Az mindenképpen igaz, hogy a ciklusnak addig kell futni, amennyit foglalsz. Csak nem a ciklus a rossz, hanem a foglalás, mivel a progidban egyébként az y az első koordináta. Szóval így:
mezo=malloc(my*sizeof(palya*)); //dinamikus memoriafoglalas
if(mezo==NULL)
{
fprintf(stderr,''Out of memory!\n'');
return -1;
}
for(i=0;i<my;i++)
{
mezo[ i ]=malloc(mx*sizeof(palya)); -
emitter
őstag
válasz
Jester01 #1021 üzenetére
akkor most hogyan jó véglegesen?
most így néz ki, de így is fagy néhamezo=malloc(mx*sizeof(palya*)); //dinamikus memoriafoglalas
if(mezo==NULL)
{
fprintf(stderr,''Out of memory!\n'');
return -1;
}
for(i=0;i<my;i++)
{
mezo=malloc(my*sizeof(palya));
if(mezo==NULL)
{
fprintf(stderr,''Out of memory!\n'');
return -1;
}
}
sokszor ilyet dob fel:
vagy simán bezárja magát, vagy a windóz zárja be a szokásos ablakot megjelenítve (ami felajánlja a ''jelentés a microsoftnak'' lehetőséget)
-
Sianis
addikt
#include <conio.h>
#include <stdio.h>
#include <math.h>
main()
{
int i,n;
double x,y,x1,x2,dx,szamlalo,nevezo,logx;
clrscr();
printf(''Fuggvenytablazat keszitese a x3-cos(x)/(x-0,2)ln(x) fuggvenyhez.'');
printf(''\n\n Kerem adja meg az intervallumot!\n'');
printf(''Also hatar='');
scanf(''%lf'',&x1);
do
{
printf(''Felso hatar='');
scanf(''%lf'',&x2);
if (x2<=x1) printf(''\n A felso hatar legyen nagyobb, mint az also! \n'');
}
while (x2<=x1);
printf(''\n Hany reszre osszam be a szamkozt?'');
scanf(''%d'',&n);
dx=(x2-x1)/(double)n;
printf(''\n Szakaszok: %8.3lf\n'',dx);
printf(''\n x y'');
printf(''\n _____________________'');
for (i=0;i<=n;i++)
{
x=x1+(i*dx);
if ((x!=(double)0.2) && (x!=(double)1))
{
szamlalo=(pow(x,3)-cos(x));
logx=log(x);
nevezo=(x-0.2)*logx;
y=szamlalo/nevezo;
printf(''\n %8.3lf %8.3lf'',x,y);
}
else {printf(''\n %8.3lf 0-val valo osztas nem ertelmezett'',x);}
if(i%20==0 && i!=0) {
printf(''\n Folytatas = ENTER'');
getch();
clrscr();
}
} // for end
getch();
} //main end
Hali!
Itt egy újabb függvényes program...ezúttal már doubléval, és Borland C-re írva. A kérdés a következő. Mi az a log : SING error ??? Mert a program jól fut, jó adatokat dob, nincsen semmi hiba, és ő mégis valamit hibát dob....ugyanez Dev-C++-al fordítva tökéletese, de suliban Borland-C-vel kell fordítani. Nos valaki tudja a választ/megoldást? -
emitter
őstag
válasz
Jester01 #1019 üzenetére
így jó? egyébként így is éppúgy kifagy egy-két menet után
mezo=malloc(mx*sizeof(palya*)); //dinamikus memoriafoglalas
if(mezo==NULL)
{
fprintf(stderr,''Out of memory!\n'');
return -1;
}
for(i=0;i<mx;i++)
{
mezo=malloc(my*sizeof(palya));
if(mezo==NULL)
{
fprintf(stderr,''Out of memory!\n'');
return -1;
}
}
vagy a 2. malloc is mx*sizeof(palya)-t foglaljon le? -
Jester01
veterán
válasz
emitter #1016 üzenetére
miért foglal a progim a windóz szerint 44kB-ot, mikor van összesen 6 int változóm, összesen 12bájtot kéne foglalni nekik, nem?
Programkód, verem, betöltött dllek ...
Egyébként az int az 32 bites szóval 24 byte.
én számításaim alapján 2mb-ot kéne foglaljon, mégis 4megát foglal
Lásd fennt, valamint van overhead is. Plusz ha debug verziót fordítasz akkor sokkal több helyet foglal.
segítsetek pls
Honnan tölthetem le a kódot? -
emitter
őstag
egyébként miért foglal a progim a windóz szerint 44kB-ot, mikor van összesen 6 int változóm, összesen 12bájtot kéne foglalni nekik, nem?
ha dinamikus memóriafoglalást is beleveszek a dologba, de még nem jut el a progi a futás közben addig a részig, ahol a memet din. foglalnám, (mertt még az elején várakozik egy inputra), mégis több mint 1MB-ot foglal a progi.
Akkor most mitől lehet ez?
Ha lefoglaltatok neki dinamikusan egy területet, az én számításaim alapján 2mb-ot kéne foglaljon, mégis 4megát foglal
aztán, mikor felszabadítom a memet, visszaesik az induló 1megára, szal jól működik ez a része
Viszont a nagy problémám az, hogy mikor többször hívom a progit (nem zárom be, csak a memóriafelszabadítás elvégeztével visszatérek az elejére), szóval néhány ilyen menet után elszáll, sokszor simán csak kilép, máskor feldob egy hibaüzit, hogy illegális memóriaműveletet végzettpedig minden ciklus után felszabadítottam a lefoglalt memót
Az az érzésem, h nem működik megfelelően ez a din-foglalás, mintha bennmaradna a mem-ben az adat, és egy idő után túlcsordulna (malloc-cal csinálom a foglalást)
segítsetek pls!!! -
Jester01
veterán
válasz
emitter #1014 üzenetére
Sajnos az üres sort már a scanf lekezeli, úgyhogy muszáj lesz fgets/sscanf párosra átállni.
A 9,10g esetet pedig úgy lehet megvizsgálni, hogy megköveteljük a sorvég jelet a második szám után:do{
char buf[80];
char c;
printf(''Mekkora palyan szeretne jatszani? (sor,oszlop) '');
fgets(buf, 80, stdin);
temp=sscanf(buf, ''%d,%d%[\n]'', &mx, &my, &c);
} while( (temp!=3) );
Ezzel most még az a baj, hogy a sor lehet hosszabb mint 80 karakter, házi feladat, hogy ezt még ellenőrizd. -
emitter
őstag
válasz
Jester01 #1001 üzenetére
Igen, azt a cella-t csak elnéztem, nem ezt akartam írni
Köszi a scanf-hez az ötletet, de még mindig van rajta mit javítani, mert ha pl olyat adok be, hogy ''9,10g'', azaz a megengedett ''int,int'' végére még egy betűt is írok, akkor elszáll az aranyos!
Ezt hogy tudnám kivédeni?
Aztán, ha először beadok pár entert, majd utána adom meg a két számot, akkor is összedől
most így néz ki:
(mx,my,temp,pmeret int típusúak)
do{
system(''cls'');
printf(''Mekkora palyan szeretne jatszani? (sor,oszlop) '');
temp=(scanf(''%d, %d'',&mx,&my));
while(getchar() != '\n'); //scanf pufferenek uritese
}
while( (temp!=2) || (mx<pmeret) || (my<pmeret) ); -
Jester01
veterán
Also hatar=0
Felso hatar=1.5
Hany reszre osszam be a szamkozt?15
0.100
x y
_____________________
0.000 3.980
0.100 3.952
0.200 3.876
0.300 3.753
0.400 3.584
0.500 3.374
0.600 3.125
0.700 2.842
0.800 2.530
0.900 2.194
1.000 1.842
1.100 1.481
1.200 1.120
1.300 0.769
1.400 0.440
1.500 0.151
Google szerint jók
(A dx kiíratásnál kimaradt egy f betű a formátumstringből) -
Sianis
addikt
Sziasztok!
C-ben kell írnom egy programot, ami kiszámítja f(x) =
4*th(x-3)*cos^1.2(x)
-re y értékeit, tehát csak az egyenletbe kell behelyettesíteni x értékeit. Így oldottam meg:float x,y,x1,x2,dx,tanh,cosos,cosx;
.
.
.
tanh=(tanhf(3-x));
cosx=cosf(x);
cosos=powf(cosx,1.2);
y=4*tanh*cosos;
.
.
.
A töbi változó a program többi részéhez szükséges. A program ''eliveleg'' működik, de uncsim Mapple-el utánna számolt, és nem jók az értékek. Mit rontottam el, illettve miért számolhat félre? Mert néhol túl nagy a differencia, és érzésem szerint a számolás jól meg megoldva... -
Jester01
veterán
válasz
emitter #1000 üzenetére
A foglaláskor és a felszabadításkor a belsõ ciklusban cella[i] kell, hiszen az i. sort (oszlopot) piszkáljuk. Általában (persze nem mindig) eleve gyanúsak az olyan ciklusok amelyek magjában nincs hivatkozás a ciklusváltozóra. Te pedig ugyanazt a változót írtad felül úrja meg újra.
A bekérõ kód kicsit zavarosra sikerült, a végtelen ciklustól eltekintve is.
A temp változót fölösleges kinullázni, hiszen úgyis értéket adsz neki.
A típusa feltehetõleg int, mivel a scanf azzal tér vissza. Márpedig ha ez így van, akkor ne NULL-lal hasonlítsd össze, mert az pointer.
Az az összehasonlítás egyébként teljesen felesleges, hiszen a kilépési feltétel elegendõ. Nézd meg hogyan lehet bekapcsolni a figyelmeztetéseket a fordítóban, szokott segíteni. Gcc pl. a fenti összehasonlításért is szól:
warning: comparison between pointer and integer.
A végtelen ciklus pedig azért van, mert a scanf abbahagyja a beolvasást az elsõ olyan karakternél amit nem tud értelmezni. Igy aztán legközelebb megint belefut. Ki kell ûríteni az input puffert, pl. ilyesmivel:while(getchar() != '\n');
[Szerkesztve]
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
- Kerékpárosok, bringások ide!
- Kertészet, mezőgazdaság topik
- Vicces képek
- Milyen légkondit a lakásba?
- The Division 2 (PC, XO, PS4)
- Házimozi belépő szinten
- Házi barkács, gányolás, tákolás, megdöbbentő gépek!
- Kínai és egyéb olcsó órák topikja
- World of Tanks - MMO
- gban: Ingyen kellene, de tegnapra
- További aktív témák...
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7600X 32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- Samsung Galaxy S23 128GB, Kártyafüggetlen, 1 Év Garanciával
- LG 65QNED87T / 65" - 164 cm QNED / 4K UHD / 120Hz & 3ms / HDR 10 Pro / FreeSync Premium / HDMI 2.1
- Bomba ár! Fujitsu LifeBook U758 - i5-8GEN I 8GB I 256GB SSD I HDMI I 15,6" FHD I W11 I Garancia!
- Új! Targus - USB-C Dual HDMI 4K HUB - 2 HDMI-vel. Saját töltő nélkül 2 monitorral (120Hz)
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest