Autor Zpráva
Werewolf
Profil
Zdravím.

Hledám programovací jazyk, který:

• dovoluje vytvořit velké pole (ne jako C)
• umí foreach
• je zkompilovatelný (např. do *.exe)
• převádí datové typy (není nutné, ale byl bych rád)

Díky za nápady :-)
WanTo
Profil
Werewolf:
Jak velké pole, kolik prvků? Proč foreach?
DoubleThink
Profil *
Werewolf:
dovoluje vytvořit velké pole (ne jako C)
Velikost (dynamicky alokovaného) pole v C je fakticky omezena jen velikostí haldy.

Zkus C++ nebo C#.
C# tuším potřebuje .NET framework, takže to s tou zkompilovatelností není tak úplně pravda. V C++ je zase trochu větší hokej v syntaxi (je to takový dort od pejska a kočičky). V C++ si musíš obstarat vlastní management paměti, v C# zase hlídat garbage collector, aby ti nesežral, co nemá.
Automatické přetypování se (u obou tuším) řeší přetížením operátorů.
Werewolf
Profil
WanTo:
Prvků kolem milionu, možná i víc.

DoubleThink:
Zkoušel jsem C#, sám jsi mi ho přece poradil.
WanTo
Profil
Werewolf:
S milionem prvků není v C problém - přinejmenším u mě na Linuxu, gcc4.

Zeptám se jinak - co chceš v jazyku, který hledáš, programovat? Něco jiného se hodí na hry, něco jiného na webové aplikace, něco jiného na GUI klikátka pro Windows, něco jiného zase na hromadné zpracování textu.

Ten C# ti nevyhovoval?
Shadowek
Profil
Á další jazyk Werewolfe? :D Zkus C++ to je asi nejlepší :P.
Werewolf
Profil
WanTo:
C# neumí inicializovat pole. Nebo spíš to neumím já.
Stačilo by, kdybys mi poradil, jak inicalizovat pole (indexy asi tak -1000 až 1000 - další pole) polí (indexy taky -1000 až 1000 - čísla).

Shadowek:
A ty seš pejsek nebo kočička?
Shadowek
Profil
Werewolf:
Vypravěč
WanTo
Profil
Werewolf:
int[][] polePoli = new int[velikost1][];
for (int i = 0; i < polePoli.length; i++) polePoli[i] = new int[velikost2];

Každé z "podpolí" může mít navíc jinou velikost. K prvkům se přistupuje přes polePoli[x][y].

Indexy od -1000 do 1000 neuděláš, všechny rozumné programovací jazyky indexují od nuly do velikost-1.

Ještě můžeš použít dvourozměrné pole:
int[,] pole2D = new int[velikost1, velikost2];

K prvkům se pak přistupuje pomocí pole2D[x, y].


Jinak jestli s programováním teprve začínáš, tak se C++ radši vyhýbej jako čert kříži. Je to černá magie.
Timy
Profil
WanTo:
Indexy od -1000 do 1000 neuděláš, všechny rozumné programovací jazyky indexují od nuly do velikost-1.
U pole to samozřejmě nepůjde, ale šlo by to udělat přes Indexery.
imploder
Profil
Werewolf:
Nejlepší "dort od pejska a kočičky" je Perl :)

C++ je určitě dobrá volba, zvlášť pokud už trochu znáš C. Má s C hodně společného (jdou používat i céčkové funkce) a hodně vylepšení navíc: výjimky, OOP, proudy ... atd. atd.. Součástí standardní knihovny je i STL - nabízí snadnou práci s dynamickými řetězci, zásobníkem a tak podobně - ušetří práci a není takové nebezpečí problémů s alokací paměti.

C# neumí inicializovat pole. Nebo spíš to neumím já.
C# neznám, ale nejde to pole (nebo pole polí) prostě projít cyklem a každý prvek inicializovat? Můžeš si na to udělat funkci a tu pak používat.
WanTo
Profil
Timy:
Ono by nakonec fungovalo i Dictionary<int, Dictonary<int, int>>.
Werewolf
Profil
Shadowek:
...nebo ten dort?

WanTo:
Děkuji ti. Dělal jsem chybu v tom, že jsem tomu poli dával mínusové indexy a když jsem začal používat indexy od nuly výš, tak jsem místo operátoru '<' použil '<=', takže OutOfRangeException.
Jinak Tvůj názor na C++ sdílím. Jen Shadowek je tu zamilovaný do C++.

Timy:
Nerozumím jim. Až udělám chybu i v řešení od WanToa, tak se na to důkladněji podívám a použiju.

imploder:
Perl běží na serveru, mám pocit. Nebo se mýlím?
Jednou jsem se díval na nějaký tutoriál o C++ a buď mi Opera vyměňovala znaky nebo je opravdu tak nepřehledné.
Přesně tím cyklem jsem to zkoušel inicializovat.

Všem děkuji. Čekejte, že se ozvu s další chybou. Pokud ne, zahynul jsem bídnou smrtí uprostřed tvorby. Zkompilujte mě prosím, do formátu *.exe a vypusťte mě do internetu.
Werewolf
Profil
Tak fajn. Mám problém:

Napsal jsem cyklus s použitím 2Dpole. Ten nějakou dobu trvá (je to 10000^2 položek).
Potom jsem vytvořil RichTextBox a do něj napsal informace (schválně je nepíšu do Labelu).

Jenže to okno i s tím Boxem se zobrazí až když ten cyklus skončí (tzn. když to dojde ke konci metody).

Šlo by to okno nějakým jednodušším způsobem zobrazit dříve, abych viděl průběžný stav toho, co se bude dít (bude to dlouho trvat, nemám zrovna 50GHz procesor)?
Znovu vám všem děkuji :-)
WanTo
Profil
Werewolf:
Ten operátor "<" tam dává smysl. Začneš na nule a dostaneš se na velikost-1, kdy bude podmínka s "<" naposledy platit. Dále, nechtěl jsem vyloženě říct, že C++ je špatné - ona i černá magie může být někdy super věc.

Na poslední dotaz bohužel neodpovím, zase tolik do C# nevidím.
Werewolf
Profil
WanTo:
Já vím. Jen jsem si to předtím neuvědomil.
Ok, možná se spokojím s prázdnou obrazovkou a oknem až na konci procesu.

Už jsem na to přišel. Stačí dát do okýnka tlačítko "Začít". Potom můžu v tom okně s tim tlačítkem měnit Label/(Rich)TextBox, co se právě děje a kolik procent je dokončeno.
Sakra, nejde to :-D
Werewolf
Profil
Mám docela problém s foreach.
Potřeboval bych zjistit index, jako v php foreach($pole as $index => $hodnota). Která funkce/obměna to dokáže? Díky po... :-)
WanTo
Profil
Werewolf:
V C#? U pole můžeš použít obyčejný for cyklus od 0 do velikostPole-1, jelikož pole je indexované souvisle. Jinak funguje (dle dokumentace na MSDN) něco jako foreach(int cislo in pole), předpokládám, že bude fungovat i na asociativní pole (System.Collections.Generic.Dictionary).
Timy
Profil
U normálního pole to pokud vím nejde, ale můžeš si napsat Extension method, která to bude simulovat :-). Pro dictionary foreach funguje, takže když budeš mít foreach (var pair in dict), tak v pair.Key bude klíč a v pair.Value bude hodnota.
Werewolf
Profil
WanTo:
To jsem právě nechtěl, protože mám pole, které má sto milionů prvků a já hledám pouze čísla větší nebo rovna 4.

Timy:
To funguje jen na pole polí...?
WanTo
Profil
Timy:
Funguje i u normálího pole, právě jsem to zkusil.

Werewolf:
To jsem právě nechtěl, protože mám pole, které má sto milionů prvků a já hledám pouze čísla větší nebo rovna 4.
No a? V čem by ti měl foreach pomoct? V principu funguje úplně stejně jako obyčený for nebo while, je stejně časově náročný - nějak teďka nechápu, kam směřuješ.
Werewolf
Profil
WanTo:
Foreach... Aha. Uvědomil jsem si až teď, že foreach prochází prvky s hodnotou 0.
Mohl bych na začátku inicializovat int[,] pole = new int[10000, 10000], potom pole[5000, 5000] = 1000000 a potom prvky přidávat v tom foreach.
Jen nevím, jak zjistit, jestli položka pole existuje nebo ne.

Takže můžu zkusit foreach a přidávání prvku, mělo by to být rychlejší. Nechal jsem to běžet hodinu a okno nikde a nikde...
Nosal
Profil *
Skus ActionScript ve Flashi... Asi to není tvoje kategorie ale v tom co chceš vyhovuje a AS je opravdu skvělí :)
Timy
Profil
WanTo:
Moment — co tam jde a nejde? Já myslel to, že když použiji foreach na pole, tak z něj nevytřískám právě procházený index pole. Foreach jako takový na pole samozřejmě jde.

Werewolf
To jsem právě nechtěl, protože mám pole, které má sto milionů prvků a já hledám pouze čísla větší nebo rovna 4.
U jednorozměrného pole bys mohl použít tohle:
int[] result = arrInts.Where(x => x >= 4).ToArray();

U vícerozměrných to nejde, tam budeš muset použít dva vnořené cykly nebo foreach, který to projde jako jedno pole. Možná by pomohlo, kdyby jsi sem vložil ten svůj kód, protože jinak to bude jen takové věštění z koule…
imploder
Profil
Werewolf:
Perl běží na serveru, mám pocit. Nebo se mýlím?
Perl může běžet na serveru, ale jeho použití není omezené na server jako u PHP. Nicméně chtěl jsem říct, že je v něm bordel, ne že ho doporučuju. Lepší je Python, je podobný, ale na rozdíl od Perlu přehledný. Jsou to jazyky interpretované (i když zkompilovat nějak do samostatně spustitelné binárky jdou, když na to přijde), takže asi ne úplně to, co sháníš. Foreach i převádění typů umí (odborně řečeno "dynamicky typovaný jazyk").

To jsem právě nechtěl, protože mám pole, které má sto milionů prvků a já hledám pouze čísla větší nebo rovna 4.
To není složité ani v C - nějak takhle:
int i;
int *pole = malloc(100000000 * sizeof(int));  // vytvoříme pole o 100 miliónech prvků

/* ... pole nějak naplníme ... */

for (i=0; i<100000000; i++) {  // vypíšeme indexy, na kterých je v poli číslo >= 4 
  if (pole[i] >= 4) printf("%d\n", i);
}

free(pole);  // pole uvolníme z paměti

Pokud je teda tohle to, co potřebuješ.

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0