Nebo další řešení
std::string hex = "FF"; // vstup z konzole
unsigned long dec = std::strtoul(hex.c_str(), nullptr, 16);
std::cout << dec; // 255
Jinak doporučuju použít switch místo několikanásobného elseif
framework není nic jinýho, než nějaká sada objektů (tříd, struktůr, typů apod.), který můžeš používat a přidat si tak do tvého aktuálního projektu
některý jsou ale dost komplexní, že doslova mění skoro vše (používáš na všechno ten framework), ale čistý C++ můžeš ofc. používat stále.. takto to třeba dělá zmiňovaný C++/Qt nebo C++/CLI, ale například tyhle 2 nemají moc rádi, když mícháš třeba stl s jejich fw
ale vždy platí to, že se musíš naučit používat ten framework, nestačí ti jen znát základy C++
#3 sleepy
cože? tak tohle opravdu nevím jestli bude fungovat :) Zkoušel sis zadat těch tvých pow(3.1415297,5) při počtu iterací 32? Ano, opravdu vyjde nekonečno ;)
jinak nepřijde ti tohle jednodušší?
double pow(double n, int e)
{
double r = n;
for (int i = 1; i < e; i++) r *= n;
return r;
}
#1 lekejs
A co je na tom těžkýho? Důležitý je si uvědomit, jak funguje Math.pow() a co vlastně dělá
když přes pow dáš 3^3 = 3*3*3, když exp bude 5, tak 3*3*3*3*3
už tě teda něco napadá?
Rec. řešení je takto
int pow(int n, int e)
{
if (e == 0) return 1;
return pow(n, e - 1) * n;
}
No, to bude trochu problém. Ta oblast se scollbarem je speciální a nefungujou na ní klasické události, takže to musíš řešit více mimo samotnej framework
udělej si novou komponentu a na ní tohle naimplementuj (tu logiku se scollbarem), ty události stisknutí a uvolnění myši můžou být třeba takto
public partial class UserControl1 : RichTextBox
{
public event Action ScrollMouseDown = delegate { };
public event Action ScrollMouseUp = delegate { };
private bool lastDown = false;
public UserControl1()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
// HScroll, VScroll
if (m.Msg == 0x114 || m.Msg == 0x115)
return;
// pokud se kurzor nachází na scrollbaru
if (m.WParam == (IntPtr)7)
{
if (m.Msg == 0xA1)
{
lastDown = false;
ScrollMouseDown();
}
else
{
if (!lastDown)
{
lastDown = true;
ScrollMouseUp();
// zde je potreba jeste vyresit posun scollbaru
}
}
}
base.WndProc(ref m);
}
}
Pro realokaci se používá funkce realloc() viz. http://www.cplusplus.com/reference/cstdlib/realloc/
#26 Tayson
nic takovýho nejde a logicky je to i blbost, hlavní vlákno nemůžeš zastavit, je to i "rodič" všech podvláken. Pokud ho zastavíš, tak zastavíš vše, ale to už víš.
Prostě na hlavním vláknu vyhod třeba okno s textem "načítám" a jakmile se to načte, tak se okno zavře (pokud se to nepodaří, tak ukončí třeba program), ale nemůžeš zastavovat hlavní vlákno
#24 Tayson
to co jsem napsal, je nejkratší zápis události (jsem na to zvyklej).. a to co si napsal, tak to je událost s vlastním delegátem (taky může být, není to chyba)
nemusí to být ve jmenným prostoru, můžeš to dát klidně do třídy, která s tím bude pracovat (musí to být vždy public)
tu událost potom vyšleš (emitneš) v místě, kde potřebuješ (při tom čtení) a zachytíš mimo třídu, ale na tohle si prostuduj události.. osobně si myslím, že to je jednoduchá věc a v C# se události vytvářejí snad nejsnáze ze všech prog. jazyků :)
#22 Tayson
hlavně v tom, že ty to chceš porovnat jen tehdy, když přijde string... kdyby se ti to ukládalo do statický proměnný, tak je to jednak bezpečnostní blbost a taky nepoznáš. kdy se hodnota aktualizovala.. by si tam musel mít další vlákno který bude synchronizovaný s tím čtecím a bude oznavovat (opět nějakým způsobem) = zbytečně komplikovaný řešení
#20 Tayson
vše tam můžeš dělat v tom jednom vlákně a už jsem ti psal, že to můžeš udělat přes událost... se mi zdá, že hledáš nějaký složitý řešení
jediny co vlastně, chceš, je číst ze serveru, kde jsem teda pochopil, že to stále odesílá a ty chceš jen zachytávat a vykovávat akce.. nepotřebuješ složitý řešení
pokud to chceš zachytávat v další třídě, tak bud přes událost nebo delegátem, protože to potřebuješ zachytit jen tehdy, když to přijme ten string.. podivej se na moji ukázku pro Klienta a jeho použití, tam to mám
#5 Hitokage
nic jako "mezi" stack a heap neexistuje.. buď je to tam nebo tam
tu glob. proměnnou co tam máš, máš stejně špatne - obj Model; tam by měl být ukazatel správně, takto je to jen reference na existující objekt, ty potřebuješ ukazatel = dynamicky naalokovat model do paměti
ale tu glob. proměnnou vyhod, správně by si globálky neměl používat vůbec - je to takový "nečistý"
#3 Hitokage
stack má omezenou velikost, tam se ti ukládaj takový ty dočasný věci jako proměnný ve funkcích nebo statický alokace
na heap leze všechno co je dynamický, resp. přes "new, malloc, calloc...", tam to musíš potom i ručně uvolnit!
pokud např. ztratíš nebo nastavíš ukazatel na model jako NULL, tak v paměti bude stále a bude brát místo podle velikosti modelu
a tak jak to máš to můžeš více-méně nechat, jen bych se pokusil zrušit všechny globální proměnný a někam potom ukládat všechny načtený modely (pole s ukazatelema na modely)
a ta struct Model múže obsahovat víc věcí, jak cestu k modelu, jeho název, velikost a hlavně ukazatel, kde je umístěnej v paměti.. a hlavně pokud model nepotřebuješ už, tak ho uvolnit
Tak můžeš ho nahrát do paměti (na heap), je to potom rychlejší, ale pokud těch modelů máš hodně nebo jsou dost velký (třeba přes 2GB) tak to nemá smysl, ale pokud jsou menší, tak ho normálně nahraješ do paměti a vezmeš si ptr na něj
typedef unsigned char byte;
struct Model
{
char* name;
byte* data;
};
Model* loadModel(const char* modelPath)
{
// pokud vrátí NULL, tak se model nepodařilo načíst
}
Dost záleží o jaký modely se jedná a kde a jak je chceš používat.. od toho vychází i kód potom
#1 felix
paintComponent se volá automaticky, když na komponentě nastane změna, třeba změna velikosti nebo okno získá opět focus, maximalizace a min. apod.
pomocí repaint() tuhle funkci zavoláš manuálně a ta funkce render() je nějaká tvoje, to komponenta snad neobsahuje tušim
Zkusil jsem to na rychlo udělat a nějak takto by to mohlo být.. pokud teda jde čistě o kontrolu hotového sudoku
sudoku.h
#pragma once
#include <iostream>
#define SUDOKU_SIZE 9
typedef unsigned char ubyte;
bool isValidSudoku(const ubyte* sudoku);
sudoku.cpp
#include "sudoku.h"
static bool existsInBuffer(const ubyte* buffer, const ubyte value, const int bufferSize)
{
for (int i = 0; i < bufferSize; ++i)
{
if (*(buffer + i) == value)
return true;
}
return false;
}
static bool areValidRow(const ubyte* sudoku, const int rowIndex)
{
ubyte buffer[SUDOKU_SIZE] = { 0 };
for (int i = 0; i < SUDOKU_SIZE; ++i)
{
ubyte value = *(sudoku + rowIndex + i * sizeof(ubyte));
if (!existsInBuffer(buffer, value, i))
{
*(buffer + i) = value;
}
else return false;
}
}
bool isValidSudoku(const ubyte* sudoku)
{
ubyte buffer[SUDOKU_SIZE];
bool state = false;
for (int n = 0; n < SUDOKU_SIZE; ++n)
{
if (!areValidRow(sudoku, SUDOKU_SIZE * n))
return false;
}
return true;
}
main.cpp
#include "sudoku.h"
#include <iostream>
int main()
{
ubyte sudoku[] = {
1,2,3,4,5,6,7,8,9,
2,3,4,5,6,7,8,9,1,
3,4,5,6,7,8,9,1,2,
4,5,6,7,8,9,1,2,3,
5,6,7,8,9,1,2,3,4,
6,7,8,9,1,2,3,4,5,
7,8,9,1,2,3,4,5,6,
8,9,1,2,3,4,5,6,7,
9,1,2,3,4,5,6,7,8
};
std::cout << (isValidSudoku(sudoku) ? "Sudoku je v poradku!" : "Sudoku neni spravne!");
std::cin.get();
return EXIT_SUCCESS;
}
nevim jestli ti to nějak pomůže, ale:
1) sudoku je matice, takže můžeš použít normální pole a né dvojrozměrný char**, protože tam stejně budeš mít jen čísla 0-9 a velikost je vždy 9
unsigned* matice = (unsigned *)calloc(9 * 9, sizeof(unsigned));
2) jako globální můžeš nastavit velikost matice, protože je vždy 9
#define SIZE 9
3) kdyb to bylo C++, tak můžeš použít třídy, ale v C dej hlavní pole matice do main() a jako parametr budeš vždy předávat jen ukazatel na pole, protože velikost znáš
void generujMatici(unsigned* matice, unsigned obtiznost)
{
// ...
}
int main()
{
unsigned* matice = 0; // alokace (bod 1.)
// neni nutne potom vynulovat matici, protoze calloc ji vynuluje pri alokaci.. takze muzes jen generovat a pracovat s tim
generujMatici(matice, 1); // obtiznost treba 1-5
return 0;
}
Další funkce, který budeš používat už máš nebo si uděláš, ale vždy bude stačit a bude i nutnost dávat jako parametr unsigned*
#7 Kalgys
však tam se taky třída používá, sice to můžeš dát jako struct, ale přijde mi to zbytečně komplikovaný... musel by si vytvořit nullable struktůru
a pokud říkal s ukazateli, tak po vás chce C/C++ nikoliv C# nebo Javu.. osobně si myslim, že tohle se nejlíp dělá právě v těchto jazykách
#4 Kalgys
No tak vyhoď pointery a udělej to normálně, fakt nevim, proč cpeš c++ do C#
class Node
{
public int value;
public Node next;
}
class Program
{
private static Node first = null;
private static Node act = null;
static void addNode(int value)
{
Node node = new Node();
node.value = value;
node.next = null;
if (first == null)
{
first = node;
}
else
{
act.next = node;
}
act = node;
}
}
Jinak tu chybu ti to hází proto, že nealokuješ Nod. Nemůžeš do null nastavovat hodnoty.. správně by to mělo být takto, ale fakt to nedoporučuju v C#
unsafe struct Node
{
public int value;
public Node* next;
}
unsafe class Program
{
private static Node* first = null;
private static Node* act = null;
static void addNode(int value)
{
Node* node = stackalloc Node[sizeof(Node)];
node->value = value;
node->next = null;
if (first == null)
{
first = node;
}
else
{
act->next = act;
}
act = node;
}
static void Main(string[] args)
{
addNode(10);
addNode(20);
Console.ReadKey();
}
Takto by to vypadalo, pokud to seřadíš podle ASCII
class Root { public static void main(String[] args) { String text = "Dobrý den, jak se dnes máte?"; List<Integer> data = new ArrayList(); for (int i = 0; i < text.length(); i++) { int c = (int) text.charAt(i); if (!data.contains(c)) { // odebere duplicity data.add(c); } } Collections.sort(data); // ,?Dabdejkmnorstáý
for (int c : data) { System.out.printf("%c", c); } } }
#4 Jakub
Ty vlastně nic nemáš, takže ano, musel by si to udělat celý znova. To, co jsem psal je jednoduchý řešení. Prostě si vypočteš počet mezer na řádce a počet hvězdiček a to potom vypíšeš a hodíš nový řádek a znovu na novým řádku.
Jde to udělat i jinak, že si zjistíš maximální délku řádku a stačí ti jeden cyklus a jen podmínky a další možnosti, je jich víc, vyber si ;)
Možností je několik, mě napadlo tohle třeba, dalo by se to celý udělat i pomocí 1-2 cyklu, ale toto bylo rychlejší :)
#include <stdio.h>
int main()
{
int i, j;
int size = 5;
for (i = 1; i <= size; i++)
{
for (j = 1; j <= size - i; j++) putchar(' ');
for (j = 2; j <= i * 2; j++) putchar('*');
putchar('\n');
}
return 0;
}
Otevři si texták a namaluj si tam:
*
* *
*****
*******
*********
***********
přesně vidíš, kde jsou mezery a kde hvězdičky.. takže první průchody budou:
5 mezer + 1 *
4 mezery + 2 *
3 mezery + 5 *
2 mezery + 7 *
1 mezery + 9 *
0 mezery + 11 *
a teď zkus vymyslet cyklus :)
Já události dělám takto zatím http://ideone.com/BS45It může tam být někde chyba/překlep, psal jsem to z hlavy.. ale jde mi o to, jestli je tento způsob správněj nebo existuje elegantnější řešení
aha, ale v použití je potom jen jedna metoda update, kde se zachytí všechny události a pomocí instanceof? Takže když tam bude třeba 5 událostí a ja si budu chtít zachytit jen jednu, tak to nějak jde přes observer?
#6 lukber
na to jsem koukal, ale nějak to nechápu.. tam je v rozhraní jenom invoke() ale nemůžu si tam dát vlastní/další, abych nenarušil struktůru observeru nebo se pletu?
můžeš mi zkusit udělat jednoduchej příkad na tu ukázku v C# co jsem psal? resp. to přepsat do Javy, jak by to vypadalo, pokud možno co nejelegantněji :)
Škoda no, když budu mít 5 tříd, kde každá bude mít nějaký události, tak pro každou třídu musím mít další 3 třídy jen pro události, čili z 5ti tříd se mi stane 20 =D To je maso prostě a až to začíná být lehce nepřehledný
Fakt nikdo nevíte?
Momentálně to dělám takto, ale přijde mi to dost neohrabaný http://www.java2s.com/Code/Java/Event/CreatingaCustomEvent.htm
Proste vytvářet 3 soubory +1 ten hlavní, kde se to použije mi přijde zbytečně komplikovaný. Sice to můžu dát jako vnořený třídy, ale potom se to stává nepřehledný trochu a přijde mi to takový "nečistý" :-/
Zdravim,
existuje v jave nějaká možnost nebo udělat vlastní třídu, která by fungovala a pracovala s vlastníma událostma podobně jako to má C# ?
Tím myslim, že v C# se jednoduše výtváří události (klíčové slovo "event" a pomocí delegáta). Šlo by něco podobného udělat i v Jave? Nějak se mi nelíbí a přijde mi komplikovaný dělat 2-3 objekty (EventListener, EventHandler, [EventObject])
V C# to vypadá třeba takto:
class NumbersDB
{
// vytvoreni udalosti pro pridani cisla
public event Action<int> OnNewNumber(int number) = delegate { }
// pridani cisla a zavolani udalosti
public void AddNumber(int number)
{
OnNewNumber(number);
}
}
class MainClass
{
private NumbersDB db = new NumbersDB();
public MainClass()
{
// zachyti udalost pridani cisla
db.OnNewNumber += number => { Console.WriteLine(number); };
// prida cislo
db.AddNumber(100);
}
}
A moje otázka tedy je, jak toto naprogramovat v Jave, aby to bylo takto jednoduchý :)
Díky
Zdravim,
chci se zeptat jak je to s RAID 5 a jeho rozšířením.
Řekněme, že si spojim 3 stejný disky do RAID 5, po roce si řeknu, že bych to rozšířil a přidal další disk (čili 4 disky v RAID 5). Jak se to zachová? Normálně přepočítá parity a rozdělí data na všechny disky, nebo to vůbec nejde?
Vim, že třeba u Intel Rapid to pro RAID 0 jde, sice přepočet trvá třeba den (v závislosti na velikosti disku), ale funguje to. Ale u RAID 5 nevim. Hlavně já mám BIOS UEFI a když to nastavim tam (čili přes HW, nikoli přes SW - intel rapid), tak to půjde takto rozšířit nebo ne?
Díky
nechce se mi to celý kontrolovat, ale na první pohled ti tam chybějí závorky ve funkci "kontrola", takto se ti cyklus vykoná jen pro první podmínku
potom nechápu, proč máš matici typu char, použij bool, případně unsigned (stačí ti jen hodnoty 1/0)
dále se zamysli trochu nad optimalizací, představ si pole pro piškvorky 100x100 nebo větší, timto způsobem by to nešlo moc dobře :)
jen pozor, že třída nemá modifikátor private, ale internal (ve výsledku je to prakticky stejný)
a nezmění, všechny modifikátory musíš měnit ručně, nic se ti nenastaví automaticky v závisloti na nějakým nadřazeným modifikátoru... čili když změníš třídu na public, tak členy budou stále private
a doporučuju psát všude modifikátory.. i když to někde bere jako výchozí private, tak tomu ještě ručně dopsat private, je to pak na první pohled jasný
a smysl je v tom, že privátní členy třídy nejsou viditelný z venku nebo u dědičnosti, jsou použitelný pouze pro potřeby třídy
class A
{
protected int cislo;
private A() { } // zakáže bezparametrický konstruktor
public A(int cislo) { this.cislo = cislo; }
}
// třída B nyní může používat pouze konstruktor s parametrem int
// případně nějaký vlastní, ale nelze vytvořit bezparametrický!
class B : A
{
// zavolá konstruktor z rodiče
public B(int cislo)
: base(cislo) { }
}
#4 vitamin
no jo, jsem úplně zapoměl ze utf8 mají 2byte, no tak opravim.. původní text překonvertovat na wchar_t
wchar_t* toCharArrayW(const char* text)
{
size_t size = strlen(text) + 1;
wchar_t* arr = new wchar_t[size];
mbstowcs(arr, text, size);
return arr;
}
nebo "klasickej" zápis přes pole znak po znaku, pokud nezmáš moc iterátory.. takováto funkce pro test diakritiky
bool textDiakritiky(char* text, int length)
{
for (int i = 0; i < length; ++i)
{
if (text[i] > 127)
return true;
}
return false;
}
#29 Nonameboy
ok, tak tahle... důvod proč ti to bliká je, že kreslíš na jedno "plátno", který se musí jak aktualizovat tak kreslit ve stejnej čas, tohle se řeší backBufferem - DoubleBuffer, kde se kreslí na jedno a aktualizuje druhý a potom se prohoděj, takže nevzniká blikání (bufferů může být samozřejmě víc)
co se týče toho co jsem psal, tak je dobrý si udělat objekt, kterej bude řešit vše (jak vlastní vykreslení, tak pohyb), takže něco takovýho třeba
public class Block
{
private Form parent;
private Rectangle rect = new Rectangle(0, 0, 50, 50);
public Block(Form parent)
{
this.parent = parent;
this.parent.KeyDown += UpdateKeys;
Speed = 4;
}
public Block(Form parent, int x, int y, int width, int height)
: this(parent)
{
rect = new Rectangle(x, y, width, height);
}
public int Speed { get; set; }
public Rectangle Rectangle
{
get { return rect; }
set { rect = value; }
}
public void Draw(Graphics g)
{
g.FillRectangle(Brushes.Black, rect);
}
private void UpdateKeys(object sender, KeyEventArgs e)
{
bool validKey = true;
switch (e.KeyCode)
{
case Keys.Left:
rect.X -= Speed;
break;
case Keys.Right:
rect.X += Speed;
break;
case Keys.Up:
rect.Y -= Speed;
break;
case Keys.Down:
rect.Y += Speed;
break;
default:
validKey = false;
break;
}
if (validKey)
parent.Invalidate();
}
}
a potom v samotným formu nebude nic jinýho, než toto
public partial class MainForm : Form
{
private Block block;
public MainForm()
{
InitializeComponent();
DoubleBuffered = true; // zapne DoubleBuffer (aby to neblikalo)
block = new Block(this, 100, 100, 50, 50);
}
protected override void OnPaint(PaintEventArgs e)
{
block.Draw(e.Graphics);
}
}
Pokud máš nějaký dotazy ohledně kódu, tak sem napiš
Tvůj hlavní problém je, že ti chybí samotná struktůra.. měl by sis udělat speciální objekt, kterým chceš pohybovat, ten by měl třeba rozhraní pro vykreslení a aktualizaci (pohyb)
tohle potom naimplementovat do formu... a proboha, v žádný případě nevolej překreslení ve funkci na vykreslení
do int** můžeš přiřadit referenci na jinej ukazatel typu int*
int cislo = 10; // hodnota
int* ptr = &cislo; // ukazatel typu int na cislo (hodnotu)
int** ptr2 = &ptr; // ukazatel na ukazatel typu int*
int** používáš nejčastije na matici, resp. pole polí
koukáš špatně... máš tam i tutoriál + dokumentaci... http://webkitdotnet.sourceforge.net/basics.php
zde máš třeba ten webkit http://sourceforge.net/projects/webkitdotnet/
WebBrowser používá IE, tahle komponenta není dělaná pro prohlížeč, ale pouze jako náhled třeba části webu nebo pro reklamy, logy apod. co se načítá jako HTML stránka (napr. v launcherech u her)
pokud chceš prohlížeč, tak bud vlastní jádro nebo nějaký externí třeba webkit (v podobě .dll)
no tak základní pointa je v tom, že kolekce Set nemůže uchovávat duplicity, takže si všechny pole převedu do Setu a potom jen filtruju ty, který mají stejný prvky, takže nemám duplicity a funguje to i pro X polí a co se týče toho procenta, tak to máš jednoduchej vzorec... (100f * počet_stejnych_prvků / minimalni_velikost_pole)