On 21 Aug 01, at 11:33, wrote:
> A kovetkezo a problemam: linux alatt divide et impera modszer
> segitsegevel kellene rendezni egy sort... Ez idaig ok is lenne
> csakhogy a ket reszsorozatot ket kulonallo process kellene rendezze
> es igy tovabb ... Na itt vagyok megakadva... Halas lennek ha valaki
> ramutatna a hibara.
Ket processz ket kulonallo cimterrel dolgozik, vagyis az egyik altal
modositott valtozot a masik nem latja. Tehat ha berendezi egy
processz a tomb felet, a masik a masik felet, akkor az osszefesulo
mindebbol semmit sem lat! Ketfelekeppen jarhatsz el: az egyik,
hogy processzek helyett thread-eket hasznalsz (a thread
modositasait a tobbi thread is latja). Ha mindenfelekeppen
processz kell, akkor jon a masik megoldas: shared memoriaban
kell tarolnod a tombot (man shmget, illetve lesz kesobb egy pelda).
Mas gond is van egyebkent: A wait() barmelyik gyerek processz
befejezese utan visszater, viszont te kettot is inditottal, szoval az
egyik befejezte akkorra, de a masik meg fut. Ha csak ket
processzet hasznalsz, akkor egyszerubben is megoldhatod: a
gyerek rendezi az elso felet, a szulo a masikat, es miutan
megrendezte, bevarja az egy szem gyereket, utana osszefesuli a
tomb-feleket:
#include <sys/shm.h>
....
int shmid = -1;
int *x;
....
void impera(int bal, int jobb)
{
if ((jobb-bal) <= 1)
rendez(bal,jobb);
else {
int m=(bal+jobb)/2;
impera(bal,m);
impera(m+1,jobb);
fesul(bal,m,jobb);
}
}
void divide(int n)
{
int m = n/2;
pid_t child;
if ((child=fork()) == 0) { // child
impera(1,m);
exit(0);
} else { // parent
if (child==-1) error("fork error\n");
impera(m+1,n);
wait(0);
fesul(1,m,n);
}
}
int main(int argc, char *argv[])
{
int n=argc-1;
int i;
shmid = shmget(IPC_PRIVATE, (n+1)*sizeof(int), 0600);
if (shmid==-1) error("shmget error\n");
x = (int *)shmat(shmid, 0, 0); // attach
if (x==-1) error("shmat error\n");
for (i=1; i<=n; i++)
x[i] = atoi(argv[i]);
divide(n);
for (i=1; i<=n; i++)
printf("%d\n", x[i]);
shmdt(x); // detach
shmctl(shmid, IPC_RMID, 0); // remove
return 0;
}
(Megjegyzes: Az shmget utan valamikor mindenfelekeppen kell
IPC_RMID is, egyebkent a program terminalasa utan is foglalva
marad a shared memoria! Szoval az error() fuggveny mielott csinal
egy exit()-et (gondolom csinal), hivnia kell egy
shmctl(shmid,IPC_RMID,0)-at ha nem -1 az shmid erteke!)
Ha tobb processzet akarsz esetleg kesobb hasznalni (mondjuk
egy 4 processzoros gepen jobb 4-et futtani, mint kettot), akkor igy
modosithatod a divide-t:
#define PROCOK 4
void divide(int n)
{
pid_t child[PROCOK];
int p;
int bal=1;
int jobb;
for (p=1; p<PROCOK; p++) {
jobb = n*p/PROCOK;
if ((child[p]=fork()) == 0) { // child
impera(bal,jobb);
exit(0);
}
// parent
if (child[p]==-1) error("fork error\n");
bal = jobb+1;
}
impera(bal,n); // az utolsot mi magunk csinaljuk
// fesulesek:
waitpid(child[1], 0, 0);
jobb = n*1/PROCOK;
for (p=2; p<PROCOK; p++) {
int m=jobb;
waitpid(child[p], 0, 0);
jobb = n*p/PROCOK;
fesul(1,m,jobb);
}
fesul(1,jobb,n);
}
Nem probaltam ki egyiket sem, de remelem, futna :)
István
|
Nem exportálni akarsz XLS -be? :-)
Szerintem a fejlesztőeszközhöz biztosan adtak ODBC
drivert Excel fájlokhoz. Ha találsz ilyet, akkor
már csak létrehozod a cél adatbázist, és már mehetnek
is az INSERT -ek.
Ennél egyszerűbbet egyelőr nem tudok ajánlani.
Van egy bonyolultabb is, az az amikor DBF -be exportálsz, OLE -n keresztül betö
ltöd az Excelt, és egy OLE interface -en keresztül kiadott SaveAs -el kiírod XL
S -be. Ha a visible property -t False -ra állítod, a felhsználónak még csak sej
telme sem lesz, hogy közben elindult és leállt az Excel.
(webes bekuldes, a bekuldo gepe: farewall.cib.hu)
|