C++, Delphi, JAVA és egyéb programnyelvek

Started by ignus, 2007-06-05, 15:03:45

Previous topic - Next topic

TurboK

A felét nem értettem, de azért köszi. Az életben nem leszek kész ezzel a progival, ahányszor belenézek, mindíg találok valamit amivel még okosabbá tudnám tenni.

Jó lovag, velünk tartasz-e Camelotba a kerekasztal lovagjai közé?

http://www.saunalahti.fi/cse/foobar2000.php target=_blank>http://web.axelero.hu/fka2636/dwnld_fb2k.png>

Makos

Quote from: TurboK on 2010-03-25, 01:34:09
A felét nem értettem, de azért köszi. Az életben nem leszek kész ezzel a progival, ahányszor belenézek, mindíg találok valamit amivel még okosabbá tudnám tenni.
Ez minden programra jellemző :D

Moha

Quote from: Makos on 2010-03-25, 12:54:59
Quote from: TurboK on 2010-03-25, 01:34:09
A felét nem értettem, de azért köszi. Az életben nem leszek kész ezzel a progival, ahányszor belenézek, mindíg találok valamit amivel még okosabbá tudnám tenni.
Ez minden programra jellemző :D
Első munkahelyemen rangidős programozó munkatárs mondta egyszer:

"Egy program soha sincs befejezve, maximum nem fejlesztik tovább."

Bírtam az öreget, jó fej volt. :)

TurboK

A gond csak az hogy a progi egy szakdolgozat tárgya, amibe illene belekezdenem.

Jó lovag, velünk tartasz-e Camelotba a kerekasztal lovagjai közé?

http://www.saunalahti.fi/cse/foobar2000.php target=_blank>http://web.axelero.hu/fka2636/dwnld_fb2k.png>

kikuchiyo

Az nagyon kellemetlen, amikor egy szakdolgozat a "még nem fejeztem be, de már majdnem elkezdtem" állapotban van.

Mi a téma?
Failure is the default option

TurboK

#275
Hogyan lehet egy tömbhöz új tömb értékeit hozzácsatolni, úgy hogy a kulcsok automatikusan növekednek? $tomb[] nem jó, mert akkor minden hozzácsatolt tömb uj alkulcs alá kerül kap.

Valami ilyesmi:

foreach ($file_extensions as $tomb2) {$tomb1[$i][] = glob($directory[$i]."/*.".$tomb2));}

($i változó szükséges egy más dolog miatt, az egész hóbelebanc egy $i által uralt for ciklusban van)
Ez a példa nem működik, mert így ahányszor lefut a foreach, annyi al-tömb jön létre. Egy al-tömb kéne, amibe belemegy az összes cucc.

Vagy van még:

foreach ($file_extensions as $tomb2) {$tomb1[$i] = glob($directory[$i]."/*.".$tomb2));}

De így meg folyamatosan felülírja a $tomb[$i] értéket, és csak a $tomb2 legutolsó értéke kerül bele (mert azzal írta felül utoljára).

Jó lovag, velünk tartasz-e Camelotba a kerekasztal lovagjai közé?

http://www.saunalahti.fi/cse/foobar2000.php target=_blank>http://web.axelero.hu/fka2636/dwnld_fb2k.png>

kikuchiyo

#276
Jól értem, hogy azt akarod, ami perlben ez lenne:
foreach my $tomb2 (@file_extensions) {
    push @{$tomb1[$i]}, glob($directory[$i]."/*.".$tomb2);
}

?

Találtam valami hülye cookbookot, ami szerint ugyanez PHP-ban:
foreach ($file_extensions as $tomb2) {
    $temp = glob($directory[$i]."/*.".$tomb2);
    array_merge($tomb1[$i], $temp);
}


Persze lehet, hogy nem jó, nem értek a PHP-hoz.
(Amit eddig láttam belőle, az alapján az a benyomásom, hogy olyasvalaki találta ki, aki megpróbált perlben programozni, de nem értette...)
Failure is the default option

motifator

#277
Quote from: TurboK on 2010-03-26, 02:47:53
[...] uj alkulcs alá kerül kap.
:zomg:

Jól értem, hogy az a cél, hogy a $tomb1 sima egydimenziós tömb meglévő értékei után szeretnéd másolni a glob($directory[$i]."/*."$tomb2) által visszaadott tömb elemeit?
Akkor mondjuk valami ilyesmi:

foreach ($file_extensions as $ext) { //ne nevezd $tomb2-nek, ha egyszer nem is tömb, nagyon zavaró
  $filenames = glob($directory[$i] . "/*." . $ext); // mi ez az $i? honnan jön? mikor növekedik az értéke?
  foreach ($filenames as $filename) { // bejárod a glob() által visszaadott tömböt, mert...
    $tomb1[] = $filename; // így a $tomb1-be magát a sztringet rakod bele következő elemnek, nem az egész $filenames tömb kerül kap új alkulcs alá :)
  }
}

Vagy valami. Kevés a kód, amit írtál, néhány dolog nem egyértelmű, hogy honnan jön (pl. $i), de azért remélem ez segít.
Ha még mindig nem tiszta, akkor írd le, hogy pontosan mit szeretnél elérni, milyen könyvtárakat akarsz bejárni, miért csak adott kiterjesztésű fájlokat gyűjtesz, ezek az adatok honnan jönnek, stb.

EDIT:
Quote from: kikuchiyo on 2010-03-26, 11:22:44
foreach ($file_extensions as $tomb2) {
    $temp = glob($directory[$i]."/*.".$tomb2;
    array_merge($tomb1[$i], $temp);
}

Az array_merge alapvetően jó ötlet, ugyanazt csinálja, amit az én belső foreach-em. De így, ahogy te írod, a $temp még mindig a $tomb1[$i] alá új alkulcs kerül kap.
Inkább így:
foreach ($file_extensions as $tomb2) {
    $temp = glob($directory[$i]."/*.".$tomb2;
    array_merge($tomb1, $temp);
}


De amúgy egy az egyben el kéne felejteni ilyen elnevezéseket, hogy $tomb1 meg $tomb2, a $temp se túl szerencsés, bár ebben az esetben tényleg csak egy eldobható változó. A $tomb2 ráadásul nem is tömb. Ejnye.
Nothing amazing happens here, and you get used to that: used to a world where everything is ordinary.
Every day we spend here is like a whole lifetime of dying slowly.

kikuchiyo

#278
Én nem egészen értettem, hogy minek kéne vagy nem kéne új alkulcs alá kerül kapnia (:D), de arra következtettem (abból, hogy az egész egy nagy foreach ciklusban van), hogy itt igazából egy könyvtárlistán iterál végig, és ennek az iterátora az $i. És úgy szeretné, hogy a $directory tömb $i-edik eleméhez a $tomb1-ben tartozzon egy $tomb1[$i] al-tömb vagy mi, ami pedig a megfelelő kiterjesztésű fájlok listáját tartalmazza.
E te megoldásod ezzel szemben az összes megfelelő ilyen fájlnevet egy tömbbe ömleszti. Ha ez a cél, akkor persze a tied jó.

A $temp-re nem tudom, hogy van-e szükség, ha be lehet a glob-os kifejezést pakolni az array_merge argumentumába, akkor nincs.

Az elnevezésekről alkotott véleményedet osztom. (Amúgy miféle fasság ez már, hogy a tömböket és a skalárokat ugyanazzal a $-vel jelölik?)
Failure is the default option

TurboK

#279
Quote from: motifator on 2010-03-26, 11:22:57
Quote from: TurboK on 2010-03-26, 02:47:53
[...] uj alkulcs alá kerül kap.
:zomg:
Hajnali háromkor erre telik.

Quote from: kikuchiyo on 2010-03-26, 18:29:28
Én nem egészen értettem, hogy minek kéne vagy nem kéne új alkulcs alá kerül kapnia (:D), de arra következtettem (abból, hogy az egész egy nagy foreach ciklusban van), hogy itt igazából egy könyvtárlistán iterál végig, és ennek az iterátora az $i. És úgy szeretné, hogy a $directory tömb $i-edik eleméhez a $tomb1-ben tartozzon egy $tomb1[$i] al-tömb vagy mi, ami pedig a megfelelő kiterjesztésű fájlok listáját tartalmazza.
E te megoldásod ezzel szemben az összes megfelelő ilyen fájlnevet egy tömbbe ömleszti. Ha ez a cél, akkor persze a tied jó.

A $temp-re nem tudom, hogy van-e szükség, ha be lehet a glob-os kifejezést pakolni az array_merge argumentumába, akkor nincs.

Az elnevezésekről alkotott véleményedet osztom. (Amúgy miféle fasság ez már, hogy a tömböket és a skalárokat ugyanazzal a $-vel jelölik?)

Valami ilyesmi. A directory[] tömbbe be van olvasva minden könyvtár neve (és egyebek). Van egy nagy for ciklus $i iterátorral, amivel a directory tömb $i-edik eleméből olvasok infót (név, méret, ilyesmi). Tehát amikor az $i értéke 0, akkor a directory tömb első elemét nézem, ami lehet pl. az ami fájlnévre az első, vagy aminek a legujabb a dátuma, attól függően hogy a directory tömböt hogyan rendeztem sorba. Ez a program lelke.

A dolog aminél elakadtam az az, hogy egy-egy könyvtárból fájllistát is csináljon. $i cikluson belül kéne lemennie, egyrészt mert az $i irányít többek között oldalakra tagolást is, és így csak annak a könyvtárnak a tartalmát kell beolvasni, ami az adott oldalon megjeleni. Ha a directory tömbbe beolvasnám az egész könyvtárfát mappán belüli fájlokkal, akkor az egyrészt lassú lenne (300 mappa alatt 10000 fájl van ott ahol egyébként is használom a programot, haveri alapú ingyen host ugyhogy nem akarom terhelni), másrészt sokat pazarolna (egy oldalon csak 12 mappa van kijelezve), harmadrészt azt az alapfunkciót kéne átirnom amire az egész program épül és erre se időm, se türelmem, se elég tudásom.

Ha csak glob (*.*)-ot használnék, akkor beszedne mindent, ami nem jó mert alap dolog hogy a program csak azt a kiterjesztést látja amit engedélyezel neki. Ezért végig kell menni egy foreach-al az engedélyezett kiterjesztések listáján, és ezt úgy pakolni egy tombbe hogy a tomb minden eleme $i alatt tartalmazzon egy al-tombot, amiben benne van a fájllista. A $tomb1-nek tehát így kéne kinéznie:
tomb (
[0] => tomb (
              [0] => mappa0\fájl1.png
              [1] => mappa0\anyám.png
              [2] => mappa0\stb.jpg
              [3] => mappa0\lalala.jpg
            )
[1] => tomb (
              [0] => mappa1\egyéb.png
              [1] => mappa1\fájl2.png
            )
)


Ha csak $tomb1[]-t vagy $tomb1[$i][]-t használnék, akkor minden kiterjesztést (minden foreach ciklust) ujabb altombbe tenné:
tomb (
[0] => tomb (
              [0] => mappa0\fájl1.png
              [1] => mappa0\anyám.png
            )
[1] => tomb (
              [0] => mappa0\stb.jpg
              [1] => mappa0\lalala.jpg
            )
[2] => tomb (
              [0] => mappa1\egyéb.png
              [1] => mappa1\fájl2.png
            )
)


Ez így nem jó, mert összevissza kavarodik minden.

Ezért van arra szükségem hogy tartalommal bővitsen a foreach egy tömböt. array_merge-et már próbáltam, de nem sikerült működésre bírnom, valószínüleg csak én voltam a béna.

>ha be lehet a glob-os kifejezést pakolni az array_merge argumentumába, akkor nincs

Nekem nem sikerült.

Jó lovag, velünk tartasz-e Camelotba a kerekasztal lovagjai közé?

http://www.saunalahti.fi/cse/foobar2000.php target=_blank>http://web.axelero.hu/fka2636/dwnld_fb2k.png>

kikuchiyo

#280
Csak tippelek, miért nem működött az array_merge: a manual szerint csak tömböket fogad el argumentumként. És lehet, hogy ha a $tomb1[$i] még nem létezik, az nem jó neki.


$tomb1[$i] = array(); // mukoggy!
foreach ($file_extensions as $tomb2) {
    $temp = glob($directory[$i]."/*.".$tomb2;
    array_merge($tomb1[$i], $temp);
}


Vagy mittudomain.

szerk: Meg talán olyan is van, hogy a '+' operátor tömbökre vonatkoztatva 'unió' jelentésű.

$tomb1[$i] = array(); // mukoggy!
foreach ($file_extensions as $tomb2) {
    $temp = glob($directory[$i]."/*.".$tomb2;
    $tomb1[$i] += $temp;
}
Failure is the default option

TurboK

array_merge egyik fenti példára se reagált, nem egyesít semmit (a $temp megmarad üres tömbnek, $tomb1 meg ki lesz lőve (print_r-re semmit nem dob ki)).
Ha olyat csinálok hogy $temp2 = array_merge($tomb1[$i], $temp);, arra se reagál. valszeg az array_merge nem szeret itt valamit.
($temp és $tomb1 is deklarálva van tombnek, az összes cikluson kívül)
+= operátorral nem fut le a program.
(egyébként ilyesmi kombinációkkal szoptam tegnap hajnal háromig)


motifator dupla foreach-je viszont tökéletesen megteszi azt amire szükségem van. Köszi!

Jó lovag, velünk tartasz-e Camelotba a kerekasztal lovagjai közé?

http://www.saunalahti.fi/cse/foobar2000.php target=_blank>http://web.axelero.hu/fka2636/dwnld_fb2k.png>

Moha

Hai!

SQL-ben meg lehet oldani, hogy azonos táblából több rekordot "egymás mellé" teszek egy szempont szerint?

Konkrétan egy php/mysql alapú rendszert fejlesztek, ami boltok forgalmát rögzíti. Minden nap felrögzítik majd hogy hány vásárló volt, mennyi eladás, napi forgalom, stb. Namost, kellene egy összehasonlító nézet, ahol egy sorban (adott napra nézve) összehasonlítható a forgalom a különböző boltokban.
GROUP BY-al le tudom ugye kérdezni az adott napi össz forgalmat az összes boltban, de ugye boltonként kellene. A forgalom tábláman van egy mező, ami az adott bolt ID-je.
Tehát olyasmire gondolok, hogy:
SELECT bolt1.forgalom, bolt2.forgalom FROM eladas <insert help>
2 bolt összehasonlítása elég volna. Van erre natív SQL vagy inkább csináljak több lekérdezést és PHP-vel rendezzem őket egymás mellé?

Előre is kösz a segítséget!

Kuroi Tenshi

Quote from: Moha on 2010-05-03, 21:33:52
GROUP BY-al le tudom ugye kérdezni az adott napi össz forgalmat az összes boltban, de ugye boltonként kellene. A forgalom tábláman van egy mező, ami az adott bolt ID-je.

Vak vezet világtalant, de ha

SELECT bolt,forgalom FROM forgalomtabla
SUM forgalom
GROUP BY bolt

akkor csak az azonos boltnévhez tartozó értékeket
összegzi, pont erre való a group by.

Moha

Az a baj, hogy így 2 sorom lesz:





BoltnévForgalom
bolt11234
bolt25678

Nekem meg így kellene:



Bolt1 forgalomBolt2 forgalom
12345678

Mindegy, ha nem oldható meg, akkor lekérem külön és összerakom PHP-val.

Próféta

Jó ideje nem nyúltam SQL-hez, de nem látom igazából, mi a probléma. Simán összejoinolod kétszer ugyanazt a táblát/view-t, az miért nem jó?
SELECT bolt1.forgalom, bolt2.forgalom
FROM napiForgalomView AS bolt1, napiForgalomView AS bolt2
WHERE bolt1.név=?egyik AND bolt2.név=?másik

Ahol a napiForgalomView ugyanaz, amit K_T definiált (+szűrve a keresett napra).
Ha nem akarsz view definiálással vesződni, akkor helyette zárójelek közé bemásolhatod az egész SELECT-utasítást.

Ha meg azt akarod, hogy több sor legyen, minden sor egy-egy napra a két bolt, akkor meg a view helyett simán a (boltnév,nap,napibevétel) táblát joinolod össze magával, bolt1.nap = bolt2.nap mentén (ezt az oszlopot nyilván selecteled is).

Kuroi Tenshi

Quote from: Moha on 2010-05-03, 22:11:16
Az a baj, hogy így 2 sorom lesz:

Ez nem bug, hanem feature :p
De komolyan, ez neked baj?  :3x3: :zomg:
Szerintem pont így átláthatóbb (+ ha sok bolt van, akkor
inkább vertikális scroll, mint horizontális) és jobban kezelhető
(oszlopok), arról nem is beszélve, hogy mennyivel egyszerűbb...

Próféta

Quote from: Kuroi Tenshi on 2010-05-04, 00:30:31
Quote from: Moha on 2010-05-03, 22:11:16
Az a baj, hogy így 2 sorom lesz:

Ez nem bug, hanem feature :p
De komolyan, ez neked baj?  :3x3: :zomg:
Szerintem pont így átláthatóbb (+ ha sok bolt van, akkor
inkább vertikális scroll, mint horizontális) és jobban kezelhető
(oszlopok), arról nem is beszélve, hogy mennyivel egyszerűbb...
Tök igazad van, az esztétikai szempontok mellett így ugye egy adatbáziskezelő is többet tud vele kezdeni, meg egyszerűbben skálázható majd arra az esetre, ha nem két, hanem x boltot akar összehasonlítani.

Szerintem ezt ő is tudja, és azért akarja egy sorba tenni, hogy soronként egy nap lehessen, ezért is írtam azt a kiegészítést a végére.

kikuchiyo

Az ember időnként megretten a saját munkája minőségétől.

Mi lenne pl., ha Megsemmisülne A Világ, Ahogyan Ismerjük, és az egyetlen fennmaradt töredék az alábbi lenne:
[spoiler]reset
fn = "list_signific_w_expl.txt"
ext = ".pdf"
fs = 14
r = 0.02
freq = "1800MHz 900MHz"
mod = "CW GSM"
wave = "cont. int."
t(i) = word(freq,1+(i&4)/4)." ".word(mod,1+(i&2)/2)." ".word(wave,1+(i&1)) #.", i=".i
tf(i) = word(freq,1+(i&4)/4)."_".word(mod,1+(i&2)/2)."_".word(wave,1+(i&1)).ext
tfm(i) = word(freq,1+(i&4)/4)."_".word(mod,1+(i&2)/2).ext
p(x) = log(x)/log(30)+1
c(i) = sprintf ("#%x", (((i&4)/4)?2**16:1) * ( ((i&2)/2)*2**7 + (i&1)*2**6 + 2**6-1))
color(x) = (x==1) ? 0x000000 : 0x606060;
posd = 0.075
posx(x,y,s) = (x>y) ? x+posd*(p(s)+2) : x-posd*(p(s)+2)
posy(x,y,s) = (x>y) ? y-posd*(p(s)+2) : y+posd*(p(s)+2)
txt(x) = (x==1) ? '*' : ''
MARGINS0 = "set tmargin at screen 0.9; set rmargin at screen 0.12"
MARGINS1 = "set lmargin at screen 0.08; set rmargin at screen 0.5"
MARGINS2 = "set lmargin at screen 0.56; set rmargin at screen 0.98"

PLOT1 = 'plot x w l lc rgb "gray" notit, '
PLOT1 = PLOT1.'fn u 3:1:4:2 i i w xyerrorbar ps 0 lw 0.5 lc rgb "#202020" notit,'
PLOT1 = PLOT1.'fn u 3:1:(p($5)/10):(0):(360):(color($10)) i i w circ lc rgb var fs empty notit,'
PLOT1 = PLOT1.'fn u 3:1:(p($5)/10):(90-59*$6):(90):(color($10)) i i w circ lc rgb var fs solid 1.0 notit,'
PLOT1 = PLOT1.'fn u (posx($3,$1,$5)):(posy($3,$1,$5)):(txt($10)) i i w labels center tc rgb "black"'

# valamiert az igy gyartott eps-eknek lelog a szele.
CONVERT = 'system("rm ".tfm(i).".eps");system("pdf2ps -dEPSCrop ".tfm(i)." ".tfm(i).".ps");'
CONVERT = CONVERT.'system("ps2eps ".tfm(i).".ps");system("rm ".tfm(i).".ps")'
#CONVERT = 'system("pdftops -eps ".tfm(i)." ".tfm(i).".eps");'

set xl "Control tail DNA %"
set yl "Exposed tail DNA %"
unset key
set size ratio -1

set term pdfc size 6,3 font "Gill Sans MT,".fs #fontscale 1

p(x) = log(x)/log(10)+1
s(S,s) = sprintf("{/=%d %s}", p(s)*5., S eq "0.5" ? ".5" : S)

set xr [4:11]
set yr [4:11]

#set out "scatter_multi.pdf"
#set multiplot layout 2,4 rowsfirst title "Scatterplot" font ",".sprintf("%.1f",fs*1.4)
i = 0
set title t(i) font ",".sprintf("%.1f",fs*1.2)
p(x) = log(x)/log(20)+1

eval MARGINS0

set out tfm(i)
set multiplot
eval MARGINS1
eval PLOT1

eval MARGINS2
i = 1; set title t(i); eval PLOT1
unset multiplot
set out


i = 4
set out tfm(i)
set multiplot
eval MARGINS1
set title t(i); eval PLOT1

eval MARGINS2
i = 5; set title t(i); eval PLOT1
unset multiplot
set out


i = 6
set out tfm(i)
set multiplot
eval MARGINS1
set title t(i); eval PLOT1

eval MARGINS2
i = 7; set title t(i); eval PLOT1
unset multiplot
set out

HNNNGG = "i 9 w circ lc rgb var fs "
PLOT2 = ', fn u ($3*0.7+5):(-$1*0.75+14.5):(p($5)/10):(0):(360):(color($10)) '.HNNNGG.'empty notit,'
PLOT2 = PLOT2.'fn u ($3*0.7+5):(-$1*0.75+14.5):(p($5)/10):(90-59*$6):(90):(color($10)) '.HNNNGG
   PLOT2 = PLOT2.'fs solid 1.0 notit,'
PLOT2 = PLOT2.'fn u ($3*0.7+5):(-$1*0.75+14):5 i 9 ev :::1::1 w labels tc rgb "black",'
PLOT2 = PLOT2.'fn u ($3*0.7+5):(-$1*0.75+15.2):6 i 9 ev :::0::0 w labels tc rgb "black"'

set label 1 "Irradiation\ntime [h]" at first 9.25, 13.8 center
set label 2 "Sampling\ntime [h]" at first 9.75, 15 center
set obj 1 rect from first 4.5,15.5 to first 10.75,12.75 fs empty border rgb "black"

i = 2
set xr [4:12]
set yr [4:16]
set term pdfc size 6,3*12./7.
set out tfm(i)
set multiplot
eval MARGINS1
set title t(i); eval PLOT1.PLOT2  ## !!! plotting explanation

unset label 1; unset label 2; unset obj 1
unset yl
eval MARGINS2
i = 3; set title t(i); eval PLOT1

unset multiplot
set out


set term pop

if (1) i = 0; eval CONVERT;i = i+2; eval CONVERT;i = i+2; eval CONVERT;i = i+2; eval CONVERT
[/spoiler]
Failure is the default option

Moha

Hali!

Felkérésre csináltam egy nagyon fapados kis facebook "teendő lista" app-ot.
Bátor (facebookon regisztrált) jelentkezőket kérnék, akik tesztelnék egy kicsit... (linket PM-ben adom)

Előre is köszi.

Moha

.Attila

SQL gyakorláshoz kéne valami, tudtok esetleg könyvet CD-vel, vagy valami honlapot, ahol táblák vannak és gyakorolni lehetne?
Van a w3schools, de a gyakorlás kissé nehézkes.

Puru²

#291
Head first SQL ugyaninnen tudsz leszedni hozzá sql fájliokat

.Attila


chilip

#293
[spoiler=zsak.h]#ifndef ZSAK_H_INCLUDED
#define ZSAK_H_INCLUDED


class zsak
{
    public:
        zsak();
        zsak(int &meret);
        ~zsak();
        void urese();
        void kiir();
        void beszur(const int &ertek);
        void kivesz(const int &ertek);
        void metszet(const zsak &z1, const zsak &z2);

    private:
        int* w;
        int meret, tarolo1, tarolo2;
        bool log, be, osszehuz;
};

zsak::zsak()
{
    w = new int [2];
    w[0] = 0;
    w[1] = 0;
    meret = 2;
}

zsak::zsak(int &meret)
{
    w = new int [meret];
}

zsak::~zsak()
{
    delete[] w;
}

void zsak::urese()
{
    if(w[1] == 0)
    {
        std::cout << "URES";
    }else{ std::cout << "NEM URES"; }
}

void zsak::kiir()
{
    std::cout << "zsak: ";
    for(int i = 0; i<meret; i++)
    {
        std::cout << w[ i] << "x" << w[i+1] << "db,";
        i = i+1;
    }
    std::cout << std::endl;
}

void zsak::beszur(const int &ertek)
{
    if(w[1] == 0)
    {
        w = new int [2];
        w[0] = ertek;
        w[1] = 1;
        meret = 2;
    }else
    {
        log = false;
        be = false;
        for(int i=0; i<meret; ++i)
        {
            if(w[ i] > ertek && !be)
            {
                tarolo1 = w[ i];
                tarolo2 = w[i+1];
                w[ i] = ertek;
                w[i+1] = 1;
                log = true;
            }else if(w[ i] == ertek)
            {
                w[i+1] = w[i+1] + 1;
                be = true;
            }else if( i == meret-2 && w[ i] < ertek && !be)
            {
                tarolo1 = ertek;
                tarolo2 = 1;
            }
            i = i+1;
        }
        if(!be)
        {
            meret = meret + 2;
            w[meret-2] = tarolo1;
            w[meret-1] = tarolo2;
        }
    }
}

void zsak::kivesz(const int &ertek)
{
    osszehuz = false;
    for(int i=0; i<meret; ++i)
    {
        if(osszehuz && i < meret-4)
        {
            w[ i] = w[i+2];
            w[i+1] = w[i+3];
        }else if(osszehuz && i == meret-4)
        {
            w[ i] = w[i+2];
            w[i+1] = w[i+3];
            meret = meret - 2;
        }
        if(w[ i] == ertek)
        {
            if(w[i+1] > 1)
            {
                w[i+1] = w[i+1] -1;
            }else if(w[i+1] == 1)
            {
                osszehuz = true;
                w[ i] = w[i+2];
                w[i+1] = w[i+3];
            }
        }
        i = i + 1;
    }

}

void zsak::metszet(const zsak &z1,const zsak &z2)
{
    int limit;
    int i, j, z = 0;
    if(z1.meret > z2.meret)
    {
        limit = z1.meret;
    }else{limit = z2.meret;}
    for(int k = 0; k < limit; ++k)
    {
        if(i < z1.meret && j < z2.meret)
        {
            if(z1[ i] > z2[j])
            {
                j = j+2;
            }else if (z1[ i] < z2[j])
            {
                i = i+2;
            }else if(z1[ i] == z2[j])
            {
                w[z] = z1[ i];
                if(z1[i+1] > z2[j+1])
                {
                    w[z+1] = z2[j+1];
                }else if(z1[i+1] < z2[j+1])
                {
                    w[z+1] = z1[i+1];
                }
                i = i+2;
                j = j+2;
                z = z+2;
            }
        }
    }
}

#endif // ZSAK_H_INCLUDED
[/spoiler]
nos minden működik kivéve a piros rész a legvégén, és ezeket dobálgatja ki rá:
[spoiler]s\C++\beadando\1_8\beadando1\zsak.h||In member function 'void zsak::metszet(const zsak&, const zsak&)':|
s\C++\beadando\1_8\beadando1\zsak.h|145|error: no match for 'operator[]' in 'z1[ i]'|
s\C++\beadando\1_8\beadando1\zsak.h|145|error: no match for 'operator[]' in 'z2[j]'|
s\C++\beadando\1_8\beadando1\zsak.h|148|error: no match for 'operator[]' in 'z1[ i]'|
s\C++\beadando\1_8\beadando1\zsak.h|148|error: no match for 'operator[]' in 'z2[j]'|
s\C++\beadando\1_8\beadando1\zsak.h|151|error: no match for 'operator[]' in 'z1[ i]'|
s\C++\beadando\1_8\beadando1\zsak.h|151|error: no match for 'operator[]' in 'z2[j]'|
s\C++\beadando\1_8\beadando1\zsak.h|153|error: no match for 'operator[]' in 'z1[ i]'|
s\C++\beadando\1_8\beadando1\zsak.h|154|error: no match for 'operator[]' in 'z1[(i + 1)]'|
s\C++\beadando\1_8\beadando1\zsak.h|154|error: no match for 'operator[]' in 'z2[(j + 1)]'|
s\C++\beadando\1_8\beadando1\zsak.h|156|error: no match for 'operator[]' in 'z2[(j + 1)]'|
s\C++\beadando\1_8\beadando1\zsak.h|157|error: no match for 'operator[]' in 'z1[(i + 1)]'|
s\C++\beadando\1_8\beadando1\zsak.h|157|error: no match for 'operator[]' in 'z2[(j + 1)]'|
s\C++\beadando\1_8\beadando1\zsak.h|159|error: no match for 'operator[]' in 'z1[(i + 1)]'|
||=== Build finished: 13 errors, 0 warnings ===||
[/spoiler]
az a gyanúm hogy nem veszi be valamiért azt hogy z1, z2 már van (amit megetetek majd vele) és azzal a 2 "zsákkal" kell majd dolgozni, de lövésem sincs jelenleg mit kéne tenni vele (az is lehet kurvára félreértek valamit itt)  :mittomen: valakinek valami ötlet? ([ i] -kben van egy fölös space me nem akartam code tagezni a színezés miatt :) )

motifator

Na most én nem értek a c++-hoz, de nekem ez a hibaüzenet azt jelenti, hogy a [] operátor nincs definiálva a zsak típusú objektumokra.

Nos továbbra is mindennemű c++ tudás nélkül próbálom értelmezni, de egy egyszerű, bár nem túl szép megoldás lenne,
ha a w integer tömb fieldet publikussá tennéd, és átírnád a metszet metódust,
hogy pl z1[ i] helyett z1.w[ i] módon indexelje a zsák objektum w tömbjét.

A szép megoldás az lenne, ha definiálnád a [] operátort, ami valahogy így nézne ki (életem első c++ kódja asszem):

//ezt add hozzá a class definícóhoz a public (vagy private, ahogy tetszik) részbe:
int operator [](int i);

//ezt meg akárhova:
int zsak::operator[](int i)
{
  return w[i];
}

Kiváncsi vagyok, hogy ez megoldja-e.
Nothing amazing happens here, and you get used to that: used to a world where everything is ordinary.
Every day we spend here is like a whole lifetime of dying slowly.

chilip

nem oldja meg :(

[spoiler=új hibaüzik]s\C++\beadando\1_8\beadando1\zsak.h||In member function 'void zsak::metszet(const zsak&, const zsak&)':|
s\C++\beadando\1_8\beadando1\zsak.h|151|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|151|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|154|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|154|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|157|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|157|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|159|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|160|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|160|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|162|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|163|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|163|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
s\C++\beadando\1_8\beadando1\zsak.h|165|error: passing 'const zsak' as 'this' argument of 'int zsak::operator[](int)' discards qualifiers|
||=== Build finished: 13 errors, 0 warnings ===||
[/spoiler]

sztem valami olyasmi lesz a baj hogy elírtam valamit vagy nem definiáltam rendesen z1 és z2-vel kapcsolatban így nem tudja kezelni zsákként, mint class elemet.... de nem látom....

kikuchiyo

#296
Ugyan én sem tudok ojjettumokat orientálni, de nem úgy illik, hogy van egy accessor metódus, és azzal lehet hozzáférni az objektumba zárt nem nyilvános elemekhez?
Pl.

int zsak::get_value(int i)
{
  return w[i];
}

int zsak::get_meret()
{
  return meret;
}


Továbbá mit keres egy olyan függvény, ami két tetszőleges zsák metszetét számítja, a zsák objektum metódusai között? Akkor már úgy lenne értelme, hogy csak egy argumentuma van, a másik zsák objektum, amivel össze akarod hasonlítani.


// hunglish névs az ftw-ért!
void zsak::metszet_with(const zsak &masik_zsak)
{
    int limit;
    int i, j, z = 0;
    int masik_meret = masik_zsak.get_meret();
    if(meret > masik_meret)
    {
        limit = meret;
    }else{limit = masik_meret;}
    for(int k = 0; k < limit; ++k)
    {
        if(i < meret && j < masik_meret)
        {
            if(w[ i] > masik_zsak.get_value(j))
            {
                j = j+2;
            }else if (w[ i] < masik_zsak.get_value(j))
            {
                i = i+2;
            }else if(w[ i] == masik_zsak.get_value(j))
            {
                w[z] = z1[ i]; // itt vesztettem el a fonalat
                if(z1[i+1] > z2[j+1])
                {
                    w[z+1] = z2[j+1];
                }else if(z1[i+1] < z2[j+1])
                {
                    w[z+1] = z1[i+1];
                }
                i = i+2;
                j = j+2;
                z = z+2;
            }
        }
    }
}


Szerk: vagy ez a metszet metódus azt akarta volna, hogy két zsák elemeinek a metszetéből felépít egy új zsák ojjettumot?
Failure is the default option

motifator

#297
Hát a hibaüzenet szerint azzal van baja, hogy a definiált [] operátornak nem igazán tudja átadni a metszet függvény paramétereit, mert azok konstansok. Na mint már mondtam, nem értek a c++-hoz, de google-öztem egy kicsit.
A problémádra vonatkozó leírást itt találod: http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.12
Ahogy elnézem, a 18.12-es bekezdés pont azt magyarázza el, ami neked kell. Ez alapján meg kellene tudnod oldani a dolgot, a [] operátort konstansként (is) kellene definiálni, és akkor menni fog.

@kiku: Valahol igazad van, csak nincs értelme get_value függvényt definiálni, és aztán átírni az egész metszet függvény, amikor operátorokat is tudsz definiálni. Jó lesz az a [] operátor, csak ügyelni kell a c++-nál a konstans-helyességre. Mondjuk azt se értem teljesen, hogy a metszet függvény 2 paramétere miért kell, hogy konstans legyen, de nem értek a c++-hoz.
Quote from: kikuchiyo on 2010-10-29, 16:16:01
Ugyan én sem tudok ojjettumokat orientálni, [...]
Én tudok, csak nem c++-ban  :hehe:
Nothing amazing happens here, and you get used to that: used to a world where everything is ordinary.
Every day we spend here is like a whole lifetime of dying slowly.

chilip

#298
Quote from: motifator on 2010-10-29, 16:30:02
...

[spoiler][/spoiler]

ed.: kezdek kicsit morci lenni  :__devil: számomra érthetetlen dolgok miatt kifagy a progi és a fő fájlban sima ciklust se enged hibaüzenet nélkül, de ugyanoda a  do{ ... }while(...); meg működik rendesen.... amúgy lefut a progi de valamiért nem hajlandó a metszetet számolni... ha meg túl sok számot akarok egyszerre megetetni a beszúr függvénnyel (pl 8-10), kifagy  :zomg: szaros osztályok grrr, na majd edzés után agyalok még rajta :(



Próféta

chilip: <alázós mód>nem akarlak elkeseríteni, de programozni nem úgy kell, hogy random rátenyerelsz a billentyűzetre, hanem hogy gondolkodsz és odafigyelsz arra, amit írsz. Hogy a programod rosszul működik, az nem meglepő, mivel kesze-kusza, átláthatatlan, rosszul olvasható, érthető, karbantartható módon építetted fel - egyszóval öntökönszúrást művelsz. A programhibák jelen esetben ennek a kettőnek a következményei. </alázós mód>

Ha azt szeretnéd, hogy az osztályod ne legyen ennyire bűnronda, ne használj ilyen eszement elrendezést, hogy a tömb páros elemei a hasznos értékek, a páratlanok meg a darabszámuk. Kezdetnek használj két tömböt, az egyik az értékeket, a másik a darabszámot tárolja (tehát ertek[i] darabszáma darabszam[i]). De az önszívatás tovább csökkenthető, ha std::map<int, int>-ben tárolod az érték -> darabszám leképezést. Mondjuk az utóbbiról el tudom képzelni, hogy az ilyen elsőéves kisházikban tiltva van, mert az alapok elsajátítása lenne a lényeg (különben használhatnál mindjárt std::multiset<int>-et :ejnye:).

[spoiler= részletesebben kódba mászva]
Quote from: chilip on 2010-10-29, 12:01:24
Egyébként célszerű lenne mindenek előtt megértened, mi a különbség a mezők, a lokális változók és a paraméterek között, élettartam és láthatóság szempontjából. A be, log, tarolo1, stb. mezők miért nem lokális változók a megfelelő metódusokban?

zsak::zsak(int &meret)
{
    w = new int [meret];
}
A meret paramétert nem teszed el a létrejövő ojjektum meret tagváltozójába. Esetleg érdemes lehet a tömb elemeit is inicializálni valamire.

Quote from: chilip on 2010-10-29, 12:01:24
void zsak::urese()
{
    if(w[1] == 0)
    {
        std::cout << "URES";
    }else{ std::cout << "NEM URES"; }
}
Ha én oktatnálak, itt már talán levonnék egy jegyet. A metódus nem azt csinálja, ami a neve. Az urese() kérdésre a válasz egy bool, azt majd a hívó dönti el, hogy kiírni akarja-e vagy elágazni eszerint.

Quote from: chilip on 2010-10-29, 12:01:24
            if(w[ i] > ertek && !be)
            {
                tarolo1 = w[ i];
                tarolo2 = w[i+1];
                w[ i] = ertek;
                w[i+1] = 1;
                log = true;
            }
Ha volt egy olyan célod, hogy az egyes eltárolt kulcsok növekvő rendben szerepeljenek, akkor azt itt szerintem elrontod, mivel a kipottyant érték a végére kerül. Vagy megőrzöd a rendezést (de akkor hátrébb kell tolni az egész tömböt), vagy nem használod fel a rendezettséget. Azt mondjuk itt amúgy se teszed, nem break-elsz ha túlfutottal ertek-en.

Quote from: chilip on 2010-10-29, 12:01:24
        if(!be)
        {
            meret = meret + 2;
            w[meret-2] = tarolo1;
            w[meret-1] = tarolo2;
        }
Ez segfault-gyanús. A meret változó növelése szép dolog, de a tömböd ettől nem lett nagyobb. Simán túlírsz a végén, tetszőleges arra járó-kelő ártatlan memóriaterületet felülírva. Használj C-tömb helyett std::vector<int>-et. Vagy ha az STL tiltott gyümölcs, akkor ilyen esetben foglalj le egy nagyobb tömböt, pakold át bele az eddigi adatokat (ez lassabb a vector-nál), írd a végére a tarolo tartalmát, szabadítsd fel a régit, és állítsd át rá a w pointert.

A metszet() metódus a korábbiakhoz hasonlóan túlírja a w címen lefoglalt tömböt, ráadásul a meret-et se állítja be a kialakult méretre.

Mindezeken kívül hiányzik a copy constructor és az operator= overloadja. Ezek nélkül
zsak a = b;
1:1 lemásolna a zsák objektumot, tehát a w pointert is; így ugyanarra a memóriaterületre fognak mutatni, és ha az egyiknek módosítod a tartalmát, az a másikban is látszódhat.
[/spoiler]
Mondom, ha már C++-ozol, akkor ne bénázz a C-féle bitmágiával, használd ki az OOP megoldások (pl. vector) előnyeit.

Quote from: kikuchiyo on 2010-10-29, 16:16:01
Továbbá mit keres egy olyan függvény, ami két tetszőleges zsák metszetét számítja, a zsák objektum metódusai között? Akkor már úgy lenne értelme, hogy csak egy argumentuma van, a másik zsák objektum, amivel össze akarod hasonlítani.
chilip valamiért úgy csinálta, hogy void a metódusa, és a
c.metszet(a, b);
hívás a c zsák értékét írja felül az a és b zsák értékének metszetével. Ez így kényelmetlen, félreérthető, nem szokás. Inkább:
zsak zsak::metszet(const zsak &z_masik)
alakban célszerű definiálni, ahol a this objektum az egyik operandus, z_masik a másik, és a visszatérési értékben keletkezik az eredmény. Tehát a
zsak c = a.metszet(b);
hívás a c zsákot az a és b zsák értékének metszetével inicializálja.

Quote from: motifator on 2010-10-29, 16:30:02
Mondjuk azt se értem teljesen, hogy a metszet függvény 2 paramétere miért kell, hogy konstans legyen, de nem értek a c++-hoz.
Mert nem módosítja a paramétereit. Így const zsak paramétert átadva is tudsz metszetet számolni, meg esetleg a compiler optimalizál erre valamit (ill. a nyelvtervezőknek ez volt az eredeti elképzelésük).