Új hozzászólás Aktív témák
-
#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.
-
!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.
-
!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.
[ Szerkesztve ]
-
!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[ Szerkesztve ]
-
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
[ Szerkesztve ]
Jester
-
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
DRM is theft
-
!wannabe
tag
Undorító dolog ez a socket progrramming vagy csak én nem látom benne a szépségét?!
[ Szerkesztve ]
-
j0k3r!
senior tag
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.
some men just wanna watch the world burn...
-
#23538816
törölt tag
Ti milyen c fordítót használtok, melyik a legjobb?
-
!wannabe
tag
válasz #23538816 #2514 üzenetére
Legtöbbször Geany vagy csak terminal + text editor combo. ZH-kon Eclipse a kötelező. MIndegyik jó. A kisebb feladatokra próbálgatásokra szerintem érdemes egy könnyedebb IDE-t használni vagy szövegszerkesztőt. Komolyabb projekthez persze komolyabb IDE.
[ Szerkesztve ]
-
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? -
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).Nem vagyok egoista, csak uborkagyalu!
-
j0k3r!
senior tag
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
[ Szerkesztve ]
some men just wanna watch the world burn...
-
j0k3r!
senior tag
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[ Szerkesztve ]
some men just wanna watch the world burn...
-
!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.
[ Szerkesztve ]
-
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ó leszJester
-
j0k3r!
senior tag
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?
some men just wanna watch the world burn...
-
j0k3r!
senior tag
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. : )[ Szerkesztve ]
some men just wanna watch the world burn...
-
j0k3r!
senior tag
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)some men just wanna watch the world burn...
-
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?
I am having fun staying poor.
-
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.
[ Szerkesztve ]
-
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
-
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.
-
followme
tag
-
-
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".
Jester
-
followme
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
[ Szerkesztve ]
Whatever you do will be insignificant, but it is very important that you do it.
-
followme
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
Whatever you do will be insignificant, but it is very important that you do it.
-
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!
-
chabeee
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
Ú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!