» »

[C++] vprašanja

[C++] vprašanja

snow ::

Bi rekel da s kakšnim stringstreamom.

stringstream ss;
ss.str("xxx xxxxx xxxxxxxxxx xxxxxxx xxxx");
string str;
ss>>str;
ss>>str;
ss>>str;

Nekaj v tem stilu mislim, da je.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

CCfly ::

Mislim da lahko podaš const char* kar v konstruktor.

stringstream ss("xxx xxxxx xxxxxxxxxx xxxxxxx xxxx");
"My goodness, we forgot generics!" -- Danny Kalev

snow ::

Ja res je.

Aha, je pa treba pazit eno zadevo, če boš v isti stringstream dal novi string s funkcijo str(). Po tistem moraš klicati še clear(), drugače zadeva delovala.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Nejc Pintar ::

Kako boolean array pretvori v integer?
Lahko je biti prvi, če si edini!

CCfly ::

Verjetno v 0 in 1, vendar zakaj sploh potrebuješ array booleanov. Spakiraj jih v integer.
"My goodness, we forgot generics!" -- Danny Kalev

Nejc Pintar ::

narobe sem napisal:

Kako boolean array pretvoriti v integer?
Rabim zato ker xoram nekatere bite med sabo.

edit: potrebujem pretvorbo v stilu: 100[2]=4[10]
Lahko je biti prvi, če si edini!

Zgodovina sprememb…

CCfly ::

int bits = 0;

for(int i=0; i<arrLen; i++) {
   bits |= array[i];
   bits <<= 1;
}


Nekaj takega, mogoče boš moral iti od konca tabele proti začetku.
"My goodness, we forgot generics!" -- Danny Kalev

feithless ::

Zdravo. Imam še eno vprašanje.:D

Imam dvodimenzionalen string array. Tu želim poiskati določen string. Ja za iskanje kakšen boljši (hitrejši) način kot loop skozi vsak element?

OwcA ::

V splošnem ne, če pa obstaja kakšno pravilo, po katerem so razporejeni, pa bi se verjetno dalo kaj napraskati.
Otroška radovednost - gonilo napredka.

fx ::

Zakaj mi program v win s getch() in conio.h dela v SuSe linux pa ne?

Lp,

Gundolf ::

Verjetno zato ker conio.h ni standardni c++ header in ga najdeš le na winsih. Če želiš portable zadevo uporabljaj standardne C++ knjižnice.

fx ::

Kako double naredim da mi prikaže 9 mest natančno število?
Primer
46° 38' 38.24" -> 46.64395556 to mi izpiše kalkulator
46° 38' 38.24" -> 46.644 to mi izpiše moj program

Tako pa imam rešeno programsko kod
void GPS_cifra() //Program pretvori koordinate v cifro
{    double stopinja, minuta, sekunda;
     std::cout << "-----------------" << std::endl
               << " Vnesi koorinate " << std::endl
               << "-----------------" << std::endl
               << " > ";
     std::cin >> stopinja >> minuta >> sekunda;
     std::cout << stopinja << "° " << minuta << "' " << sekunda << znak 
          << " -> " << (stopinja + ((minuta + (sekunda / 60)) / 60)) << std::endl;
     std::cout << "-----------------" << std::endl;
}
EDIT spremenljivak znak mi prikaže dvojni narekovaj ascii koda je 34, a se da to kako drugače prikazat?
EDIT : sem se že spomnil '"'
[EDIT: sem naredil en line break, da ne bo cela tema grdo izpisana zaradi ene predolge vrstice kode - Gundolf]

Lp,

Zgodovina sprememb…

  • spremenil: Gundolf ()

fx ::

Probal sem z
wchat_ z_stopinja = '°'; 
Pa mi vedno iste prikazuje neki kvadratek in ne °. Kako naredim da mi bo program prikazal °.

Lp,

y00r3 ::

To pa se mi zdi da v konzoli lahko prikazuješ samo ascii znake(se mi zdi...)
aja.. sj lohk sam nevem zakaj ti ne dela...

Zgodovina sprememb…

  • spremenilo: y00r3 ()

y00r3 ::

Drugač sm pa ugotovu da je ASCII koda k dela "-8 in ne "34".
Tist minus mi je čudn ampak dela tako, vsaj men je.

fx ::

Ko sem napisal
unsigned char z_stopinja = 248; //znak ° 
Je začelo prikazovati izbrani znak.
Kaj pa za double a mogoče veš?

Lp,

Gundolf ::

#include <iomanip>


Potem pa najbolje da si kar pogledaš vse modifikatorje ki so v tem headerju (nekaj jih je pa tudi v iostream).
setprecision ti nastavi število decimalk, setw nastavi širino izpisanega texta, fixed ti vklopi pisanje brez exponentov, scientific ravno obratno, ...

y00r3 ::

double x = 248.0;
cout << char(x);

Takole se mi cist lepo izpise tud ce je double.

y00r3 ::

Zdej bi pa še jz neki vprašu.

Mam 2D tabelo charov, ki so pač imena bitmapov, k jih moram zlodat. To zgleda takole:
char *tex_path[][128];

Zdej pa preberem iz fajla kolk jih je in moram naredit nov array, velik toliko kot je poti in 128(dolžina poti).
To pa naj bi zgledal približno takole
tex_path = new char[header.numTex][128];


Zdej mam pa problem da mi napiše:
incompatible types in assignment of `char (*)[128]' to `char *[0][128]'

Drugač vem da declearaš spremenjivko s pointerjem kar brez arraya in ga pol nardiš sam to je pa 2D tabela in bi prosil za pomoč

Gundolf ::

@y00r3

Prvič, ker je tole C++, se uporabi dvodimenzionalnih arrayev z lahkoto izogneš. Uporabiš stringe. Vector stringov :P
Drugič, char *tex_path[][128]; ni dvodimenzionalna tabela ampak pointer na dvodimenzionalno tabelo oz. teoretično je lahko tridimenzionalna tabela :) Medtem ko tole new char[header.numTex][128]; je pa 2D tabela. Zato se ti tudi pritoži kompajler.

y00r3 ::

No zdej se vse scompila vse lepo in prav, ko pa poženem to funkcijo v programu pa mi javi error in zapre program:
void WORLD::write(string path)
{
     fstream binary_file(path.c_str(),ios::out|ios::binary|ios::app);
     if (binary_file.is_open())
     {     
             binary_file.seekp(0, ios::beg);
             binary_file.write(reinterpret_cast<char *>(header.numTri),sizeof(int));//tukaj javi error
             binary_file.write(reinterpret_cast<char *>(header.numTex),sizeof(int));
             binary_file.write(reinterpret_cast<char *>(triangles),sizeof(TRIANGLE[header.numTri]));
             binary_file.write(reinterpret_cast<char *>(tex_path),sizeof(GLuint[header.numTex]));
             binary_file.close();
     }
}

Prosil bi, če lahko kdo pogleda zakaj nastane error.

Gundolf ::

Najprej povej zakaj odpreš stream za appendanje in ga potem prevrtiš na začetek in nato tam pišeš po njem?
Odpri brez flaga ios::app in brez prevrtavanja na začetku (binary_file.seekp(0, ios::beg);). Kolikor vidim kode je to edini očitni problem (lahko da povzroči to tvojo napako, lahko pa da je tudi ne).

Na koncu bom še malo dlakocepil.
Zakaj eksplicitno zapreš stream (binary_file.close();)? To je C++, to ni Java. Stream se avtomatsko zapre v destruktorju. Stream zapreš ročno le kadar ga želiš reciklirati in takoj odpreti novega.
Pa še podajanje string parametra funkciji void WORLD::write(string path) (Spet: C++, ne Java :P ). Napiši to vsaj kot const string& path.

y00r3 ::

To sm naredu ker sm pač tako vidu na netu. Sej ubistvu mi je nekak ze delal sam sm pa spremenu kaj zapisujem je pa crknl use skup. Jz ubistvu zapisem 2 int-a, pol pa trikotnike in poti do textur. Zapisat noce sam tistih intov, drugo pa zapiše.

Gundolf ::

Aja seveda. Ti moraš vzeti pointer na int, ne kar samega inta. Ne vem kako sem to prej spregledal.
reinterpret_cast<char *>(header.numTri)

spremeniš v
reinterpret_cast<char *>(&header.numTri)

Zgodovina sprememb…

  • spremenil: Gundolf ()

y00r3 ::

Tnx zdej to dela.:)) :))
Samo zdej k pa loadam iz fajla se pa zgodi to da se stringi ne zlodajo, druga geometrija pa headerji pa lepo delajo.;(( ;(( ;(( ;(( ;(( ;((

Gundolf ::

Če je tvoj tex_path seznam ali vektor stringov (v nasprotju seznamom char*), potem je to povsem razumljivo.

y00r3 ::

Ja reku si mi naj uporabim stringe in sem jih, kako bi pa uporabu chare pa vem, ker bi rabil 2d tabelo.

Gundolf ::

Ja sej stringi so ql, samo ne moreš jih pa na tak način shranit v fajl.

edit:
En način je lahko tak, da za vsak string v fajl zapišeš njegovo dolžino (size()) nato pa se podatke (data()). Prebereš pa podobno najprej dolžino N, katero uporabiš tako, da v nadaljevanju iz fajla prebereš v nek začasen objekt (npr char temp[1000];) N charov, začasni objekt pa potem shraniš v string.

Zgodovina sprememb…

  • spremenil: Gundolf ()

muzičar ::

Okej eno smešno vprašanje. Kako nardim niz 30 poljubnih črk?

Gundolf ::

std::string str;
str.append(30, '?'); // doda stringu 30 ?

joj kolk se popravljam zadnje cajte...

Lahko tudi (ne samo da lahko, tole je bolj enostavno)
str.assign(30, '!'); // prepiše string s 30 !
Kar se da z assign, se da seveda tudi s konstruktorjem.

Zgodovina sprememb…

  • spremenil: Gundolf ()

muzičar ::

To sem že pogruntal (nekaj takega) ampak mene zanima kako bi preprosto naredil:
char niz[30]; // v to bi rad dal 30 poljubnih črk oz. alternativa je da uporabnik vnese 30 črk in jih potem program vstavi v ta niz

Kako bi to naredil?

Gundolf ::

> char niz[30]; // v to bi rad dal 30 poljubnih črk oz. alternativa je da uporabnik vnese 30 črk in jih potem program vstavi v ta niz
Kaj ne najdeš funkcije za random?

y00r3 ::

Ok, se en neumen problem, nevem kako narest tole:
char *temp;
temp = tex_path[i].data();

Vem da je cist brezvezno ampak mi skos nabija da ne morem assignat iz cins char* v char*.

Gundolf ::

Najbolje pri tvojem primeru je to, da tega sploh ne rabiš delat.

Drugače je pa rešitev taka kot ti jo error nakazuje (nekompatibilnost tipov) - pač spremeniš tisti tip, ki ga lahko, v kompatibilnega (oz. v tem primeru kar enakega: const char*).
const char *temp = tex_path[i].data();

Zgodovina sprememb…

  • spremenil: Gundolf ()

muzičar ::

@Gundolf poznam random() funkcijo ampak nevem kako naj jo uporabim tu. V niz ne morem dat funkcije ali pač?

Vesoljc ::

funkcijo bos bolj tezko zbasal v niz :)

stevilo, ki ti ga funkcija vrne moras pretvoriti v niz. ce ze operiras z char*, si poglej *printf druzino funkcij (sprintf).
Abnormal behavior of abnormal brain makes me normal...

muzičar ::

Okej torej recimo da ustvarim niz[] torej nedoločeno število char, kako da v ta niz potem spremenljivko v katero sem dal rezultat random()?

CCfly ::

Naj te vprašam takole. Kakšno številsko vrednost ima na primer ASCII znak a ?

Primer:
char znak = 'a';
char znak = 97;
"My goodness, we forgot generics!" -- Danny Kalev

muzičar ::

Oboje. Torej dam lahko niz[]=a -> namreč prevajalnik mi meče vn napake. (kakšne so nevem ker ne morm dele pogledat).

CCfly ::

- Poskrbi da ti bo random vrnil vrednost v ustreznem intervalu, ki ustreza željenemu intervalu ASCII znakov,
- v zanki od 0 do 29 priredi vrednosti v polju znakov niz.

Seveda lahko uporabiš tudi std::string in funkcijo append ali push_back.
"My goodness, we forgot generics!" -- Danny Kalev

Gundolf ::

muzičar, dej najprej se dobro izjasni kaj sploh hočeš.
Da ti bo lažje ti dam dve možnosti:
a) v niz (s tem imam v mislih tvojo spremenljivko char niz[30];) hočeš zapisati random število, v obliki znakovnega niza (npr: "156233.787"). Če je tako bi bilo dobro da poveš kakšno je to število ki ga želiš oz. zakaj ga želiš imeti v tem nizu.
b) v niz želiš stlačiti 30 random charov (t.j. 30 random integerjev na intervalu -128..127)

Kot drugo, funkcija random() ? Jaz poznam le rand().

Navsezadnje: niz[]=a Kaj naj rečem. (prevajalnik je verjetno rekel "error: `a' undeclared " ali pa "expected `;'" ;)) Ne mešat spremenljivk, znakov in nizov znakov. Ker si tole očitno na pamet po spominu napisal in se verjetno zmotil v eneparih detajlih ti kaj več ne morem pomagat. Beri naslednji odstavek.

Pa še en zelo uporaben napotek imam za vse:
Nisem še naletel na prevajalnik, ki bi ob napaki naredil nekaj takega:
error
error
error
...
failed to compile, too many errors.
Prevajalniki večinoma čisto lepo napišejo česa ne morejo prebavit. Naučite se brat errorje.

Z izjavami v stilu: "tale koda se mi noče prevest, neke errorje vn vrže" se pa lahko na cicibana obrnete.

muzičar ::

Se sproščam samo se mi je mudilo in sem na hitro napisal. Vem kako narediti random generator, ki ga rabim ampak nevem kako potem dam vedeti prevajalniku da te random cifre, ki jih bo zmetal veljajo za moj char niz[30]. Ubistvu bi te prosil, če imaš čast in potrpežljivost, da mi napišeš cel kos z generiranjem vred.

Hvala, L

CCfly ::

for(int i=0; i<30; i++)
   niz[i] = ((random() % 255) - 128);
"My goodness, we forgot generics!" -- Danny Kalev

fx ::

Kje je problem, sem napisal program, ki mi prebere sistemski čas in datum zadeva lepo deluje, ampak zakaj mi izpiše za 2 uri manj časa kot pa je v resnici in pri datumu mi kar za celi mesec mimo streli?

Še koda:
#include <iostream>
#include <ctime>
#include <cstring>

int main ()
{
  tm* cas;
  int sec, min, ura, dan, mesec, leto;
  std::string datum,uras;

  sec = cas -> tm_sec;
  min = cas -> tm_min;
  ura = cas -> tm_hour;

  dan = cas -> tm_mday;
  mesec = cas -> tm_mon + 1;
  leto = cas -> tm_year;

  std::cout << sec << ":" << min << ":" << ura << "  " << dan << "." << mesec << "." << leto << std::endl;
  return 0;
}


zadevo sem preizkusil na linuxu in v biosu je ura prav nastaljena tako tudi datum.

Lp,

Gundolf ::

Tvoja spremenljivka "cas" sploh ni initializirana.

BTW, če uporabljaš std::string moraš includat header string. To da deluje tudi le s headerjem iostream je zgolj naklučje.

Zgodovina sprememb…

  • spremenil: Gundolf ()

fx ::

Kaj pa sem potem tukaj naredil tm* cas?
torej namesto cstring moram uporabljat string.h, pa mi niste enkrat rekli sa naj uporabljam cstring?

Lp,

snow ::

cstring je c++ verzija string.h

string (brez .h) je pa ena druga zadeva. Taka lepa zadeva za delo s stringi. Takoimenovan STL vsebnik (conatainer).
Pa recimo vector, map, queue in podobni spadajo v isti koš.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

snow ::

tm* cas

Ustvari pointer, ki kaže na strukturo tipa tm.
Ampak njegova vrednost je lahko praktično karkoli, kjer jo nikjer ne določiš.

Tukaj si poglej primere pod asctime, gmtime itd.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Gundolf ::

tm* cas; // to je le deklaracija
int i; // isto deklaracija, kakšna je pa vrednost i-ja?

Da določiš vrednost tvojemu času moraš klicati kako funkcijo, katere rezultat shraniš v tvojo premenljivko 'cas'.

Edit: lol snow (ali pa lol jaz) :)

Zgodovina sprememb…

  • spremenil: Gundolf ()

fx ::

Kako bi s ansi c++ preveril če določen url je dosegljiv ali ne?

Ker v php to ni problem :
    function url($url) {
     $handle = @fopen($url, "r");
     if($handle == false){
       return false;
     }else{
       return true;
     }
     fclose($handle);
   }


Lp,


Vredno ogleda ...

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

Program za C++ jezik

Oddelek: Programska oprema
232769 (1804) popaj113
»

Kako bi naredil en ultra simple programček?

Oddelek: Programiranje
492222 (1503) AtaStrumf
»

C++ & XP

Oddelek: Programiranje
241581 (1188) Exilian
»

C++ in pavza

Oddelek: Programiranje
161156 (917) napsy
»

c++ datoteke

Oddelek: Programiranje
463831 (3320) Vesoljc

Več podobnih tem