Příkaz if ve funkci – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Příkaz if ve funkci – C / C++ – Fórum – Programujte.comPříkaz if ve funkci – C / C++ – Fórum – Programujte.com

 

etro00
~ Anonymní uživatel
1 příspěvek
15. 7. 2014   #1
-
0
-

 Dobrý den.Potřeboval bych prosím poradit, jak bych mohl tyto podmínky if napsat v podobě funkce() , která mi pak vrátí nějakou tu hodnotu.S funkcemi nově začínám, takže budu vděčný za každou radu.

                                                                                                                                           Děkuji

#include <iostream>
#include <fstream>
using namespace std;
int podminka()

int main()
{
 ifstream soubor; 
    soubor.open ( "CISLA.txt");
    int min = 0; 
    int max = 0; 
    int cislo;
    while ( !soubor.eof() ) { 
        soubor >> cislo;
       
        if ( min == 0 ) {
            min = cislo;
        }
       
        if ( cislo > max ) {
            max = cislo;
        }
        
        if ( cislo < min ) {
            min = cislo;
        }
    }
    soubor.close();
    cout << "Nejvetsi cislo : " << max << endl << "Nejmensi cislo : " << min << endl;
    return 0;
}
Nahlásit jako SPAM
IP: 88.103.70.–
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #2
-
0
-

tak slo by to, ale nevidim moc smysl u takovy jednoduchy ulohy... hlavne jestli chces jen tu podminku nebo cele ty ify

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #3
-
+1
-
Zajímavé

mimochodem treba takhle nejak by to mohlo vypadat v c++11 standardu (na ty lambda funkce a foreach for a auto) :D

#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <vector>

using namespace std;

int main ()
{
  int cnt = 0;
  double min;
  double max;

  vector< function<void (double)> > functions {
    [&cnt,&min,&max](double x){ if (++cnt == 1) { min = x; max = x; } }, // init and count
    [&min](double x){ if (x < min) min = x; }, // min
    [&max](double x){ if (x > max) max = x; }  // max
  };

  istream_iterator<double> eos;
  istream_iterator<double> iter(cin);

  for_each(iter, eos, [&functions](double x){ for (auto & func : functions) { func(x); } });

  cout << "max: " << max << " min: " << min << " count: " << cnt << endl;

  return 0;
}
Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #4
-
0
-

#3 KIIV
Ale no tak, vybafnout na začátečníka takový overkill. Vždyť i mne to vyděsilo.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #5
-
+1
-
Zajímavé

#4 Kit
nadruhou stranu cim mene vlastniho kodu, tim mensi pravdepodobnost chyb :)

(ikdyz to sem tam pak mohl jeste pouzit funkci  std::min/std::max)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #6
-
0
-

#5 KIIV
nadruhou stranu cim mene vlastniho kodu, tim mensi pravdepodobnost chyb :)

Snad naopak, ne?

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #7
-
0
-

kdyby byla chyba ve for_each, istream_iterator, for tak je daleko pravdepodobnejsi, ze si toho nekdo uz davno vsiml.. tudiz cim mene vlastniho kodu, tim spise to bude funkcni

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #8
-
0
-

#7 KIIV
Stejně si myslím, že by ten program měl být přehlednější a čitelnější. Takový kód mě vyloženě od C++ odpuzuje. Není z něho na první pohled vidět, co ten program má dělat.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #9
-
0
-

#8 Kit
neregistruju zadnou vetsi prehlednost.. jen vyrazne vic mist, kde to clovek posere:

#include <iostream>

using namespace std;

void min_fn(double num, double &min)
{
  if (num<min)
  {
    min = num;
  }
}

void max_fn(double num, double &max)
{
  if (num>max)
  {
    max = num;
  }
}

int main ()
{
  int cnt = 0;
  double min = 0;
  double max = 0;

  
  while (!cin.eof())
  {
    double x;
    cin >> x;
    if (!cin.fail())
    {
      if (cnt == 0)
      {
        min = max = x;
      }
      ++cnt;
      min_fn(x,min);
      max_fn(x,max);
    }
    else
    {
      break;
    }
  }

  cout << "max: " << max << " min: " << min << " pocet: " << cnt << endl;
  return 0;
}

EDIT: coz tazatel samozrejme dokazal ... tim ze netestuje ten fail, tak kdyz zada neco co neni cislo v souboru, tak se to zacykli...

taktez nemusi existovat soubor -> cyklus

a jeste zaludnejsi je, ze se mu tam posledni cislo objevi 2x :D

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #10
-
0
-

#9 KIIV 

Fuj, ty nemáš rád funkce?

#include <iostream>

using namespace std;

double min_fn(double num, double min) {
    return (num < min) ? num : min;
}

double max_fn(double num, double max) {
    return (num > max) ? num : max;
}

int main() {
    int cnt = 0;
    double min = 0;
    double max = 0;
    while (!cin.eof()) {
        double x;
        cin >> x;
        if (cin.fail()) {
            break;
        }
        if (cnt == 0) {
            min = max = x;
        }   
        ++cnt;
        min = min_fn(x, min);
        max = max_fn(x, max);    }
    cout << "max: " << max << " min: " << min << " pocet: " << cnt << endl;
    return 0;
}
Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #11
-
0
-
Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #12
-
0
-

#11 KIIV
To je jasné, v tomto příkladu jde však o něco jiného.

Ještě jsem vyhodil ten zbytečný else, který jsi tam nacpal. Klíčové slovo else by měli zakázat.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #13
-
0
-

pak jeste ty internety a goto, tj. break taky zahodit - a pak samozrejme rovnou programovani

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #14
-
0
-

#13 KIIV
Klíčová slova goto a break jsou většinou také zbytečná. V tom příkladu jsem break ponechal, ale normálně bych se bez něho obešel. Ty někdy používáš goto? Já ne. V C úplně zbytečné - patří do assembleru (tedy instrukce JMP).

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #15
-
0
-

v C je zrovna goto nekdy nezbytny, pokud mas za ukol zabrat vic resourcu a v pripade neuspechu je postupne zase uvolnit.. resource handling/error handling je v ramci C hotovy peklo

a to jak se vyhnout tomu celymu while a error handlingu sem mel hned v prvnim prikladu.. istream_iterator zvladne jak neexistujici soubor, tak prazdnej, tak spatny hodnoty...

dejme tomu ze pole funkci, co to pocitaj by se taky dalo vymenit za neco jinyho .. ale takhle pak staci hodit push_back a zpracovava to najednou i neco dalsiho

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #16
-
0
-

#15 KIIV
Nevím, jaké je peklo ve vícenásobně vnořeném try..catch. Když to všechno mydlíš do jedné funkce, tak se nediv, že se v tom pak nemůžeš vyznat. Netuším, jak by ti goto mohlo pomoct. Spíš ti naopak jen uškodí.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #17
-
0
-

#16 Kit
si pletes C++ a C.. C nema nic jako try catch... a C++ ma jinou vychytavku - RAII (konstruktor resource zabere/destruktor uvolni) a nemusi se vubec hlidat, kde to vyskakuje, kde vypadne vyjimka a tak.. jak to vyskoci ze scope, tak se zavola destruktor

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #18
-
0
-

#17 KIIV
Však tady se od prvního řádku bavíme o C++. Žádný z uvedených příkladů nejde zkompilovat v C.

RAII to samozřejmě řeší. Není to však jiná vychytávka, ale jen syntaktický cukr nad try..catch.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #19
-
0
-

#14 Kit
Klíčová slova goto a break jsou většinou také zbytečná. V tom příkladu jsem break ponechal, ale normálně bych se bez něho obešel. Ty někdy používáš goto? Já ne. V C úplně zbytečné - patří do assembleru (tedy instrukce JMP).

+ RAII podle me neni zadna syntaxe.. to je proste specialni objekt

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #20
-
0
-

#19 KIIV

Když je goto zbytečné v C, tak je tuplem zbytečné i v C++. Měl jsem na mysli oba jazyky, zřejmě jsem to měl napsat jako C/C++, abys mě nechytal za slovo.

RAII je jen taková berlička, která by fungovala dobře, kdyby v C++ fungovaly destruktory tak jak mají.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #21
-
0
-

V C++ nefunguji destruktory? Tell me more about it...

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
15. 7. 2014   #22
-
0
-

už se perou?  

hu

Nahlásit jako SPAM
IP: 193.86.81.–
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #23
-
0
-

#22 hlucheucho
uz jen cekam, kdy na me vytahne ten garbage collector :D

Jak by pak chtel dokazat osetrit zabirani resourcu, kdyz nezvladne ani osefovat vlastni alokovanou pamet :D

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #24
-
0
-

#21 KIIV
Tak proč tohle nefunguje? 

#include <iostream>

using namespace std;

class Pes {
    string jmeno;
    public:
        Pes(string s): jmeno(s) {
            cout << "Já jsem " << s << endl;
        }
        ~Pes() {
            cout  << jmeno << " chcípl" << endl;
        }
};

int main() {
    {
        Pes *pejsek;
        pejsek = new Pes("Alík");
        pejsek = new Pes("Azor");
    }
    cout  << "Oba by měli chcípnout, protože jsem opustil scope" << endl;
    return 0;
}

Oba by měli chcípnout, ale nechcípne ani jeden. Když tam dám nakonec delete pejsek, tak chcípne jen ten jeden.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
15. 7. 2014   #25
-
+1
-
Zajímavé

#23 KIIV
Garbage collector s tím nemá nic společného.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #26
-
0
-

#25 Kit
 

#include <iostream>
#include <memory>

using namespace std;

class Pes {
    string jmeno;
    public:
        Pes(string s): jmeno(s) {
            cout << "Já jsem " << s << endl;
        }
        ~Pes() {
            cout  << jmeno << " chcípl" << endl;
        }
};

int main() {
    Pes statickej("Alik");

    unique_ptr<Pes> dynamickej(new Pes("Azor"));
    dynamickej = unique_ptr<Pes>(new Pes("Zeryk"));
    
    cout  << "Vsichni by meli chcipnout" << endl;
    return 0;
}

garbage collector je to co ti chybi...

proste kdyz das new, tak to vraci jen pointer na nove vytvoreny objekt, a pointery destruktory proste nemaj...

kdyz vytvoris statickej objekt (tj. to prvni, tak to krasne zavola destruktor)

pokud chces presto dynamickou alokaci, musis pouzit RAII - to je ten unique_ptr<typ> objekt(new typ(...));  -- to vytvori objekt obsahujici pointer a postara se i o uvolneni v destruktoru

a lepsi je ze se postara i o uvolneni pokud ho preplacnes jinym objektem

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #27
-
0
-

#26 KIIV
Psal jsem, že garbage collector s tím nemá nic společného. Ten řeší pouze defragmentaci paměti, ale destruktory ho nezajímají.

Kromě toho ten tvůj poslední příklad nefunguje.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #28
-
0
-

#27 Kit
samozrejme ze funguje.. jen se musi zkompilovat se -std=c++0x / c++11   jinak bys tam musel dat auto_ptr nebo boost nebo vlastni objekt

$ g++ -std=c++0x main.cpp 
$ ./a.out 
Já jsem Alik
Já jsem Azor
Já jsem Zeryk
Azor chcípl
Vsichni by meli chcipnout
Zeryk chcípl
Alik chcípl
Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #29
-
0
-

#28 KIIV
Teď už to funguje. Stačilo přidat "-std=c++0x" do Makefile.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #30
-
0
-

pak je jeste shared_ptr a ten ma i pocet referenci, takze se objekt zrusi az kdyz se zrusi vsechny reference - jde ruzne predavat pres fronty, predavat parametrem a tak

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Satik0
Stálý člen
15. 7. 2014   #31
-
0
-

#24 Kit
To mě pobavilo, vytvořit memory leak a pak se divit, že se nevolá destruktor :)

Nahlásit jako SPAM
IP: 46.255.9.–
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #32
-
0
-

#31 Satik
na jeho obhajobu: v jave se vsechno vytvari pres new a o uvolnovani se stara GC

v c++ se tak alokuje dynamicka pamet - coz vraci jen pointer a ten se musi taky uvolnit pomoci delete (nebo zmineneho unique_ptr/shared_ptr)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #33
-
0
-

#31 Satik
No jo, C++ je na memory leaky háklivé. Myslíš si, že jsem nevěděl, proč to tak píši? V jiných jazycích by to normálně fungovalo i s vypnutým GC, ale v C++ to prostě neprojde.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Satik0
Stálý člen
15. 7. 2014   #34
-
0
-

#32 KIIV
Ja vim, spis jsem tim narazel na to, ze Kit rad casto diskutuje o necem, v cem se moc nevyzna a pri tom se snazi tvarit, ze vyzna :) .

Nahlásit jako SPAM
IP: 46.255.9.–
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #35
-
0
-

#33 Kit
jakych jinych?

proste pointer je pointer, je to stejna promenna jako integer nebo long long integer.. v jave se taky nelikvidujou typy jako  int.

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Satik0
Stálý člen
15. 7. 2014   #36
-
0
-

#33 Kit

Myslíš si, že jsem nevěděl, proč to tak píši?

Zrejme jsi to nevedel, pokud by jsi od toho chtel funkcnost, kterou jsi cekal, musel by jsi je vytvaret staticky na stacku a ne pres new, pak by to v C++ fungovalo a pri opusteni scopu by se zavolal destruktor.

Kdyz vytvaris instanci tridy pres new, musis vzdy nekde zavolat delete.

Nahlásit jako SPAM
IP: 46.255.9.–
Kit+15
Guru
15. 7. 2014   #37
-
0
-

#35 KIIV 

PHP s vypnutým garbage collectorem:

<?php
class Pes {
    private $jmeno;

    function __construct($jmeno) {
        $this->jmeno = $jmeno;
        echo "Já jsem " . $this->jmeno . "\n";
    }

    function __destruct() {
        echo $this->jmeno . " chcípl\n";
    }
};

gc_disable();
$pejsek = new Pes("Alík");
$pejsek = new Pes("Azor");
$pejsek = new Pes("Ben");

 Výstup:

Já jsem Alík
Já jsem Azor
Alík chcípl
Já jsem Ben
Azor chcípl
Ben chcípl
Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #38
-
0
-

sem cekal teda javu ...

ale dobry vedet ze ve scriptovacim jazyce psanem v C to funguje (bych se divil, kdyby ne, kdyz uz to tam taky je) - ale promenne tam urcite nejsou pointery

(teda jsou - resources obcas ano, ale ty musis taky dusledne uvolnovat - jen se malo kdy predpoklada, ze script pobezi nejak zvlast dyl, nez vyrobi jednu stranku)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #39
-
0
-

#38 KIIV
Podle testů bych si tipl, že přes pointery jsou v PHP i čísla. Proto se v PHP vyhýbám složitějším výpočtům.

Ještě Python: 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Pes:
    def __init__(self, jmeno):
        self.jmeno = jmeno
        print("Já jsem " + self.jmeno)

    def __del__(self):
        print(self.jmeno + " chcípl")

pejsek = Pes("Alík");
pejsek = Pes("Azor");
pejsek = Pes("Ben");

a výstup:

Já jsem Alík
Já jsem Azor
Alík chcípl
Já jsem Ben
Azor chcípl
Ben chcípl
Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #40
-
0
-

#39 Kit
v jave to neni o moc lepsi.. vsude sama reference, coz je to samy jako pointer...

i blby pole objektu je temer jisty, ze to bude rozhazeny kdo vi kde po pameti

PHP je proste scriptovaci jazyk.. je to jen interpret (sice mozna uz kompilovanej pri spusteni)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
15. 7. 2014   #41
-
0
-

#40 KIIV
V Javě je to špatné stejně jako v C#: 

public class Pes {
    public static class Test {
        public static void main(String[] args) {
            Pes pejsek;
            pejsek = new Pes("Alík");
            pejsek = new Pes("Azor");
            pejsek = new Pes("Ben");
            System.runFinalizersOnExit(true);
        }
    }

    private String jmeno;

    public Pes(String jmeno) {
        this.jmeno = jmeno;
        System.out.println("Já jsem " + jmeno);
    }

    protected void finalize() throws Throwable {
        System.out.println(jmeno + " chcípl");
    }
}

Výstup: 

Já jsem Alík
Já jsem Azor
Já jsem Ben
Ben chcípl
Azor chcípl
Alík chcípl

Bez toho System.runFinalizersOnExit(true); by nechcípl žádný.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
p3can
~ Anonymní uživatel
312 příspěvků
15. 7. 2014   #42
-
0
-

zminovat C# byla chyba   

nvm co resis ze GC v C# funguje spatne kdyz v C# se deterministická destrukce resi pres using ( ale to uz se tu parkrat resilo :) ). GC je pouze k tomu aby ti resil uvolnovani objektu automaticky az uzna za vhodne sam.

Proto se v PHP vyhýbám složitějším výpočtům.

netvrdils este minuly tyden ze v php delas vsecko aj aplikace na klientovi?

Nahlásit jako SPAM
IP: 77.92.213.–
Kit+15
Guru
15. 7. 2014   #43
-
0
-

#38 KIIV
Ještě jsem modifikoval příklad v PHP: 

$pejsek = new Pes("Alík");
$alik = $pejsek;
$pejsek = new Pes("Azor");
$azor = $pejsek;
$pejsek = new Pes("Ben");
echo "Všichni psi žijí\n";

A výstup: 

Já jsem Alík
Já jsem Azor
Já jsem Ben
Všichni psi žijí
Azor chcípl
Alík chcípl
Ben chcípl
Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
15. 7. 2014   #44
-
0
-

no a v C++ by to uvolnilo vzdy jakmile bys to prepsal tim dalsim objektem (unique_ptr)

objekt na stacku by se akorat prepisoval (pokud by nebyl zakazanej assign operator) - tam se pripadne uvolnovani zdroju alokovanych v objektu extra

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ekral
~ Anonymní uživatel
41 příspěvků
15. 7. 2014   #45
-
0
-

#20 Kit

Jako c++ má normálně deterministickou destrukci objektů. RIIA je způsob jak po sobě může objekt uklidit i když k vyjímce a je to prakticky základ c++ (Bjarne Stroustrup to nikdy nezapomene zmínit v žádné přednášce). C# nemá deterministickou destrukci, ale nabízí klíčové slovo using a IDisposable. 

Jinak souhlasím, že je lepší v c++ používat standardní knihovnu, mně třeba ten příklad s lambda výrazy, for_each a range based loop. Jenom tam je trochu trikové, že defaultní konstruktor istream_iteratoru vrací konec streamu.

Nahlásit jako SPAM
IP: 195.113.99.–
ekral
~ Anonymní uživatel
41 příspěvků
16. 7. 2014   #46
-
0
-

#43 Kit

Jinak u toho příkladu co píšeš, tak v c++11 záleží co je to za třídu.V c++11 a vyšším to můžeš to právě hodně "vytunit", můžeš si řídit kopírování, přesouvání a přiřazování a nebo tohle všechno můžeš zakázat. Klidně můžeš zakázat přiřazení, že ani nepřeložíš. mezi sebou nepůjde přiřazovat atd. A nebo můžeš při přiřazení naopak převést třeba alíka na rvalue a přesunout vše co má do Azora. Je to tam prostě složitější, ale c++ to zvládá v pohodě. Jenom je potřeba být opatrný s ukazately a raději vždy použít RIIA, což se vracím k tomu, že je to v c++ základ.

Nahlásit jako SPAM
IP: 195.113.99.–
Kit+15
Guru
16. 7. 2014   #47
-
0
-

#42 p3can
GC v C# funguje dobře, ale destruktory fungují špatně, protože čekají na povel od GC, který může přijít pozdě. Naštěstí se o této "vlastnosti" obecně ví, takže programátoři s tím počítají a nedávají do destruktorů např. zavírání souborů.

PHP používám hlavně jako lepidlo mezi databází, webserverem a šablonami. Tedy na manipulaci se stringy a objekty. Na práci s čísly se PHP moc nehodí a na práci s financemi už vůbec ne. Finance se řeší nejlépe přímo v databázi, PHP dodává jen vstupní údaje a přebírá reporty.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
p3can
~ Anonymní uživatel
312 příspěvků
16. 7. 2014   #48
-
0
-

az na to ze destruktory funguji dobre (spatne znamena ze nefunguji nebo buguji, to ze funguji jinak nez chces neznamena ze je to spatne).

a taky az na to ze presne do destruktoru se dava (v destruktoru se vola dispose) to zavirani souboru i C# ale dobry pokus xD

Nahlásit jako SPAM
IP: 77.92.213.–
Kit+15
Guru
16. 7. 2014   #49
-
0
-

#48 p3can
To znamená, že když v cyklu budu volat funkci, která otevře číselník a vyhledá mi záznam, tak mi aplikace spadne kvůli vyčerpání počtu volných deskriptorů. Skvělá vlastnost.

Prostě v C# si zavírání souboru musím ohlídat sám a nemůžu se spoléhat na destruktor. Ostatně takové doporučení je i v manuálu.

Další (doporučenou) možností je používání using.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ekral
~ Anonymní uživatel
41 příspěvků
16. 7. 2014   #50
-
0
-

#49 Kit

Čteš vůbec co ti tady lidi píšou? Však ti p3can v tady tom vlakně o tom using jasně psal:

nvm co resis ze GC v C# funguje spatne kdyz v C# se deterministická destrukce resi pres using ( ale to uz se tu parkrat resilo :) )

Nahlásit jako SPAM
IP: 195.113.99.–
Kit+15
Guru
16. 7. 2014   #51
-
0
-

#48 p3can
Tak jsem destruktor v C# obešel přes using: 

using System;

class Pes : IDisposable {
    static void Main(string[] args) {
        using (Pes alik = new Pes("Alík")) {
            Console.WriteLine(alik);
            using (Pes ben = new Pes("Ben")) {
                Console.WriteLine(ben);
            }
            using (Pes civil = new Pes("Civil")) {
                Console.WriteLine(civil);
            }
        }
    }

    private string Jmeno { get; set; }

    public override string ToString() {
        return Jmeno + " žije";
    }

    public Pes(string jmeno) {
        Jmeno = jmeno;
        Console.WriteLine("Já jsem " + Jmeno);
    }

    public void Dispose() {
        Console.WriteLine(Jmeno + " chcípl");
    }
}

Výstup:

Já jsem Alík
Alík žije
Já jsem Ben
Ben žije
Ben chcípl
Já jsem Civil
Civil žije
Civil chcípl
Alík chcípl

Takhle nějak jsem si to představoval.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
p3can
~ Anonymní uživatel
312 příspěvků
16. 7. 2014   #52
-
0
-

#49 Kit

no C# ma proste jinak resenou spravu objektu. chapu ze v php je to "lepsi" ale C# diky tomu muze nabidnout vyzsi vykon.

Nahlásit jako SPAM
IP: 77.92.213.–
Kit+15
Guru
16. 7. 2014   #53
-
0
-

Totéž v Javě. Jen místo using se používá try: 

public class Pes implements AutoCloseable {
    public static class Test {
        public static void main(String[] args) {
            try (Pes alik = new Pes("Alík")) {
                System.out.println(alik);
                try (Pes ben = new Pes("Ben")) {
                    System.out.println(ben);
                }
                try (Pes civil = new Pes("Civil")) {
                    System.out.println(civil);
                }
            }
        }
    }

    private final String jmeno;

    public Pes(String jmeno) {
        this.jmeno = jmeno;
        System.out.println("Já jsem " + jmeno);
    }

    public void close() {
        System.out.println(jmeno + " chcípl");
    }

    @Override
    public String toString() {
        return jmeno + " žije";
    }
}

Výstup: 

Já jsem Alík
Alík žije
Já jsem Ben
Ben žije
Ben chcípl
Já jsem Civil
Civil žije
Civil chcípl
Alík chcípl

Teď už to nemá chybu.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
16. 7. 2014   #54
-
0
-

#52 p3can
Aplikace v C# nemusí mít vyšší výkon než aplikace v PHP. Záleží na tom, jak jsou napsány. Když se oba jazyky správně používají, tak je rychlost srovnatelná. Každý jazyk je však určen k jinému účelu, i když se oblasti použití dost překrývají.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
p3can
~ Anonymní uživatel
312 příspěvků
16. 7. 2014   #55
-
0
-

tak to asi tezko xD

php je jazyk interpretovany zatimco c# pouziva JIT (muzeme povazovat za kompilovany). rozdily ve webech mezi php a asp.net nejsou nejak markantni, ovsem co se tyka vypocetnich veci je rozdil drasticky.

rozdil mezi C++ a C#/Java je asi 1.5-3x. rozdil mezi Java a PHP je tak +-50x.

(co clovek najde po zbeznem googleni)

http://www.treehugger.com/clean-technology/facebook-could-eliminate-75-of-its-servers-by-changing-their-programming-code.html

http://blog.famzah.net/2010/07/01/cpp-vs-python-vs-perl-vs-php-performance-benchmark/

http://benchmarksgame.alioth.debian.org/u64q/benchmark.php?test=all&lang=php&lang2=java&data=u64q

http://www.wrensoft.com/zoom/benchmarks.html

Nahlásit jako SPAM
IP: 77.92.213.–
vitamin+8
Grafoman
16. 7. 2014   #56
-
0
-

Toto je sekcia pre c++, nie porovnaanie spravy objektov medzi c#, javou a php...

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kit+15
Guru
16. 7. 2014   #57
-
0
-

#56 vitamin
Pokud jsi moderátorem, tak to zkus rozdělit a přesunout tam, kam to patří.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
vitamin+8
Grafoman
16. 7. 2014   #58
-
0
-

#57 Kit
Niesom moderator.

Kam vlastne smeruje tato diskusia? Vadi ti ze jazyk s manualnou spravou pamete ti automaticky nespravuje pamet, alebo sa snazis niekoho presvedcit ze automaticka sprava pamete je lepsia ako manualna, pripadne len porovnavas gc s manualno spravou pamete alebo nieco ine? 

Nahlásit jako SPAM
IP: 95.105.152.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kit+15
Guru
16. 7. 2014   #59
-
0
-

#58 vitamin
GC do toho vůbec netahej, s likvidací objektů nemá nic společného. Pouze defragmentuje paměť. Přečti si to vlákno pořádně.

Ta diskuze už nikam nesměřuje. Tazatel dostal odpovědi na své otázky a teď tady tlacháme o objektech a jejich životnosti. A někteří do toho neomaleně vstupují a kritizují nás za to, že jsme ve špatné sekci. A to i přesto, že nejsou moderátory a nemohou s tím nic udělat.

Kdybych byl moderátorem, už bych to vlákno rozdělil a přesunul. Jenže nejsem, takže se o to ani nepokouším a nedržkuji.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ekral
~ Anonymní uživatel
41 příspěvků
16. 7. 2014   #60
-
0
-

#58 vitamin

No je to jasný offtopic, ale když člověk čte, co tu Kit uvádí za tvrzení, tak se to nedá prostě vydržet a neopravit to. Kit prostě tvrdí, že gc v c# a asi i v jave a RIIA v c++ jsou prostě špatně a jediné kde je to "dobře" je PHP.  A vůbec neřeší otázky výkonu atd.

Ale abych citoval přesně Kita:

RAII je jen taková berlička, která by fungovala dobře, kdyby v C++ fungovaly destruktory tak jak mají.

Prostě ultra nesmysl. V c++ fungují destruktory jak mají, je tam prostě víc možnost:

  • automatická správa paměti pro objekty na zásobníku, static a extern objekty.
  • manuální správa paměti pro objekty na haldě,
  • atuomatická správa paměti na haldě pomocí chytrých ukazatelů (reference counting) a
  • je možné použít i GC, ale c++ myslí definuje jenom interface a není tam konkrétní implementace GC.

RIIA potom není jenom otázka správy paměti, ale doporučený postup pro exception-safe resource management v c++ a dalších jazycích, kdy každý resource má mít svůj handler na zásobníku a využívá se toho, že objekty na zásobníku se uvolní i v případě vyjímky a zavolá se desktruktor.

Nahlásit jako SPAM
IP: 195.113.99.–
p3can
~ Anonymní uživatel
312 příspěvků
16. 7. 2014   #61
-
0
-

#60 ekral
taky sem to nemohl vydrzet xD

#59 Kit

GC do toho vůbec netahej, s likvidací objektů nemá nic společného. Pouze defragmentuje paměť.

citace z wiki:

The basic principles of garbage collection are:

Find data objects in a program that cannot be accessed in the future.
Reclaim the resources used by those objects.

citace z MSDN (z topicu o zakladech GC):

When a finalizable object is discovered to be dead, its finalizer is put in a queue so that its cleanup actions are executed ....

coz se da cele interpterovat jakoze GC vyhledava neplatne objekty a spousti na nic destruktory.

Nahlásit jako SPAM
IP: 77.92.213.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Podobná vlákna

Prikaz if — založil doma22

Příkaz UPDATE — založil Pavelv

CGI příkaz — založil Pelcik

Příkaz Handle — založil Paulí

Moderátoři diskuze

 

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