Új hozzászólás Aktív témák
-
CPT.Pirk
Jómunkásember
válasz
Gyuri16 #2598 üzenetére
Hú köszi, végre egy érthető példában láttam a pointer működését.
Anno bugyi, bugyis polc, meg bugyis polcra mutató valami közti kapcsolattal magyarázták a pointert, amikor nem sikerült megértenem. Később meg csak használtuk, de mivel nekünk nem fő profilunk (heti 1 órában hogy is lehetne) a C programozás, így érdemi pointer magyarázás a későbbiekben sem valósult meg, vagy én nem fogtam fel...Köszi nektek a segítségért.
Segfaulttal majd kezdek valamit, mert assertes test meg van csinálva hozzá, szerintem csak a codeblocks szórakozik velem.
-
Gyuri16
senior tag
válasz
CPT.Pirk #2597 üzenetére
nem. ezek szerint nem erted a pointerek mukodeset.
egy darab stringed van, amit megkapsz a buffer valtozoban. ennek a valtozonak a tartalma egy memoriacim, ami a string elso karakterere mutat. a char *c = buffer; sor annyit csinal, hogy letrehoz egy masik pointert (mutatot), ami ugyan arra a memoriacimre fog mutatni. tehat a ket valtozo ugyanannak a stringnek az elejere mutat. ezutan a c-t hasznalod, hogy megkeresd a veget, visszalepj egyet. eddig a pontig csak a c pointert valtoztattad meg (tehat azt a memoriacimet ami a valtozoban van a stringet nem valtoztattad), a stringnek az utolso nem null karakterere mutat. ezutan a *c='\0'; sorral atirod azt a karaktert amire a c mutat (ezert van ott a csillag a c elott - a dereferencia operator). ezutan pedig a tomb elejere mutato pointerrel kell visszaternie a fuggvenynek, es az pedig a buffer valtozoban van.
-
Gyuri16
senior tag
válasz
CPT.Pirk #2593 üzenetére
ez nem jo:
if (*buffer-- == '\n'){
a -- csak a feltetel kiertekelese utan fog vegrehajtodni, ezert ez az if sose teljesul (mindig 0 lesz a buffer erteke amikor ideer). ezert a fuggvenyed mindig az utolso (nem null) karakterre mutato pointert ad vissza.Ilyenkor a *buffer-t hogyan viszem vissza a kezdeti pozícióba?
ne a buffer pointert vidd vissza, hanem hasznalj egy masikat a mozgasra (ahogy azt.Jester01 mar irta). a fuggvenyed elejen csinalj egy ilyet:char * q = buffer;
es azutan a q-val dolgozz, a vegen petig visszaterhetsz a bufferral
mas:
mikozben ezt probaltam elojott a kovetkezo hiba, miert segfaultol a devcpp erre?
char * a = "abcd";
*a = 'b'; -
CPT.Pirk
Jómunkásember
válasz
Jester01 #2592 üzenetére
Uhh tényleg.
char *strChomp(char *buffer)
{
if (buffer && *buffer) {
while (*buffer != '\0') {
buffer++;
}
if (*buffer-- == '\n'){
*buffer = '\0';
}
return buffer;
}
return NULL;
}Most ha minden igaz, elmegy a végére, ha odaért, megnézi a lezáró nulla előtti karaktert, és ha az \n, akkor átírja \0-ra.
Nekem csak vissza kell adni a módosított, vagy az eredeti stringet, ha nem volt \n a végén. Ilyenkor a *buffer-t hogyan viszem vissza a kezdeti pozícióba? Ez most elég amatőr kérdés lesz, de gondolom nem egy "ellenkező irányú" while ciklussal lépdeljek vissza.
-
Jester01
veterán
válasz
CPT.Pirk #2591 üzenetére
Ez még mindig nagyon rossz, mivel most is minden lépésben nézed a \n-t, továbbá a -- és a ++ szépen kiüti egymást.
Igen, majd ha jól működik akkor két 0 lesz a végén de ez mindegy mert a stringnek az első nullánál lesz logikailag vége.
A visszatérési értéknek ha az eredeti paramétert akarod, akkor célszerű másolatot csinálni belőle és azt piszkálni, az eredetit meg békénhagyni.
-
CPT.Pirk
Jómunkásember
válasz
Jester01 #2590 üzenetére
Kezdem felfogni.
if (buffer && *buffer) {
while (*buffer != '\0') {
if (*buffer-- == '\n') {
*buffer = '\0';
}
buffer++;
}
return buffer;
}
return NULL;Viszont azt nem tudom, hogy ez a felülírás amit mondtál, ez mit csinál. Mivel ha felülírjuk, akkor mindenképpen 2 darab \0 lesz a stringben. Ilyenkor magától levágódik a második \0?
Valamint hogy van ez a visszatérési érték helyreállítása?
-
Jester01
veterán
válasz
CPT.Pirk #2589 üzenetére
Ez megint nem jó, mert a ++ az ugyebár megnöveli a változót. Tehát ha megtalálta a \n-t és a rákövetkező byte a lezáró nulla, akkor azt önmagával akarja felülírni. Ha viszont nem nulla, akkor abban a lépésben a buffer kétszer lesz növelve. A visszatérési érték pedig továbbra is rossz, mivel akkor a buffer már a string végére fog mutatni.
Embertelenül túlbonyolítod a kérdést. Összesen annyit kell csinálni, hogy megkeresed a végjelet és megnézed, hogy az előtte lévő karakter \n-e és ha igen, akkor azt felülírod.
-
CPT.Pirk
Jómunkásember
válasz
Jester01 #2588 üzenetére
No alakítottam rajta egy kicsit.
char *strChomp(char *buffer)
{
if (buffer && *buffer) {
while (*buffer != '\0') {
if (*buffer == '\n') {
if (*buffer++ == '\0') {
*buffer = '\0';
return buffer;
}
}
buffer++;
}
return buffer;
}
return NULL;
}Így most elvileg végigmegy a sztringen karakterenként a lezáró nulláig. Közben ha talál \n-et, akkor megnézi, hogy a rá következő karakter lezáró 0-e.
Egyébként van valami ordító hibám? Mert eddig csak és kizárólag segfaultot kaptam az assert teszteknél.
-
Jester01
veterán
válasz
CPT.Pirk #2587 üzenetére
Ennek már eleve a fordításnál el kellene "buknia":
c = buffer; Hiányzik egy csillag.
return *buffer; itt meg van egy fölösleges
if (c == "\n") ide karakter konstans kell, aposztrófok között nem idézőjelben
*buffer = *(buffer--); szerkezet nem szabályos
bár az if belsejét szépen behúztad, attól még oda kellene a kapcsoszárójel (így is fordul, csak mást csinál mivel a return *buffer; már nem lesz a feltétel hatása alattA logikáját amúgy sem értem. Ugye a while feltétel eleve növeli a pointert, tehát c-be a következő karakter kerül már. Ha ez \n (akárhol is van, tehát nem feltétlen a string végén) akkor ezt, és csak ezt, megpróbálja felülírni az ezt megelőző karakterrel és itt abba is hagyja a feldolgozást, visszatérési érték pedig a buffer aktuális értéke lesz (tehát nem a string eleje). Ha pl. a bemenet "abc\ndef" akkor a kimenet "cdef" esetleg "ccdef" lesz.
Mivel az a feladat, hogy szedje le az új sor jelet a string végéről, ezért egyszerűen meg kell keresni a lezáró nulla byteot és azt eggyel előrébb hozni ha az előző karakter \n volt.
-
CPT.Pirk
Jómunkásember
Van nekem egy kódom, ami ránézésre nekem tetszik, de assertes teszten mindig elbukik. Mi a gáz vele?
char *strChomp(char *buffer)
{
char c;
if (buffer && *buffer)
while (*buffer++){
c = buffer;
if (c == "\n")
*buffer = *(buffer--);
return *buffer;
}
return NULL;
}Annyit kell csinálnia, hogy leszedi a sorvégi új sor jelet, ha van.
-
Tecsa
aktív tag
válasz
WonderCSabo #2585 üzenetére
Közben megoldottam. Köszönöm a türelmetek.
-
Tecsa
aktív tag
válasz
Sk8erPeter #2583 üzenetére
Gondoltam, hogy egy for ciklussal végig futtatom a tömb elemeit és azt nézem hogy, ezek valameike éppen a bekért szám-e, és ha nincs egyezés akkor a bekért szám kerüljön a másik tömb-be. Ezt meg is irtam, de ez nem működik megfelelően.
-
Tecsa
aktív tag
válasz
WonderCSabo #2581 üzenetére
Erre gondoltam csak nem sikerült össze hozni, de akkor még nekifutok.
-
Tecsa
aktív tag
Sziasztok!
Kezdő vagyok c-programozással kapcsolatban, és egy kis problémába ütköztem.
Lenne 2 tömb. az 1-ik kézzel van feltöltve össze vissza számokkal, a másikat pedig billentyűzetről kellene feltölteni, mondjuk scanf-el, de csak olyan számokkal ami nincs benne az első tömb-ben. Ehez kérnék egy kis segítséget.
Maga a feltöltés menne, azzal van problémám, hogy a bekért szám szerepel-e a tömb-ben.
Segítségeteket előre is köszönöm.
Üdv: Tecsa -
j0k3r!
őstag
válasz
WonderCSabo #2577 üzenetére
valo igaz
(#2575) _ATi_1: en igy oldottam meg:
if(pid == 0)
{
while(j < m)
{
if(msgrcv(id, &u, sizeof(u.msg), (i + 1), 0777) == sizeof(u.msg))
{
u.mtype = (i + 2);
u.msg[0] = (u.msg[0] / u.msg[1]);
printf("%d\n", u.msg[0]);
msgsnd(id, &u, sizeof(u.msg), 0777);
++j;
}
}
}persze a j-t meg forkolas elott hoztam letre 0 kezdeti ertekkel.
-
j0k3r!
őstag
válasz
Sk8erPeter #2571 üzenetére
nemtudom mire gondolsz, elkezdek 'fentrol' lefele haladni, es ha talalok olyan szamot, amelyik mind a ket szam osztoja, akkor a fv visszateresi erteke i, a ciklust meg leallitom (break), mivel felesleges tovabb keresni, ha mar megvan az elso (legnagyobb) elem.
-
_ATi_1
senior tag
Sziasztok!
Szeretnék egy kis segítséget kérni Tőletek.
A feladat leírása: [link]
A félig kész forrás: [link] (Remélem nem gond, hogy így raktam fel)A gond, hogy nem fut le m-szer (2. paraméterben megadott szám) a számok bekérése. Pontosan nem tudom melyik részen van a hiba, de kifogott rajtam.
Ha egy hozzáértő esetleg tudna segíteni, megköszönném. -
followme
aktív tag
válasz
followme #2545 üzenetére
/* "Látható" típus */
typedef struct apiT
{
/* függvény-pointerek */
} apiT;
/* "Rejtett" típus */
typedef struct objT
{
apiT api;
/* belső paraméterek */
} objT;
/* "konstruktor" */
apiT* createObj()
{
objT* obj = (objT*)malloc(sizeof(objT));
/* belső paraméterek állítása */
/* api feltöltése */
return &obj->api;
}
/* példa egy api függvényre */
void apiFn(apiT* api)
{
objT* obj = (objT*)api;
/* belső paraméter módosítása */
}Remélem nem írtam el semmit és a lényeg átmegy
-
j0k3r!
őstag
válasz
WonderCSabo #2568 üzenetére
ezt nem is neztem, pedig ebben a felevben eleg sokszor hasznaltam irasban, mivel kellett az RSA-hoz : )
de ha mar itt tartunk: google a baratunk -
WonderCSabo
félisten
Mondjuk nem hiszem, hogy az algoritmus implementálása bárkinek gondot okozna. Ha mégis, akkor az angol wikin ott van implementálva pszeudokódban, azt már csak át tudja írni C-re.
-
lordbonehu
csendes tag
Sziasztok! Olyan embereket keresek akik akik jártasak annyira a C nyelvben, hogy a következő feladatban segítsenek.
Kezdő programozóként, van egy ilyen forráskódom.
A feladat leírása a következő:
"Kulcstábla vagy Indextábla használata és beleépítése a programba (rendezéshez, törléshez)"
Ez egy házi feladat (egy adatbázisféleség) amit a félév során folyamatosan bővíteni kellet, eddig eljutottam, de sajnos innentől nem tudom hogy hogyan lehet ezt megoldani. Bárkinek a segítségét megköszönném, aki meg tudná mondani hogyan alakítsam ezt át, hogy benne legyen, a feladatban leírt dolog. -
WonderCSabo
félisten
Van egy pár, a legismertebb az Euklideszi algoritmus.
-
Cicero
őstag
progzh bukta. Két szám legnagyobb közös osztójára tudtok valami algoritmust?
-
Stanki6
csendes tag
válasz
Sk8erPeter #2560 üzenetére
Codesearch-ön körbenéztem már de nem pontosan azok vannak amik nekem kénének, mert ezeket a paramétereket kaptam:
/**
converts int to string
\param num number to convert
\param str target buffer, needs enough to store chars
\param radix of the conversion
*/ -
Stanki6
csendes tag
Sziasztok!
Lenne egy kérdésem hogy tudnám megvalósítani ezt a függvényt amit feladatként kaptam: char *itoa(int num, char *str, int radix).
Válaszotokat előre is köszönöm -
Sk8erPeter
nagyúr
válasz
Nyiscsák #2557 üzenetére
Nincs mit!
Mindig kerüld el ezeket a system(...) jellegű függvényhívásokat, mindig megoldható másképp, könyvtári függvényekkel is.
Ez egy feleslegesen erőforrásigényes rendszerhívás, ráadásul NEM platformfüggetlen.Jester01-nek igaza van, lehet tovább egyszerűsíteni és gyorsítani, így még jobb:
int tobbszor( int* pTomb, int size )
{
int i, j;
for ( i = 0; i < size; i++ ){
for ( j = i+1; j < size; j++){
if (pTomb[j]==pTomb[i])
return 1;
}
}
return 0;
}Tehát a belső for ciklusban i+1-től vizsgálódom, felesleges újra és újra végigmenni az egész tömbön, ráadásul így eleve az aktuális tömb utántól indul a vizsgálat.
======
(#2556) Jester01: you're right.
Először arra gondoltam, az úgy nem jó, mert nem rendezett a tömb, aztán rájöttem, hogy ez baromság, mert egyszer már az elejétől végigszaladgáltunk, minek újból, kicsit fáradt vagyok...
-
Nyiscsák
aktív tag
válasz
Sk8erPeter #2553 üzenetére
Sajnos a systemes hülyeséget a tanár verte belénk a DevC++ használatakor, de igyekszem felejteni. A feladat egyszerűsítéséért pedig köszönet! Így sokkal átláthatóbb az egész.
-
Jester01
veterán
válasz
Sk8erPeter #2553 üzenetére
Sőt, elég a következő elemtől nézni a listát
-
Sk8erPeter
nagyúr
válasz
Nyiscsák #2546 üzenetére
Ezt a
system("PAUSE");
baromságot nagyon gyorsan felejtsd el (egyszer össze kéne számolni, hányszor hangzott el ez a topikban).
Gondolom valami gyökér tanár mutatta ezt a szarságot, vagy valami gány fórumon szedted össze.
Ott van helyette pl. a getchar();Ezenfelül jobb lenne, ha azonnal visszatérnél, amint egyezést találtál egy korábbi számmal (minek végigmenni rajta teljesen?).
if (pTomb[j]==pTomb[i])
ez a feltételvizsgálat nálad legalább egyszer mindenképp igaz lesz, amikor önmagával hasonlítod az elemet, felesleges ezt vizsgálni.
Szóval így is lehet:
int tobbszor( int* pTomb, int size )
{
int i, j;
for ( i = 0; i < size; i++ ){
for ( j = 0; j < size; j++){
if (i!=j && pTomb[j]==pTomb[i])
return 1;
}
}
return 0;
} -
chabeee
aktív tag
Sziasztok!
programozás közben szükségem lett volna pár matematikai függvényre, de sajnos ezt nem tette lehetőve a progi amit használok. Ubuntu alatt használok eclipset!
egyetemen még mutatták hogy vmi "-m"-et kell beírni csak nem tudom hova.
konkrétan az sqrt kellene!
a válaszokat előre is köszi
üdv -
Nyiscsák
aktív tag
Sziasztok!
Van egy programom melynek annyi lenne a feladata, hogy megnézi egy tömb elemeit és ha van benne olyan szám mely többször előfordult akkor kiírja hogy van, egyébként meg nincs.
Ez lenne a kód, ami valamiért nem működik:
#include <stdio.h>
int tobbszor( int pTomb[], int size )
{
int i, j;
int db = 0;
for ( i = 0; i < size; i++ ){
db = 0;
for ( j = 0; j < size; j++){
if (pTomb[j]==pTomb[i])
db++;
}
if (db > (size-db))
return 1;
}
return 0;
}
int main()
{
int a[] = {11, 12, 22, 33, 2, 11, 11, 55};
int size=(sizeof(a)/sizeof(a[0]));
if (tobbszor( a, size ) == 1)
printf("van\n");
else
printf("nincs\n");
system("PAUSE");
return 0;
}Köszi előre is a segítséget!
-
followme
aktív tag
válasz
Sk8erPeter #2543 üzenetére
Ez nem mentegetőzés, inkább lustaság, mert nem olyan egyszerű leírni röviden és érthetően
Majd este
-
followme
aktív tag
válasz
Jester01 #2541 üzenetére
Bocsi, nem olvastam az elejét, csak átfutottam és megláttam amit írtál és az ütött szemet.
Igazad van, gyakorlatilag mindent lehet ilyen szempontból máshogy csinálni.
De akkor még egy példa arra, hogy miért kerüljük az implicit típuskonverziót:
uint16_t u16a = 40000;
uint16_t u16b = 30000;
uint32_t u32res;
u32res = u16a + u16b;
/* 70000 vagy 4464? */Ha van rá igény mutatok olyan példát, amikor másra is használható a castolás. Nagyon szépen lehet vele például OO szerű C kódot írni
Csak nem szeretném, hogy a fórumozók idegenkedjenek tőle
-
Jester01
veterán
válasz
followme #2540 üzenetére
Ha kicsit figyelmesebben olvasol akkor látod, hogy alapvetően pointerek castolásáról van szó. Egyszerű típusokra jól definiált konverziók vannak amiket a fordító ismer is.
Ettől függetlenül a megadott példát is lehet szépen csinálni:res8 = ~p;
res8 >>= 3;Mindjárt kevesebb zárójelen kell az ember szemének jojóznia.
Az már csak a hab a tortán, hogy a te példád pont az én állításomat támasztja alá, miszerint a castolás "bizonyos esetekben szükséges rossz".
-
gitanaa87
csendes tag
válasz
Sk8erPeter #2536 üzenetére
pénzt is áldoznék rá, mivel ezen múlik hogy lesz e plusz 1 év csúszásom. ezért kérek valakit aki megcsinálná nekem, írjon egy üzit.
-
gitanaa87
csendes tag
Sziasztok!
A Miskolci Egyetemre járok és ott tanulok műszaki informatikát és van két beadandó feladatom, de sajnos nem értem ezt a programozást teljesen. Ezen a két feladaton múlna a tárgyam, ezért nagyon hálás lennék ha valaki megcsinálná nekem a feladatokat és elküldené privátban.
1. C Grafikai feladat. Egy tetszőlegesen megadott z=f(x,y) kétváltozós függvény adott síkbeli
négyszögtartomány feletti maximumát (minimumát) kell keresni egy
megadott rácsközű koordinátarács fölött gradiens-eljárással. Meg kell
rajzolni egy extrémum-keresés pályagörbéjét megadott kezdőpontból
kiindulva, a mindenkori függvényértékek és koordinátáik táblázatos
megjelenítésével.2. Dolgozzon ki legalább kétszintű osztályhierarchiából és egyedekből álló objektum orientált megoldást C++ nyelven az alább megadott témakörökre! A feladat megoldásában alkalmazza a vektorok dinamikus foglalását. Definiálja az objektumok adattagjainak történő értékadást és lekérdezést lehetővé tévő tagfüggvényeket.
Hozza létre a Bútor osztályt a Súly, Jellemző anyaga és a Legnagyobb magassága adattagokkal. Származtassa belőle az Asztal és a Szekrény alosztályokat. Az Asztal osztályt lássa el Asztallap-alak és Fiókos adattagokkal. A Szekrény osztályt bővítse Üveges és Kulccsal zárható adattagokkal. Írjon programot, amellyel létrehozhatók az Asztal és a Szekrény egyedeket tároló vektorok. A program tegye lehetővé a feltöltést és a legnehezebb Üveges szekrény összes adatának kiiratását, valamint a Kulccsal zárható fémszekrények közül azoknak a kilistázását, amelyek ráadásul Üvegesek is.Nagyon hálás lennék, ha valaki szakítana egy kis időt rám és megoldaná. Üdv: Judit
-
moszkita
csendes tag
Sziasztok! Infóra kellene beadandót csinálnom, de mivel lényegében nem tanítanak semmit, így elég nehéz :S
Kompletten el se tudom kezdeni
Borland C-ben kellene ezt megírni:
"Megrajzolandó a háromszög köré írt kör, ha a háromszög csúcspontjainak koordinátáit a felhasználótól kérjük be."Ezer hála és köszönet aki tud ebben segíteni.
Privátba is jöhet, nagy respect aki megcsinálja.
-
Drizzt
nagyúr
C++ban van gyakorlatom, kb. másfél év, nem mindig közvetlen c++ programozással telt ugyan, de nagyrészt kellett C++ kódot nézni, hibákat keresni, javítani, stb.
Viszont új munkám lesz, s ott C-vel fogok foglalkozni első körben. Milyen könyvet lenne addig érdemes elolvasni, ha az említett C++ tapasztalat van meg részemről?
-
j0k3r!
őstag
válasz
Jester01 #2529 üzenetére
elszamoltam magam, azthittem kulon kell az utolso processeknek kuldeni egy-egy uzenetet a szulonek, de mar latom, hogy az utolso gyerekprocess (i + 2) -es tipusu uzenete az pont (n + 1), szoval valo igaz ketszer kuldtem el szulonek, nemcsoda hogy ido elott torolt sleep nelkul.
koszonom szepen a segitseget, mostmar sleep nelkul is mukodik es szepen torli is az uzenetsort (ipcs szerint is) -
j0k3r!
őstag
válasz
Jester01 #2527 üzenetére
1. a kimenet meg mindig jo
2. mostmar igen, de sajnos meg mindig van benne sleep() (kod), pedig szerintem logikailag mar jo lenne (ha kiveszem a sleepet, akkor hamarabb zarja le, minthogy megerkezne az utolso uzenet, pedig a ciklusban az utolsoprocess vizsgalat es a szulonek valo uzenet kuldese a 'sima' uzenetkuldes utan van)
3. : ) -
j0k3r!
őstag
válasz
Jester01 #2525 üzenetére
hello!
1. koszonom szepen a tanacsokat, megprobaltam kijavitani a leirtak alapjan.
erre jutottam: c, sh, kimenet2. uzenetsor torlese ele beraktam egy sleep(1);-et (ez valoszinuleg ganyolas). mivel lehetne legegyszerubben leellenorizni, hogy mar elment az n * m db uzenet, ami utan mehet a torles? (en arra gondoltam, hogy letrehozok a foprogramban egy int valtozot (shmat es tarsai, hogy elerjek a gyerekprocessek is), amit novelek minden egyes sikeres uzenetkules utan, de hatha van egyszerubb megoldas is)
3. mivel 'vizsgalodtal', hogy ezekre problemakra rajottel?
-
Jester01
veterán
válasz
Jester01 #2524 üzenetére
További vizsgálódás után még az alábbi dolgokat figyeltem meg:
1) a főprogram még azelőtt törli az üzenetsort, mielőtt a gyerkőcöknek lenne esélyük kiolvasni az üzenetet. Mivel az msgrcv hívások sikerességét nem ellenőrzöd ezt nem veszed észre. Lásd még: feladatkiírás 10. pontja.
2a) a főprogram már akkor beteszi a következő üzenetet mielőtt az előző feldolgozása megtörtént volna.
2b) az előző pont miatt az első gyerek például rögvest megcsinálhat több feldolgozást is, ezért a kimenetben összekeverednek az eredmények. Erre azonban semmi megkötés nincs a feladatkiírásban szóval szerintem ez nem baj.
3) ugyanabba fájlba párhuzamosan szeretnének írni, emiatt vesznek el adatok. A fájlt hozzáfűzésre (append) kell megnyitni akkor jó lesz -
!wannabe
tag
válasz
Sk8erPeter #2522 üzenetére
Hehe, én is elgondolkodtam a kérdésen
mert arról, hogy milyen fordítót is használok az ugrott be, hogy gcc-t. Aztán gondoltam, hogy nem erre gondol hanem a fejlesztőkörnyezetekre ezért leírtam amit használok.
-
j0k3r!
őstag
hello!
van egy kis gondom. van ez a c kod, ez a bash script, es a megoldando feladat.
a gondom az, hogyha siman terminalbol inditom a c programot, akkor kiirja a kepernyore a helyes ertekeket, de ha ezt atiranyitom fileba (>), akkor egyatlan nem jo kimenetet ad.
a jo megoldas helyett (a feladatban benne van) ezt irja bele peldaul:
8
9
25
4
3
5
2
1
1
(itt peldaul lemaradtak az elso uzenetek, de nem mindig ez a kimenet, hiaba ugyanaz a bemenet)
ha van valakinek valami otlete szivesen fogadom -
j0k3r!
őstag
válasz
RexpecT #2517 üzenetére
hello!
ha jol latom, akkor s2-be fog kerulni a mar atalakitott 'string' (mivel a szoveg fgv visszateresi erteke char *).
dinamikus memoriafoglalasnal a malloc visszateresi erteke void*, szoval felesleges castolgatni, de ez mar Jester01 is leirta a minap.
system("PAUSE"); -> [link]szerk: Gyuri16 kozben megirta a lenyeget
-
Gyuri16
senior tag
válasz
RexpecT #2517 üzenetére
A karaktertömb deklarálásánál mire szolgál *s2 mutató?
ezt az egy sort:
char s[]="TesZtSzoveg19SzovegTeSZt**éáéáéá43242SzovegszoveGszoVeg323",*s2;
at lehet irni igy is:char s[]="TesZtSzoveg19SzovegTeSZt**éáéáéá43242SzovegszoveGszoVeg323";
char *s2;deklaralsz egy char tombot (s), es egy mutatot charra (s2). utobbi a fuggvenyed visszateresi ertekere kell
Hogyan tudom kiíratni a tömb összes elemét?
gondolom itt az a kerdes, hogy honnan tudod a dinamikus tomb nagysagat. a jo megoldas az, hogy a fuggvenyednek lesz egy pointer parametere ami visszaadja az elemek szamat. (lasd pl getline fv). -
RexpecT
addikt
Sziasztok!
Lenne két kérdésem.
Az első:
Írjunk függvényt, amely az 1. paraméterében megkap egy
string-et, a 2. paraméterében a string '\0' karakter nélküli
hosszát, és a 3. paraméterében egy számot (m).
Ha m=0 vagy m<0, akkor adjon vissza NULL értéket.
Egyébként adjon vissza egy új string-et, amelyet s-ből állítunk
elő úgy, hogy minden m. karaktert nagybetűsen hagyunk meg belőle,
a többi karaktert kisbetűsen. Az angol ABC betűin kívül csak a
számjegy karaktereket hagyjuk meg!
Az új string maximális hossza legyen n+1.
A függvényt próbáld is ki konkrétan egy main() programban.
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
char *szoveg(char *s, int n,int m)
{
int i,k=0;
char *t;
t=(char*)calloc(n+1,sizeof(char));
if (m<=0)
return NULL;
for (i=0;i<n;i++)
{
if (isalnum(s[i]))
{
if (((i+1)%m)==0)
t[k++]=toupper(s[i]);
else
t[k++]=tolower(s[i]);
}
}
t[k]='\0';
return t;
}
int main()
{
char s[]="TesZtSzoveg19SzovegTeSZt**éáéáéá43242SzovegszoveGszoVeg323",*s2;
s2=szoveg(s,strlen(s),3);
puts(s2);
system("PAUSE");
return 0;
}A karaktertömb deklarálásánál mire szolgál *s2 mutató?
A második:
//7. Másold át a listaelemeket a t tömbbe!
int *masol(LISTA list){
ELEM *e;
int n = elemszam(list), idx = 0;
int *t=(int*)malloc(n * sizeof(int));
//Járd be a láncot a szokott módon. A cikluson belül másold az elemet, és növeld a tömb indexet!
for( e = list.fej;e;e=e->kov)
{
t[idx]=e->adat;
++idx;
}
return t;
}
Hogyan tudom kiíratni a tömb összes elemét? -
-
#23538816
törölt tag
Ti milyen c fordítót használtok, melyik a legjobb?
-
j0k3r!
őstag
válasz
!wannabe #2511 üzenetére
en meg nem foglalkoztam vele, csak egyszer utanaolvastam egy kicsit. nemtudom mibol tanulsz, de ahogy lattam sok helyen ezt(magyar forditas), vagy az eredetit ajanljak. en majd nyaron akarnek valami 'egyszerubb' progit osszetakolni. (meg nem tudom, hogy c vagy c++) esetleg, ha van valami jegyzeted azt nyugodtan linkeld be, szivesen fogadom.
-
!wannabe
tag
Undorító dolog ez a socket progrramming vagy csak én nem látom benne a szépségét?!
-
dabadab
titán
válasz
Jester01 #2509 üzenetére
"Mivel semmi garancia nincs cast esetén, ezért ez semmivel sem jobb mintha az argumentum típusa egyszerűen void* lenne"
De, annyival azért jobb, hogy a függvény deklarációjából látszik, hogy ott valamiféle sockaddr struktúrát vár: ne felejtsd el, hogy a kódot nem csak a fordítóprogram, hanem a programozó is olvassa
-
Jester01
veterán
válasz
!wannabe #2508 üzenetére
A castolás tulajdonképpen típus ráerőszakolása. Fontos, hogy C-ben ilyenkor (pointerek esetén) nincs semmi konverzió, vagyis a gép elhiszi neked, hogy az a pointer valóban az amire castolod.
Nagyon rossz példa
const char *text = "1234";
int x = *(int*)text;Ebben az esetben x nem 1 lesz, hanem az "1234" memória leképezésének int megfelelője. Ez ascii kódban a 0x31 0x32 0x33 0x34 byte sorozatot jelenti, ami 32 bites little-endian rendszerben integerként 0x34333231=875770417. Tehát még csak nem is hasonlít arra, amit szegény kezdő programozó gondolt. (Már ha nem a még rosszabb int x = (int)text; formát próbálta.)
A castolást lehetőség szerint kerülni kell, de bizonyos esetekben szükséges rossz. Most hirtelen jó példát nem is tudok rá hozni.
Tipikus hibát viszont igen: ez a void* oda-vissza castolása. Szabvány C-ben erre semmi szükség, mivel a konverzió mind a két irányba automatikus. Példák:
Rossz
int *p = (int*)malloc(10 * sizeof(int));
fwrite((void*)p, sizeof(int), 10, stdout);Helyes
int *p = malloc(10 * sizeof(int));
fwrite(p, sizeof(int), 10, stdout);Bizonyos API függvényekhez viszont szükséges castolni, például a bind ilyen:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Itt az addr argumentum valójában egy sereg struct valamelyike lehet, a címtartománytól függően, például sockaddr_un unix sockethez, sockaddr_in internet sockethez, stb. Ilyenkor castolni kell. Mivel semmi garancia nincs cast esetén, ezért ez semmivel sem jobb mintha az argumentum típusa egyszerűen void* lenne (amihez nem kellene cast), de sajnos a szabványba ez került be. Példa:
struct sockaddr_un my_addr;
...
my_addr.sun_family = AF_UNIX;
bind(sfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr_un));MOD: ja meg az accept is ilyen, azt meg te is használtad
-
!wannabe
tag
El tudná valaki magyarázni nekem akár egy példán keresztül, hogy mit jelent az, hogy egy mutatót castolni kell?
Hát ha még a legjobb programozók is hibáznak akkor rendben
Szerencsére én nem török effajta babérokra csak a sulit akarom túlélni egyelőre -
!wannabe
tag
válasz
Sk8erPeter #2505 üzenetére
Azért nem akartam mert rossz fényt vetne rám. A kód alján volt egy kikommentezett rész: while(1)
{
socklen_t struct_len = sizeof(struct sockaddr_in);
struct sockaddr_in client_addr;
int client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &struct_len);
printf("Kapcsolódott egy kliens\n");
}Ez azért lett kikommentezve mert error volt az első sorban. Azt gondoltam, hogy enélkül is futnia kellene egyébként a servernek azért tettem fel itt a kérdést. Syntax error volt csak benne, tehát egy elírás, de persze csak akkor tűnt fel amikor már nem tudtam szerkeszteni az előző posztomat. Ezért mondtam, hogy ne gondolkodjatok már rajta.
Jah és még annyi, hogy ez nem echo server mert még nem adja vissza amit beírunk az majd később lesz.
-
!wannabe
tag
Sziasztok,
Van egy kódom ami ugyan lefut warning nélkül mégsem működik megfelelően. Ez egy echo server megvalósítás és a 8000-es porton kellene tudnom hallgatózni, de mégsem inditja el a servert amikor lefuttatom.
Most ismerkedek a témával tehát attól tartok eléggé triviális a válasz a hozzább értők számára.
-
#90999040
törölt tag
válasz
kingabo #2501 üzenetére
Igen, így még valóban lehet optimalizálni.
Jester01: valóban igazad volt, hogy a feltétel módosításával működőképes a kód. Mondjuk első nekifutásra nem is néztem meg olyan részletesen a #2497-es hozzászólásomban említett okok miatt, inkább működő alternatívákat kerestem, és csak a #2498-as hozzászólásod után tértem vissza az eredeti kódra.
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Azonnali informatikai kérdések órája
- gban: Ingyen kellene, de tegnapra
- Vékonyabb lett, jobb kamerát kapott, de az akku maradt a régi: itt a Fold7
- Simbin topic (GTR, Race07, GTR Evolution, RaceRoom Racing Experience, stb.)
- Redmi Note 10 Pro - majdnem minden stimmel
- World of Tanks - MMO
- Napelem
- Autós topik
- SSD kibeszélő
- Kuponkunyeráló
- További aktív témák...
- HP ProBook 430 G8, 13,3" FHD IPS, I5-1135GU CPU, 16GB DDR4, 256GB SSD, WIN 11, 27% áfás számla, 1 év
- Playstation Portal - 3 hónap Bolti Garanciával
- BESZÁMÍTÁS! ÚJ AMD Ryzen 5600X 5700X 5800X 5900X processzor 3 év garancia 27% áfa termékbeszámítás
- BESZÁMÍTÁS! ÚJ AMD Ryzen 8500G / 8600G AMD Ryzen 7 8700G / 7800X3D processzor 3 év garancia 27% áfa
- Remek áron Lenovo ThinkPad x395 AMD Ryzen 7 pro-3700U/16GB/256 SSD/AMD Radeon Vega 10 Grap/FHD/IPS
- BESZÁMÍTÁS! MSI B450M R 5 5600X 32GB DDR4 512GB SSD RTX 3060 12GB Rampage SHIVA Corsair 650W
- Eredeti Lenovo USB-C 65W töltő
- Xiaomi Redmi Note 13 5G 256GB, Kártyafüggetlen, 1 Év Garanciával
- ÁRGARANCIA!Épített KomPhone i3 10105F 16/32/64GB RAM RX 6600 8GB GAMER PC termékbeszámítással
- Telefon felvásárlás!! iPhone 12 Mini/iPhone 12/iPhone 12 Pro/iPhone 12 Pro Max
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest