Avatar billede king-at-run Nybegynder
06. februar 2004 - 10:06 Der er 26 kommentarer og
1 løsning

problemer med semop funktion

Jeg har lavet en funktion der skal tælle semafor op. Når jeg compiler programmet kommer der en fejl, hvor den siger at jeg har:

"Two or more data types in declaration"

Hvad kan det skyldes??
Avatar billede pchris Nybegynder
06. februar 2004 - 10:54 #1
Lad os se et par kode-linier...
Avatar billede king-at-run Nybegynder
06. februar 2004 - 10:58 #2
void op (int sem_nr)
{
struct sembuf sem_b;
sem_b.semu_nr = sem_nr;
sem_b.sem_flg = SEM_UNDO;
}
Avatar billede hjalten5 Nybegynder
06. februar 2004 - 11:05 #3
SKAL der stå semu_nr eller bare sem_nr?
Avatar billede pchris Nybegynder
06. februar 2004 - 11:09 #4
Hmmm, jeg tror vi skal bruge nogen flere linier.
Der står måske noget før din funktion.
Hvilken linie kommer fejlen fra?
Avatar billede king-at-run Nybegynder
06. februar 2004 - 11:26 #5
void op (int sem_nr)
{ (FEJLEN SKER VED DENNE LINIE???...DET KAN VEL IKKE PASSE)
struct sembuf sem_b;
sem_b.semu_nr = sem_nr;
sem_b.sem_flg = SEM_UNDO;
}
Avatar billede Slettet bruger
06. februar 2004 - 11:37 #6
Du har skrevet følgende:
struct sembuf sem_b;
sem_b.semu_nr = sem_nr;

skriv istedet :
struct sembuf sem_b;
sem_b.sem_nr = sem_nr;

Ellers er her en anden måde at løse dit problem på:

void up(int sem_nummer)
{
    struct sembuf sem_b;

    sem_b.sem_num = sem_nummer;
    sem_b.sem_op = 1;        //up el. V()
    sem_b.sem_flg = SEM_UNDO;
    semop(sem_id, &sem_b,1);
}
Avatar billede hjalten5 Nybegynder
06. februar 2004 - 11:42 #7
Ganske som jeg antyder

Man må gerne bruge kode direkte fra de udleverede eksempler KaR, ordret
Avatar billede king-at-run Nybegynder
06. februar 2004 - 11:48 #8
void op (int sem_nr)
{
struct sembuf sem_b;
sem_b.semu_nr = sem_nr;
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id,&sem_b,1)==-1)
printf("optællingsfejl af semafor")
}

Her er præcis det vi har og det virker ikke...Det virker heller ikke hvis vi sætter sem_b.sem_nr = sem_nr;
Avatar billede king-at-run Nybegynder
06. februar 2004 - 11:50 #9
hjalten, hvad mener du?
Avatar billede Slettet bruger
06. februar 2004 - 12:02 #10
prøv at skriv: sem_b.sem_nr = sem_nummer;

og så ret sem_nummer til i resten af koden
Avatar billede king-at-run Nybegynder
06. februar 2004 - 12:10 #11
void op (int sem_nr)DET ER VEL DET SAMME SOM STÅR
{
struct sembuf sem_b;
sem_b.semu_nr = sem_nr; OG HER
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id,&sem_b,1)==-1)
printf("optællingsfejl af semafor")
}

VI HAR OGSÅ EN FUNKTION DER HEDDER "NED". HVIS VI UDKOMMENTER "OP" FÅR VI BARE FEJLEN I "NED" FUNKTIONEN. SÅ LÆNGE "OP" IKKE ER UDKOMMENTERET HENVISER DEN IKKE TIL FEJL I FUNKTIONEN "NED"
Avatar billede Slettet bruger
06. februar 2004 - 12:12 #12
hvordan ser din main funktion ud?
i sidste linie skal der stå :

....    }
    del_sem();
}
Avatar billede king-at-run Nybegynder
06. februar 2004 - 12:15 #13
Okay, det havde vi ikke med, men vi får stadig den samme fejl.
Avatar billede Slettet bruger
06. februar 2004 - 12:17 #14
det eksempel jar har virker det nemlig fint når den sidste linie i main rettes til..
Avatar billede king-at-run Nybegynder
06. februar 2004 - 12:19 #15
vi er ikke helt med...hvad er det for et eksempel du snakker om.

Vi har ikke en funktion der hedder "void del_sem"?
Avatar billede Slettet bruger
06. februar 2004 - 12:21 #16
eksemplet dining philosophers..
Avatar billede king-at-run Nybegynder
06. februar 2004 - 12:21 #17
okay, nu har vi lavet funktion "void del_sem"...stadig samme fejl
Avatar billede Slettet bruger
06. februar 2004 - 12:23 #18
så kan jeg ikke svare på det... beklager
Avatar billede king-at-run Nybegynder
06. februar 2004 - 12:26 #19
okay, sidste spørgsmål...fejlen er "Two or more data types in declaration of op" kan det skyldes noget helt andet?
Avatar billede Slettet bruger
06. februar 2004 - 12:35 #20
min up funktion ser således ud:
void up(int sem_nummer)
{
    struct sembuf sem_b;

    sem_b.sem_num = sem_nummer;
    sem_b.sem_op = 1;        //up el. V()
    sem_b.sem_flg = SEM_UNDO;
    semop(sem_id, &sem_b,1);
}
Avatar billede pchris Nybegynder
06. februar 2004 - 12:52 #21
Problemet er at I har noget stående FØR "void op" funktionen.
Det er typisk en uafsluttet erklæring eller noget andet.
F.eks

int

void up(int ...)

Derfor vil jeg gerne se linierne lige inden funktionen. Hvis linien lige inden funktionen er en #include så skal I se i slutningen af den inkluderede fil.
Avatar billede king-at-run Nybegynder
06. februar 2004 - 13:02 #22
//headers
#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <time.h>

void op(int);
void ned(int);

//variables
int pid;
union semun semafor_setup;
int sem_id;

struct segment {
  char x;
  int y;
  char type;
  char *navn
  int frem;
  int tilbage;
};

struct tog {
  int nr;
  struct segment **plan;
  int cur_index;
  int retning;
}


void op (int sem_nr)
{
struct sembuf sem_b;
sem_b.semu_nr = sem_nr;
sem_b.sem_flg = SEM_UNDO;
if(semop(sem_id,&sem_b,1)==-1)
printf("optællingsfejl af semafor")
}

Her er alt det kode der står inden "op"
Avatar billede Slettet bruger
06. februar 2004 - 13:14 #23
Prøv at kopiere hele denne tekst ind i compileren...
Det er det eksempel jeg har:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <sys/ipc.h>

#define N            5
#define    LEFT        (i-1)%N
#define    RIGHT        (i+1)%N
#define THINKING    0
#define HUNGRY    1
#define    EATING        2
#define    FREE        3
#define MUTEX        0

void up(int);
void down(int);

union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short int *array;
};

struct shared
{
    int chair[6];
};

pid_t pid; //indeholder childprocess id
union semun sem_union; //parameter til semctl() kaldet

int j;
int sem_id;
int shm_id;


void *share = (void *)  0;
struct shared *shared_chairs;

void filosof(int i)
{
    while(1)
    {
        think(i);
        take_forks(i);
        eat(i);
        put_forks(i);
    }
}

take_forks(int i)
{
    printf("filosof %d prøver at tage gafler\n", i);
    down(MUTEX);
    shared_chairs->chair[i]=HUNGRY;
    test(i);
    up(MUTEX);
    down(i);

}

put_forks(int i)
{
    printf("filosof %d prøver at lægge gafler\n", i);
    down(MUTEX);
    shared_chairs->chair[i]=THINKING;
    test(left(i));
    test(right(i));
    up(MUTEX);
    printf("filosof %d har lagt gafler\n", i);
}

test(int i)
{
    //int r;
    //for (r=1;r<6;r++)
        //printf("%d ",shared_chairs->chair[r]);

    if (shared_chairs->chair[i]==HUNGRY && shared_chairs->chair[left(i)] != EATING && shared_chairs->chair[right(i)] != EATING)
    {
        shared_chairs->chair[i] = EATING;
        up(i);
        printf("filosof %d har taget gafler\n", i);
    }
}

eat(int fil)
{
    printf("filosof på stol %d spiser\n", fil);fflush(stdout);
    sleep(rand()%3);
}

think(int fil)
{
    printf("filosof på stol %d tænker\n", fil);fflush(stdout);
    sleep(2);

}


void del_sem()
{
    int i; //bruges i løkken der sletter alle semaforene
    union semun sem_union;
    for (i=0;i<7;i++)
    semctl(sem_id, i, IPC_RMID, sem_union);
}

void down(int sem_nummer)
{
    struct sembuf sem_b;

    sem_b.sem_num = sem_nummer;
    sem_b.sem_op = -1;        //down el. P()
    sem_b.sem_flg = SEM_UNDO;
    semop(sem_id, &sem_b,1);
}

void up(int sem_nummer)
{
    struct sembuf sem_b;

    sem_b.sem_num = sem_nummer;
    sem_b.sem_op = 1;        //up el. V()
    sem_b.sem_flg = SEM_UNDO;
    semop(sem_id, &sem_b,1);
}

int main()
{
    int i;
    shm_id = shmget((key_t)1235, sizeof(struct shared), 0666 | IPC_CREAT);
    sem_id = semget((key_t)1234,6, 0666 | IPC_CREAT);

    share = shmat(shm_id, (void *) 0, 0);
    printf("Mem att at %X\n\n", (int) share);
    shared_chairs = (struct shared *) share;
    shared_chairs->chair[1]=FREE;
    shared_chairs->chair[2]=FREE;
    shared_chairs->chair[3]=FREE;
    shared_chairs->chair[4]=FREE;
    shared_chairs->chair[5]=FREE;



    sem_union.val = 5;
    semctl(sem_id, 0, SETVAL, sem_union);
    sem_union.val= 0;
    for (i=1;i<6;i++)
        semctl(sem_id, i, SETVAL, sem_union);

    for (j=1;j<N+1;j++)
    {
        pid=fork();
            if (pid==0)
        {
                  filosof(j);
        }
            else
        {

        }
    }
    del_sem();
}

int left(int i)
{
    if(i==1)
        return N;
    else
        return i-1;
}

int right(int i)
{
    if(i==N)
        return 1;
    else
        return i+1;
}
Avatar billede pchris Nybegynder
06. februar 2004 - 13:17 #24
Ja, der mangler et ; efter tog struct'en. Lige inden "void op"

.....
struct tog {
  int nr;
  struct segment **plan;
  int cur_index;
  int retning;
};


void op (int sem_nr)
{
....
Avatar billede Slettet bruger
06. februar 2004 - 13:20 #25
Jep det ser sådan ud pchris
Avatar billede king-at-run Nybegynder
06. februar 2004 - 13:29 #26
vi takker for hjælpen
Avatar billede king-at-run Nybegynder
06. februar 2004 - 13:31 #27
jeg kan ikke give jer point, ved ikke hvorfor...der sker ikke noget når jeg acceptere
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester