Newsgroup: it.comp.lang.c++
Titolo: Aiuto per un novizio

Scusate tutti, premetto che sono un totale novizio del C e del C++...
...ho il seguente file: semaphores-win.c
Con il seguente codice:
/************************************************************/
/************ standby process *******************************/
/************************************************************/
#include <windows.h>
#include <stdio.h>
#define DISP 16
char messaggio[128];
char *addr;
void standby_procedure(HANDLE *sem) {
  char *addr1;
  long dummy;
  addr1 = addr;
  while(1){
    WaitForSingleObject(sem[0], INFINITE);
    addr1 = addr;
    printf("\n------------------\n");
    printf("messaggio: \n");
    while( (strcmp(addr1,"quit") != 0) && (strcmp(addr1,"passo") != 0) ) {
      printf("%s\n", addr1);
      addr1 = addr1 + DISP;
    }
    if ( strcmp(addr1,"passo") == 0) {
      addr1 = addr;
      printf("\nrisposta: \n");
      do {
 scanf("%s", messaggio);
 strcpy(addr1, messaggio);
 addr1 = addr1 + DISP;
      } while( (strcmp(messaggio,"quit") != 0) && (strcmp(messaggio,"passo")
!=0 ));
      printf("\n------------------\n");
      ReleaseSemaphore(sem[1], 1, &dummy);
    }
 }
}
main(int argc, char *argv[]) {
  HANDLE id_shm;
  HANDLE sem[3];
  id_shm = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,
  0,1024,"memoria");
  if( id_shm == INVALID_HANDLE_VALUE ) {
    printf("cannot open shared memory segment, please check the problem\n");
    exit(-1);
  }
  addr = (char *) MapViewOfFile(id_shm,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
  if(addr == NULL) {
    printf("cannot attach shared memory segment, please check the
problem\n");
    exit(-1);
  }
  sem[0] = CreateSemaphore(NULL, 0,1, "Sem0");
  if( sem[0] == INVALID_HANDLE_VALUE ) {
    printf("cannot open sem, please check the problem\n");
    exit(-1);
  }
  sem[1] = CreateSemaphore(NULL, 0,1, "Sem1");
  if( sem[1] == INVALID_HANDLE_VALUE ) {
    printf("cannot open sem, please check the problem\n");
    exit(-1);
  }
  sem[2] = CreateSemaphore(NULL, 1,1, "Sem2");
  if( sem[2] == INVALID_HANDLE_VALUE ) {
    printf("cannot open sem, please check the problem\n");
    exit(-1);
  }
  standby_procedure(sem);
  return(0);
}/* end main */
/************************************************************/
/************ calling process *******************************/
/************************************************************/
#include <windows.h>
#include <stdio.h>
#define DISP 16
char messaggio[128];
char *addr;
void calling_procedure(HANDLE * sem) {
  char *addr1;
  long dummy;
  /********* mutual exclusion **********/
  WaitForSingleObject(sem[2], INFINITE);
  /************************************/
  while (1){
    addr1 = addr;
    printf("\n------------------\n");
    printf("messaggio: \n");
    do {
      scanf("%s", messaggio);
      strcpy(addr1, messaggio);
      addr1 = addr1 + DISP;
    } while( (strcmp(messaggio,"quit") != 0) && (strcmp(messaggio,"passo")
!=0 ));
    ReleaseSemaphore(sem[0], 1, &dummy);
    if( strcmp(messaggio,"passo") == 0){
      WaitForSingleObject(sem[1], INFINITE);
      addr1 = addr;
      printf("\n risposta: \n");
      do {
 printf("%s\n", addr1);
 addr1 = addr1 + DISP;
      } while( (strcmp(addr1,"quit") != 0) && (strcmp(addr1,"passo") !=0 ));
      printf("------------------\n");
      if( strcmp(addr1,"quit") == 0 ){
 ReleaseSemaphore(sem[2], 1, &dummy);
 ExitProcess(0);
      }
      else{}
   }
   else {
 ReleaseSemaphore(sem[2], 1, &dummy);
      ExitProcess(0);
    }
 }
}
main(int argc, char *argv[])
{
  HANDLE id_shm;
  HANDLE sem[3];
  id_shm = OpenFileMapping(FILE_MAP_READ|FILE_MAP_WRITE,FALSE,"memoria");
  if( id_shm == INVALID_HANDLE_VALUE ) {
    printf("cannot open shared memory segment, please check the problem\n");
    exit(-1);
  }
  addr = (char *) MapViewOfFile(id_shm,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
  if(addr == NULL) {
    printf("cannot attach shared memory segment, please check the
problem\n");
    exit(-1);
  }
  sem[0] = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Sem0");
  if( sem[0] == INVALID_HANDLE_VALUE ) {
    printf("cannot open sem, please check the problem\n");
    exit(-1);
  }
  sem[1] = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Sem1");
  if( sem[1] == INVALID_HANDLE_VALUE ) {
    printf("cannot open sem, please check the problem\n");
    exit(-1);
  }
  sem[2] = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, "Sem2");
  if( sem[2] == INVALID_HANDLE_VALUE ) {
    printf("cannot open sem, please check the problem\n");
    exit(-1);
  }
  calling_procedure(sem);
  return(0);
}/* end main */
Ora, deduco che per il corretto funzionamento questo programma C debba
essere diviso in due files...ho copiato l'intero testo di "Calling Process"
in un nuovo file C, chiamato calling, ed ho cancellato il codice da
semaphores-win.exe...
Quando tento il "Build", ricevo il seguente errore:
Linking...
calling.obj : error LNK2005: _main already defined in semaphores-win.obj
Debug/semaphores-win.exe : fatal error LNK1169: one or more multiply defined
symbols found
Error executing link.exe.
Come posso risolvere? Scusate, vi ripeto sono alle prime armi, non
rispondetemi male ma se potete datemi solo un piccolo aiuto! Grazie a tutti!
Luka

 Error executing link.exe.
<SNIP>
Senza entrare nei dettagli... il compilatore ti ha dato tutte le
informazioni necessarie: il main è definito una o più vote, ed ogni
programma C o C++ può avere al massimo un singolo main. Ti consiglio di
portare tutto il codice che hai in un main, nell'altro e ALMENO un pò di
lettura su un libro di C e/o C++!