tomascz píše:
A aspoň si to po sobě příště přečti - "pokut nebil soubor ke zpracování" to jako fakt né
Z mého pohledu tam jsou všechny písmenka, diakritická znaménka a věta dává smysl. Jo to bít a být je pod mou rozlišovací schopností. Ten kousek klidně smolím i dvě hodiny a při tom šílím z automatických oprav MS WORD. A WORD všechno neodchytí.
tomascz píše:
Kód:
var fSoubor1 = fopen{...);
if (fSoubor1 otevřen pro čtení ok){
var sou,poc,poz;
while ( freadf( fSoubor1, "definice tvého formátu", &sou, &poc, &poz ) == 3 ){
if ( je splněna podmínka týkající se sou, poc a poz )(
// vlastní zpracování aktuálního řádku
// jak se na to koukám tak by se to fakt dalo napsat mnohem líp
}
fclose(fSoubor1); // uzavření souboru
var blok1 = 0;
// něco bliju (a iterátorem v cyklu je zřejmě blok1) :puke:
var fSoubor2 = fopen(...);
if (fSoubor2 otevřen pro čtení ok){ // tohle zřejmě nemáš ve svém kódu ošetřeno
var y;
while ( freadf( fSoubor2, "definice tvého formátu", &y ) == 1 )
if ( je splněna podmínka týkající se y )(
// vlastní zpracování řádku
}
fclose(fSoubor2); // uzavření souboru
}
// něco bliju dále :puke:
}
No jo pokut jde mít vnořené příkazy tj. podmínka v příkazu muže být příkaz tak to se dají dělat kouzla. Ve FORTRANu 77 je nově zaveden DO WHILE (podmínka) jenže v podmínce platí stejná pravidla jak pro IF takže jen proměnné a konstanty. I pokut by parametr ERR=návěští byl ERR=proměnná (vracelo by se např. TRUE a FALSE) tak to by moc ničemu nepomohlo.
Panda38 píše:
Bez GOTO se opravdu dá obejít a nemusí být potřeba nikdy - místo toho používat podmínky, stavové flagy, funkce. Nebo v cyklu continue. GOTO je spíš projevem chybné konstrukce strukturovaného programu. Má velkou nectnost - je nejednoznačné v jakém stavu bude zásobník proměnných. A i překladači způsobuje problémy, protože v místě cílové adresy nemůže optimalizovat tok pořadí instrukcí, tak to zpomalí program i když se GOTO nepoužije.
.
No přemýšlel jsem, celí den zda by se dalo nějaké to GOTO z FORTRANu 77 odstranit a došel k závěru, že jen v některých vyjmečných případech a to jen za cenu (velkého) zkomplikování algoritmu a tím pádem k znepřehlednění.
Pokut jde o ty cukříky tak mezi ně patří i různé CYCLE, EXIT, BREAK aneb je to trochu komplikovanější GOTO.
Pro zajímavost jak by vypadal tento podprogram v něčem kde GOTO je spíše relikt než nutnost.
Trochu úvod do toho co to má dělat a proč to je zrovna tak jak to je. FORTRAN 77 ve kterém to je napsané v základu překládá pro 8086/87 nebo s parametrem pro 80286/80287 s dalším parametrem doplní knihovnu co nahradí fyzický matematický koprocesor. Takže do paměti se nevleze moc dat tak se to řeší přes soubory. Daný podprogram spojuje soubory podle šablony aneb DSD a současně název šablony je i název výstupního DSS, těch šablon je vícero a obsahuji seznam datových souborů součástek aneb DSS. Hlavní program po seznamu šablon ještě přidává *VSE* kdy se pak provedou všechny šablony. Pokut se v šabloně narazí na řádek složen ze samých pomlček tak následnicí DSS se budou odečítat.
V kanále 2 je výstupní soubor, ze kterého se bere popis a zobrazí se na Console. V kanále 1 je šablona, v kanále 3 je vstupní soubor. Kanály U1 a U2 jsou pomocné pracovní sobory a hvězdička je vstup/výstup na Consoli.
První DSS se rovnou překopíruje do pomocného souboru na kanále U1, další DSS na kanále 3 se porovná s daty na kanále U1, pokut se objeví dva shodné řádky tak se sloučí a výsledek se uloží na kanál U2, jinak ve kterém kanále (3 nebo U1) jsou „menší“ data tak s toho kanálu se uloží data na kanál U2. Pokut se narazí na konec v některém z kanálů 3 nebo U1 tak se zbytek druhého kanálu do kopíruje do kanálu U2. Jakmile jsou oba sobory na koci tak se prohodí čísla pomocných kanálu U1 a U2 a celá mašinerie muže začít nanovo. Pokut se v šabloně narazí na konec tak se zbyteček prohodí čísla pomocných kanálu U1 a U2 obsah z kanálu U2 překopíruje do výstupního soboru na kanálu 2 to zbytečné prohození je asi pohrobek nějaké předchozí verze nebo mi nedocvakli nějaké souvislosti, aneb stačilo to překopírovat z kanálu U1.
To „27,‘[něco‘“ tj. „ESC,‘[něco‘“ je ovládaní kurzoru a barev pomoci ovladače ANSI.SYS, IFBRK je dodělaná funkce na čtení klávesnice, u proměnné TYP se počet položek dědí z hlavního programu proto ta hvězdička v deklaraci, S je čilo šablony, ne VER je "číslo" verze programu a v CO je co se zrovna provádí v tomto případe tam bude SPOJ. IF si neporadí s polem textových proměnných tak je to potřeba překopírován do pomocné proměnné, v daném případě TY.
Kód:
C ***************************** SPOJ ***********************************
subroutine spoj(typ,s,ver,co)
integer*2 i,l,k,s,p,u,u1,u2,poc,poc1,j,pocet
character typ*20(*),ver*15,co*10,ty*20,poznamka*20,nic*50
character sou*20,poz*20,sou1*20,poz1*20
ty=typ(s)
if (ty.eq.'*VSE*') then
k=1
l=s-1
else
k=s
l=s
end if
do i=k,l
u1=10
u2=11
open(unit=u1)
open(unit=u2)
write(*,'(1x,2(a1,a))')27,'[2J',27,'[0m'
write(*,'(1x,a)')ver
write(*,'(1x,2(a1,a),a,(a1,a))')
# 27,'[3;36H',27,'[1;37m','PROGRAM E',27,'[0m'
write(*,'(/,36x,a)')co
ty=typ(i)
write(*,'(1x,a1,a,i2.2,2a)')
# 27,'[6;',(80-len_trim(ty)+2)/2,'H',ty
ty=typ(i)
ty=ty(1:len_trim(ty))//'.dss'
c CLOSE (unit=1)
OPEN (unit=2,file=ty,status='OLD',err=100)
read(2,'(a)')poznamka
write(*,'(1x,a1,a,i2.2,2a,a1,a,//)')
# 27,'[7;',(80-len_trim(poznamka)+2)/2,'H',poznamka,27,'[0m'
read(2,'(a)')nic
ty=typ(i)
ty=ty(1:len_trim(ty))//'.dsd'
p=0
j=0
OPEN (unit=1,file=ty,status='OLD',err=100)
1 read(1,'(a)',err=100)ty
if (ty.eq.'--------------------')then
p=1
goto 1
end if
ty=ty(1:len_trim(ty))//'.dss'
write(*,'(2x,a,\)')ty
rewind u1
rewind u2
OPEN (unit=3,file=ty,status='OLD',err=100)
read(3,'(a)')nic
read(3,'(a)')nic
if (j.eq.0)then
2 read(3,'(a,2x,i4,2x,a)',err=1)sou,poc,poz
write(u1,'(a,2x,i4,2x,a)')sou,poc,poz
j=1
goto 2
end if
read(3,'(a,2x,i4,2x,a)',err=101)sou,poc,poz
if (p.eq.1)poc=-poc
read(u1,'(a,2x,i4,2x,a)',err=102)sou1,poc1,poz1
3 if (sou.eq.sou1.and.poz.eq.poz1)then
poc=poc+poc1
write(u2,'(a,2x,i4,2x,a)')sou,poc,poz
read(3,'(a,2x,i4,2x,a)',err=111)sou,poc,poz
if (p.eq.1)poc=-poc
read(u1,'(a,2x,i4,2x,a)',err=112)sou1,poc1,poz1
else if (sou.eq.sou1.and.poz.lt.poz1)then
write(u2,'(a,2x,i4,2x,a)')sou,poc,poz
read(3,'(a,2x,i4,2x,a)',err=102)sou,poc,poz
if (p.eq.1)poc=-poc
else if (sou.lt.sou1)then
write(u2,'(a,2x,i4,2x,a)')sou,poc,poz
read(3,'(a,2x,i4,2x,a)',err=101)sou,poc,poz
if (p.eq.1)poc=-poc
else
write(u2,'(a,2x,i4,2x,a)')sou1,poc1,poz1
read(u1,'(a,2x,i4,2x,a)',err=102)sou1,poc1,poz1
end if
goto 3
101 write(u2,'(a,2x,i4,2x,a)')sou1,poc1,poz1
111 read(u1,'(a,2x,i4,2x,a)',err=103)sou1,poc1,poz1
write(u2,'(a,2x,i4,2x,a)')sou1,poc1,poz1
goto 111
102 write(u2,'(a,2x,i4,2x,a)')sou,poc,poz
112 read(3,'(a,2x,i4,2x,a)',err=103)sou,poc,poz
write(u2,'(a,2x,i4,2x,a)')sou,poc,poz
goto 112
103 u=u1
u1=u2
u2=u
goto 1
100 rewind 2
write(2,'(a)')poznamka
write(2,'(a,12x,a)')'soucastka','pocet'
s=0
pocet=0
u=u1
u1=u2
u2=u
rewind u2
4 read(u2,'(a,2x,i4,2x,a)',err=104)sou,poc,poz
write(2,'(a,2x,i4,2x,a)')sou,poc,poz
s=s+poc
pocet=pocet+1
goto 4
104 write(*,'(1x,2(a1,a),a,17x,i4,1x,i6)')
# 27,'[21;10H',27,'[37;1m','Secteno: ',pocet,s
CLOSE (unit=1)
CLOSE (unit=2)
CLOSE (unit=3)
CLOSE (unit=u1)
CLOSE (unit=u2)
end do
write(*,'(1x,a1,a,4(a1,2a),\)')
# 27,'[25;62H',27,'[1;31m','N',27,'[0m','navrat ',
# 27,'[1;31m','K',27,'[0m','onec '
5 k=0
do while (k.eq.0)
k=ifbrk()
end do
if (k.eq.107.or.k.eq.75) then
write(*,'(1x,a1,a)')27,'[0m'
stop'KONEC programu E'
else if (k.eq.78.or.k.eq.110) then
return
end if
goto 5
end