C/C++

Hogyan tegyünk olvashatatlanná C kódot?

Fórumok

Sziasztok!

Egyszer régebben olvastam egy humoros (angol nyelvű) írást arról, hogyan lehet olvashatatlan C kódot készíteni. Több buta szabály volt fölsorolva, többek közt valami olyasmi, hogy "használjunk egybetűs változó neveket".
Nem emlékszik valaki ilyesmire? Nem tudnátok linket adni rá, vagy valami támpontot, ami alapján magam is megtalálnám?
Előre is köszi!

[megoldva] UTF-8 + CGI

Fórumok

Sziasztok!

Van egy C-ben írt CGI ami GET adatokat dolgoz fel és egy UTF-8-as kódolású adatbázisból kér le adatokat.


	char *data;
	data = getenv("QUERY_STRING"); 

A problémám az, hogy ha nem ASCII karaktereket kap bemenetként nem helyesen dolgozza fel. Ezen annyira nem is lepedők meg lévén a szokásos % formában érkeznek ezek a karakterek. A "szo" változó a problémás. Megpróbáltam ilconv-al visszakódolni de nem sikerült:


	
	int ntabla=0;		// hány táblából kérdezünk le
	char *szo;
	char *irany;
	char *illeszkedes;
	char *jelzo, *jelzet;
	char sep[] = "&=";
	jelzet = strtok(data, sep);
	while( jelzet != NULL ) {
		jelzo=strtok(NULL, sep);
		
		if (strcmp(jelzet, "szo")==0)
			szo=jelzo;
		else if (strcmp(jelzet, "irany")==0)
			irany=jelzo;
		else if (strcmp(jelzet, "tabla")==0)
			if (ntabla==0){
				ntabla=ntabla+atoi(jelzo);
			}
			else {ntabla=ntabla*atoi(jelzo);}
		else if (strcmp(jelzet, "illeszkedes")==0)
			illeszkedes=jelzo;
		
		jelzet=strtok(NULL, sep);
	}


        iconv_t cd;
//        char instr[]="áű";
        char *inbuf;
        char *outbuf;
        char *outptr;
        unsigned int insize=strlen(instr);
	unsigned int outputbufsize=10;
        unsigned int avail=outputbufsize;
        unsigned int nconv;
//        inbuf=instr;
        inbuf=szo;
        outbuf=(char *)malloc(outputbufsize);
	outptr=outbuf;
	memset(outbuf,'\0',outputbufsize);
        cd=iconv_open("utf-8","iso-8859-2");
        if(cd==(iconv_t)-1)
        {
                printf("fail.\n");
        }
        nconv=iconv(cd,&inbuf,&insize,&outptr,&avail);

        printf("%s\n", szo);

Nem vagyok programozó, és a C-hez is kevéssé értek, de meg tudnátok mondani hogy mit rontok el.

Vagy esetleg tudtok ajánlani egy másik módszert ami működik.

connection reset by peer

Fórumok

Sziasztok!
Kerdes: UNIX domain socket-ek ko"re'ben a `connection reset by peer` (ECONNRESET) pontosan mit takar, mikor fordulhat elo"? Ha ket program kozul az egyik (konkretan a kliens) szepen bezarja, majd kilep, szabalyosan (main() leall), akkor a szerver oldalon a read() nem 0-val hanem -1 + ECONNRESET-tel te'r vissza. Semmi extra konfig (setsockopt?) nem volt a szerver/kliens socket-en, a szerveroldali algoritmusban semmi nagy durranas nincs, a valgrind nem jelez semmi problemat, es ha kezzel beleteszem a protokolba, hogy a kliens "koszonjon el" es a szerver bontsa a kapcsolatot, akkor meg minden fasza (alatamasztando, hogy nem az algoritmusba kerult pl. hibas pointerkezeles altal pl. felulirt memoria kavar be).
Szoval a konkret problema ez, de altalanossagban is erdekel, hogy mi kozhat conn. reset-et egy ilyen (legalabbis elsore) egyszerunek tuno objektumon mint unix socket. Mondjuk ha az egyik oldal aborta'l vagy sigsegv hatasara all le, akkor oke, ugy el tudom kepzelni, de itt semmi ilyenrol nincs szo...
koszi, A.
szerk: c/c++ kornyezet nem tudom mennyit szamit, csak azert valasztottam ezt a kategoriat mert a problema ebben a kornyezetben merult fel (C progi), de az alap-kerdes persze nyelv-fuggetlen...

[Megoldva]C++ cstdarg (va_list,stb) probléma

Fórumok

Adott egy egyszerű exception osztály, ami változó hosszúságú argumentumlistát fogad! Úgy szeretném megcsinálni, hogy a user csak a konstruktoron keresztül adhassa ezt át, míg a gyerekosztályok kapnak egy protected setMessage() függvényt. Logikus lenne, ha a konstruktor a setMessage() függvényt hívná, de valamiért ilyenkor lenyelődik, azaz inkább felülíródik az első paraméter értéke.

Mivel a 'C'-s vsnprintf függvény hívása problámamentes, ezért gondolom azzal lehet összefüggésben a dolog, hogy a setMessage 'C++' függvény.

Nos ismeri valaki a 'C++'-os függvények hívási specifikációját, vagy megadhatom e egy osztály memberfüggvényére, hogy extern "C", vagy egyéb
ötlete illetve magyarázata van valakinek? :)Ez a kód:


#include <iostream>
#include <cstdio>
#include <cstdarg>

using namespace std;

#define BUFF_SIZE 	1024

class Exception {

public:
	Exception(const char *format, ...) {
		va_list args;
		va_start (args, format);
		setMessage(format, args);
		va_end (args);
	}

	const char* getMessage() const {
		return message.c_str();
	}

//protected:
	void setMessage(const char *format, ...) {
		char buffer[BUFF_SIZE];
		
		va_list args;
		va_start (args, format);
		
		vsnprintf (buffer,BUFF_SIZE, format, args);
		va_end (args);
		
		message = std::string(buffer);
	}
private:
	std::string message;
};

int main(void)
{
	try {
		throw Exception("1:%s,2:%s,3:%s","1","2","3");
	} catch(Exception e) {
		cerr << "Exception: " << e.getMessage() << endl;		
	}
	
	try {
		Exception e("");e.setMessage("1:%s,2:%s,3:%s","1","2","3");	throw e;
	}
	catch(Exception e) {
		cerr << "Exception: " << e.getMessage() << endl;		
	}

}

Ez a kimenet:


Exception: 1:,2:2,3:3
Exception: 1:1,2:2,3:3

SIGIO eldobasa soros port aszinkron olvasasakor, es mas SIGIO kerdesek

Fórumok

Egy soros GPS-t idomitok linux ala, ehhez faragok egy egyszeru kodot. A Serial Programing How-to -bol copy-pasteztem a "3.3. Asynchronous Input" mintakodot, es kikommenteltem belole az ures enterre torteno kilepes reszt.
A kod siman fordul, es szepen ki is kohogi a NMEA kodot, ahogy kell, viszont 2-3 perc mukodes utan "megall". Nemi hackkeles aran kiderult, hogy valamilyen oknal fogva a SIGIO "kezeleset" vegzo fuggveny nem kerul meghivasra, emiatt a egyhelyben fut a cucc. Mivel a megallas helye fuggetlen a kuldott es a fogadott adatok mennyisegetol, es a SIGIO meghivasatol, ezert hirtelen nincs otletem, hogy mi lehet az oka.
Mivel a GPS veletlenszeruen kuld ures entereket, arra gyanakszom, hogy rovid idon belul ketszer is meg van hivva a SIGIO kezelo, es ezert dob hatast a kod.
Valami otlet erre?

A masik kerdes, hogy tudtok valami jo online how-to-t vagy tutorialt a SIGIO kezelesre? Elsodlegesen, idozitesi funkciok (rtc es tarsai) erdekelnenek.

Megoldva: Undefined operation

Fórumok

Sziasztok!

Van egy ilyen programsorom:


      int i;
      // bla-bla-bla
      for (i = 0; i < steps; a[low+i] = temp[i++]);

Erre ezt üzeni a fordító:

warning: operation on ‘i’ may be undefined

Szerintetek, melyik műveletre gondol, és hogyan lehetne írni az utasítást, hogy ne kapjak ilyen figyelmeztetést. Egyáltalán érdemes ezzel foglalkozni?

pipe olvasasa

Fórumok

Lehet elég rossz megoldást választottam, de szeretnék neves pipe-ot olvasni.
Beállítottam rá egy select-et, ami szépen működik is. Bár kiolvasom a pipe-ot, és itt jön a gond, hogy én csak \n-ig akarom kiolvasni. de akár a fgets-et, akár fscanf-et használok, kiolvasás után a select visszadob, hogy van adat a pipe-ban, és annak olvasásakor Segmentation fault-ot kapok. Ha másképp nem megy ciklusba szervezem, de hátha van ötletetek, egy frappáns megoldásra.
köszi

tömb elemeinek száma

Fórumok

Hogy tudnám azt megállapíteni, hogy egy ilyen tömb hány elemből áll?


char *conf_f[]="server_port","time_out","mysql_host","mysql_user","mysql_password","mysql_database","."};

[Qt4] Connectek es threadek egy dll-ben (+ Qt centre forum)

Fórumok

Kedves hupperek.

Több kérdésem is lenne.
1: Tudja-e valaki mért elérhetetlen mostanában gyakran a qtcentre.org?
2: A problémám maga pedig: (amit amúgy az előbb említett qtcentre.org fórumján ki is fejtettem)

Van egy dll fájlom, amit arra szeretnék használni, hogy bizonyos számításokat elvégezzen. Egy-egy számítás egy-egy threadben fut. Ezt a dll egy kívülről hívható függvénye intézi el úgy, hogy amint befut egy új számításigény, az adatokat szépen beleteszi egy szálba, majd a meghívó számára visszaad egy azonosítót. Később ezzel az azonosítóra hivatkozva lehet például lekérni a megoldásokat.

Egy thread amint megoldást talál, emit-tel egy signalt, amit a solution osztály fogad. Tehát a thread megfelelő része a signal/slot mechanizmust használva kommunikál "standalone objektumokkal" a dll-en belül.

A kérdés pedig ott merül fel, hogy miképp történjen az event handling. Elsőre a kötelező megoldás: QApplication (QApplication::exec(): "It is necessary to call this function to start event handling.").
Csakhogy ez egy olyan ciklusba kezdene, hogy annak végezetéig nem térhetnék vissza a meghívó programhoz
("Enters the main event loop and waits until exit() is called.")

Így kérdeznék minden qt-ben jártas lelkes fórumozót, milyen megoldást javasolnak a problémára.
Még egyszer a kívánt funkcionalitás:

[caller program] start problem in the dll
[dll] receive the call. start a new thread with the problem
[dll] start event handling
[dll] give to the caller program the ID (return ID)
[caller program] receive the ID
[caller program] do something && [dll] working
...
[caller program] get the solution
[dll] give the solution (if finished)

Fontos lenne mielőbb kisütni valamit, szóval előre is köszönöm a segítséget.