Fontos linkek a C-ről:
Prog.hu-s cikkek
Prog.hu-s tudástár témák
The C Library Reference Guide
Standard C
Wikipedia
C Tutorial
Programming in C
Bevezetés a C programozási nyelvbe
Gyorskeresés
Legfrissebb anyagok
- Bemutató Spyra: akkus, nagynyomású, automata vízipuska
- Bemutató Route 66 Chicagotól Los Angelesig 2. rész
- Helyszíni riport Alfa Giulia Q-val a Balaton Park Circiut-en
- Bemutató A használt VGA piac kincsei - Július I
- Bemutató Bakancslista: Route 66 Chicagotól Los Angelesig
Általános témák
LOGOUT.hu témák
- [Re:] [gban:] Ingyen kellene, de tegnapra
- [Re:] Gurulunk, WAZE?!
- [Re:] eBay-es kütyük kis pénzért
- [Re:] [Luck Dragon:] Asszociációs játék. :)
- [Re:] [Victoryus:] Már a Josef Seibel se a régi
- [Re:] Spyra: akkus, nagynyomású, automata vízipuska
- [Re:] [Sirus86:] Renault Modus 2005 - Az ezer Euros auto tortente.
- [Re:] PLEX: multimédia az egész lakásban
- [Re:] [Szevam:] Érzelmi magabiztosság/biztonság - miért megyünk sokan külföldre valójában?
- [Re:] [ldave:] New Game Blitz - 2024
Szakmai témák
PROHARDVER! témák
Mobilarena témák
IT café témák
Téma összefoglaló
- Utoljára frissítve: 2014-04-25 14:12:00
LOGOUT.hu
Hozzászólások
skylaner
senior tag
Igazad van.
Persze lehetne így is: while((a=getchar())!='\n') {.....}
MÁS:
Hogy/mivel tudom megnézni,hogy a program futása során mennyi memóriát használt ?
Jester01
veterán
A valgrind egy hasznos eszköz (linuxon).
Jester
ReJim
őstag
sziasztok c-ben hogyan tudok udp-n adatot küldeni?
(server linuxon, kliens winen. gcc fordítók, winen devc++ és mingw)
ez a kód jó lenne nekem, de winre nem találok headert:
/*********************** udpclient.c ***********************/\
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h> /* memset() */
#include <sys/time.h> /* select() */
#define REMOTE_SERVER_PORT 1500
#define MAX_MSG 100
int main(int argc, char *argv[]) {
int sd, rc, i;
struct sockaddr_in cliAddr, remoteServAddr;
struct hostent *h;
/* check command line args */
if(argc<3) {
printf("usage : %s <server> <data1> ... <dataN> \n", argv[0]);
exit(1);
}
/* get server IP address (no check if input is IP address or DNS name */
h = gethostbyname(argv[1]);
if(h==NULL) {
printf("%s: unknown host '%s' \n", argv[0], argv[1]);
exit(1);
}
printf("%s: sending data to '%s' (IP : %s) \n", argv[0], h->h_name,
inet_ntoa(*(struct in_addr *)h->h_addr_list[0]));
remoteServAddr.sin_family = h->h_addrtype;
memcpy((char *) &remoteServAddr.sin_addr.s_addr,
h->h_addr_list[0], h->h_length);
remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT);
/* socket creation */
sd = socket(AF_INET,SOCK_DGRAM,0);
if(sd<0) {
printf("%s: cannot open socket \n",argv[0]);
exit(1);
}
/* bind any port */
cliAddr.sin_family = AF_INET;
cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
cliAddr.sin_port = htons(0);
rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr));
if(rc<0) {
printf("%s: cannot bind port\n", argv[0]);
exit(1);
}
/* send data */
for(i=2;i<argc;i++) {
rc = sendto(sd, argv[i], strlen(argv[i])+1, 0,
(struct sockaddr *) &remoteServAddr,
sizeof(remoteServAddr));
if(rc<0) {
printf("%s: cannot send data %d \n",argv[0],i-1);
close(sd);
exit(1);
}
}
return 1;
}
valakinek valami ötlete?
</end.?>
ReJim
őstag
megvan, találtam megoldást, csak a devc-bena projekthez kellett állítani egy paramétert...
</end.?>
bodisjani
csendes tag
Sziasztok!
Most kezdek C-vel bajlódni és az első lépéseknél el is akadtam: A fordító Dev-C++, az oprendszer Vista, a probléma pedig az, hogy a prgram lefordítódik, le is fut, csak azonnal be is záródik az ablak. Az egészből csak egy villanást látok. ???
Előre is köszi!!
Gyuri16
senior tag
a programod lefut rendben.
vagy nyiss egy konzolt, es onnan inditsd el, akkor latod a kimenetet, vagy tegyel a programod vegere egy getchar()-t (ez var amig megnyomsz valamilyen billentyut)
Nem vagyok egoista, csak uborkagyalu!
bodisjani
csendes tag
Köszi!
Igaz csak enterre tér vissza, de mindegy.
így már lett egy működő programom
Esetleg tudnál segíteni, honnan lehet értelmes mintaprogikhoz és valami oktatóanyaghoz jutni?
skylaner
senior tag
Megtudnátok mondani, hogy az alábbi kód, hogyan/miért működik pointerek nélkül?
#include <stdio.h>
#define csere(a, b) { int c; c=a; a=b; b=c; }
int main()
{
int a=4, b=9;
csere(a,b);
printf("%d %d",a,b); // 9 4
return 0;
}
Mert valojaban igy nez ki:
#include <stdio.h>
int main()
{
int a=4, b=9;
int c;
c=a; a=b;b=c;
printf("%d %d",a,b); // 9 4
return 0;
}
Tehat nem tortenik fuggvenyhivas.
while (!sleep) sheep++;
Gyuri16
senior tag
makrot definialtal. ezt a c preprocessora feldolgozza, es a fordito mar nem latja hogy ott mi volt eredetileg, tehat addigra mar be van helyettesitve a makro teste, nincs fuggvenyhivas
wiki: [link]
gcc doksi: [link]
mod: sokaig kinlodtam ezzel a bonyolult esszevel, megeloztek
[ Szerkesztve ]
Nem vagyok egoista, csak uborkagyalu!
skylaner
senior tag
Lenne egy egyszerű kliens-szerver progi,amiben a két fél tud egymással chatelni ill. a kliens fájlokat tölthet le a szerverről.
A kérdésem a recv()-el kapcsolatban lenne.
Ha elküldök egy üzenetet:
send(client_sock,"download_over",13,0);
Akkor a fogadásnál szükség van erre?
#define BUFF_SIZE 1024
.......
char msg[BUFF_SIZE];
int len;
......
len=recv(sock,msg,BUFF_SIZE,0);
msg[len]='\0';
if(strcmp(msg,"download_over")==0) { ....}
Tehát le kell zárni a stringet, vagy ez automatikusan megtörténik ?
/esetleg a send-nél 14-t kellene megadni, és akkor másolódik át automatikusan a lezáró '\0' ? /
[ Szerkesztve ]
Jester01
veterán
Igen, a lezáró nulla csak akkor megy át, ha 14 byteot küldesz. Jelen esetben amúgy nem is kell lezárni: if (len == 13 && strncmp(msg, "download_over", 13) == 0) ....
Ja és a recv visszaadhat hibakódot (-1) vagy éppenséggel BUFF_SIZE értéket is és ezekben az esetekben a msg[len]='\0'; felettéb szerencsétlen lenne (de gondolom a hibakezelést csak innen a postból hagytad ki).
Jester
skylaner
senior tag
Kösz, eszembe se jutott ez az n-ig összehasonlító fgv.
Visszatérve egy korábbi kérdésemre: valgrind
Feltettem ubuntut,valgrind-et. Futtattam --leak-check=full --showreachable=yes paraméterekkel, sok okosságot kiírt, de hogy tudnám azt megnézni h összesen mennyi memóriát használt a progi, ne csak azt amit malloc-al foglaltam le? Mindent, lokális,globális,fgv argumentumok változói stb...
Vagy nincs ilyen lehetőség?
Jester01
veterán
Hát a globális (illetve statikus) változók azok benne vannak a program fejlécében (objdump -h kimenetben data+bss). Lokális változók méreténél (ideértve a függvényargumentumokat is) nem tudom mit szeretnél tudni, esetleg a maximális verem méretet? Mivel ismereteim szerint linux alatt a verem nem csökken, ezért azt elvileg ki lehet nyomozni a futás végén. Például gdb-vel breakpoint az exit függvényre és a /proc/<pid>/maps fájlban a stack bejegyzésből.
[ Szerkesztve ]
Jester
skylaner
senior tag
Na pl:
typedef struct szam{
int a;
int b;
} SZAM;
void szum(int a,int b)
{
printf("%d\n",a+b);
}
int main()
{
SZAM* sz;
sz=(SZAM*)malloc(sizeof(SZAM));
sz->a=4;
sz->b=5;
szum(sz->a,sz->b);
free(sz);
sz=NULL;
return 0;
}
sz: 4 byte
*sz: 8byte
2 int másolat: 8byte
Tehát ennek összesen akkor min 20byte memória kell a program egy adott pontján.
Valami ilyesmire gondoltam.
Jester01
veterán
A valgrindban van egy "massif" eszköz is, az nem jó?
#-----------
snapshot=64
#-----------
time=124348
mem_heap_B=8
mem_heap_extra_B=8
mem_stacks_B=1008
heap_tree=detailed
n1: 8 (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
n0: 8 in 1 place, below massif's threshold (01.00%)
[ Szerkesztve ]
Jester
kampi_
csendes tag
Sziasztok!
Tudja valaki, hogy hogyan lehet megoldani C-ben azt, hogy létrehozok egy process-t, de úgy mintha run as-szel futttatnám? Tehát bekérem a felhasználónevet, meg a jelszót, meg hogy milyen process process-t nyissak meg, és az eredmény az hogy megnyílik a program csak úgy mintha az adott felhasználó nevében nyitnám meg.
Thx, kampi
kampi_
csendes tag
Hi!
Azt hiszem megtaláltam. Ha minden igaz akkor a CreateProcessWithLogonW függvénnyel tudok ilyet csinálni. Ha nem, akkor légyszíves szóljatok, mert hiába fogok próbálkozni
Thx, kampi
kampi_
csendes tag
Hi!
Tudja valaki hogy hogyan kell használni a CreateProcessWithLogonW fv-t? Vagy csak én vagyok béna, és azért nem jó?
Így próbálom,de nem történik semmi, a CreateProcessWithLogonW mindig 0-t ad vissza,vagyis valamilyen hiba van,csak nem találom meg hogy mi?
STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcInfo;
memset(&ProcInfo, 0, sizeof(ProcInfo));
memset(&StartInfo, 0 , sizeof(StartInfo));
StartInfo.cb = sizeof(StartInfo);
int bFuncRetn = CreateProcessWithLogonW(
(LPCWSTR)user,
(LPCWSTR)domain,
(LPCWSTR)password,
LOGON_WITH_PROFILE,//LOGON_NETCREDENTIALS_ONLY,
(LPWSTR)applicationname,
NULL,
CREATE_UNICODE_ENVIRONMENT,//CREATE_NEW_PROCESS_GROUP,
NULL,
NULL,
(LPSTARTUPINFOW)&StartInfo,
&ProcInfo
);
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
printf("\n\nCreateProcessWithLogonW returns :: %d", bFuncRetn);
Előre is köszönöm a segítséget!
kampi
Jester01
veterán
1) megnézted, hogy a GetLastError mit mond?
2) van joga a felhasználónak a desktophoz? ("The application must add permission for the specified user account to the specified window station and desktop, even for WinSta0\Default.")
3) esetleg nem unicode stringeket adsz be neki?
Jester
kampi_
csendes tag
Hi!
A GetLastError 1326-ot ad vissza, vagyis Logon Failure-el szállt el. Közben rájöttem, hogy az volt a gáz, hogy nem Unicoe típust hazsnáltam, hanem csak sima char-t nem wchar_t -t. De ezt már kijavítottam. Most az a bajom, hogy ha lokális felhasználóval akarok egy process-t nyitni, akkor műkődik, viszont ha egy olyan userral ami domain-tag akkor márnem megy. GetLastError szintén 1326-ot ad vissza.
Valakinek valami ötlet?
Előre is köszi!
kampi
kampi_
csendes tag
Hi!
Boccs, hogy ennyit írok. Szóval mostmár sikerült megcsinálni. A LOGON_WITH_PROFILE-t kellett átírni LOGON_NETCREDENTIALS_ONLY-ra. Most viszont az a bajom, hogy a process elindul, de a másik user neve alatt, hanem vagy az enyém alatt, vagy pedig system-ként látja a taskmanager. Ez mitől lehet? Ebben segítsetek légyszíves, mert fontos lenne.
Köszönöm!
kampi
cellpeti
veterán
Nem akarok hülyeséget kérdezni,de mibe lehet C.be programozni, kompatibilisnek kell lennie a Turbo C 2.0-val???
Visual C vagy Visual Studio 2008 vagy melyik?
Tigris, tigris, csóvafény...
gygabor88
tag
CodeBlocks, Dev-C++, Visual C++ Express (azt hiszem be kell neki állítani valahol, hogy unmanaged C kódot akarsz írni). Az első kettő elég minimális IDE, de kezdetben elég lesz.
cellpeti
veterán
Szia!
Nekem mindenképp akkor a Visual Studio kellene,de csak C++ engedélyez. Inkább ebbe a progiba vizsgáznék,mint a Turbo C 2.0-n. Ez a progi kell a féléves vizsgához progból. Most leszedtem megint,de még mindig csak C++ enged írni. Nem tudod,hogy hol kell átállítani?
[ Szerkesztve ]
Tigris, tigris, csóvafény...
gygabor88
tag
Először mindig új projectet hozz létre és azon belül fájlokat. Valahol a new project menupont alatt kell beállítani, hogy C-ben fogod írni.
[ Szerkesztve ]
sghc_toma
senior tag
nem szukseges beallitani, ha .c a kiterjesztes, automatikusan C-kent fordit..
amugy a project Properties|C/C++|Advanced|Compile As helyen lehet beallitani az egesz project-re (ezt felulirja a kiterjesztes).. adott file-ra is be lehet allitani, ekkor ertelemszeruen a file Properties lapjan kell beallitani, nem a project-en..
in asm we trust
cellpeti
veterán
gygabor88
tag
Nekem nincs a gépemen VS, szóval csak az írtam, ahol értelemszerűen lennie kellene. Amúgy #1177.
sghc_toma
senior tag
csinalsz egy Empty Project-et, majd Project|Add New Item|C++ File (.cpp), filenevnek meg egy .c kiterjesztesu nevet adsz meg..
in asm we trust
cellpeti
veterán
Tigris, tigris, csóvafény...
kampi_
csendes tag
Sziasztok!
Tudna valaki segíteni nekem a CreateProcessWithLogonW függvénnyel kapcsolatban?
A problémám az vele, hogy létre tudok hozni egy processt pl Total commandert, de:
- bennt a cégnél műkődik is, mert egy admin usert adok meg, és hozzáférek olyan dolgokhoz amikhez csak ezzel a userral tudok. Ezzel eddig semmi gáz. Ha megnézem Task Managerben, akkor ott viszont nem úgy látszik, hogy az admin userrel futtatom a process-t hanem a SYSTEM futtatja a process-t. Na mindegy, végülis műkődik, csak gondoltam megkérdem ezt is hátha valaki tudja hogy miért?
- otthon viszont(hazaviszem a laptopom) megpróbálom ugyanezt (semmit nem változtattam a kódon) és meg akarom nyitni az admin userrel ugyanúgy a Total commandert (már be voltam jelentkezve a gépre vele, így létrejöt a profil, tehát elvileg már akármit tudok run as-ként futtatni), és meg is nyílik, viszont itt már nincsenek meg a jogaim. Most nem hálózati jogokra gondolok, hanem pl az a user amivel be vagyok lépve, nem admin, tehát pl nem tudok egy fájlt létrehozni a c:\-ben. Az admin userrel viszont simán tudok. Van egy lokális admin user is, azzal is megpróbáltam. Megadtam a usert, jelszót, domainnak meg a gépnevet, és ugyanúgy nincs jogom hozzá. Mindkét esetben (otthon az admin és a lokál admin esetében is) task managerben úgy látszik hogy a processt az a user futtaja aki be van jelentkezve.
Erre van valakinek valami ötlete?
Előre is köszi a segítséget!
Kampi
cellpeti
veterán
üdv! Írtam egy progit a Code:locks-ba,de nem engedi futtatni(F8).
Ez miért lehet?
A fájlnak .c kiterjesztést adtam.
Tudnátok segíteni?
Tigris, tigris, csóvafény...
gygabor88
tag
Nyilván egy hibaüzenetet látnunk kellene. De tippre azt mondom, hogy nem tetted projectbe, mert ha abba tetted volna, akkor nem kellett volna .c kiterjesztést megadni a fájlnak, hiszen eleve .c fájlt készít a C projectbe.
-=Lord Tom=-
senior tag
Segítsetek plz, miért ugorja át a műveletjel megadását/miért nem lesz a muvjelnek megfelelő értéke?
#include <stdio.h>
int main(){
int szam, szam2;
char muvjel;
// Adatok beolvasása
printf("Kerem az elso szamot: ");
scanf("%d", &szam);
printf("\n\nMuvelet: ");
scanf("%c", &muvjel);
printf("\n\nKerem a masodik szamot: ");
scanf("%d", &szam2);
//Tényleges műveletvégrehajtás
if (muvjel=="+"){
printf("%d %c %d = %d ", szam, muvjel, szam2, (szam+szam2));
}
else if (muvjel=="-"){
printf("%d %c %d = %d ", szam, muvjel, szam2, (szam-szam2));
}
else if (muvjel=="*"){
printf("%d %c %d = %d ", szam, muvjel, szam2, (szam*szam2));
}
else if (muvjel=="/"){
printf("%d %c %d = %d ", szam, muvjel, szam2, (szam/szam2));
}
system("pause");
}
cellpeti
veterán
Sziasztok!
A Dev C++ nem ismeri a pontosvesszőt?
Tigris, tigris, csóvafény...
-=Lord Tom=-
senior tag
De, csak át kell állítani a: tools - configure shortcuts-nál a ctrl+. ill törölni azt. (a magyar kiosztással akad)
cellpeti
veterán
köcce
Tigris, tigris, csóvafény...
sghc_toma
senior tag
az elozo beolvasas utan ottmarad az stdin-en egy '\n', es ezt olvassa be a masodik scanf.. csinalhatod azt, hogy olvasas elott kiurited az stdin-t mondjuk igy:
char c; while ((c = getc(stdin)) != EOF && c != '\n');
ja, es az osszehasonlitasnal ne "-t hasznalj, hanem '-t.. a "+" igazabol ket karakter, a vegen van egy '\0'..
in asm we trust
Jester01
veterán
Rossz példa! Itt a c-nek int típusúnak kell lennie, különben az EOF ellenőrzés nem lesz jó.
Egyébként bevett tanács, hogy billentyűzetről nem olvasunk scanf-el. Helyette fgets + sscanf páros javallott.
Jester
sghc_toma
senior tag
rosszul emlekeztem, a getc tenyleg int-et ad vissza, es valoban elofordulhat olyan implementacio, ahol az ellenorzes nem lesz jo.. bar en meg nem lattam olyat, hogy az EOF ne -1 lett volna..
in asm we trust
Jester01
veterán
És olyat láttál ahol a char nem előjeles?
Jester
sghc_toma
senior tag
ehh, ezt beneztem
in asm we trust
-=Lord Tom=-
senior tag
Köszi mindkettőtöknek!
cellpeti
veterán
A Dev C++ tud olyat,hogy nem ugrik el a program végén,mint a C-Free?
Tigris, tigris, csóvafény...
cellpeti
veterán
Sziasztok!
A Dev C++ról lemondtam.
Feltettem a C-Free-t,ezzel megírom a progit,majd mikor F5-vel lefuttatom egy ilyen kicsi ablakba fut le. Egész idáig jó volt,már régebben is írtam benne progit,akkor ok volt. Esetleg aki ilyet használ,az segíthetne nekem.
Tigris, tigris, csóvafény...
gaben
aktív tag
Hello!
Azt hogy tudom megoldani,hogy egy sima vektroból mondjuk törlöm a 3. elemet ill. egy mátrixnak mondjuk a középső sorát ?
[ Szerkesztve ]
Gyuri16
senior tag
vegyel egy tombot: 0,1,2,3,4,5,6. ha ebbol ki akarod dobni a harmadikat, akkor ez marad: 0,1,2,4,5,6. mi tortent: a harmas helyere kerult a negyes, annak a helyere az otos es igy tovabb, majd az egesz tomb hossza egyel kisebb lett.
Nem vagyok egoista, csak uborkagyalu!
gygabor88
tag
Vektorból erase függvénnyel tudsz törölni tetszőleges elemet. A mátrixot nem tudom hogy valósítod meg, így arra nem tudok megoldást mondani.
[ Szerkesztve ]
Csuty12
csendes tag
Sziasztok,
két hete kezdtem tanulni programozni c++ 3.1ben, az érdekelni hogy megoldható az hogy Vista-n normálisan fusson? A problémám az lenne hogy nem tudom teljes képernyőre kirakni, a másik pedig az hogy angol billentyűkiosztást használ a program bent, lehet valahogy ezt magyarrá varázsolni? Így kicsit macerás a () és egyebek..
u.i.: azért ezt a programot használom mert ahol oktatják ott is ez van és így egyszerűbb..
Köszönöm
Téma tudnivalók
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!