Új hozzászólás Aktív témák
-
Jester01
veterán
válasz chabeee #2755 üzenetére
Hiányzik egy ; a return 0 után, ez gondolom másolási hiba különben nem is fordul. Ezen felül a fordító segítő üzeneteit ne hagyd figyelmen kívül:
t.c: In function 'beolvas':
t.c:19: warning: format '%d' expects type 'int *', but argument 2 has type 'unsigned int'
t.c:21: warning: format '%lf' expects type 'double *', but argument 2 has type 'double'
t.c:24: warning: format '%d' expects type 'int *', but argument 2 has type 'int'Azt próbálja neked mondani, hogy a scanf hívásokban pointert kell átadni, vagyis:
scanf("%d",(unsigned int)t[i].gyev);
-helyett-
scanf("%d",&t[i].gyev);
(annak a castnak amúgy sem volt semmi értelme)Hasonlóan a többire is.
Korcsii: a hiba attól még nem tűnik el. Bár a %u ettől még jó javaslat.
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz PetyaMIK #2762 üzenetére
A kigyok az kétdimenziós karakter tömb, vagy ha úgy tetszik egydimenziós string tömb. Ezért nem jó a kigyok[index] != '*', hiszen a bal oldal az char* a jobb oldal meg char. Egy lehetséges megoldás, ha a jobb oldalból is stringet csinálsz, és a megfelelő összehasonlítást alkalmazod: strcmp(kigyok[index], "*") != 0
MOD: Továbbá a ciklus vége előtt már növeled az index értékét, így a while feltétel már másik elemet vizsgál. Egyszerűbb lenne, ha a ciklusmagban lévő if feltétel break használatával kilépne a ciklusból, ami amúgy végtelen lenne.
MOD #2: ja és ha csak a leghosszabb kígyót kell kiíratni, akkor teljesen fölösleges mindet eltárolni egy tömbben.
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz Feribacsi555 #2788 üzenetére
Ahogy említették szabvány C-nek ilyen függvény nem része, ez platformfüggő. Windowson nyilván a windows api cuccokat kell használni, pl. SetConsoleTextAttribute (példaprogram ugyanott)
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz Hujikolp #2792 üzenetére
Pedig elég egyértelmű a hibaüzenet. A % operátor csak egész típusra működik, neked meg float van.
Korcsii: hajnali kettőkor már elnézzük hogy a xor-t valahogy idekeverted
Hujikolp: a feladatra egyszerűbb megoldás lenne a négyzetszámokon végigmenni 100-ig. count = 0; for(i = 1; i * i < 100; ++i) count++;
sokadik mod: ja persze ha konkrétan kétjegyű kell, akkor 4-től nézni.
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz Hujikolp #2795 üzenetére
Nem mindegy, csak a <= a helyes.
A for-ban nem felsorolás van, ott a vessző mást jelent (operátor). Egyik részben sem kötelező semmit megadni. Az első kifejezés a ciklus előtt értékelődik ki egyszer, a második a ciklusban maradási feltétel, minden iteráció előtt fut, a harmadik pedig minden iteráció után.Jester
-
Jester01
veterán
MOD: ha figyelmesebben olvastam volna akkor láttam volna, hogy az -lm már megvan Pedig azzal lesz valami, mert ez akkor is linker error. Be tudnád másolni az egész tesztprogramot és a pontos parancssort és hibaüzenetet?
$ cat >test.c
#include <math.h>
int main()
{
float c = pow(3, 2);
return 0;
}
$ gcc -Wall -lm test.c
test.c: In function 'main':
test.c:4: warning: unused variable 'c'[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz TheRolf #2813 üzenetére
1) gets-t tilos használni
2) teljesen fölösleges a két változat, a második jó (lesz*) mind a két esetben
3) a math.h is fölösleges
4) ha egyszer int main, akkor illene valamit visszaadni
5) a fordító üzeneteit érdemes megszívlelni (és persze bekapcsolni őket)
6) a kiírás végére illene soremelést tenni
7) a "valamiért nem fut le" szánalmas hibaleírás
8) a ciklusból ki lehet lépni ha már kiderült, hogy nem palindromMOD: * úgy értem, ha a kingabo által fentebb jelzett hibát javítod
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz TheRolf #2825 üzenetére
Itt csak az a baj, hogy az atoi-nek string kell, ami C-ben nulla byte-tal lezárt karaktertömböt jelent. Több lehetőséged is van. Talán a legegyszerűbb, ha a kar[1]-et nullázod. Ekkor ugye így fog kinézni a tömb { x, 0, y, 0 } (a végére az fgets tette a nullát). Ilyenformán a konverzióhoz simán megadhatod az &kar[0] illetve &kar[2] pointereket (ami ugyanaz mint a kar ill. kar+2).
Másik lehetőség egy számjegyű számok konvertálására ha simán levonod belőle a 0 ascii kódját, pl. n = en - '0';
Jester
-
Jester01
veterán
Ebben konkrétan ki van kommentezve az amit a hibaüzenet hivatkozik tehát valamit sumákolsz
Egyébként undefined reference akkor szokott lenni, ha elfelejted hozzálinkelni a megfelelő könyvtárakat. Ugye a headerek kellenek a fordításhoz, a libraryk pedig a linkeléshez.
Jester
-
Jester01
veterán
válasz WonderCSabo #2866 üzenetére
Méginkább nyilván egyikre sincs szükség mert az előző tagból simán adódik a következő. Azt hiszem kingabo is erre célzott.
[ Szerkesztve ]
Jester
-
Jester01
veterán
válasz eriktoth #2871 üzenetére
Az egy dolog, hogy a mi tanácsainkat elengedted a füled mellett, de sajnos a fordító figyelmeztető üzeneteit is (vagy be sem kapcsoltad őket).
1. össze-vissza kevered az egész illetve lebegőpontos típusokat
2. a faktoriális igen hamar igen nagy lesz
3. a ciklusban a változód neked i nem n mint az eredeti képletben
4. a hívott függvény vagy legyen előbb a kódban vagy legyen hozzá prototípus
5. ebben a formában borzalmasan lassú lesz
6. a nyelvek keveréséért azonnali főbelövés jár már két nyelv esetén is, de neked sikerült hármat is ...
7. folyamatosan kérjük, hogy ha már segítségért folyamodik valaki, akkor tiszteljen meg bennünket olvasható kóddal (indentáció és a Programkód gomb használata)Jester
-
Jester01
veterán
Ugye a for(i = 1; i <= x; i += 2) ciklusod csak a páratlan számokon megy végig, így a végérték vagy x (ha x páratlan) vagy x - 1 (ha x páros). Ezért simán nem lehet megfordítani, mivel a kezdőértéket pontosan kell megadni. Például így: for(i = (x & 1) ? x : (x - 1); i >= 1; i -= 2)
Jester
-
Jester01
veterán
válasz Rickazoid #2893 üzenetére
Tényleg olyan nagy dolog fordítható, futtatható kóddal megtisztelni a segítőkész embereket?
Valahogy kipótoltam, de hogy így most az-e amit te használsz azt honnan tudjam?
Általános jótanács, hogy kapcsold be a fordító figyelmeztetéseit:
warning: suggest parentheses around assignment used as truth value
warning: operation on 'l' may be undefinedEzek a while(Name[I][l]=buffer3[l++]); sorra vonatkoznak.
Következő jótanács, hogy használd a valgrind (vagy más hasonló) programot. Ez például megmutatja, hogy itt-ott a már bezárt f fájlból akarsz olvasni az ff helyett.
Ezen felül, a buffer2 és buffer3 tömbök induláskor nincsenek inicializálva, tehát legalább az első iterációban baj van. A későbbiekben sem látom hogy kerül bele EOF ami különben is int konstans, tehát char változóba nem szabad beletenni.
Ezeket javítva már valamit csinál a program, de hogy az jó-e azt nem tudtam a leírásodból kibogozni.
Jester
-
Jester01
veterán
válasz Rickazoid #2895 üzenetére
Igen, pár változó maradt ki. Ami jelen esetben (is) nagyon fontos volt mivel a típusuk, a méretük és a sorrendjük nagyban befolyásolhatja a program működését. Igen, kitaláltam nagyjából mik lehettek.
"Ezen felül, a buffer2 és buffer3 tömbök induláskor nincsenek inicializálva"
Ez nem is tudom mit jelent.Azt jelenti, hogy C-ben a lokális változók tartalma induláskor nem definiált. Tehát bármi lehet benne. Ezért rossz, ha te valamit keresel benne.
Az általam tanultak szerint a while(Name[I][l]=buffer3[l++]); kifejezés megfelelő.
Nem az, mivel a szabvány szerint nem szerepelhetne benne l és l++ is. A működése ugyanis attól függ, melyik értékelődik ki hamarabb és ezt a szabvány nem definiálja. Ha a jobb oldal számítódik ki először, akkor oda az l eredeti értéke helyettesítődik, de a bal oldalra már a növelt érték kerül. Fordított sorrendben mindkét helyre az eredeti érték kerül.
kellett valami, ami kinullázza a tömb tartalmát
Tehát a tömböt akarod kinullázni. Van neki mérete, tessék szépen végigmenni rajta és kinullázni. for(l = 0; l <= size; ++l) buffer2[l] = 0; (mivel ugye a tömböd mérete size + 1 volt.
Aki nem a debugger használatát tanítja először fejbe kellene kólintani.
[ Szerkesztve ]
Jester
-
-
-
Jester01
veterán
válasz chabeee #2916 üzenetére
Rengeteg módon. Például csinálsz egy struct-ot amiben benne van a magyar és az angol szó. Ezután qsort hívással, a megfelelő összehasonlító függvény megadásával, berendezed:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct entry
{
const char* eng;
const char* hun;
};
static int compare_entries(const void* a, const void* b)
{
const struct entry* e1 = a;
const struct entry* e2 = b;
return strcmp(e1->eng, e2->eng);
}
int main()
{
struct entry words[] = {
{ "dog", "kutya" },
{ "donkey", "szamar" },
{ "content", "tartalom" },
{ "apple", "alma" },
{ "good", "jo" },
{ "diamond", "gyemant" }};
const int count = sizeof words / sizeof words[0];
int i;
qsort(words, count, sizeof words[0], compare_entries);
for(i = 0; i < count; ++i)
{
printf("%s %s\n", words[i].eng, words[i].hun);
}
return 0;
}Jester
-
Jester01
veterán
Szépen elbaktatsz a megfelelő headerbe és megnézed:
G_CONST_RETURN gchar* gtk_entry_get_text (GtkEntry *entry);Vagy nyilván a dokumentációban.
[ Szerkesztve ]
Jester
-
-
Jester01
veterán
válasz Feribacsi555 #2958 üzenetére
Google ( ) szerint:
Indeterminate.
Result cannot be represented in a floating point register.
Most likely the result of 0/0, sqrt(-1) or similar.Magyarul nullával osztottál, negatív számból gyököt vontál vagy hasonló - valós számokon - érvénytelen művelettel próbálkoztál.
Jester
-
Jester01
veterán
válasz Feribacsi555 #2961 üzenetére
A mínusz jel speciális guglinak, idézőjelbe kell az egészet tenni.
Jester
-
Jester01
veterán
válasz LumberJack #2965 üzenetére
Például azért, mert az első if blokk x == 80 esetén kinullázza az x-et, amitől persze teljesülni fog az x < 80 feltétel és a második blokk is végrehajtódik. Esetleg simán else ágat kellene használni (vagy átírni kevésbé kacifántos megoldásra).
Jester
-
Jester01
veterán
Ez nagyon kreatívan megírt program. Ha ember bírálná el, nem sok jó származna belőle.
Mindenesetre a baj az fgets körül lehet, az ugyanis eltárolja a sorvég jelet is. Ezáltal egyfelől csak akkor találod meg a dolgokat ha az éppen a sor végén van, másfelől pedig a 255 hosszú sorokon elcsúszik a feldolgozás (és onnan már nem is jön helyre). Jelen formájában a feladatkiírásban lévő példára sem működik, nem értem ezt hogy nem vetted észre.
Jester
-
Jester01
veterán
válasz WonderCSabo #3003 üzenetére
Nekem nem. Hol vágja le a sorvég jelet amit az fgets beolvas?
(gdb)
40 fgets(s,256,f);
(gdb)
41 fgets(d,256,f);
(gdb)
43 kimenet=vizsgal(s,d);
(gdb) x/s s
0x7fffffffe5d0: "abrakadabra\n"
(gdb) x/s d
0x7fffffffe4d0: "rak\n"A vizsgal függvénynek meg kutya kötelessége az egész stringet nézni a lezáró 0-ig, vagyis a \n-t is. Így pedig csak a sor végén fog egyezni.
255-nél hosszabbra nem is kell működnie, de ez már 255-re sem működik, amire még kellene. A tesztelő meg lehet, hogy gonosz módon ki is próbálja azt.
Jester
-
Jester01
veterán
válasz WonderCSabo #3006 üzenetére
Tévedés:
A bemenet két sorból áll. Mindkét sorban egy-egy szóközt nem tartalmazó, legalább egy de maximum 255 karakter hosszú sztring található, melyeket rögtön sorvégejel követ.
Mind a két sor végén kellene \n legyen. És akkor már nem működik.
Jester
-
Jester01
veterán
Ahogy mondod
Mivel a main a kapcsolat a futo és a futolepes között, így először futo-ból kellene visszaadni a main-be, majd onnan tovább. A helyzetet bonyolítja, hogy 2 értékről van szó. Egy lehetséges megoldás ha definiálsz egy struktúrát a két értéknek és azt adogatod, valahogy így:struct pozicio
{
int sor;
int oszlop;
};
struct pozicio futo(char tabla[TABLA_MERET][TABLA_MERET], char input[3])
{
struct pozicio p;
...
return p;
}
...
void futolepes(char tabla[TABLA_MERET][TABLA_MERET], struct pozicio p)
{
...
}
...
int main()
{
struct pozicio p;
...
p = futo(tabla, input);
gyalog(tabla, input);
futolepes(tabla, p);
...
}A naív megoldás persze a globális változók használata lenne, de az általában nem ajánlott.
Jester
-
Jester01
veterán
válasz WonderCSabo #3038 üzenetére
Főleg, hogy ennek olyan szaga van, hogy valakivel megíratta a tanár meg lebuktatta...
Jester
-
Jester01
veterán
válasz WonderCSabo #3043 üzenetére
Azok közül csak a gets vár entert, a többinél csak azért látszik úgy, mert az alatta lévő réteg eleve soronként pufferel. Ennek kikapcsolása vagy megkerülése sajnos platformfüggő.
Jester
-
Jester01
veterán
Van több is
while(d != '1');
Ide nem karakter konstans kell, csak simán egy szám.Másik probléma, hogy a d-be számítod ki az új értéket de az a-t használod.
Kicsit letisztázva ilyesmi lehet:
#include <stdio.h>
int main(void)
{
int a;
scanf("%d",&a);
do
{
if (a % 2 == 0)
{
a = a / 2;
} else {
a = a * 3 + 1;
}
printf("%d\n", a);
} while (a != 1);
return 0;
}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!
- Xiaomi 14 Ultra - Leica hercegnő
- Hivatalosan is reagált a Core CPU-k stabilitási gondjáira az Intel
- TCL LCD és LED TV-k
- Milyen videókártyát?
- Asztrofotózás
- AMD GPU-k jövője - amit tudni vélünk
- EAFC 24
- Samsung Galaxy Z Fold5 - toldozás-foldozás
- Súlyos adatvédelmi botrányba kerülhet a ChatGPT az EU-ban
- Luck Dragon: Asszociációs játék. :)
- További aktív témák...
- Keresek - Macbook Air M3 16GB / 24 GB - 512 GB SSD - Magyarországi beszerzés, tehát kb. 3 év garit
- Tyű-ha Lenovo Thinkpad T14 G2 Üzleti "Golyóálló" Laptop 14" -50% i7-1185G7 4Mag 16GB /512GB FHD IPS
- Ej-ha Lenovo Thinkpad T14 G2 Üzleti "Golyóálló" Laptop 14" -50% i7-1185G7 4Mag 32GB /512GB FHD IPS
- Eladó Nitro Venture TLS Snowboard Bakancs 46-os
- Eladó Nitro Team 2022 162W Snowboard Deszka
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Promenade Publishing House Kft.
Város: Budapest