All pastes #293336 Raw Edit

Quelqu'un

public text v1 · immutable
#293336 ·published 2006-12-27 13:59 UTC
rendered paste body
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include "AccesIpc.h"
#include "../Ecran/Ecran.h"

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>

#define ROBOT

#define IDQ "PLENGA"

#define LIGNE "                                                    "

#define				CLEF		(key_t)5678

int Chemin[20];
int AllerOu[10];

void AffChemin(int aChemin[],int TailleChemin);

int idRq,idWq;
int NumRobot;

int main(int argc,char *argv[])
{
	int rc,i = 0,idM,j,k,X=16,Y=0;
	int hdPipe;
	pid_t idPid;
	char *pShm;
	char CpAtelier[17][17],tmp[10],NumR;

	Trace("\t\t(ROBOT) Entree dans Robot");

	if((idM=shmget(CLEF,0,0)) == -1)
		perror("Err. de creation de la file3");

	if ((pShm = shmat(idM,NULL,0)) == (char *)-1)
		perror("Err. d'att de la memoire partagee");

	Trace("idM3 = %d\n",idM);

	if(argc!=4)
	{
    		Trace("\t\t(ROBOT) Trop ou trop peu d'argument(s)...");
    		Trace("\t\t(ROBOT) Usage: Numero_du_Robot Id_queue...");
    		exit(1);
	}

	NumRobot = atoi(argv[1]);
	idRq = atoi(argv[2]);
	idWq = idRq;
	hdPipe= atoi(argv[3]);

	//lecture dans le pipe
    if (!(read(hdPipe,tmp,10)))
    {
        perror("(Robot) Erreur de lecture dans le Pipe...\n");
    }

    AllerOu[0] = atoi(tmp);
	Chemin[2] = AllerOu[0];
	Trace("\t\t(ROBOT) AllerOu : %d",Chemin[2]);
	Chemin[1] = 1;
	Chemin[0] = getpid();

	if(SendMessage(Chemin,3*sizeof(int),1L)<0)
   	{
			perror("(Robot) Erreur d'emission...\n");
			exit(1);
   	}

   	/*Entre du robot ds l'atelier en position 1*/
   	sprintf(&NumR,"%d",NumRobot);

    memcpy(CpAtelier,pShm,sizeof(CpAtelier));
    tmp[0]=CpAtelier[X][Y];
    CpAtelier[X][Y]=NumR;
    memcpy(pShm,CpAtelier,sizeof(CpAtelier));

	while (1)
	{
		idPid = getpid();
		if((rc=ReceiveMessage(Chemin,&idPid))<0)
		{
			perror("(Robot) Erreur de reception...\n");
			exit(1);
   		}

		rc=rc/sizeof(int);
		AffChemin(Chemin,rc);

		/* Effectuer le deplacement dans la memoire partagee*/

		for (j=0;j<rc-1;j++)
		{
            if ((Chemin[j+1]-Chemin[j])==1)
            {
                for (k=0;k<4;k++)
                {
                    memcpy(CpAtelier,pShm,sizeof(CpAtelier));
                    CpAtelier[X][Y]=tmp[0];
                    tmp[0]=CpAtelier[X][Y+1];
                    Y++;
                    CpAtelier[X][Y]=NumR;
                    memcpy(pShm,CpAtelier,sizeof(CpAtelier));
                    sleep(1);
                }
            }

            if ((Chemin[j+1]-Chemin[j])==-1)
            {
                for (k=0;k<4;k++)
                {
                    memcpy(CpAtelier,pShm,sizeof(CpAtelier));
                    CpAtelier[X][Y]=tmp[0];
                    tmp[0]=CpAtelier[X][Y-1];
                    Y--;
                    CpAtelier[X][Y]=NumR;
                    memcpy(pShm,CpAtelier,sizeof(CpAtelier));
                    sleep(1);
                }
            }

            if ((Chemin[j+1]-Chemin[j])==5)
            {
                for (k=0;k<4;k++)
                {
                    memcpy(CpAtelier,pShm,sizeof(CpAtelier));
                    CpAtelier[X][Y]=tmp[0];
                    tmp[0]=CpAtelier[X-1][Y];
                    X--;
                    CpAtelier[X][Y]=NumR;
                    memcpy(pShm,CpAtelier,sizeof(CpAtelier));
                    sleep(1);
                }
            }

            if ((Chemin[j+1]-Chemin[j])==10)
            {
                for (k=0;k<8;k++)
                {
                    memcpy(CpAtelier,pShm,sizeof(CpAtelier));
                    CpAtelier[X][Y]=tmp[0];
                    tmp[0]=CpAtelier[X-1][Y];
                    X--;
                    CpAtelier[X][Y]=NumR;
                    memcpy(pShm,CpAtelier,sizeof(CpAtelier));
                    sleep(1);
                }
            }

            if ((Chemin[j+1]-Chemin[j])==-5)
            {
                for (k=0;k<4;k++)
                {
                    memcpy(CpAtelier,pShm,sizeof(CpAtelier));
                    CpAtelier[X][Y]=tmp[0];
                    tmp[0]=CpAtelier[X+1][Y];
                    X++;
                    CpAtelier[X][Y]=NumR;
                    memcpy(pShm,CpAtelier,sizeof(CpAtelier));
                    sleep(1);
                }
            }

            if ((Chemin[j+1]-Chemin[j])==-10)
            {
                for (k=0;k<8;k++)
                {
                    memcpy(CpAtelier,pShm,sizeof(CpAtelier));
                    CpAtelier[X][Y]=tmp[0];
                    tmp[0]=CpAtelier[X+1][Y];
                    X++;
                    CpAtelier[X][Y]=NumR;
                    memcpy(pShm,CpAtelier,sizeof(CpAtelier));
                    sleep(1);
                }
            }
		}

		sleep(3);
		i++;
		if(i>3)
			break;
		Chemin[1]=Chemin[rc-1];
		Chemin[2]=AllerOu[i];
		Chemin[0]=getpid();

		if(SendMessage(Chemin,3*sizeof(int),1L)<0)
		{
			perror("(Robot) Erreur d'emission...\n");
	     		exit(1);
   		}
	}
}

void AffChemin(int aChemin[],int TailleChemin)
{
	int i=0;
	char szChemin[80],szBuff[80];
	sprintf(szChemin,"\t\t(ROBOT %d) Chemin a suivre :",NumRobot);

	while (i < TailleChemin)
   	{
		sprintf(szBuff,"%4d ",aChemin[i++]);
     		strcat(szChemin,szBuff);
   	}

	Trace(szChemin);
}