Assembly a jazyková interoperabilita
Transkript
1 Assembly a jazyková interoperabilita ř Cílem následující ukázky je poskytnout p íklad nazna ující jen n co málo více, než je hello, world. Bude se jednat o malou knihovnu pro ešení kvadratické rovnice. Téma opravdu elementární, pro demonstra ní ú ely však bohat sta í. Tuto knihovnu spat íte v n kolika programovacích jazycích, což nám p edstaví .Net platformu jako vícejazykovou, provázanou s mnoha sv ty1. Navíc si také p iblížíme pojem rodina jazyk C, kam C# pat í. č ě ř ř č č ě č ř ě ř ě ů ř ř Na platform .Net jsou assembly soubory s p íponou *.exe nebo *.dll, obsahující jednu nebo více t íd p eložených do mezijazyka CIL. Krom tohoto ízeného kódu obsahují v tzv. manifestu rovn ž metadata, t.j. sebepopisné informace o t chto t ídách a mohou obsahovat i další atributy. Pokud chceme budovat knihovnu, je žádoucí její t ídy zkompilovat do samostatného assembly s p íponou *.dll. Takové assembly neobsahuje vstupní bod, metodu Main(). Knihovnu m žeme potom znovu použít v jiné aplikaci, bez nutnosti kompilovat opakovan zdrojový kód. ě ř ř ř ě ř ě ě ř ř ů ě ř ř M žeme za ít návrhem t ídy v nadjazykové podob , pro tento ú el byl vytvo en Unified Modelling Language – UML jazyk. Na obrázku je vid t UML diagram popisující lenské prom nné (složky, fields) a lenské funkce (metody) které chceme implementovat. Rovn ž vidíme, že každá t ída .Netu je potomkem t ídy System.Object. ů č ě č ě ě č ř ě 1 Ř íká se tom Cross Language Interoperability ř č 2 ř Vhodným nástrojem (nap . MS Visio, které je sou ástí Visual Studia .Net Architect) lze z tohoto diagramu vygenerovat kostru zdrojového kódu. č Ta vypadá v C# takto using System; namespace KvadrRovLib { public class Solver { private double a,b,c; public Solver(){} public void Read(){} public void Solve(){} private double Read(string caption){} private double discriminant(double a,double b,double c){} } } 3 a na cvi ení m že být nabídnuta k dopln ní kódu. č ů ě ř A takhle vypadá kostra ve Visual Basicu .Net (VB). VB nepat í do rodiny C a je to vid t. ě Imports System Namespace KvadrRovLib Public Class Solver Inherits Object Private a As Double Private b As Double Private c As Double Public Sub Solver () End Sub Public Sub Read () End Sub Public Sub Solve () End Sub Private Function Read (ByVal caption As String) As Double End Function Private Function discriminant (ByVal a As Double, _ ByVal b As Double, _ ByVal c As Double) _ As Double End Function End Class End Namespace Visio umí vygenerovat i kostru pro ANSI/ISO C++. Jazyk C++ je následník jazyka C, který jej uvedl do sv ta objektového programování a byl šlágrem 90tých let minulého století. V C++2 musíme mít hlavi kový (*.h) soubor, který je pot eba ší it spole n s binárními soubory. Ta totiž v C++ na rozdíl od assembly neobsahují metadata ( v p ípad data o funkcích, t ídách, metodách ...). ě ř ř č ř č ř ě #ifndef __SOLVER__ #define __SOLVER__ #include <string> using namespace std; namespace KvadrRovLib { class Solver { private: double a,b,c; public: Solver(); void Read(); void Solve(); private: double Read(string caption); 2 Takhle vypadá ne ízená varianta C++, Visual C++ umí generovat i ízený kód. Zdrojový kód pro ízené C++ je v dodatku. ř ř ř ě 4 double discriminant(double a,double b,double c); }; }#endif // __SOLVER__ A zde je soubor *.cpp s kostrou definic metod #include ".\solver.h" namespace KvadrRovLib { Solver::Solver(){} void Solver::Read(){} void Solver::Solve(){} double Solver::Read(string caption){ } double Solver::discriminant(double a,double b,double c){} } Protože jsou definice odd leny od deklarací, je nutno u každé metody znovu dodat vazbu na metadata. Tím myslím, že p ed identifikátorem metody stojí odd leno ty te kou :: jméno t ídy, ke které metoda náleží. Rovn ž je p ítomen p íkaz preprocesoru #include, kterým umožníme kompilátoru C++ provést kontrolu metadat. V .Netu, jak již víme, jsou metadata integrální sou ástí assembly a proto ani ty te ku ani hlavi kové soubory s deklaracemi neuvidíme. Metadata si vygenerují v procesu kompilace a jsou neodlu n spojena s ízeným kódem v assembly. ě ř ř ě ř ř č č ř ě ř č č č č č ř Vra me se proto rychle k našemu C#. Po dopln ní t l metod zdrojový kód vypadá takto: ť ě ě “Matematická” knihovna v C# (Solver.cs) 1 using System; 2 namespace KvadrRovLib 3 { 4 public class Solver 5 { 6 public Solver() 7 { 8 Random rand = new Random(); 9 a = rand.NextDouble(); 10 b = rand.NextDouble(); 11 c = rand.NextDouble(); 12 } 13 14 private double a, b, c; 15 16 private double Read(String caption) 17 { 18 Console.WriteLine(caption); 19 return double.Parse(Console.ReadLine()); 20 } 21 22 public void Read() 23 { 24 a = Read("a:"); ě 5 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 } b = Read("b:"); c = Read("c:"); } private double discriminant(double a, double b, double c) { return b*b-4*a*c; } public void Solve() { double d = discriminant(a,b,c); if (d == 0) { Console.WriteLine(- b / (2 * a)); return ; } if (d > 0) { Console.WriteLine((- b + Math.Sqrt(d))/(2*a)); Console.WriteLine((- b - Math.Sqrt(d))/(2*a)); } else { double r = Math.Sqrt(- d) / (2 * a); Console.WriteLine("{0}+{1}i",- b/ (2 * a),r); Console.WriteLine("{0}-{1}i",- b/ (2 * a),r); } } } ř ř Na ádku 6 je deklarován implicitní konstruktor t ídy Solver. Implicitní znamená, že nemá parametry. Pokud bychom ho nenapsali, doplní si jej p itom p eklada automaticky sám (prázdný). My jsme implicitní konstruktor napsali. Funkcí konstruktor je inicializovat data a uvést instance t ídy do provozuschopného stavu. Proto se konstruktory volají automaticky p i vytvá ení instancí (objekt ). To se práv d je na ádku 8, kde je vytvá ena instance rand t ídy System.Random. T ída Solver má t i lenské privátní prom nné typu double pro koeficienty kvadratické rovnice. Na ádcích 9–11 jsou tyto prom nné inicializovány pomocí volání metody NextDouble() objektu rand. ř ř č ů ř ř ř ů ř ř ě ř ě ř ř ř č ě ě Ř ádkem 16 za íná privátní metoda Read s parametrem caption typu string. Jejím ú elem je p e íst prom nnou typu double a p edat ji jako návratovou hodnotu. Parametr caption slouží jako náv ští pro uživatele. ádek č č ř ř č ě Ř ě 19 return double.Parse(Console.ReadLine()); ř ř ř volá statickou metodu Parse t ídy double, která se pokusí zkonvertovat et zec p e tený z klávesnice na reálné íslo s dvojitou p esností, v opa ném p ípad se vyhodí výjímka, tu však pro jednoduchost neodchytáváme. ě ř č ř č ě č 6 Ř ádek 37 if (d == 0) obsahuje dvojité == což je logický test rovnosti (v C rodin tradi ní) jednoduché = je p i azovací p íkaz (v Pascalu = a :=, VB si pochopí sám). ě ř ř č ř ř Kone n následující ádek č ě 50 Console.WriteLine("{0}+{1}i",- b/ (2 * a),r); obsahuje zajímavou variantu statické metody WriteLine. Prvním parametrem je formátovací et zec, který obsahuje zna ky {0},{1}, …,{n}. Za formátovacím et zcem následují parametry par0, par1,...,parn. Metoda WriteLine zkonvertuje parx na et zec a substituuje jím všechny výskyty zna ek {x} ve formátovacím et zci. Výsledný et zec se objeví jako nový ádek textu na konzole. ř ř ě č ě ř ě ř č ř ě ě ř Zbytek kódu je snad sdostatek sebepopisný. Program v C# používající tuto knihovnu (KvadrRov1.cs) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 using System; using KvadrRovLib; namespace kursyCS { class TridniObal { static void Main() { Solver sol = new Solver(); sol.Solve(); sol.Read(); Console.WriteLine("Reseni:"); sol.Solve(); Console.ReadLine(); } } } ř ř Na ádku 2 vidíme p íkaz using KvadrRovLib, který nám umožní zkrátit identifikátory. Soubor deklaruje t ídu TridniObal která bude sou ástí jmenného prostoru kursyCS. Metoda Main() obsahuje na ádku 10 p íkaz new, který vytvo í instanci t ídy KvadrRovLib.Solver a odkaz (adresu) na tuto instanci uloží do prom nné sol typu KvadrRovLib.Solver. Na ádcích 11 – 15 se sekven n volají ve ejné (public) metody naší t ídy Solver. Nejd íve je voláno Solve() nad stavem instance sol, do kterého ji uvedl implicitní konstruktor. Vy eší se kvadratická rovnice s koeficienty vygenerovanými náhodným generátorem. Poté m že uživatel zadávat svoje koeficienty a ode íst ešení z ř č ř ř ř ř ě ř ř č ř ě ř ř ř ů č 7 ř konzoly. Na 15. ádku se eká na Enter, což v jistých situacích zamezí ne ekanému zmizení konzolového okna. č č P eklad a spušt ní programu ř ř ř Knihovnu a program ji používající p eložíme do ízeného kódu (CIL) p íkazy csc /target:library solver.cs csc kvadrrov1.cs /reference:solver.dll ř ř ř Nezapome te si nejd íve nastavit prost edí. V pracovním adresá i vznikly dv assembly solver.dll a kvadrrov1.exe. Parametr /target:library za ídí, že vzniklé assembly bude mít p íponu *.dll. Pokud tento parametr neuvedeme, p eklad skon í chybou, protože pro *.exe je vyžadována p ítomnost metody Main(). Parametr /reference zjistí na základ metadat v assembly solver.dll zda jsou p ítomny všechny t ídy a metody volané z kvadrrov1.cs a uloží vazbu na solver.dll do assembly kvadrrov1.exe. Spustíme kvadrov1.exe ň ě ř ř ř č ř ě ř ř ř ř Samoz ejm , že náš program mohl vzniknout jako jediné assembly, nap . tak, že bychom ob t ídy umístili do jediného souboru a rovn ž st tak zjednodušili p íkazy pro kompilaci. Takto ale m žeme použít kdykoliv t ídu KvadrRovLib.Solver aniž bychom manipulovali se zdrojovým kódem. ě ř ř ě ě ř ů Dodatky pro zvláš odolné jedince ť Platforma .Net podporuje mnoho jazyk S Visual Studiem 2003 dostanete 5 .Netových jazyk C#, J#, Jscript, VB, C++ (to umí i nativní kód a je dodáno s nativními knihovnami)3. Dalších více než 20 jazyk m žete získat z jiných, asto univerzitních zdroj . ů ů č 3 ů C++, C#, J#, Jscript pat í do rodiny C jazyk ř ů ů 8 MS.Net je navržen tak, aby si každý vývojá mohl vybrat jazyk podle toho, který nap . nejvíce umí, nebo spíše ten který, se pro danou problematiku nejvíce hodí. asto se jedná o tradici. Intenzivní výpo ty se nap . programují nej ast ji ve Fortranu, nov ji pak v C++, Jav a C#. Samoz ejm se rozhodují v tšinou týmy a jednotlivci se musí p izp sobit. Nejd ležit jší je v moderním vývoji znovupoužitelnost kódu a tehdy se musejí p ekonávat jazykové bariéry. Program ve finan nictví psaný ve Visual Basicu nap . pot ebuje používat knihovnu psanou v C++. K tomu d íve sloužil a slouží COM a CORBA, což jsou složité a t žkopádné technologie. V .Netu to prost díky spole ným typ m (CTS Common Type Specification) a stavb jazyk (Common Language Specification) není žádný problém. Samoz ejm musí jít o programy psané pro .Net verze t chto jazyk , používající FCL. V následující ukázce p jde ješt o více. ř ř Č č ě ř ů ř ů č ř ě ě ě ě č ř ř ě ř ř ě ů ů ě ř ě ů ě č ě ů ě Sun Java má mnoho spole ných rys s .Netem, je ovšem v podstat jednojazyková. Existuje velké množství kódu v jav . P edpokládejme, že máme p ístup ke zdrojovému kódu. M žeme si vybrat .Netový jazyk který je Sun Jav velmi blízko, je to J#. Pomocí kompilátoru J# (vjc.exe) m žeme vyrobit ízený modul, který potom budeme modifikovat nap . ve Visual Basicu a používat nakonec v C#. M žeme ovšem rovn ž použít Java Conversion Assistant pro (polo)automatickou konverzi zdrojového kódu Javy na zdrojový kód C#. Java má v .Netu trochu v tší podporu, než by se ekalo, do jisté míry je podporován nejen jazyk, ale i runtime (Java platforma). č ů ě ě ř ř ů ě ů ř ů ř ě č ě V p edchozím jsme napsali knihovnu na ešení kvadratické rovnice, mohli jsme si to ale odpustit, kdybychom m li k dispozici zdrojový kód v Sun jav . ř ř ě ě “Matematická“ knihovna v isté Sun Jav (Solver.java) package KvadrRovLib; public class Solver { public Solver() { a=Math.random(); b=Math.random(); c=Math.random(); } private double a,b,c; private double Read(String caption) { byte[] buf = new byte[100]; System.out.println(caption); double r=0; try { System.in.read(buf); } catch(java.io.IOException exc) { System.out.println(exc.toString()); 9 } String str = new String(buf).trim(); r = Double.parseDouble(str); return r; } public void Read() { a = Read("a:"); b = Read("b:"); c = Read("c:"); } private double discriminant(double a, double b, double c) { return b*b-4*a*c; } public void Solve() { double d = discriminant(a,b,c); if(d==0) { System.out.println(-b/(2*a)); return; } if(d>0) { System.out.println((-b+Math.sqrt(d))/(2*a)); System.out.println((-b-Math.sqrt(d))/(2*a)); } else { double r = Math.sqrt(-d)/(2*a); System.out.print(-b/(2*a)); System.out.print("+"); System.out.print(r); System.out.print("i"); System.out.println(); System.out.print(-b/(2*a)); System.out.print("-"); System.out.print(r); System.out.print("i"); System.out.println(); } } } Program v Jav používající tuto knihovnu (KvadrRov.java) import KvadrRovLib.*; public class KvadrRov { public static void main(String[] args) { Solver sol = new Solver(); 10 sol.Solve(); sol.Read(); System.out.println("Reseni:"); sol.Solve(); } } Jak to sestavíme a spustíme pod Sun JDK (Java Development Kit)? JDK je obdobou .Net SDK, obsahuje základní nástroje nutné pro vývoj aplikací. Nejd íve si ov íme zda máme JDK nainstalováno. Uložíme-li soubor KvadrRov.java do adresá e ekn me Kvadratice, je nutno uložit soubor Solver.java do podadresá e Kvadratice\KvadrRovLib. KvadrRovLib je název balí ku - package, java alternativ prostoru jmen a jak se zdá Java pro prostory jmen p ímo používá adresá ový strom.4 Zjistíme si, v kterém adresá i leží JDK adresá bin a napíšeme si následující dávku (buildjava.bat). ř ě ř ř ř ě ř č ě ř ř ř ř set jdkbin=c:\JBuilder9\jdk1.4\bin cd kvadrrovlib %jdkbin%\javac.exe solver.java cd .. %jdkbin%\javac.exe -classpath . kvadrrov.java Pokud dávku spustíme, vytvo í se v odpovídajících adresá ích ke každému souboru *.java soubor *.class obsahující tzv. byte kód (obdoba CIL). Pro spušt ní programu si napíšeme následující dávku (run.bat) ř ř ě set jdkbin=c:\JBuilder9\jdk1.4\bin %jdkbin%\java.exe -classpath . KvadrRov Prob hne JIT p eklad a JVM (Java Virtual Machine) spustí kód: ě ř Uv domíme si, že v Jav velké množství t íd znamená velké množství *.class soubor uložených ve stromové adresá ové struktu e5 simulující prostory jmen. ě ě 4 ř Zdrojový soubor *.java nesmí rovn ž obsahovat více než jednu ve ejnou t ídu. To je d vod, pro se dále balí do *.jar archív . ř ě 5 ů ř ř ů č ů ř 11 Knihovnu použijeme pod .Net frameworkem Nad adresá em Kvadratice nastavíme prost edí SDK (máme zav šeno kafe). Zadáním p íkazu ř ř ě ř vjc /target:library KvadrRovLib/solver.java vyrobíme p eklada em J# v adresá i KvadrRov assembly solver.dll obsahující ízený kód se t ídou Solver. Toto assembly m že rozvinout tým VB programátor , který v každé t íd implementuje metodu about(). Tady je p íslušný kód č ř ř ř ř ů ř ů ě ř Imports KvadrRovLib, System Public Class VBSolver Inherits Solver Public Function About() As String Console.WriteLine("Kvadraticka rovnice:") End Function End Class uložme jej do souboru VBSolver.vb. P íslušné assembly z potomkem VBSolver p eložíme p eklada em Visual Basicu ř ř ř č vbc vbsolver.vb /reference:solver.dll /t:library kde referencujeme zd d ný kód ze solver.dll. Kone n vše použijeme v C# programu ě č ě ě using System; using KvadrRovLib; namespace kursyCS { class TridniObal { static void Main(string[] args) { VBSolver sol = new VBSolver(); sol.About(); sol.Solve(); sol.Read(); Console.WriteLine("Reseni:"); sol.Solve(); Console.ReadLine(); } } } Vše p eložíme a sestavíme p íkazem ř ř csc kvadrrov.cs /r:solver.dll /r:vbsolver.dll 12 Vzniklé assembly kvadrrov.exe spustíme obvyklým zp sobem, tady je výsledek ů Krom p ísp vku VB týmu (Kvadratická rovnice) vidíme rovn ž, jak .Net na rozdíl od Javy podporuje automaticky eskou kulturu (desetinná árka). ě ř ě ě č č Implementace knihovny v MC (Managed C++) Ano C++ je jedním z jazyk .Netu, dosahuje se toho pomocí tzv. ízených rozší ení (managed extensions). V našem p ípad je to klí ové slovo __gc p ed slovem class, které instruuje p eklada k vytvo ení ízené t ídy, jejíž životnost spravuje sb ra odpadk – Garbage Collector. ů ř ř ř č ř ř č ě ř // SolverMC.h #pragma once using namespace System; namespace KvadrRovLib { public __gc class Solver { private: double a,b,c; public: Solver() { Random* rand = new Random(); a = rand->NextDouble(); b = rand->NextDouble(); c = rand->NextDouble(); } void Read() ř ř ě č ů 13 { a=Read("a:"); b=Read("b:"); c=Read("c:"); } void Solve() { double d = discriminant(a,b,c); if (d == 0) { Console::WriteLine(- b / (2 * a)); return ; } if (d > 0) { Console::WriteLine((-b+ Math::Sqrt(d))/(2*a)); Console::WriteLine((-b-Math::Sqrt(d))/(2*a)); } else { double x = - b/ (2 * a); double y = Math::Sqrt(- d) / (2 * a); Console::WriteLine("{0}+{1}i",__box(x),__box(y)); Console::WriteLine("{0}-{1}i",__box(x),__box(y)); } } private: double Read(String* caption) { Console::WriteLine(caption); return Double::Parse(Console::ReadLine()); } double discriminant(double a,double b,double c) { return b*b-4*a*c; } }; } Implementace knihovny v Ansi/ISO C++ Zde je implementace v C++ podle normy ANSI/ISO, jazyce, který z stal ve Visual Studiu a s .Netem komunikuje prost ednictvím MC (viz výše). Hlavi kový soubor solver.h je ten co už byl uveden. Obsahuje p íkaz using namespace std nazna ující použití standardní knihovny STL, která je sou ástí normy jazyka. ů č ř ř č #include #include #include #include #include #include ".\solver.h" <iostream> <cmath> <cstdlib> <ctime> <limits> č 14 namespace KvadrRovLib { Solver::Solver(){ srand( (unsigned)time( NULL ) ); double m = (double)numeric_limits<int>::max(); a = rand()/m*1000; b = rand()/m*1000; c = rand()/m*1000; } void Solver::Read(){ a=Read("a:"); b=Read("b:"); c=Read("c:"); } void Solver::Solve(){ double d = discriminant(a,b,c); if (d == 0) { cout << - b / (2 * a) << endl; return; } if (d > 0) { cout << (- b + sqrt(d)) / (2 * a) << endl; cout << (- b - sqrt(d)) / (2 * a) << endl; } else { double r = sqrt(- d) / (2 * a); cout << - b/ (2 * a) << "+" << r << "i" << endl; cout << - b/ (2 * a) << "-" << r << "i" << endl; } } double Solver::Read(string caption){ cout << caption << endl; double r; cin >> r; return r; } double Solver::discriminant(double a,double b,double c){ return b*b-4*a*c; } } A ješt kód klienta: ě #include "./solver.h" using namespace KvadrRovLib; int _tmain(int argc, _TCHAR* argv[]) { Solver* pSolver = new Solver(); 15 pSolver->Solve(); pSolver->Read(); pSolver->Solve(); delete pSolver; return 0; } Ješt m žeme vytvo it ízenou obálku (managed wrapper) Máme-li zajímavý kód v ANSI/ISO C++ a nem žeme-li jej z n jakého d vodu p epsat do n jakého .Netového jazyka (nejlepší by byl MC), vyrobíme tzv. ízený obal. D vodem pro nechceme kód p epsat m že být zachování výkonu. MC optimalizuje více než C#, ale na nativní C++ nemá. Tady vidíme plnou sílu Visual C++. ízený kód je mixován s ne ízeným. Je vytvo en odkaz na ne ízený objekt pSolver a všechna volání metod jsou p evedena na n j. Jak vidíme ízená t ída m že mít i destruktor. Trochu si asi budete muset pohrát s linkerem (smíšený kód v dll), ale zdrojový kód obálky je pr zra ný. ů ů ě ě ř ů ř č ř ů Ř ř ř ř ě ř ř ř ů ů #include ".\solver.h" using namespace System; namespace KvadrRovLib { public __gc class SolverMC { private: Solver* pSolver; public: SolverMC(){pSolver = new Solver();} ~SolverMC(){delete pSolver;} void Read(){pSolver->Read();} void Solve(){pSolver->Solve();} }; } A pro úplnost kód klienta v C#. using System; using KvadrRovLib; namespace KursCS { class TridniObal { static void Main() { SolverMC solver = new SolverMC(); solver.Solve(); solver.Read(); solver.Solve(); } } } č 16 Assembly je ješt t eba ádn zatemnit Když se podíváme nástrojem ILDasm na assembly s knihovnou KvadrRovLib, s hr zou si uv domíme, jak snadné m že být reverzní inženýrství našeho kódu. ů ů ě Visual Studio 2003 obsahuje zatem ova == obfuscator, komunitní DotFuscator. Po jeho použití se všechno krásn zatemní. Musíte si ovšem zatemnit všechny assembly aplikace naráz, jinak si nebudou rozum t. Assembly se p idávají na záložku Trigger Files. Rovn ž je pot eba nastavit adresá e na záložce Build. DotFuscator najdete v nabídce Visual Studio .Net Tools (stejn jako shortcut na vsvars32.bat v p edchozí lekci). ň č ě ě ř ř ě ř ě ř 17
Podobné dokumenty
Nástroje pro vývoj aplikací v závislosti na platformě a jejich vazba na
Například diagram nahoře ukazuje zasílání zpráv během přihlašování k webové aplikaci. To, co je
zakresleno na tomto diagramu, by šlo vyčíst i ze zdrojového kódu, pokud člověk ovládá programovací
ja...
Programovanie 3.
Druhá položka (second) vracia true, ak bol vložený nový prvok a false, ak už sa
daný prvok v množine nachádza.
Prvá položka (first) je iterátor na nový prvok, príp. iterátor na už existujúci
prvok ...
Nové prvky v C# 3.0
Z tohoto zápisu se zdá, že první zavolání QueryExtensions.Where
vyústí v dotaz na databázi, který vyselektuje údaje z tabulky orders,
s Londýnem jako místem dodání, a QueryExtensions.SelectMany
vyú...
Používáme Visual Studio
nepoužitelný výpis na konzolu, jak se dotázat na ešení rovnice. Z d vodu jednoduchosti,
protože zatím nechceme implementovat t ídu (typ) pro komplexní ísla, nám posta í
ešení jako et zec. Existuje ...
INFORMACE PRO UŽIVATELE TARKA 180/2 mg tbl. TARKA 240/4
Užíváte-li přípravek Tarka delší dobu, mohou se objevit i jiné nežádoucí účinky, které je nutno
oznámit lékaři - například zduření prsou, tvorba mléka nebo obnažení dásní.
Hlášení nežádoucích účink...
tutoriál CodeBlocks 10.05 v1.1.cz
1.8 Pracovní plocha a závislosti projektu
V CodeBlocks mohou být otev ené rozli né projekty. Uložením otev ených projekt p es ' File' ' Save
workspace' je m žete soust edit v jediné pracovní ploše ...
Visual Basic – základní prvky jazyka
Psaní na obrazovku
Console.WriteLine("text" + "další text" + 123)
Tento příkaz napíše to, co je v závorkách, a odřádkuje (tj. přesune se na další řádek).
Nechceme-li odřádkovat, použijeme místo Wri...
Návrh malé větrné turbíny
zajímavější než odporové. Při volbě mezi svislou a horizontální turbínou jsem se po
dlouhém zvažování rozhodl pro horizontální, i přestože turbína bude umístěna
v zástavbě, kde je turbulentní okolí...