Forum » Programiranje » [C++] vprašanja
[C++] vprašanja
Gundolf ::
char* ime_doc = (pot, datum, end);
To je narobe. Tu uporabljaš operator "," (vejica), ki vedno izvrši vse elemente, kot rezultat pa vzame rezultat zadnje operacije (v tvojem primeru ni nobene operacije, je le konstanta "end"). Primer z inti bi izgledal takole
int i = (1, 2, 3+4, 5);
Rezultat bo i = 5. 3+4 se bo sicer izračunalo a nikamor vpisalo. Kratek povzetek, ne uporabljaj vejice.
In zakaj ne narediš tako kot sem ti svetoval? Sicer sem zapisal le popravljen delček kode ampak ga boš pa že znal nazaj pravilno vstaviti.
fx ::
#include <iostream> #include <fstream> #include <string> struct Cel { float data; }; struct ime { char* pot; char* datum; char* end; }; int main () { ime NameDoc; Cel temp; _strdate(NameDoc.datum); NameDoc.pot = "data/"; NameDoc.end = ".dat"; NameDoc.datum[2] = '_'; NameDoc.datum[5] = '_'; char AllWay[17] = sizeof(NameDoc); std::cout << AllWay << std::endl; //18 std::fstream doc(AllWay, std::ios::out | std::ios::binary /*|std::ios::app*/); std::cout << "doc <<" ; while (std::cin >> temp.data) { doc.write((char*)&temp, sizeof(temp)); std::cout << "doc <<" ; } doc.close(); system("PAUSE"); return 0; }
Mogoče se sprašuješ, kaj je z mano, samo ti lahko povem da nič, ker program od mene to zahteva da ima AllWay v char obliki. Tukaj mi javi samo : 18 invalid initializer, ne vem kako naj jo rešim oz. kaj sem narobe naredil?
lp
Zgodovina sprememb…
- spremenil: fx ()
Gundolf ::
Program to od tebe zahteva? Ni mi jasno ...Morda misliš na to da v fstream konstruktorju zahreva const char*?
Kaj si pa s tem hotel narediti?
char AllWay[17] = sizeof(NameDoc);
Tole je prirejanje integerja tabeli znakov.
Ok, najbolje da ti kar napišem (ampak dopuščam možnost kake napake v kodi):
Poskusi če ti dela.
Kaj si pa s tem hotel narediti?
char AllWay[17] = sizeof(NameDoc);
Tole je prirejanje integerja tabeli znakov.
Ok, najbolje da ti kar napišem (ampak dopuščam možnost kake napake v kodi):
char datum[10]; _strdate(datum); datum[2] = '_'; datum[5] = '_'; std::string path("data/"); path += datum; path += ".dat"; std::fstream doc(path.c_str(), std::ios::out | std::ios::binary);
Poskusi če ti dela.
Zgodovina sprememb…
- spremenil: Gundolf ()
fx ::
Tako kot si reko. Char AllWay[17] = sizeof(NameDoc); s tem sem želel vse združiti v eno spremenljivko.
lp
lp
Gundolf ::
sizeof vrne velikost, v tvojem primeru bo vrnil 12 (ker je struktura sestavljena iz 3 pointerjev, vsak pointer pa zasede 4 byte). Torej sizeof nima nič skunega s stringi.
fx ::
Deluje hvala ti. Samo nekaj me zanima, ta c_str() naredi to da lahko namesto char* in char uporabim string? Si prav razlagam ali narobe mi sporoči.
lp
lp
Gundolf ::
c_str() ti iz std::string pretvori v const char* (pri tem se sam string ne spremeni).
Podobno kot imaš lahko funkcijo, ki ti int pretvori v float.
Podobno kot imaš lahko funkcijo, ki ti int pretvori v float.
Gundolf ::
Ti predlagam kakšen C++ tutorial. Tak, ki se dotakne tudi classov in stringov. Greš skozi in si boš garantirano prihranil več časa potlej med programiranjem, kot si ga vložil v tutorial. Seveda če boš sploh še kdaj programiral v c++.
OwcA ::
uporabiš kako knjižnico. Predlogov je bilo v zadnjem času ogromno.
Otroška radovednost - gonilo napredka.
fx ::
Ok, to bom že nekako rešo. Zdaj me zanima, zakaj mi winxp v datoteko shrani 10 podatkov tipa float, kar je več pa gre v zrak. Tako pišem podatke v datoteko:
lp
struct Podatki { float data; }; void VnesiPodatke() { int i = 0; Podatki temp; std::fstream doc(path.c_str(), std::ios::out | std::ios::binary | std::ios::app); std::cout << path << " << " ; while (std::cin >> temp.data) { doc.write((char*)&temp, sizeof(temp)); std::cout << path << " << " ; } doc.close(); }
lp
Zgodovina sprememb…
- spremenil: fx ()
]Fusion[ ::
Glede pritisnjene tipke si lahko tu kaj prebereš, mogoče bo pomagalo...
"I am not an animal! I am a human being! I... am... a man!" - John Merrick
OwcA ::
Daj pusti no te dirty hacke s pretvarjanjem med tipi na miru in stvar sporgramiraj kot se spodobi. V tem primeru recimo s specializacijo operatorja << za par std::iostream in Podatki, ali pa slednjim dodaj eno metodo za izpis.
Otroška radovednost - gonilo napredka.
OwcA ::
V C++ ni razlike med struct in Class, izbira je samo stvar oblikovanja kode, estetike.
Otroška radovednost - gonilo napredka.
fx ::
Tako tudi mi deluje :
int i = 0; float Data; for(int i = 0 ; i < 24 ; i++) TempPolje[i] = 0; std::fstream doc(path.c_str(), std::ios::in | std::ios::binary); while(!doc.eof()) { doc.read((char*)&Data, sizeof(Data)); TempPolje[i] = Data; i++; if (i > 24) return 1; } doc.close();
CCfly ::
V C++ ni razlike med struct in Class, izbira je samo stvar oblikovanja kode, estetike.
Kaj pa doseg private / public ?
Kaj pa doseg private / public ?
"My goodness, we forgot generics!" -- Danny Kalev
OwcA ::
Hm, bi znalo biti. Pri structu je privzeto public, kaj je pa pri class?
Otroška radovednost - gonilo napredka.
64202 ::
private
Potem pa rabmo samo se
Potem pa rabmo samo se
#define high high class richsuperstar { protected: // by bodyguards };
I am NaN, I am a free man!
fx ::
Imam rešitev za branje tipk (dela na win za unix naj nekdo preveri):
lp
#include <conio.h> #include <iostream> int main() { int ch = getch(); while(ch != '\x1b') //x1b = ESC tipka { ch = getch(); std::cout << ch << std::endl; } return 0; }
lp
Mmm'Aah ::
Zdaj bom pa jaz postavil eno vprašanje. Zakaj vsi tako radi vsevprek uporabljate std razrede kot so string ipd.? Za moj okus je std sintaksta naravnost grozljiva in popolnoma neberljiva, poleg tega pa se vse stvari da nardit maksimalno portable in tudi na preprost način z drugimi funkcijami kot so memset, memcpy, memcmp, printf, sprintf, fread, fwrite, ter uporabo osnovnih tipov char*, unsigned char*.... Rad bi samo vedel, če gre za kakšne prednosti pri tem, ki jih js ne poznam.
fx ::
> Ok, to bom že nekako rešo. Zdaj me zanima, zakaj mi winxp v datoteko shrani 10 podatkov tipa float, kar je več pa gre v zrak.
To sem rešo, fora je bila, ker sem imel if stavek ki mi je omogoče samo izpis prvih 10 ukazov.
lp
To sem rešo, fora je bila, ker sem imel if stavek ki mi je omogoče samo izpis prvih 10 ukazov.
lp
Gundolf ::
Ja Mmmaah so prednosti, naprimer da izrabiš moč C++ in pustiš C funkcije tam kamor sodijo, v C projektih. Streami so vsaj meni veliko elegantnejši od fprintf-of in podobnega, string je sploh super, varnost pred buffer overflowom je vgrajena da raznih kontejnerjev in algoritmov sploh ne omenjam. Če ne uporabljaš standardne knjižnice potem je brezveze da sploh pišeš v C++.
Poleg tega pa lahko vedno napišeš using namespace std, še te ta std:: tako moti.
Poleg tega pa lahko vedno napišeš using namespace std, še te ta std:: tako moti.
fx ::
Gledal sem tole, samo ima nekam čudo obliko class-a in struct-a:
To mora biti tako, ali ne?
lp
__gc class CSerialPort __nogc struct DCB
To mora biti tako, ali ne?
lp
Nerdor ::
fx pazi to je pisano za managed C++ Naujno rabiš .Net Framework 1.1, ki mislim, da pride zraven Visual C++ Toolkit 2003 (link). Gre samo za command line orodja in samo kompajler in nič drugega.
Samo verjetno boš našel nekaj drugega, ker za tvoj Dev-C je čisto nekaj drugega rešitev.
Samo verjetno boš našel nekaj drugega, ker za tvoj Dev-C je čisto nekaj drugega rešitev.
... for lifetime!
fx ::
Kdo išče, ta najde: [ st.povezava http://forums.devshed.com/t85857/s.html link]
Sedaj moram samo še nekako preverit če res prav deluje.
lp
#include <windows.h> #include <iostream> #include <string> using namespace std; #define BUFLEN 20 int main () { string path; DWORD byteswritten; DWORD bytesread; char read[BUFLEN+1];//space for NULL termination HANDLE comport; cout << "Enter the name of the play you want to run (no more than " << BUFLEN << " characters!)." << endl; cin >> path; if (path.size() > BUFLEN){ cerr << "I told you, no more than " << BUFLEN << " characters!\n"; exit(1); } //create handle, open COM1 comport = CreateFile("COM1:",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); if (comport == INVALID_HANDLE_VALUE){ cerr << "Problem opening com port. GetLastError: \n" << GetLastError() << endl; exit(1); } //write string to COM1 if (WriteFile(comport,path.c_str(),path.size(),&byteswritten,NULL)){ cout << byteswritten << " bytes written to com1" << endl; //read string back if (ReadFile(comport,&read,BUFLEN,&bytesread,NULL)){ read[bytesread] = '\0'; //output results cout << read << " read from com1" << endl; cout << "read " << bytesread << " bytes." << endl; }else{ cerr << "Error reading from com port. GetLastError: \n" << GetLastError() << endl; } }else{ cerr << "Error writing to com port. GetLastError: \n" << GetLastError() << endl; } //Close COM1 CloseHandle(comport); return 0; }
Sedaj moram samo še nekako preverit če res prav deluje.
lp
Zgodovina sprememb…
- spremenil: fx ()
Vesoljc ::
odvisno od OS-a. das mu pa nizjo prioriteto. ce si na win32 potem lahko probas SetThreadPriority za zacetek
Abnormal behavior of abnormal brain makes me normal...
fx ::
Malo sem se narobe izrazo, bom povedal kar na primeru:
- linux ima to lepo narejeno, predvsem programi za prevajanje glasbe iz CD-ja.
- program poženeš, nastaviš, zapreš in se ti glasba vseeno predvaja naprej.
Jaz bi nekaj takega naredo za Win32, razen če mi to ukaz SetThreadPriority to omogoča.
lp
- linux ima to lepo narejeno, predvsem programi za prevajanje glasbe iz CD-ja.
- program poženeš, nastaviš, zapreš in se ti glasba vseeno predvaja naprej.
Jaz bi nekaj takega naredo za Win32, razen če mi to ukaz SetThreadPriority to omogoča.
lp
fx ::
#include <windows.h> #include <cstdlib> #include <iostream> int main(int argc, char *argv[]) { char date [9]; char time [9]; char time1 [9]; char time2 [9]; std::cout << "Datuma : " << _strdate(date) << std::endl; std::cout << "Ura : " << _strtime(time) << std::endl; std::cout << "Uro : " ; std::cin >> time1; do { if(time1 == _strdate(time)) if(MessageBox(NULL, time, "Opomnik", MB_OKCANCEL | MB_ICONINFORMATION) ==IDOK) exit(0); } while(time1 != _strdate(time)); system("PAUSE"); return EXIT_SUCCESS; }
Zgoraj je koda, ki naj bi primerjala moj čas s sistemskim. Samo, ko sta si časa ista mi ne izpiše sporočila in program deluje naprej. Kaj je narobe? Čas napišem v taki obliki 12:48:00.
lp
Gundolf ::
Narobe je, da primerjaš dva pointerja (char*) in ne njune vsebine. Uporabi strcmp ali strncmp za primerjanje dveh v (char*) shranjenih stringov.
fx ::
Gundolf koliko sem našel na googelu piše da ta dva ukaza primarjata velikost niza in ne vsebine.
lp
lp
BigWhale ::
> if(time1 == _strdate(time))
V teoriji, ce bi cas lahko kar kot string primerjal. A ga lahko?
if (!strcmp(time1, time)) { do_equal(); } else { do_not_equal(); }
V teoriji, ce bi cas lahko kar kot string primerjal. A ga lahko?
CCfly ::
@fx: predvidevam da si se jezil, vendar kaj naj ti napišem. Nauči se brati deklaracije.
SYNOPSIS #include <string.h> int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); DESCRIPTION The strcmp() function compares the two strings s1 and s2. It returns an integer less than, equal to, or greater than zero if s1 is found, respectively, to be less than, to match, or be greater than s2. The strncmp() function is similar, except it only compares the first (at most) n characters of s1 and s2.
"My goodness, we forgot generics!" -- Danny Kalev
CCfly ::
Zakaj ne bi časa preprosto shranil kot milisekunde, ki ti jih vrne sistemski klic ?
"My goodness, we forgot generics!" -- Danny Kalev
CCfly ::
Vse je odvisno od tega, kja nameravaš početi s temi datumi. Če veliko operiraš z njimi, pač sparsaš niz in si shraniš datum v ustrezno strukturo, da ni treba vsakič preračunavati milisekund in primerjati nizov, ki so po možnosti še za vsak locale drugačni.
"My goodness, we forgot generics!" -- Danny Kalev
fx ::
Želim narediti opomnik si, ki bi mi na datum in na uro obvestil, vse pa bilo shranjeno v datoteko.
lp
lp
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Program za C++ jezikOddelek: Programska oprema | 2862 (1897) | popaj113 |
» | Kako bi naredil en ultra simple programček?Oddelek: Programiranje | 2331 (1612) | AtaStrumf |
» | C++ & XPOddelek: Programiranje | 1680 (1287) | Exilian |
» | C++ in pavzaOddelek: Programiranje | 1225 (986) | napsy |
» | c++ datotekeOddelek: Programiranje | 4057 (3546) | Vesoljc |