C++ Zašto ovo ima problema

poruka: 9
|
čitano: 1.899
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
offline
C++ Zašto ovo ima problema i još par pitanja

Dakle, učim c++, nemam literature i idem metodom uzaludnih pokušaja i primjerima s neta

 

pitanje je:

Ovo radi:

       time_t calender_time;
       struct tm todays_date;
       calender_time = time(NULL);
       todays_date = *localtime(&calender_time);

       printf("%d-%d-%d %d:%d:%d - \n",todays_date.tm_year+1900,todays_date.tm_mon+1,todays_date.tm_mday,todays_date.tm_hour,todays_date.tm_min,todays_date.tm_sec);

 

a ovo ne radi?
       char vr = "%d-%d-%d %d:%d:%d - \n",todays_date.tm_year+1900,todays_date.tm_mon+1,todays_date.tm_mday,todays_date.tm_hour,todays_date.tm_min,todays_date.tm_sec;

 

a ni ovo ne radi (probao sam sa vr="test")?

       printf(vr);

 

Ako netko zna za dobar tutorial sajt (za ljude koji znaju programirati u drugim programskim jezicima)?

 

I da li netko može preporučiti nekakav razvojni alat (a da nije eclipse)

Code Blocks ne mogu instalirati iz nepoznatog razloga (kaže da signature ne valja) (CentOS 32bit)

 

 

I još nešto:

U vb-u se vrijednosti u funkcije i subove prosljeđuju na način

private sub nesto(ByRef a as integer, ByVal b as integer)

 

kako u c++ definiram da li prosljeđujem pointer ili vrijednost?

 

 

 

hvala!

Dolje Matija Gubc
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
RE: C++ Zašto ovo ima problema i još par pitanja
franjo tahy kaže...

Dakle, učim c++, nemam literature i idem metodom uzaludnih pokušaja i primjerima s neta

 

pitanje je:

Ovo radi:

       time_t calender_time;
       struct tm todays_date;
       calender_time = time(NULL);
       todays_date = *localtime(&calender_time);

       printf("%d-%d-%d %d:%d:%d - \n",todays_date.tm_year+1900,todays_date.tm_mon+1,todays_date.tm_mday,todays_date.tm_hour,todays_date.tm_min,todays_date.tm_sec);

 

a ovo ne radi?
       char vr = "%d-%d-%d %d:%d:%d - \n",todays_date.tm_year+1900,todays_date.tm_mon+1,todays_date.tm_mday,todays_date.tm_hour,todays_date.tm_min,todays_date.tm_sec;

 

a ni ovo ne radi (probao sam sa vr="test")?

       printf(vr);

Zato sto funkcija printf() ne radi na taj nacin. Ona koristi promjenjivi broj argumenata koje ti ovdje pokusavas strpati sve u jedan string. A to ne ide tako jer svi argumenti moraju biti na stacku, a ti ovako imas samo jedan pointer na string na stacku.

 

npr printf("%d %d", 5, 23). "%d %d" je prvi argument, ujedno i string koji daje naputak kako treba tretirati argumente koji slijede, u ovom slucaju oba kao cijele brojeve.

 

Nadalje, ovo sto ti radis, tm_mon, tm_year, i ostali clanovi su zapravo 32 i 16 bitni cijeli brojevi koji su u biti nizovi od 4 i 2 bajta u memoriji, dok je jedan znak (slovo) u stringu 8 bitni broj koji zauzima 1 bajt u memoriji. Ne mozes samo umetnuti takav broj u string i nadati se da ce biti ispisan kako treba jer nece. Da bi cijeli broj pretvorio u string koji potom mozes spojiti s drugim stringom trebas koristiti funkciju sprintf()

 

Ja sam se tu malo zapetljao i nisam htio zadirati previse u low level stvari nadam se da ce netko malo bolje pojasniti zasto ti se to dogada... ukratko ne mozes to tako raditi.

 

franjo tahy kaže...

I da li netko može preporučiti nekakav razvojni alat (a da nije eclipse)

Code Blocks ne mogu instalirati iz nepoznatog razloga (kaže da signature ne valja) (CentOS 32bit)

Sto se tice razvojnog okruzja na linuxu, imas jos i NetBeans (zasnovan je na Javi pa ti mozda nece biti prihvatljiv iz istog razloga kao i Eclipse - brzine) i KDevelop koji je dio KDE-a

 

franjo tahy kaže...

I još nešto:

U vb-u se vrijednosti u funkcije i subove prosljeđuju na način

private sub nesto(ByRef a as integer, ByVal b as integer)

 

kako u c++ definiram da li prosljeđujem pointer ili vrijednost?

u slucaju vrijednoti:

int funkcija(int nekibroj)

 

u slucaju pointera:

int funkcija(int *nekibroj)

Pathogenic fundamentals clearly indicate that homogenous populations are most vulnerable.
Poruka je uređivana zadnji put uto 19.10.2010 17:34 (rustweaver).
16 godina
neaktivan
offline
RE: C++ Zašto ovo ima problema i još par pitanja
rustweaver kaže...
franjo tahy kaže...

I još nešto:

U vb-u se vrijednosti u funkcije i subove prosljeđuju na način

private sub nesto(ByRef a as integer, ByVal b as integer)

 

kako u c++ definiram da li prosljeđujem pointer ili vrijednost?

u slucaju vrijednoti:

int funkcija(int nekibroj)

 

u slucaju pointera:

int funkcija(int *nekibroj)

Ako se radi o obicnoj varijabli najbolje bi bilo jednostavno prenijeti referencu tj.

 

int funkcija(int& nekibroj)

Pa se "nekibroj" u funkciji jednostavno korisit kao svaka druga varijabla tj. nema potrebe za zvjezdicama Namigiva

 

franjo tahy kaže...

a ovo ne radi?
       char vr = "%d-%d-%d %d:%d:%d - \n",todays_date.tm_year+1900,todays_date.tm_mon+1,todays_date.tm_mday,todays_date.tm_hour,todays_date.tm_min,todays_date.tm_sec;

 

a ni ovo ne radi (probao sam sa vr="test")?

       printf(vr);

 

Ne mozes taj string strpati u jedan bajt tj char, najbolje bi ti bilo da jednostavno koristis string jer njemu ne moras zadati duzinu

tj broj elemenata u polju.

 

jednostavno

 

#include <string>

 

std::string vr = "nesto..."

 

isto tako nadam se da znas da je = operator "pridjeljivanja", znaci za usporedivanje koristis == operator, koji radi s pojedinacnim

karakterima (char) inace koristis strcmp() funkciju.

 

Ako koristis string stvar je jednostavnija te mozes korisititi == ili bolje compare metodu, npr.

if(vr.compare("nesto") == 0) radi nesto...

 

 

All religions are the same: religion is basically guilt, with different holidays.
15 godina
neaktivan
offline
RE: C++ Zašto ovo ima problema i još par pitanja
drnde kaže...

Ako se radi o obicnoj varijabli najbolje bi bilo jednostavno prenijeti referencu tj.

 

int funkcija(int& nekibroj)

Pa se "nekibroj" u funkciji jednostavno korisit kao svaka druga varijabla tj. nema potrebe za zvjezdicama Namigiva

Da ali ako radi s pointerom, a to je bilo pitanje. Kako u funkciji navodi da li je argument pointer ili vrijednost. Za to mu je potrebna zvjezdica.

Ako pokazivacu bude pristupao na ovaj nacin nece li dobiti dvostruku referencu, tj pokazivac na pokazivac koji pokazuje na neku memorijsku adresu?

Pathogenic fundamentals clearly indicate that homogenous populations are most vulnerable.
Poruka je uređivana zadnji put uto 19.10.2010 17:48 (rustweaver).
16 godina
neaktivan
offline
RE: C++ Zašto ovo ima problema i još par pitanja
rustweaver kaže...
drnde kaže...

Ako se radi o obicnoj varijabli najbolje bi bilo jednostavno prenijeti referencu tj.

 

int funkcija(int& nekibroj)

Pa se "nekibroj" u funkciji jednostavno korisit kao svaka druga varijabla tj. nema potrebe za zvjezdicama Namigiva

Da ali ako radi s pointerom, a to je bilo pitanje. Kako u funkciji navodi da li je argument pointer ili vrijednost. Za to mu je potrebna zvjezdica.

Ako pokazivacu bude pristupao na ovaj nacin nece li dobiti dvostruku referencu, tj pokazivac na pokazivac koji pokazuje na neku memorijsku adresu?

Lako za zvjezdicu tj. pokazivac samo sam htio istaknuti da ima jos jedna mogucnost za koju vjerovatno ne zna, a koja radi kao "ByRef a as integer",

a i lakse je prenositi referencu pogotovo kad je u pitanju vise jednostavnih varijabli jer se ne mora misliti sto je pokazivac a sto nije sto i smanjuje mogucnost

pogreski u kodu koje ponekad nije lako otkriti.

 

Pa nece predati referencu od pokazivaca, cemu ici zaobilaznim putem, ako zeli predat funkciji pokazivac onda neka preda pokazivac ??

Ali ako zeli predat referencu za varijablu, ne mora predati pokazivac, nego moze i referencu, to sam mislio reci.

 

Referenca:

 

void funkcija(int& nekibroj){

nekibroj = nekibroj + 1;

radi jos nesto s nekibroj...

}

int nekibroj = 0;

funkcija(nekibroj);

 

Pokazivac:

 

void funkcija(int* nekibroj){

*nekibroj = *nekibroj +1;

radi jos nesto s nekibroj...

}

int nekibroj = 0;

int* p_nekibroj = &nekibroj;

funkcija(p_nekibroj);

 

 

 

All religions are the same: religion is basically guilt, with different holidays.
Poruka je uređivana zadnji put uto 19.10.2010 18:28 (drnde).
17 godina
offline
C++ Zašto ovo ima problema

Koja bi bila razlika između reference i pointera?

 

I može li mi netko objasniti zašto ovo ne radi u niti jednoj drugoj kombinaciji nego ovako:

u postavke.c je ovo:

char* getServerUserName() {
    return "root"; //ovo će se ubuduće čitati iz fajla
}
char* getServerPassword() {
    return "root"; //ovo će se ubuduće čitati iz fajla
}
char* getServerIP() {
    return "10.0.96.200"; //ovo će se ubuduće čitati iz fajla
}
char* getServerDatabase() {
    return "wikidb"; //ovo će se ubuduće čitati iz fajla
}

 

u main.c je ovo:

char *usr,*srv,*db,*pwd;
usr = getServerUserName();
srv = getServerIP();
db = getServerDatabase();
pwd = getServerPassword();

mySelect(a,srv,usr,pwd,db);

 

u mysql.c je ovo:

void mySelect(int i, char *server, char *user, char *password, char *database) {
    MYSQL *conn;
    MYSQL_RES *res;
    MYSQL_ROW row;
    conn = mysql_init(NULL);
    if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) { fprintf(stderr, "%s\n", mysql_error(conn)); }
    if (mysql_query(conn, "select * from gnw_searchindex")) { fprintf(stderr, "%s\n", mysql_error(conn)); }
    res = mysql_use_result(conn);
    while ((row = mysql_fetch_row(res)) != NULL) {
       printf("%s \n", row[i]);
    }
    mysql_free_result(res);
    mysql_close(conn);
}

 

 

Stvar radi ali mi nije jasno zašto se javlja greška kada getServerPassword i ostale funkcije nemaju zvjezdicu a istovremeno char usr,srv,db,pwd; nema zvjezdice?

Zašto se javlja greška kada te funkcije imaju zvjezdicu i deklaracije varijabli imaju zvjezdicu i ovo: *usr = getServerUserName(); ima zvjezdicu?

 

 

Nadam se da ne maltretiram, nov sam u c++ (vrlo nov) (a vb sve radio za mene 8-) )

 

 

Hvala

Dolje Matija Gubc
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: C++ Zašto ovo ima problema

U funkcjiji treba biti * (pokazivac) jer je char u c++u jedno slovo ne vise znakova.

 

Ako napises u funkcjiji da prima char nesto to znaci da ona ocekuje da ces joj poslat samo jednan znak, kako to u tebe nije slucaj nego imas vise znakova onda moras stavit * (pokazivac) jer time funkciji saljes lokaciju prvoga clana toga polja.

 

Ako nisi previse upoznat sa pokazivacima koristi string, i onda neces porat koristit * (pokazivace)

 

 

 

 

 

 

17 godina
offline
C++ Zašto ovo ima problema

Konkretan i od velike pomoći odgovor!

 

 

Hvala!

Dolje Matija Gubc
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: C++ Zašto ovo ima problema

...samo da se nadovežem ...reference su samo aliasi  za varijable i što god ti radio s tipom reference to radiš s varijablom...
Znači referenca je "nadimak" za varijablu ali je u biti sama varijabla .

#include<iostream>
#include<cstdlib>
using namespace std;


int main()
{
  int a=1;
  int b=3;
  int &c =a;//vezanje za varijablu a tipa int (sve se mora poštivati)
  c++;b++;//ovdje uvečavam "nadimak"
  cout<<c<<endl;  
  cout<<b<<endl;
  cout<<a<<endl;


 
 
 
 system ("pause");
  return 0;
}

 

Samo sad pogledaj što se ispisuje na konzoli i to je objašnjenje.....reference su povezane s varijablom i njezinom adresom i nepromjenjive su dok
pokazivače možeš preusmjeravati    ...

 

 

Private
Poruka je uređivana zadnji put ned 24.10.2010 18:35 (Private).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice