Avatar billede okholm Nybegynder
30. januar 2004 - 20:53 Der er 11 kommentarer og
1 løsning

problemer med at programnavn.o ikke kan findes / compilerproblem?

Hej folks

Jeg har lidt problemer med et c-program. Når jeg compiler det med cc får jeg følgende fejl:
binarySearch.c: In function `main':
binarySearch.c:26: parse error before `int'
binarySearch.c:28: `temp' undeclared (first use in this function)
binarySearch.c:28: (Each undeclared identifier is reported only once
binarySearch.c:28: for each function it appears in.)

Hvis jeg så benytter mig af -M flaget ser det umiddelbart ud til at virke, men når jeg så forsøger at køre programmet sker følgende:
./binarySearch: binarySearch.o:: command not found

Jeg har ikke nogen .o fil, men hvordan får jeg den? Er det et spørgsmål om at ændre flag på gcc ?

Venligst,

Morten
Avatar billede arne_v Ekspert
30. januar 2004 - 20:57 #1
Du skal nok starte med at rette en fejl i linie 25-26.
Avatar billede okholm Nybegynder
30. januar 2004 - 21:03 #2
Programmet skulle ikke fejle noget - har fået det af en anden. Jeg kan prøve at smide C-koden her:

/*

Et bud på binary search - haaber det er rigtigt

*/

#include <stdio.h>

int binarySearch(int arr[], int searchValue, int left, int right);
void printArr(int *arr, int length);

const int length = 10;

int main(void){

    int array [] = {2,5,11,13,19,25,30,44,45,55};

    int search1 = 13;
    int search2 = 900;


    printArr(array, length);

    printf("searching for value %d\n", search1); 

    int temp = binarySearch(array, search1, 0, 9);

    if(temp == -9999)
        printf("item not found\n"); 
    else
        printf("value found at index: %d\n", temp); 


    printf("searching for value %d\n", search2);

    temp = binarySearch(array, search2, 0, 9);
   
    if(temp == -9999)
        printf("item not found\n"); 
    else
        printf("value found at index: %d\n", temp); 

       
               
    getchar(); // til ære for mit Dev C++ IDE

    return (0);

}


void printArr(int* arr, int length){

    int i;

    for(i = 0 ; i < length ; ++i){
   
        printf("index %d value %d\n", i, *arr);
   
        ++arr;
   
    }

} // end main


// returnerer index for søge værdi
int binarySearch(int arr[], int searchValue, int left, int right){


    if(left == right){
   
        if(searchValue == arr[left])
            return left;
       
        else
          return -9999; // hvis det havde været java var der blevet kastet en exception her :(
   
    }
    else{

        int mid = (int) (left + right) / 2;

        if(searchValue == arr[mid])
            return mid; // hvis værdien er i midten

        else{
            if(searchValue < arr[mid])
                return binarySearch(arr, searchValue, left, mid);

            else        // nødvendigt at tillægge mid 1, da man har afrundet
                return binarySearch(arr, searchValue, mid+1, right);       

        }

    }

} // end method
Avatar billede arne_v Ekspert
30. januar 2004 - 21:08 #3
Prøv at compile med C++ compileren i.s.f. C compileren.
Avatar billede arne_v Ekspert
30. januar 2004 - 21:09 #4
Programmet bruger C++ ved at erklære variable midt i den eksekverbare kode.
Avatar billede okholm Nybegynder
30. januar 2004 - 22:36 #5
Hmm... okay. Smider lige noget andet kode, som jeg heller ikke kan få til at spille, hvis du vil se lidt på det :-)

Det er noget dining philosophers, hvis du kender den.
Det skulle gerne være alm. C-kode, men jeg tager måske fejl igen? Kan hverken få g++ eller gcc til at compile den, så den kan afvikles..

#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 = 1;
    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
        {

        }
    }
}

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 arne_v Ekspert
30. januar 2004 - 22:44 #6
Hvilke fejl får du ?

Mit gæt er at du får nogle unresolved symbols fordi du mangler at linke mod
nogle libraries.
Avatar billede arne_v Ekspert
30. januar 2004 - 22:45 #7
Med hensyn til den første kode, så bør det være pærenemt at flytte de 2 erklæringer
op så den kan compiles som C kode.
Avatar billede okholm Nybegynder
30. januar 2004 - 23:06 #8
Følgende fejl opstår ved forsøg på at compile således:

gcc -o dining dining_shmem.c

dining_shmem.c: In function `main':
dining_shmem.c:153: warning: assignment makes pointer from integer without a cast
Avatar billede arne_v Ekspert
30. januar 2004 - 23:15 #9
Det er kun en warning.
Avatar billede arne_v Ekspert
30. januar 2004 - 23:18 #10
Men et sted i koden (linie 153 eller tæt på) står der:

pointer variabel = integer værdi
Avatar billede arne_v Ekspert
16. februar 2004 - 22:10 #11
OK ?
Avatar billede okholm Nybegynder
16. februar 2004 - 22:14 #12
Det virkede 10 min. efter, hvor jeg prøvede igen. Underligt... Men nok mig, der trængte til mad ;)
Du får dog point fordi du svarede...
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