» »

[C++] vprašanja

[C++] vprašanja

fx ::

Sem ugotovil.

Kako bi jaz naredil tako, kot naredi konzola, ko vpišem man ime_ukaza, da pobriše vsebino in jo ponovno prikaže ko pritisnem črko Q.
#include <iostream>
#include <curses.h>

int main()
{
  int test;
  initscr();
  noecho();
  nodelay(strscr, 1);
  while(getch() != '\1x1b')
  {
    std::cout << "TEST";
    std::cin >> test;
    std::cout << test;  
  } 
  endwin();
  return 0;
}

Ta program mi to naredi samo ne morem nič izpisati (razen, če pritisnem enter potem mi izpiše TEST, drugače ne)oz. vpisati v spremenljive.

fx ::

Kako bi jaz uporabil konzoline ukaze, ki bi imeli isti učinke, kot če bi jih sam vpisal v konzolo?

"UNIX & C++"

CCfly ::

Glej funkcijo system().
"My goodness, we forgot generics!" -- Danny Kalev

fx ::

CCfly hvala.

#include <stdlib.h>
int system(const char *string);

primer :
system("pause");

"UNIX & C++"

OwcA ::

#include <cstdlib> ;((
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

CCfly ::

Ja če že delaš v C++ uporabljaj zaglavne datoteke, ki ti C-jevske funkcije preslikajo v std namespace, kakor ti je napisal Owca.
"My goodness, we forgot generics!" -- Danny Kalev

fx ::

Ukaz v konzoli za pošiljanje na serijski port je:
echo -ne 'podatek' > /dev/ttyS0
če se ne motim
system("echo -ne 'podatek' > /dev/ttyS0");

Samo zdaj nevem kaj naj naredim s podatkom, ker bi ga rad spreminjal.

lp

"UNIX & C++"

CCfly ::

Če želiš podatke spreminjati imaš pač neko polje znakov, ki pa potem podaš kot parameter funkciji system.
"My goodness, we forgot generics!" -- Danny Kalev

snow ::

Kam se daje spremenljivke v win32 api programu?

Mamo winmain... pa pol on wndproc, ki procesira razne msgje... zdej globalne spremenljivke ne... jaz bi pa rad mel zadeve pač stalne.. npr neko spremenljivko v kateri hranim neko stanje, pol jo pa prek gumbov spreminjam. Sam static v wndproc funkciji mi tud niso nekaj preveč všeč?

Kak pa objektno pa ta win32api? Ideas, links? :\
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Nerdor ::

snow. imamo ideas, glej klikni na legendarni Forgerjev tutorial. Tudi jest sem se od tod tega tutoriala učil programirat v windowsih!
Samo zapomni si nekaj, vse v win32 so strukture, enumeracije, konstante in funkcije v C-jeziku! V win32 api programirju NI objektov! Temu najbližje so strukture (kot objekt v C-ju, samo nimajo metod, samo spremenjivke! )! To imej v mislih, objekti so bili preveč nova zadeva, ko so še pacali win32 api, zato so struct in enum v čistem C-ju! Aja, odveč je rečt da Win32 api potem takem ni v C++. Skratka preberi si Forgerjev tutorial za boljše razumevanje!
... for lifetime!

Zgodovina sprememb…

  • spremenil: Nerdor ()

OwcA ::

Čeprav nič ti ne preprečuje, da API klicov ne oblečeš v kaj bolj okusnega -- objektnega. V skrajni sili kar MFC.
Otroška radovednost - gonilo napredka.

Vesoljc ::

jah, recimo window wrapper zna biti kr hecno implmentirat.

@owca

ampak res v skrajni sili...
Abnormal behavior of abnormal brain makes me normal...

snow ::

Ja, saj delam po tem Forgerju :)

Pa pol recimo se te spremenljivke/strukture kar globalno daje oziroma se jih zapakira v eno strukturo?

Tako kot ima narejeno zadevo tukaj za to animacijo žoge.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

OwcA ::

Če boš ostal pri win32 API-ju, torej C, kar nameči vse v globalni imenski prostor. Na estetiki se ne bo poznalo. ;)
Otroška radovednost - gonilo napredka.

Gundolf ::

Lahko pa uporabiš recimo wxWidgets. Sam sem se malo poigral z njimi in se mi zdijo kar fletni. Prijetno me je presenetilo, da se da uporabniški vmesnik spisati kar v XMLju. Je pa to popolnoma objektna knjižnjica, zelo pregledna in tudi prenosljiva. Edina pripomba ki jo imam je ta, da exe že po defaultu zasede skoraj 1M.

CCfly ::

Statični build ?
"My goodness, we forgot generics!" -- Danny Kalev

Gundolf ::

Kaj misliš s statičnim buildom?

BigWhale ::

Saj ves tisto, ko linkas z -static.

In namesto 1MB exe dobis 15MB exe ;)

Gundolf ::

V bistvu ne poznam ker delam v winsih in se mi dozdeva da je tole linux fora. Si predstavljam, da ti statični build zlinka v executable tudi vse dinamične knjižnjice, ki jih uporabljaš. Imam prav? No, kaj za vraga sploh linkajo windows linkerji mi ni jasno, ker vsak hello world zasede skoraj 300k. Ampak static / dynamic tu ni prava rešitev. Mi je po svoje še bolj všeč če imaš le en velik exe kot pa majhen exe in eno tono velikih dlljev (ki jih tako ali tako nihče drug nima, tako da jih moraš distribuirat skupaj s programom).

Quikee ::

Ja staticni build ti zlinka vse potrebne DLL v exe. Drugace so DLL fajn.. ce uporabljas kake, ki so mnozicno uporabljeni tak kot recimo MFC, ki je ze prilozen Windows XP ( in vrjetno tudi starejsim Windowsem ). Drugace pa ce uporabljas kakasen neznan DLL pa je problem ker v taksnem primeru pa ga potem mores nonstop prilagat programu ali na kakasen drug nacin nakazat kak se ga dobi. =) Majo pa se DLL drugi namen.. in to je da jih lahko kadarkoli v programu nalozis v pomnilnik in iz pomnilnika sprostis, ko ga vec ne rabis.

Gundolf ::

Ja plugini s pomočjo DLLjev so kar v redu. Pa kakšen OpenGL32.dll je tudi zelo koristen. MFC pa verjetno morajo dodajati winsom (močno močno dvomim da je priložen starejših verzijam, že to da je priložen XPjem se mi sliši malo čudno), da bi spodbudili njegovo uporabo >:D

Quikee ::

MFC je kar fajn za kaksne bolj enostavne programe... kolkor pa hoces naredit kaj bolj kompleksnega pa zraven lahko znoris in za eno bogo funkcijo, ki bi ze morala biti privzeto vkljucena moras podedovat celi control in si ga po svoje prilagodit kar pa po navadi vec ni "piece of cake". =)

Zdaj ne vem ce je prilozen tudi starejsim Windowsem.. ampak kljub temu ko si namescas razne programe na masino bo sigurno en med temi namestil tudi MFC DLL. Mislim da ga MS Office rabi in ti ga namesti ampak nisem ziher. =)

fx ::

Kaki so ukazi za pošiljanje podatkov na serijska vrata iz konzole za linux?

lp

"UNIX & C++"

CCfly ::

echo "blabla" > /dev/ttyS0
"My goodness, we forgot generics!" -- Danny Kalev

fx ::

Torej je to to:
#include <iostream>
int main()
{
int ukaz;
std::cin >> ukaz;
system("echo 'ukaz' > /dev/ttyS0");
return 0;
}


Če želim podatke pošiljati na serijska vraza s pomočjo konzole.

Če je kaj narobe, me obvestite, prosim lepo.

lp

"UNIX & C++"

fx ::

Kako v C++ naredim da imam dve okni, v prvo vnašam podatke, v drugem oknu se avtomatično prikažejo podatki v obliki grafa (OpenGL).

lp

BigWhale ::

> Ja staticni build ti zlinka vse potrebne DLL v exe.

Hm, na tole nisem nic odgovoril... ;)

Ce nekaj linkas z -static, potem ti linker vzame staticno knjiznjico (.la) in jo zalima zraven exe datoteke. To je staticno linkanje. Ce pa linkas brez -static, potem se pa linkajo simboli in dinamicni linker ti ob izvajanju nalozi vse potrebne knjiznice.

Tako je to na Unix sistemih.

fx ::

Kako pa je za windowse?

lp

fx ::

Vse imam narejeno samo ta povezava mi manjka, pa program deluje. Ena možnost je branje iz datoteke. Sploh ne vem kaj bi iskal po stricu googlu.

lp

fx ::

class Temperatura
{
      public: 
      void setTemp(float Celzija)
      {
           Temp = Celzija;
      }
      float getTemp()
      {
          return Temp;
      }
      private:
      float Temp;
};
struct podatki
{
       int address;     //sifra podatka 
       float data;        //novi podatek
};

void Beri_doc()
{
     Temperatura Celzija[24];
     podatki beri;
     int i = 0;
     std::fstream doc("test.dat", std::ios::in | std::ios::out);
     while(!doc.eof())
     {
                      i++;
                      doc.seekp((i-1) * sizeof(podatki));
                      doc.read((char*)&beri, sizeof(podatki));
                      Celzija[i].setTemp(beri.data);  
     }
}

Kaj je narobe, da mi program ne želi podatke iz datoteke straniti v polje?

lp

OwcA ::

doc.read((char*)&beri, sizeof(podatki));

To ni zelo lepa rešitev in pogost izvor napak, saj zahteva, da kontroliraš poravnavo podatkov, kar dvomim, da počneš.
Otroška radovednost - gonilo napredka.

fx ::

Kako pa je lepša rešitev, ker jaz poznam samo to? Pomagam si z literaturo.

lp

OwcA ::

Če drugega ne, prebereš int ter float posamično in ju potem zbašeš v beri. Glede na to, da tako uporabiš samo data, bi lahko branje int-a v celoti preskočil.
Otroška radovednost - gonilo napredka.

fx ::

Joj jaz uporabljam naključni dostop lahko pa bi zaporedni dostop. Bom probal z slednjim sedaj.

lp

OwcA ::

Aja, še en bug imaš, ker pišeš Celzija[i] in ne Celzija[i-1]. Daj raje tist i++ na koncu bloka in lepo povsod uporabljaj i.
Otroška radovednost - gonilo napredka.

Gundolf ::

In ker bereš iz binarnega fajla dodaj med flage tam kjer odpreš fajla še std::ios::binary, drugače boš ob prvem številu ki bo enako 0 neprijetno presenečen - morda si že sedaj.

Aja, če pa ne bereš binarnih podatkov ampak imaš text fajl, potem pa uporabljaj
operator >>
za branje.

fx ::

Mene zanima če jaz sploh dobro vpisujem v polje?

lp

fx ::

Ne, ker ta sistem deluje:
#include <iostream>
#include <fstream>

struct oseba
{
       float Data;
};

int main()
{
    const int VelPolja = 24;
    float Temp[VelPolja];
    std::fstream osebe("osebe.dat", std::ios::in | std::ios::binary);
    oseba o;
    int i = 0;
    while(!osebe.eof())
    {
                       osebe.read((char*)&o, sizeof(o)); 
                       std::cout << o.Data << std::endl;
                       Temp[i] = o.Data;
                       i++;  
    }
    std::cout << "-----------------" << std::endl;
    
    for(int i = 0; i < 24; i++)
    {
            std::cout << Temp[i] << std::endl; 
    }    
    system("PAUSE");
    return 0;
}


Obema hvala za pomoč in trud.

lp

fx ::

Kako naredim, dami program v win prebere današnji dan?

lp

fx ::

Prehitro vprašam:
     #include <stdio.h>
     #include <time.h>
     #include <iostream>

     int main()
     {
          char dateStr [9];
          char timeStr [9];
          _strdate( dateStr);
          printf( "The current date is %s \n", dateStr);
         _strtime( timeStr );
         printf( "The current time is %s \n", timeStr);
         system("PAUSE");
         return 0;         
      }


lp

fx ::

To ne najdem:
char dateStr [9];
_strdate( dateStr);
std::fstream osebe("data/dateStr.dat", std::ios::out | std:ios::binary /*|std::ios::app*/);


Kako naredim, da mi bo bral datoteko z danajšnjim datumom, ne vem kako bi to skupaj spesno. Z string ni problema.

lp

OwcA ::

Pa iz dateStr naredi std::string. Drugače imaš pa strcat() in podobne akrobacije.
Otroška radovednost - gonilo napredka.

fx ::

kako string spravim v char in obratno.

    std::string datum;
    char*  ime_doc];
    char dateStr [9];
    _strdate( dateStr);
    datum = dateStr;
    datum[2] = '_';
    datum[5] = '_';
    datum = "data/" + datum + ".dat";
    ime_doc = datum;
     std::fstream doc(ime_doc, std::ios::out | std::ios::binary /*|std::ios::app*/);


lp

Gundolf ::

Mislim da bi delalo takole (če primerno popraviš tvojo kodo, ki s jo napopal)
std::string datum("data/");
datum += dateStr;
datum += ".dat";
//mislim pa da bi moralo delovati tudi na bolj eleganten način - takole:
datum = std::string("data/") + dateStr + ".dat";

Na enostavno povedano c++ ne zna seštevati char*, zna pa seštevati stringe in stringe z char*. Zato mu moraš explicitno pretvoriti prvo spremenljivko v std::string, k njej pa bo potem znal prišteti tudi navadne char* (če zanemarim eno malenkost, da te ne bi zmedel, potem je tudi navadno besedilo znotraj narekovajev je tipa char*)

fx ::

Gundolf to eleganso sem imel tudi jaz samo, mi datum izipiše v obliki 28/05/05. Tega znaka / pa windows ne more prebaviti za ime datoteke. zato sem imel jaz vsem to
datum[2] = '_';
datum[5] = '_';


lp

Zgodovina sprememb…

  • spremenil: fx ()

OwcA ::

std::string::replace()
Otroška radovednost - gonilo napredka.

fx ::

OwcA meni ga ne najde, ko ga pokličem.

lp

fx ::

Kako skupaj zlepim dva chara?

lp

Gundolf ::

fx, očitno ga slabo kličeš (saj to si o replace govoril?) - to je namreč metoda razreda string. Dva char pa lahko zlepiš v char[2] ali pa v string.

fx ::

    char* datum;
    _strdate(datum);
    char* pot = "data/";
    char* end = ".dat";
    datum[2] = '_';
    datum[5] = '_';
    char* ime_doc = (pot, datum, end);
    std::cout << ime_doc << std::endl;

Deluje samo mi program izpiše .dat namsto tega data/29_05_05.dat. Kaj je narobe?

lp


Vredno ogleda ...

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

Program za C++ jezik

Oddelek: Programska oprema
232862 (1897) popaj113
»

Kako bi naredil en ultra simple programček?

Oddelek: Programiranje
492331 (1612) AtaStrumf
»

C++ & XP

Oddelek: Programiranje
241680 (1287) Exilian
»

C++ in pavza

Oddelek: Programiranje
161225 (986) napsy
»

c++ datoteke

Oddelek: Programiranje
464057 (3546) Vesoljc

Več podobnih tem