Anonymní profil vitamin – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil vitamin – Programujte.comAnonymní profil vitamin – Programujte.com

 

Příspěvky odeslané z IP adresy 95.105.229.–

C / C++ › Otázka/Rada ohledně C++(náuka)
4. 8. 2015   #203993

#7 Marty

Skus si pozriet knihy a ine materiali od Scott Meyersa. Zistis ako malo toho o c++ vies :) Take variadic templaty a reference kolapsing ta zabavi... 

C / C++ › Výhody C oproti C++
14. 4. 2015   #201371

C ma oproti C++ a inym jazykom vyhodu ze kompilator je skoro vsade.

Dalsia vyhoda je v tom ze s C sa dobre pouziva z inych jazykov, vdaka tomu ze C nema pretazovanie operatorov, funkcii, namespaces, metody, templaty a ine vlastnosti ktore vyzaduju name mangling... Takze ked volate funckiu z 1 jazyka v inom jazyku, tak sa to velmi casto robi cez C interface.

C je jednoduchy jazyk (neznamena to e sa v nom pise jednoducho).

C / C++ › Výber maximálnych hodnôt zo…
19. 3. 2015   #200487

#4 ondrej39
Podla mna by stacilo nieco taketo:

typedef uint32_t IPv4Addr;
C / C++ › undefined reference to funct…
18. 3. 2015   #200411

#1 oxidián
Zrejme musis rilinkovat kniznicu.

C / C++ › Proč padá funkce po realloc?
12. 3. 2015   #200206

#6 oxidián
Preco je parameter buffer dvojity pointer?

Preco porovnavas unsigned cisla (size_t, uint32_t) so zapornymi cislami?

C / C++ › problém se vzorcem
10. 3. 2015   #200108

#3 ondrej39
Ved pouzi pow a vysledok pretypuj na int, ak ti ide o rychlost tak mocniny 2 si sprav cez switch(jump table) a bude to ovela rychlejsie.

Inak ipow moze vyzerat takto:


int ipow(int base, int exp){
    if(exp < 0)return 0;
    int res = 1;

    while(exp--)res *= base;
	
    return res;
}
C / C++ › problém se vzorcem
10. 3. 2015   #200106

#1 oxidián
zrejme mas chybu v ipow, skus spustit toto:

for(int level = 1; level < 19; ++level){
	if((int)pow(2, level) != ipow(2, level))printf("chyba pri exp == %d\n", level);
    }
C / C++ › problem se stringem
7. 3. 2015   #199919

#3 ellke
Aj tak to mas zle (daklaracia ma mat velkost 5).

Lepsie by sa to dalo napisat takoto:

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

int main(){
    enum{N = 5};
    string znak[N];

    cout << "Zadejte prvni znak" << endl;

    for(int i = 0; i < N; ++i){
        cin >> znak[i];
    }

    cout << endl;

    for(int i = 0; i < N; ++i){
        cout << znak[i] << endl;
    }

    return 0;
}
C / C++ › problem se stringem
7. 3. 2015   #199917

#1 ellke
Pole sa indexuje od 0, nie od 1.

C / C++ › Pár dotazů
7. 3. 2015   #199913

#31 oxidián
skus: 

char arr[LAST][50] = {{0}};
C / C++ › objektove programovani
26. 2. 2015   #199616

C++ je dost zlozity jazyk a webove tutoriali maju zlu kvalitu, doporucil by som radsej daku knihu (kludene aj vo forme pdf).

Knihy v cz/sk su vecsinou zastarale, preto sa viac oplatia knihy v eng: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list

C / C++ › Druhé nejmenší číslo v poli
6. 2. 2015   #198920

#53 hlucheucho
Moja chyba mam, tam chybu

#52 BDS
Od C99 nemusi byt deklaracia premennej na zaciatku bloku.

C / C++ › Druhé nejmenší číslo v poli
6. 2. 2015   #198917

#47 hlucheucho

Nefungovalo by to ani keby ze tam je N rovnakych cisiel, nemusia byt nutne 2 (kod som editol).

#49 BDS

  1. Preco by to nebolo C?
  2. mne to funguje aj s 0.

C / C++ › Druhé nejmenší číslo v poli
6. 2. 2015   #198911

#40 BDS
Slo by to aj jednoduhsie:


int DruheNejmensi(unsigned velikost_pole, const int *pole){
	assert(pole);
	assert(velikost_pole >= 1);

	int min_val = pole[0];
	int ok = min_val;
	
	for(unsigned i = 1; i < velikost_pole; ++i){
		if(pole[i] < min_val){
			ok = min_val;
			min_val = pole[i];
		}
	}
        //edit:
        if(min_val == ok)return INT_MAX;   

	return ok;
}
C / C++ › procházení vektoru - iteráto…
4. 2. 2015   #198819
C / C++ › procházení vektoru - iteráto…
4. 2. 2015   #198817

#30 hlucheucho
V poslednm case programujem D a robi sa v nom ovela lepsie ako v C++.

V tvojom pripade bude asi lpsie pouzit indexi, lebo rucne vypisovat typy iteratorov je strasna otrava (predpokladam ze builder nema auto z c++11)..

C / C++ › procházení vektoru - iteráto…
4. 2. 2015   #198815

#28 hlucheucho
Ja pouzivam iterovanie pomocou indexov len ak potrebujem modifikovat vector pocas iterovania. Ak by som pouzil iteratory tak by to neskoncilo dobre :). Ak mas c++11 tak samozrejme vstavany foreach, ak mas c++14 tak std::for_each a polymorficke lambdy.

vitamin
C / C++ › Spojový seznam
22. 1. 2015   #198302

#4 ondrej39

Raw pointre by sa nemali pouzivat na prenos vlastinctva, inak je ich pouzitie v c++ v poriadku.

C / C++ › Obrazce do dvourozměrného pole
10. 1. 2015   #197984

#7 Zelenáč
Naco ti je pole, nestaci nieco taketo?

#include <iostream>

enum{
	N = 10,
};

int main(){
	for(unsigned i = 0; i < N*N; ++i){
		if(i%N == 0)std::cout << std::endl;
		if(i%3 == 0)std::cout << '*';
		else std::cout << '0';
	}
	
	return EXIT_SUCCESS;
}
C / C++ › načítání retezce ze souboru
10. 1. 2015   #197981

V C++ pomocou getline.

V C treba zrejme nacitavat znak po znaku napr pomocou fgetc az do kym nenarazis na EOF, '\n' alebo ';'

C / C++ › Funkce typu 'funct(void (*pr…
6. 1. 2015   #197892

#1 Rick
Je to pointer na funkciu, premennu proc mozes pouzit ako keby to bola funkcia.

Ak programujes v c++, tak skus pouzit templaty kvoly inliningu.

Ak v C tak si davaj pozor na to ze je rozdiel medzi 'void (*)()' a 'void (*)(void)'

C / C++ › Jak vracet chybu funkce
6. 1. 2015   #197891

#8 Lukáš
skus isnan neviem ci je aj v C.

C / C++ › Jak vracet chybu funkce
6. 1. 2015   #197882

#1 Lukáš
Mozes vratit NaN:

double deleni(const double delenec, const double delitel) {
  if(delitel == 0)return 0.0/0.0;	//NaN
  return delenec / delitel;
}

edit: float/double moze okrem normalnych cisiel obsahovat aj kladnu a zapornu nulu, kladne a zaporne nekonecno a NaN (Not a number)

C / C++ › Použít assert nebo if jako o…
18. 12. 2014   #197388

#7 ondrej39
assert vecsinou funguje tak ze v debug mode sa testuje a v release mode sa asserty ignoruju.

Tak ako ti povedal Kit, asserty nemaju byt zavysle na vstupnych datach.

Ja pouzivam asserty na otestovanie chyb ktore by nemali nikdy nastat, testovanie takychto chyb pomocou if-ov vynimiek... zbytocne spomaluje program a zneprehladnuje kod, preto sa na ne hodi asserty ktore sa v release mode ignoruju.

C / C++ › Zakladni programovani-pointery
9. 12. 2014   #197099

#18 ingiraxo
Stratis pointer. V C++ sa nedoporucuje pouzivat ciste pointre/referencie na transfer vlastnictva. Vecsinou nebudes potrebovat vobec pointre a ak ano tak pouzi unique_ptr/shared_ptr.

C / C++ › Zakladni programovani-pointery
9. 12. 2014   #197096

#15 ingiraxo
Vratenie adresy lokalnej premennej je 'undefined behavior', to znamena ze compilator moze z kodom spravyt hocico, moze to nahodou fungovat tak ako si chcel, compilator moze pouzit daku optimalizaciu ktora ti totalne rozhasi cely kod a kludne ti to moze aj zmenit status na facebooku. Preto sa nevrcaju adresy lokalnych premennych.

C / C++ › Zakladni programovani-pointery
9. 12. 2014   #197089

#12 ingiraxo
Okrem toho ze ten tvoj priklad je chybny (viz KIIV a voty), tak s nim ani nic nedosiahnes lebo ak by si rovno vratil strukturu Time tak snad skoro kazdy prekladac pouzie pouzie copy elision optimalizaciu (alebo priamo vrati navratovu hondotu cez registre ak sa tam zmesti), pripadne rovno inlinuje celu funkciu. 

C / C++ › Teorie do praxe, aneb první…
9. 12. 2014   #197086

#1 igorS
Z akeho dovodu chces zacinat s winapi? Pre c++ by bolo lepsie Qt. Ak sa chces obmedzit len na windows tak skus radsej c#.

C / C++ › Bezparametrický destruktor s…
2. 12. 2014   #196833

#3 ondrej39
skus nieco taketo:

void DoubleList::smaz_seznam(DoubleListNode* head){
	cout << "Mazu seznam." << endl << endl;
	
	while(head){
		DoubleListNode* next = head->Next;
		delete head;
		head = next;
	}	
}
C / C++ › Kombinace písmen, znaků a čí…
29. 11. 2014   #196656

Nestailo by pridelovat obycejne cisla a pred vypisom ich skonvertovat do 26 ciselnej sustavy, ako znakovu sadu pouzit 'A' - 'Z'?

C / C++ › Načítání specifické proměnné…
22. 11. 2014   #196323

Na ciselne konstanty sa hodi enum:

enum{MAX_VKLAD = 100000};
C / C++ › sprintf formátování bool
18. 11. 2014   #196149

#1 hlucheucho
bool je automaticky pretypovany na int pri volani funkcie s premenlivym poctom parametrov, takze vzdy to bude 1 alebo 0.

C / C++ › Porovnání double
16. 11. 2014   #196092

Neabudejte na NaN :)

C / C++ › Kniha c++
11. 11. 2014   #195933

#1 polenog
Vecsinou je doporucovana kniha C++ Primer (5th Edition) (je aj vo forme pdf na TPB). 

Vsetky knihy ktore su v slovencine/cestine su velmi zastarale.

C / C++ › operator přetypování
11. 11. 2014   #195926

#12 Jurin
To bude bug v prekladaci.

C / C++ › operator přetypování
10. 11. 2014   #195899

#9 Jurin
skus si spustit toto a porozmyslat preco sa vystupy lisia:


struct Test{
	Test(){std::cout << "Test::Test()\n";}
	Test(Test& ){std::cout << "Test::Test(Test&)\n";}
	Test(int){std::cout << "Test::Test(int)\n";}
  	operator int(){std::cout << "Test::operator int()\n";}
  	~Test(){std::cout << "Test::~Test()\n";}
};


int main(){
    std::cout << "\nA:\n";{
        Test x;
        Test A = x;
    }

    std::cout << "\nB:\n";{
        Test B = Test();
    }

    return 0;
}
C / C++ › operator přetypování
10. 11. 2014   #195895
C / C++ › operator přetypování
10. 11. 2014   #195892

#5 Jurin
Ty zrejme narazas na tzv: "copy elision". Copy ctor sa nemusi volat ak kompilator vyoptymalizuje zbytocne kopie. Ak si vypnes optimalizacie tak sa ti budu volat vsetky ctory.

C / C++ › operator přetypování
10. 11. 2014   #195888

Lebo ::MyCreate() vracia Rvalue a konstruktor XXX::XXX(XXX &inRight) ocakava Lvalue parameter. Skus vytvorit copy konstruktor XXX::XXX(const XXX &inRight)  alebo ak mas c++11/14 tak mozes pouzit move constructor XXX::XXX(XXX &&inRight) .

C / C++ › Asi neplatný prístup do pamäti
9. 11. 2014   #195831

#3 vrtkoo
spz by mala mat fixnu velkost, mozes spravyt nieco taketo:

enum{ SPZ_SIZE = 7 };

typedef char SPZ[SPZ_SIZE+1];

void printSPZ(SPZ* spz){
    assert(spz);
    assert(SPZ_SIZE >= 7);
    printf("%.2s %.3s %.2s\n", (*spz), (*spz)+2, (*spz)+5);
}

void testSPZ(){
    SPZ spzs[] = {
        "BA123AB",
        "BA353AB",
        "DS353AB",
    };

    for(int i=0; i < 3; ++i){
        printSPZ(spzs+i);
    }
}
C / C++ › Načtení souboru C
8. 11. 2014   #195811

fseek a rewind ti nebudu fungovat so stdin. Takze si musis vstup nacitat do pamete (vyuzit napr malloc :)) alebo si vytvorit pomocny subor...

C / C++ › Nefunguje podmienka
8. 11. 2014   #195787

#1 vrtkoo
skusal si pouzit debuger alebo si si tam dat pomocne vypisy?

C / C++ › IFFT pomocí FFTW
8. 11. 2014   #195784

#1 JakubD
std::vector interne uchovava 3 hodnoty, alokovane pole(pointer na data), velkost alokovaneho pola ( capacity() ) a pocet prvkov(size()). Metoda rezerve() len zvysuje kapacitu, nevytvara konkretne prvky. Na pridanie prvku do vectora s pouziva push_back/emplace_back/insert/... alebo konstruktor  std::vector(pocet_prvkov, defaultna_hodnota). Metoda clear() vola destructory na vsetky prvky ktore boly pridane cez push_back/emplace_back/insert/... ale nemeni kapacitu(capacity()), len nastavy pocet prvkov(size()) na 0 a zavola destructory.

C / C++ › Dvakrát getchar()
8. 11. 2014   #195760

#5 lukas.balaz
Problem je ze take pole sa vytvara na stacku a stack je relativne maly (vecsinou radovo v jednotkach MB), ak bude pole dost velke tak nastane stackoverflow...

C / C++ › pole reťazcov
7. 11. 2014   #195743

#11 vrtkoo
ak bude v subore viac riadkov ako 30 tak si budes prepisovat data na stacku, preto tam treba mat este jednu podmienku:

while (i < 30 && (fgets(udaje[i], 52, subor)) != NULL){
	++i;
}
		

Radsej nepouzivaj magicke cisla.

C / C++ › pole reťazcov
7. 11. 2014   #195741

#9 vrtkoo
Cez staticke pole, potom ani nepotrebujes pomocnu premennu str, rovno budes zapisovat do toho pola.

void proc(){
    const int max_udaje_len = 30;
    const int max_data_size = 52;

    int udaje_len = 0;
    char udaje[max_udaje_len][max_data_size];
    FILE* file;

    if(!(file = fopen("data/subor.txt", "r"))){
        printf("subor fail");
        return;
    }

    while(udaje_len < max_udaje_len && fgets(udaje[udaje_len], max_data_size, file)){
        ++udaje_len;
    }

    if(ferror(file)){
        printf("subor fail");
        goto cleanup_file;
    }

    for(int i = 0; i < udaje_len; ++i){
        printf("%d. %s\n", i, udaje[i]);
    }

cleanup_file:
    fclose(file);
}
C / C++ › Použití FFTW3
7. 11. 2014   #195739

#1 JakubD 

Nemalo by byt vystupne pole vecsie ako vstupne?

Skus nieco taketo:

 vector<double> in(data, data+size);
 vector<fftw_complex> out((in.size()/2+1)*2, 0);


 fftw_plan p;

 p = fftw_plan_dft_r2c_1d(in.size(), in.begin(), out.begin(), FFTW_ESTIMATE);
 fftw_execute(p);   

C / C++ › pole reťazcov
7. 11. 2014   #195734

#6 Tomáš
Ked uz by si chcel pouzit tie zbytocne alokacie a chcel by si aj spravne dealokovat data pri chybach tak by si mohol pouzit nieco taketo:

void proc(){
    const int max_udaje_len = 30;
    const int max_data_size = 52;

    int udaje_len = 0;
    char str[max_data_size];
    char** udaje;
    FILE* file;

    if(!(file = fopen("data/subor.txt", "r"))){
        printf("subor fail");
        return;
    }

    if(!(udaje = (char**)malloc(max_udaje_len * sizeof(char*)))){
        printf("pamät fail");
        goto cleanup_file;
    }

    while(udaje_len < max_udaje_len && fgets(str, max_data_size, file)){
        if(!(udaje[udaje_len] = (char*)malloc(max_data_size))){
            printf("pamät fail");
            goto cleanup_malloc;
        }
        strcpy(udaje[udaje_len], str);
        ++udaje_len;
    }

    if(ferror(file)){
        printf("subor fail");
        goto cleanup_malloc;
    }

    for(int i = 0; i < udaje_len; ++i){
        printf("%d. %s\n", i, udaje[i]);
    }

cleanup_malloc:
    for(int i = 0; i < udaje_len; ++i){
        free(udaje[i]);
    }
    free(udaje);

cleanup_file:
    fclose(file);

}
C / C++ › Rozeznání čísla
6. 11. 2014   #195695

#8 Kit
Napr ked robis lexer a v cykly prechadzas znaky tak ak checes preskakovat biele znaky tak sa continue/break hodi.

C / C++ › Rozeznání čísla
6. 11. 2014   #195693

#6 Kit
Niesu zbytocne. Samozrejme je dobre minimalizovat pouzivanie goto/break/continue. Ale nie za kazdu cenu, niekedy je goto/break/continue prehladnejsie ako alternativy.

C / C++ › Rozeznání čísla
6. 11. 2014   #195690

#4 hlucheucho
V C sa goto dost casto pouziva na uvolnovanie zdrojov, v c++ je vo vecsine pripadov zbytocne (cest vynimkam ako stavove automaty a break cyklu ak si v switchi...).

C / C++ › std::queue - přetížit destru…
6. 11. 2014   #195689

#18 hlucheucho
Templaty musia byt v hlavickach (ak ich chces pouzit vo viacerych moduloch). Exportovanie templatov do cpp suboru bolo zo standardu odstranene.

C / C++ › Převod písmen
5. 10. 2014   #194552

Budes potrebovat 2 indexy, jeden z ktoreho budes citat(v tvojom pripade je to i) a este jeden ktory budes pouzivat na zapis. Ten na zapis incrementujes len vtedy ak sa znak nebude rovnat '_'..

C / C++ › navrh tridy
28. 9. 2014   #194357

#8 Scrat

operator '->' je nieco ako operator '.' len dereferencuje vyraz na lavej strane. Je to v podstate len skrateny zapis tohto:

struct S{
	void fnc();
};

int main(){
	S s;
	S* ptr = &s;

	
	//tieto vyrazy funguju totozne: 
        s.fnc();
	ptr->fnc();
	(*ptr).fnc();


}
C / C++ › navrh tridy
28. 9. 2014   #194334

#5 Scrat
staticka globalna funkcia je nieco ako privatna funkcia pre danu komilacnu jednotku ("modul"), daj si ale pozor, staticka metoda je nieco ine.

C / C++ › navrh tridy
28. 9. 2014   #194333

#3 Scrat
Je to mozne:

int object::Load(LPWSTR soubor){
	this->~object();
	new(this) object(subor);
	//...
}

Ale to riesenie od KIIV je lepsie.

C / C++ › Prepis výrazu z infixu do po…
28. 9. 2014   #194331

Aky ocakavas vstup a aky vystup?

Toto ti funguje? :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>


typedef struct zasobnik
{
	int data[10000];				//pole pre pismenka a operatori ktore budem davat do zasobnika
	int vrch;					//vrch zasobnika
}zasobnik;

char vrch(zasobnik *s);
int priorita(char);
int je_prazdny(zasobnik *s);
char vyber(zasobnik *s);
void vloz(zasobnik *s, char x);
int je_plny(zasobnik *s);
void inicializacia(zasobnik *s);

int main()
{
	zasobnik s;
	char x;
	int c;
  	inicializacia(&s);				//inicializacia vrchu zasobnika
	while ((c = getchar()) > 0)
	{
     
      	if (c >= 'A' && c <= 'Z')		//ak je to pismeno tak ho vypise
			printf("%c", c);
		else
			if (c == '(')				//ak je to lava zatvorka tak vlozi do zasobnika
				vloz(&s, '(');
			else
			{
				if (c == ')')			//ak je to prava zatvorka tak..
					while ((x = vyber(&s)) != '(')	//..sa vybera zo zasobnika kym nenarazi na pravu zatvortku
						printf("%c", x);
				else					//ak je to operator
				{
					while (priorita(c) <= priorita(vrch(&s)) && je_prazdny(&s) != 1)	//porovna sa priorita operatoru
					{
						x = vyber(&s);
						printf("%c", x);
					}
					vloz(&s, c);		//vlozenie operatoru
				}
			}
        
      }
    
  	
    while(je_prazdny(&s) != 1)		//vyprazdnenie zasobnika
	{
		x = vyber(&s);
		printf("%c", x);
     }
  
	getchar();
	getchar();
	return 0;
}


int priorita(char x){
	switch(x){
		case '(':
			return 0;
			
		case '+':
		case '-':
			return 1;
		
		case '*':
		case '/':
			return 2;
			
	}
	
	assert(0);
}

int je_prazdny(zasobnik *s){
	assert(s);
	return s->vrch == -1;
}

void inicializacia(zasobnik *s){
	assert(s);
	s->vrch = -1;
}

void vloz(zasobnik *s, char x){
	assert(s);
	assert(s->vrch >= -1);	
	assert((s->vrch+1) < (int)(sizeof(s->data)/sizeof(int)));
	
	s->vrch++;
	s->data[s->vrch] = x;				//zapisem znak
}

char vyber(zasobnik *s){
	assert(s);
	assert(s->vrch >= 0);
	assert(s->vrch < (int)(sizeof(s->data)/sizeof(int)));
	
	char x = s->data[s->vrch];
	s->vrch--;
	return x;
}

char vrch(zasobnik * s){
	assert(s);
	assert(s->vrch >= 0);
	assert(s->vrch < (int)(sizeof(s->data)/sizeof(int)));
	
	return s->data[s->vrch];			//vrati znak ktory je na vrchu zasobnika
}
C / C++ › hlavickove soubory a undecla…
23. 9. 2014   #194181

Precompiled Headers je nestandartne riesenie (nie je definovane v c++ stndarde) ktore riesi dlhe kompilacie ktore su sposobene absenciou modulou v c++. Ak si zaciatocnik tak sa uplne vykasli na predkompilovane hlavicky a zacni sa s nimi zaoberat az ked budes mat vecsi projekt a kompilacia bude trvat dlho.

edit: Mozno dovtedy budu v standarde moduly: http://llvm.org/devmtg/2012-11/videos/Gregor-Modules.mp4 :)

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý