» »

[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):
    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

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

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.

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++.

fx ::

Kateri ukaz je v c++ da ti preverja ali je bila pritisnjena tipka?

lp

Vesoljc ::

odvisno od knjznice!
Abnormal behavior of abnormal brain makes me normal...

fx ::

In katera knjižnica po standartu je to?

lp

OwcA ::

ANSI standard tega ne zajema.
Otroška radovednost - gonilo napredka.

fx ::

Aja.
Kako to potem naj rešim?

lp

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:
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.

fx ::

Torej naj ne uporabljam :
struct Podatek
{
     float data;
};


lp

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 :D :
     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 ?
"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.

CCfly ::

Privzeto private ko je meni znano.
"My goodness, we forgot generics!" -- Danny Kalev

64202 ::

private

Potem pa rabmo samo se

#define high

high class richsuperstar
{
    protected:
        // by bodyguards
};
I am NaN, I am a free man!

CCfly ::

Kaj boš pa s "high" define-om počel ?
"My goodness, we forgot generics!" -- Danny Kalev

64202 ::

Hm... mogoce to, da je high u bistvu fake :))
I am NaN, I am a free man!

fx ::

Imam rešitev za branje tipk (dela na win za unix naj nekdo preveri):
#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

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.

fx ::

Gledal sem tole, samo ima nekam čudo obliko class-a in struct-a:
__gc class CSerialPort
__nogc struct DCB

To mora biti tako, ali ne?

lp

Nerdor ::

fx pazi to je pisano za managed C++ 8-O 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.
... for lifetime!

fx ::

Kdo išče, ta najde: [ st.povezava http://forums.devshed.com/t85857/s.html link]
#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 ()

fx ::

Kako z C++ naredim, da mi program deluje v ozadju?

lp

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

Quikee ::

Ja poglej kak se program v tray vrze.. =) Lahko pa ga naredis kot service. =)

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

CCfly ::

Narobe si gledal.
"My goodness, we forgot generics!" -- Danny Kalev

BigWhale ::

> if(time1 == _strdate(time))

if (!strcmp(time1, time))
{
  do_equal();
} else {
  do_not_equal();
}


V teoriji, ce bi cas lahko kar kot string primerjal. A ga lahko?

BigWhale ::

Tukaj ga v bistvu najbrz lahko, ce primerjas samo ali sta casa enaka.

fx ::

Točno tako, želim primerjat moj izbrani čas z sistemskim.

lp

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

fx ::

Potem moram svoj čas tudi pretvoriti v milisekunde ali ne? Samo mislim da.

lp

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

BigWhale ::

crontab!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Program za C++ jezik

Oddelek: Programska oprema
232773 (1808) popaj113
»

Kako bi naredil en ultra simple programček?

Oddelek: Programiranje
492226 (1507) AtaStrumf
»

C++ & XP

Oddelek: Programiranje
241586 (1193) Exilian
»

C++ in pavza

Oddelek: Programiranje
161160 (921) napsy
»

c++ datoteke

Oddelek: Programiranje
463837 (3326) Vesoljc

Več podobnih tem