Access asi neumí CASE-WHEN. Můžeš použít IIF nebo Switch.
Příspěvky odeslané z IP adresy 213.211.51.–
Ta metoda je statická, takže nemá přístup k instanci toho formuláře s tím editem.
Težko říct, jak to používáš, ale pravděpodobně ji nepotřebuješ mít statickou. A pokud jo, tak jí tu MAC předej třeba parametrem.
Driver psát nemusíš. Obzvlášť když Widle to zařízení vidí.
Pracovat s těmi kartami pak můžeš přes SC API.
Konkrétně pro .NET nevím, ale existuje Windows.Devices.SmartCards a živý je i projekt pcsc-sharp. Nebo můžeš použít SC API přes P/Invoke.
Těžko takhle hádat. Buď řádně doběhne nebo spadne, kvůli nějaké chybě.
Ukaž kód a/nebo chybový výpis.
Na začátek přidej uses math; tim se ti zpřístupní ty matematické funkce. A Pascal asi nemá operátor ^. Místo x^2 můžeš zkusit x**2 nebo prostě x*x.
Tak popiš, jak si představuješ ten rozložený výsledek a já ti napíšu, jak ho složit dohromady.
class AA:
...
class AB:
...
class AC:
...
class A(AA, AB, AC):
...
Napiš, co je původní záměr a vymyslíme řešení, které není takový nesmysl.
V první řadě u všech funkcí, které mohou vrátit chybu, přidej kontrolu chyb.
V tom kernelu se mi nějak nepozdává to result++, jakože ++ na floatu. Tipuju, že se to ani nezkompiluje, ale jistý si nejsem.
Netuším proč máš global dvouhodnotový, ale když to tak máš, tak obě hodnoty inicializuj.
A a B nejdřív inicializuješ mallocem, ale pak je nastavíš na adresu lokálních proměnných, takže free na konci nejspíš sletí.
Nekonečný cyklus tam nevidím, ale zjevně je to dvouminutová matlanina a osobně nemám chuť to zkoumat.
Vývoj Windows vůbec nesleduju a možná už jsou lepší způsoby, ale v principu, když se ten tvůj program spustí, tak můžeš detekovat, jestli jiná instance už běží a jen jí poslat požadavek o provedení té akce.
Používá(-val) se na to Mailslot, Named Pipe, Socket... (viz MSDN) Takže něco z toho vytvoříš a čekáš na zprávy. Když se to vytvořit nepodaří, tak nejsi první a jen pošleš zprávu a skončíš.
Nebo okenní zprávy. Vylistuješ seznam oken a podle titulku nebo souvisejícího exáče detekuješ, jestli patří tvému programu. A když jo, tak tomu oknu pošleš zprávu (PostMessage). To bude možná jednodušší.
Samořejmě by nebylo od věci dělat ptákoviny mimo transakci, ale jo, to je její pointa - začneš transakci, pak uděláš X příkazů a nakonec změny uložíš nebo zrušíš.
Tomu se říká transakce. Buď se udělá všechno nebo nic.
https://dev.mysql.com/doc/refman/8.0/en/sql-transactional-statements.html
Myslím, že to trénování nemusíš dělat a můžeš použít předtrénovaný model (nejspíš proto na ten problém ostatní nenarazili).
Ale pokud chceš, tak můžeš upravit ten if v args.py.
- if args.p_dataset_config is not None:
+ if hasattr(args, "p_dataset_config"):
$('label[for="sendNewsletter"]').contents()[1].textContent = 'nazdar';
Ech, když ti jiný kód na stejné adrese funguje, tak to nebude mono režimem. Čtu strašně nepozorně :) Takže asi ty indexy.
#34 Martin
Jejda, ty jsi ale drsňák.
To vidím jak to dokázali napsat, když neví ani příkaz na vymazání prostředí
U všech tvých dotazů je jasné, že všichni zúčastnění by to měli za pár minut. Konkrétní kód ti do teď nikdo nenapsal, protože na to dlabeš a "udělejte za mě" moc nefunguje.
DOSbox nešel spustit, protože nebyl povolený virtuál v biosu a ani ve windowsu, není můj problém, že tomu nerozumíš, nebo nechápeš, ale je to bohužel tak, nefungovalo mi to předtím a teďka jo.
DOSBox virtualizaci nepoužívá a nepotřebuje, tudíž ji není potřeba zapínat. To by ses ale musel obtěžovat to zkusit a nevymýšlet si.
Jde vidět, že nic moc nevíš jak tady vidím hnedka co píšeš za nesmysly. Musel jsem aji vysvětlovat zadání, jde vidět že si jen tady hraješ na borce, přitom vůbec nic nevíš no. Vtipní tito lidé :)
Zadání jsi musel vysvětlovat, protože jsi ho napsal debilně. Já jsem tě prokoukl rychle, ale Jerry s tebou ztrácí čas a dokonce ti fotí knížku, tak se chovej uctivě, zmrde.
Virtuál nepotřebuješ. Rozchodit DOSBox je záležitost minuty, jak už psal Jerry.
A jestli to použiješ, tak do té sekce Service asi ještě přidej User=... a Group=... pod kterými to má běžet.
Od PHP jako takového bych problém nečekal a ta knihovna pro MQTT vypadá dobře, takže když preferuješ PHP, tak bych se nebál to zkusit. Kdyžtak můžeš třeba pro jistotu po každých 1000 zprávách ten skript ukončit.
Na tom Debianu ti pravděpodobně beží systemd, tak [re]start můžeš řešit přes něj.
/etc/systemd/system/zigbeemqtt.service
[Unit]
Description=zigbeemqtt
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
StartLimitIntervalSec=300
StartLimitBurst=5
[Service]
ExecStart=/foo/bar baz
Restart=on-failure
RestartSec=1s
[Install]
WantedBy=multi-user.target
Jestli tou analýzou myslíš kontrolu nebo doplňování interpunkce, tak češtinu prostě nejde strojově analyzovat pro jednoznačné pochopení významu a bez toho nejde (stoprocentně) opravovat interpunkci. Link nemám, ale když nad tím budeš koumat, tak tě určitě pár přikladů napadne.
Natrénování toho, čemu se dneska říká AI (která neví, ale dost dobře hádá) taky nevidím nadějně.
RLC/RRC rotuje přes carry flag. Tzn. že jak se ty bity posunují, tak se ten jeden krajní vyšoupne do carry a ten na druhé straně zase doplní z předchozí hodnoty carry. To nechceš.
Zkrátka místo RLC/RRC použij RL/RR.
Jinak tam nic vyloženě špatně nevidím. Kromě toho, že to není dokončené.
rd.nextInt(limit);
A co nevíš?
Tak mě napadá, že už při načítání můžeš ukládat jen půlku řádku a rovnou s tím ukončovačem. Tím se to dost zjednoduší.
OK, u té funkce 0x0A je v tom bufferu 1 byte určující kapacitu, pak 1 byte určující délku načtených dat, a pak X byte těch dat.
Nevím, jak s touhle funkcí zjistit konec vstupu. Asi ji používáte tak budeš vědět, jak to děláte.
To, že rovnou máš v paměti [delka, data...] se hodí a použil bych to pro uložení všech řádků. Takže nakonec můžeš mít kompletní data ve formátu:
3, 'abc', 6, 'nazdar', 5, 'bazar'
Ty řetězce pak projdeš a před výpisem doprostřed vložíš ten ukončovací '$' pro funkci 0x09.
V pseudokódu celý program může vypadat nějak takhle:
max_line_count equ 600
max_line_len equ 100
segment code
start:
...
read_lines:
if line_count == max_line_count
goto print_lines
; nacteni radku
buffer.used = 0
int21.read(buffer)
; nevim jak s touto funkci detekovat konec vstupu
; dejme tomu, ze to bude zadani <ctrl-z>, <enter>
; tj. v bufferu bude jeden znak s hodnotu 26
if buffer.used == 1 and buffer.data[0] == 26:
goto print_lines
; ulozeni radku. delka + data
copy_src = @buffer.used
copy_dst = save.ptr
copy_len = buffer.used + 1
copy(copy_dst, copy_src, copy_len)
line_count += 1
save.ptr += copy_len
goto read_lines
; vypsat prvni polovinu nactenych radku
; a z kazdeho radku jen prvni polovinu nactenych bajtu
print_lines:
line_count = line_count / 2
save.ptr = @save.data
next_line:
if line_count == 0
goto end
line_count -= 1
line_length = save.ptr[0]
line_data = save.ptr + 1
save.ptr += 1 + line_length
line_length = line_length / 2
if line_length == 0
goto end_line
line_data[line_length] = '$'
int21.print(line_data)
end_line:
int21.print(crlf)
goto next_line
end:
int21.exit(0)
segment data
line_count dw 0
crlf db 13, 10, '$'
buffer:
.max db max_line_len + 1
.used db 0
.data resb max_line_len + 1
save:
.data resb (1 + max_line_len + 1) * max_line_count
.ptr dw save.data
Pokud to nemusí běžet na DOS 1, tak s funkcemi 0x3F/0x40 to podle mě bude jednodušší.
Tak v první řadě pro funkci 0x0a musí být v tom bufferu jeho délka, a pro funkci 0x09 musí být ten řetězec ukončený dolarem.
To je zvláštní, že to nemá tu definici Fields, ale toto teda (u mě) chodí.
from pdfrw import PdfReader, PdfWriter, PdfDict, PdfName, PdfString
def merge(outfile, seznam):
writer = PdfWriter()
merged_acroform = None
for idx, fname in enumerate(seznam):
reader = PdfReader(fname)
assert not reader.Root.AcroForm or not reader.Root.AcroForm.Fields
if merged_acroform is None and reader.Root.AcroForm:
merged_acroform = reader.Root.AcroForm
for page in reader.pages:
for annot in page.Annots or []:
name = annot.T[1:-1]
annot.T = f"{name}_merge{idx}"
writer.addpages(reader.pages)
if merged_acroform:
writer.trailer.Root.AcroForm = merged_acroform
else:
writer.trailer.Root.AcroForm = PdfDict({PdfName("NeedAppearances"): PdfString("true")})
writer.write(outfile)
Jestli můžeš, tak pošli 2 ukázkové soubory. Já na to mrknu.
Mně funguje zopakování a přejmenování definice polí. (Merguju stejné formuláře)
from pdfrw import PdfReader, PdfWriter, PdfName
def merge(outfile, seznam):
PdfT = PdfName("T")
PdfFields = PdfName("Fields")
writer = PdfWriter()
merged_acroform = None
for idx, fname in enumerate(seznam):
reader = PdfReader(fname)
form = reader.Root.AcroForm
fields = form[PdfFields]
for field in fields:
name = field[PdfT][1:-1]
field[PdfT] = f"{name}_merge{idx}"
if merged_acroform is None:
merged_acroform = form
else:
merged_acroform[PdfFields] += fields
writer.addpages(reader.pages)
writer.trailer.Root.AcroForm = merged_acroform
writer.write(outfile)
Můžeš si napsat pomocnou funkci nebo makro, ale jinak ne, C nemá výchozí hodnoty nebo konstruktory struktur.
#define FRAM(name) Fram name = { .staticS = 0b111 };
...
FRAM(fram);
fram.w1 = ...;
Nevím, vypisuješ obsah toho seznamu, tak bys měl vidět, co tam je a není, ale tipl bych, že třeba zadáváš ta jména jako "petr, pavel" a pak tam máš tu mezeru navíc ("petr" a " pavel").
A ty funkce parseTimespan a formatTimespan neexistují. Jde jen o princip.
Funkcí setInterval můžeš naplánovat periodické spouštění funkce, ve které ty časy upravíš.
function startTimer() {
setInterval(updateTimes, 1000);
}
function updateTimes() {
for (const el of document.querySelectorAll('.timer')) {
el.innerText = formatTimespan(parseTimespan(el.innerText) - 1);;
}
}
To časování není úplně přesné, takže takový pokus každou sekundu odečíst 1 sekundu se ti při delším běhu trochu rozjede. Ideální by bylo, kdybys tam měl finální čas expirace a vždycky z aktuálního času počítal zbývající dobu.
Tohle je těžké. Jedna věc je se na něčem zaseknout a hodně jiná věc je mít (zkopírovat) 5 funkcí a nechápat ani řádek.
Tak na ten kód chvíli zírej a uvidiš, že se funkcím předávají nějaké hodnoty jako parametry a vracejí jiné hodnoty jako výsledky. A pak stačí stejným způsobem tu konverzní funkci aplikovat na načtený text.
Třeba máš ty uzly očíslované, tak začátek a konec zadáš jako číslo.
Při návštěvě každého uzlu si můžeš uložit, odkud jsi na něj přišel a z toho pak zrekonstruovat cestu.
Protože příznak konce souboru (nebo chyby) se nastaví až když se pokusíš číst za koncem a protože getline tu výstupní proměnnou nijak nemění když nic nenačte.
- Čili načteš poslední řádek a vypíšeš ho.
- Soubor je vpořádku, tak čteš dál. Fakticky jsi na jeho konci, tak teď to selže a do myline se nic nevloží a je tam předchozí hodnota, kterou znova vypíšeš.
- Až teď detekuješ konec souboru a cyklus končí.
Můžeš dát přímo getline jako podmínku toho cyklu.
while (getline(myfile, myline))
{
cout << myline << '\n';
}
Nepoužil jsi nic z toho, co jsem ti poradil a máš to ještě blběji než předtím.
# === example.py
def coding(s):
...
return void # nazev `void` je hodne blby
def decoding(s):
...
return void
def main():
while ...:
...
if d==1:
print(coding(vstup))
else:
print(decoding(vstup))
if __name__ == "__main__":
main()
# === test.py
def test_coding():
assert coding("A") == ".-"
...
Ve funkci `decoding` máš pracovat s parametrem `s`, ne s globální proměnnou `a`.
Tu interaktivní smyčku spouštěj jen při přímém spuštění skriptu, ne při jeho importu odjinud (z testu). Přímé spuštění poznáš tak, že proměnná `__name__` má hodnotu "__main__".
V tom testu ve funkci `test_coding` budeš testovat funkci `coding` (ne test_coding). A `coding` tedy nebude výsledek vypisovat, ale bude ho vracet jako návratovou hodnotu (příkaz return). To samé pro `decoding`.
`pytest.raises` testuje jestli někde (kdekoliv) v tom bloku dojde k uvedené vyjímce. Ty asi chceš testovat, že všechny ty varianty tu vyjímku vyhodí (a tam mi není jasné proč by "r" mělo házet TypeErrror).
Podle Wikipedie SQLCE podporuje OLEDB, takže by to mohlo jít, ale nevím.
Pořád nevím, jestli tomu rozumím správně :-)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule "^(.*)$" "clanky/$1.php" [QSA,L]
Mně není jasné, jak to má fungovat. Možná to spíš rozepiš jako adresy.
index... => index...
foo => clanky/foo.php
??? => ???
Nebo všechno směruj na jeden skript, kde si to url rozparsuješ a naincluduješ soubory jak chceš. Ať už rewritem nebo jako ErrorDocument.
Nepostřehl jsem ten edit, že už ti to chodí. Asi se ti to stejně chová jinak než mně, ale hlavně, že to šlape :-)
Aha, to jsem špatně pochopil ten první konfig.
Ale prostě to přepisuje na /clanky/, tak tam buď dej celou cestu, nebo umaž to lomítko a "předponu" dej do rewritebase.
Já jsem to zkusil bez toho lomítka a funguje to. Dává to smysl, nevím proč jsem měl zafixováno, že se RewriteBase přidává vždycky.
Nevím, možná pages bez toho počátečního lomítka, ale myslím si, že by se RewriteBase mělo vždycky předřadit. V dokumentaci taky nic nevidím a instalovat se mi to nechce :-)
Nebo možná prostě napiš do RewriteRule tu cestu celou.
dev a prod jako "development" a "production" server.
Přidej tam [R] ať vidíš kam to přesměrovává.
Co bys tady do toho komentáře napsal? Že Interior je vnitřek a Color je barva?
Jj, na tom localhostu potřebuješ zachovat to počáteční /mojestranka. Mělo by stačit upravit RewriteBase.
# dev
RewriteBase /mojestranka
# prod
RewriteBase /
Jestli správně chápu, o co ti jde, tak to bude fungovat, tak jak chceš.
Ten přepis proběhne jen na serveru. Z pohledu prohlížeče, když budeš mít "/foo" a v něm "něco.css", tak to bude "/něco.css".
To [L] znamená last / konec zpracování. Jestli nechceš dělat nic dalšího, tak to tam můžeš přidat.
A asi bych do toho regexu na konec přidal $, pokud chceš matchovat jen "bar" a ne třeba i "barman".
MySQL dělá obousměrný překlad ipadresa->hostname->ipadresa a ty adresy musí sedět. Výsledky se cachují, možná ti tam z testování visí negativní záznam.
Takže ověř, že se ti to v obou směrech resolvuje správně a vyprázdni DNS cache pomocí FLUSH HOSTS. A pro jistotu se podívej jestli jsi tam nezapomněl nějaké testovací účty, které by navzájem kolidovaly.
#11 oxidián
No, ty jsi chtěl šoupat obrázek. To je skrolování. Já jsem navrhl to nedělat programově, ale dát ho do skrolovatelného divu (overflow: auto).
Původně mi to fungovalo pěkně (sáhnu na obrázek a posunu ho), ale když jsem to později zkoušel znova, tak to často kvedlalo celou stránkou. To je na prd.
Tak jsem to ještě zkusil skrolovat programově a to funguje dobře.
To draggable byl jen první nápad, kdyby sis s tím chtěl hrát.
Spíš jsem myslel nechat to scrolování na prohlížeči. Ale jak jsem si s tím hrál, tak mi to dost často scrolovalo celou stránku místo jen obrázku. S nabindovanými touch událostmi to ale pěkně scroluje jen obrázek.
A ještě raději asi jak to napsal Peter. Zobrazit ten obrázek celý a zase nechat zoomování na prohlížeči, pokud je to použitelné.
Touchpad je prakticky myš a touchscreen na mobilech taky funguje podobně jako myš. "Chmatání" na tlačítka funguje stejně, jako bys na ně klepnul myší.
Zkoušet to můžeš i na desktopu, když přepneš do mobilního režimu (Ve FF a Ch je to zkratka Ctrl+Shift+M)
jQuery UI má funcki draggable, která by mohla jít rozchodit na mobilech pomocí jQuery UI Touch Punch, ale mně se to nepovedlo.
Ale jednoduchý scrolovatelný div mi funguje pěkně.
#scroll {
width: 200px;
height: 200px;
overflow: auto;
}
--
<div id="scroll">
<img src="elephant.jpg">
</div>
Mně to připadá, že chceš sortovat o úroveň hlouběji.
// ne tak
$img_list[$k]['Q_alternative'][$i]
// ale tak
$img_list[$k]['Q_alternative'][$i][...]
Ale moc do detailu jsem to nezkoumal (je to dlouhýýý)
#30 oxidián
Že 205 jede a 206 spadne je k ničemu. Podívej se na hodnoty těch pointerů.
Ten řádek máš v pd0 a voláš to s ps0. Už ten předhozí kód jsem se ani nepokoušel pochopit, protože prostě nedává smysl.
Jestli ti nějaký kód přepisem přestal fungovat, tak jsi ho prostě přepsal blbě :)
Jo, a to co jsem chtěl napsat je, že bitmapa může být uložená shora dolů nebo zdola nahoru. Nevím, co je windowsí nebo delphácký default, ale ta verze zdola nahoru by možná vysvětlovala, proč ti to padá. Tj. pokud je první řádek fyzický poslední, tak při pokusu koukat na další řádky za ním, saháš úplně mimo.
Předpokládám, že to zase půjde ověřit kouknutím na pointerý vrácené ze Scanline.
Integer v Delphi je vždycky 32b. Dword nejspíš taky. Ale velikosti pointerů se na 32/64 liší. To už psal Milan, že ta konverze není dobrý nápad. Ale když to budeš kompilovat jako 32b aplikaci, tak prostě bude 32b a když pak poběží na 64b systému, tak se o případné konverze postará systém.
To, že by Scanline zpřístupňovala jen jediný řádek se mi zdá nepravděpodobné.
Myslím, že Delphi obsahuje zdrojáky VCL, tak bys krokováním dovnitř Scanline měl vidět, co dělá. A i bez zdrojáků by asi měl být vidět aspoň disassemblovaný stroják a na tom taky poznáš, jestli to jen násobí šířku řádku, nebo něco čaruje.
Nebo ještě jednodušeji prostě zkusit dva různé řádky a podívat se jak se ty vrácené pointery liší. To taky už psal Milan :-)
jj, já jsem to zrovna teď zkoušel a nevšiml jsem si, že ty už taky :)
A asi to teda je arr^[x]
Chce měnit barvu pixelu. Já ale chci v proceduře nabrat výběr barev, ne je měnit.
Nejdřív ho načte, pak otestuje a pak případně mění.
Jak odkázat na 32bitů a uložit to na integer?
Dostaneš obecný ukazatel, ten přetypuješ na ukazatel na 32b typ, takže dereferencí dostaneš odkazovanou 32b hodnotu. Už to Milan napsal.
Jednoduchý trik je použít ukazatel na pole, ale netuším jestli to ještě funguje.
type
PArray32 = ^TArray32;
TArray32 = array [0..0] of DWORD;
var
a32: PArray32;
...
a32 := ...ScanLine[0];
{$R-} // to pole je definovane jako 0..0, takze vypnout range check, pokud ho mas zapnuty
a32[0]
a32[1]
a32[2]
{$R+}
To je celkem normálka. Akorát bývá zvykem konkrétně uvést kolik ti po tu dobu budou platit, ale možná to není nutné a předpokládá se zákonné minimum. A netuším, jak to máte na Slovensku.
Podstatný je smysl takové doložky. Pokud ti zaměstnavatel platí školení, dává přístup k technologiím, nějak získáváš jejich know-how, atd. tak to nedělá proto, abys mu pak utekl a přebral zákazníky.
Jako živnostník v takové situaci nejspíš nejsi a ta doložka je nesmyslná. U nás automaticky neplatná.
Pokud je platná, tak ji můžete zrušit. Prostě se s nimi dohodni. (Nebo můžeš tu pokutu zaplatit předem, ale to asi není to, co bys chtěl :-)) A i pokud není platná, tak si to zavčas písemně vyjasněte.
Tak se mi ta "hustší" verze zdá lepší.
V principu jo, když ten kernel otočíš na diagonálu, tak bude detekovat diagonální hrany.
Akorát takhle kolem té diagonály "vzorkuješ trojúhelníky". To nedovedu intuitivně odhadnout, jak se to bude chovat a jestli by nebylo lepší ten kernel zvětšit. Jako takhle:
-1| 0| 1
-2| 0| 2
-1| 0| 1
A pootočit takhle:
| |-1| |
|-2| | 0|
-1| | 0| | 1
| 0| | 2|
| | 1| |
Ale fakt nevím.
Vezmeš pixel a jeho "sousedy", takže máš 3x3 pixely a matici 3x3 definující jejich "váhy". Jednotlivé pixely vynásobíš jejich váhami a ty násobky pak sečteš. A to uděláš pro všechny pixely.
Když se na ty matice/kernely podíváš, tak vidíš, že se stejné (nebo podobné) hodnoty nulují a rozdíly vynikají. Výrazné rozdíly jsou hrany. To je celé.
A když teda máš vertikální a horizontální hrany a chceš je sloučit, tak pro spoustu účelů je stačí normálně sečíst. Ale když je to teda vlastně vektor, tak se nabízí výpočet velikosti toho vektoru. A když máš vektor, tak máš i úhel. Jakoby kterým směrem je ten rozdíl "nejstrmější". V rámci těch 9 pixelů.
Na tom není nic k přemýšlení. A Matlab umí násobit a sčítat prvky matic, zázrak.
Co se týče toho odstraňování čísel, tak ty nejspíš budou všechny stejným fontem. Takže hrubě vytipovat oblasti, kde by mohly být a pak zkusit jestli tam opravdu jsou číslice.
Terminál/konzole je typicky v řádkovém režimu. To znamená, že se zadávaná data pošlou do programu až když Enterem ukončíš řádek. A Scanner podporuje i mezery jako oddělovač dat.
Jestli chceš zadat více hodnot na jednom řádku, tak nemusíš nic upravovat a prostě je tak zadej :)
Ale jinak teda teď asi po každém načtení hodnoty ji hned vypisuješ. Takže v jednom cyklu jen načti hodnoty a až potom je v dalším cyklu vypiš. (A zavání to tím, že budeš počítat průměr. Součet a počet můžeš počítat průběžně a ty hodnoty nepotřebuješ ukládat).
Pokud chceš vyloženě 4 čísla, třeba jako nějaké řídící parametry, tak je prostě načti do samostatných proměnných. Pokud jsou to nějaká data, která se hodí mít pohromadě, tak třeba do pole. A pokud nevíš velikost, jako třeba to čtení do 0, tak nějaký List.
double a = scanner.nextDouble();
double b = scanner.nextDouble();
double c = scanner.nextDouble();
double d = scanner.nextDouble();
// ======
double poleCisel[] = new double[4];
for (int i = 0; i < 4; i++) {
poleCisel[i] = scanner.nextDouble();
}
// ======
ArrayList<Double> listCisel = new ArrayList<>();
while ((cislo = scanner.nextDouble()) != 0.0) {
listCisel.add(cislo);
}
Máš tam jasně napsané, že krok toho cyklu bude delta. Takže projdeš ten interval a najdeš a ty extrémy.
Někde v nastavení buildu je volba úrovně logování. Zkus dát co nejvyšší a třeba pak půjde vidět, co konkrétně tomu chybí.
A toto teda vyžaduje, aby ten sub-select něco našel. Pokud chceš, aby to fungovalo vždy, tak to můžeš třeba zabalit do IFNULL.
IFNULL( (select ... ), 0 )
V SQL jde dělat "subquery". Můžeš tak použít výsledek selectu jako hodnotu v jiném výrazu. To může být dost neefektivní, ale v tomhle případě na tom nesejde.
Takže můžeš třeba vyselektovat datum posledního plnění a to použít pro vyselektování novějších záznamů.
SELECT *
FROM tabulka
WHERE datetime > (SELECT Max(datetime)
FROM tabulka
WHERE ticks = -1)
Neuniká. Nemám slov :-)
Mně asi uniká nějaký podstatný detail :)
V insert-values taky můžeš použít tu zdrojovou tabulku a nemusíš ty hodnoty uvádět dvakrát.
Myslím si, že ti to řve při parsovaní toho SETu kvůli závorkám kolem přiřazení. Ale nemám to kde vyzkoušet a nevím, jestli je tam Oracle dovoluje.
Pak ti to nejspíš ještě zařve za běhu, protože v `dual` neexistují ty selectované/matchované sloupce. A i pokud toto projde, tak ti to nic nevrátí a nezmerguje.
Merge funguje takhle:
dst.id
1
2
src.id
2
3
merge on id
dst src op
1 (nic)
2 2 matched then update ...
3 not matched then insert ...
Ten "trik" s tabulkou `dual` spočívá v tom, že je v ní jeden záznam, který se bude mergovat, ale jeho obsah nás nezajímá. Zajímá nás jen cílová tabulka pro rozhodnutí, jestli to bude nebo nebude jako match:
MERGE INTO dst D
USING dual
ON (D.id = 'XXX')
WHEN MATCHED THEN
UPDATE ...
WHEN NOT MATCHED THEN
INSERT ...
Dej tam 2pi a nech tam atanxy (nebo prohoď parametry atan2) a máš to hotové.
To je převod na radiány. 360 * deg je 2 * PI
No o tom "eliptickém zkreslení" jsem uvažoval hned na začátku, že by to mohlo jít spočítat, ale to nedám (jestli to vůbec jde).
I s tímhle přístupem nemusíš počítat přesně. Co dostaneš navíc jedním krokem, tak můžeš zase ubrat na dalším kroku a nikde to neujede víc než 1px. Průsečík je to nejmenší :-)
Já jsem to půlení intervalu taky zkoušel, ale tady nejde jednoznačně říct, jestli je potřeba prodloužit nebo zkrátit, tak to nemůže fungovat (obecně).
Triviální a zároveň rychlé řešení mě nenapadá.