Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    errore in strcnpy

    Ciao, sto scrivendo un programma, ma mi dà un errore alla linea 157.
    L'errore è questo: 157: undefined reference to `strcnpy'
    collect2: ld returned 1 exit status

    è in rosso la linea di codice che mi da errore

    Grazie

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/msg.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/sem.h>
    
    #define DIMENSIONE 2560
    #define TAGLIA_OBJ 56
    #define TAGLIA_TXT 200
    #define NUM_MAX_MSG (DIMENSIONE/TAGLIA_OBJ + TAGLIA_TXT)
    
    typedef struct {
      int tipo;
      int memoria;
      int semaforo;
    } boot;
    
    typedef struct {
      char obj[TAGLIA_OBJ];
      char txt[TAGLIA_TXT];
    } message;
    
    message messaggio;
    
    void errore(char* temp){
      printf("%s",temp);
      exit(-1);
    }
    
    void printMenu() {
    	printf("==================================================\n");
    	printf("	BACHECA ELETTRONICA VOLATILE		\n");
    	printf("==================================================\n");
    	printf("A. Leggi tutti i messaggi nella bacheca;\n");
    	printf("B. Leggi un messaggio in bacheca;\n");
    	printf("C. Inserisci un messaggio in bacheca;\n");
    	printf("D. Rimuovi un messaggio dalla bacheca;\n");
    	printf("Q. Esci dal programma;\n");
    	printf("--------------------------------------------------\n");
    	printf("Immetti la tua scelta: ");
    }
    
    void readMessages(int ds_shm){
      char* temp;
      int cont =1;
      temp = shmat(ds_shm, NULL, SHM_R);
      if(temp == (char*) -1){
        printf("Errore nella call shmat\n");
        exit(-1);
      }
    
        while(strcmp(temp,"")!=0){
          if(strcmp(temp,"_")==0){
            temp += TAGLIA_OBJ + TAGLIA_TXT;
            cont++;
          }
          else{
            printf("Codice del messaggio: %d\n", index);
            printf("Oggetto: %s\n", temp);
            temp+=TAGLIA_OBJ;
            printf("Testo: %s\n", temp);
            printf("--------------------------------------------------\n");
            temp += TAGLIA_TXT;
            cont++;
          }
        }
    
        }
        
        void readAMessage(int ds_shm){
          char* temp;
          int cont = 1;
          int codice;
          temp = shmat(ds_shm, NULL, SHM_R);
          if(temp == (char*) -1){
          printf("Errore nella call shmat\n");
          exit(-1);
          }
          printf("Inserire il codice del messaggio: ");
          scanf("%d", &codice);
          
          if(codice>NUM_MAX_MSG){
            printf("Errore: non esiste questo messaggio\n");
    	exit(-1);
          }
          while(cont != codice){
            temp += TAGLIA_OBJ + TAGLIA_TXT;
            cont ++;
          }
    
          if(strcmp(temp,"")== 0 || strcmp(temp,"_") == 0){
            printf("Il messaggio non è presente in bacheca\n");
            exit(0);
          }
          else{
            printf("Codice del messaggio: d%\n", index);
            printf("Oggetto: %s\n",temp);
            temp+=TAGLIA_OBJ;
            printf("Testo: %s\n", temp);
            printf("----------------------------------------------------------\n");
            exit(0);
          }
    
        }
    
        void postAMessage(int ds_shm, int ds_sem){
          int letti;
          int ret;
          int index = 1;
          char* temp;
          struct sembuf oper;
          /*Blocco i semafori*/
          oper.sem_num = 0;
          oper.sem_op = -1;
          oper.sem_flg = 0;
          ret = semop(ds_sem, &oper, 1);  
          oper.sem_num = 1;
          oper.sem_op = -1;
          oper.sem_flg = 0;
          ret = semop(ds_sem, &oper, 1);
    
          temp = shmat(ds_shm, NULL, SHM_W);
          if(temp == (char*) -1){
            printf("errore nella call shmat\n");
            exit(-1);
          }
          while(strcmp(temp,"")!=0){
            if(strcmp(temp, "_") == 0 || index > NUM_MAX_MSG)
            break;
            else if(index == NUM_MAX_MSG){
    
              /*Sblocco i semafori*/
              oper.sem_num = 0;
              oper.sem_op = 1;
              oper.sem_flg = 0;
              ret = semop(ds_sem, &oper, 1);
    
              oper.sem_num = 1;
              oper.sem_op = 1;
              oper.sem_flg = 0;
              ret = semop(ds_sem, &oper, 1);
    
              printf("Bacheca piena, riprovare più tardi\n");
    	  exit(-1);
            }
            else{
              temp += TAGLIA_OBJ + TAGLIA_TXT;
              index ++;
            }
          }
            printf("Oggetto: \n");
            scanf("%s\n", &messaggio.obj);
            strcnpy(temp,messaggio.obj,TAGLIA_OBJ);         temp += TAGLIA_OBJ; 
    
            printf("Testo: \n");
            scanf("%s\n",&messaggio.txt);
            strncpy(temp,messaggio.txt, TAGLIA_TXT);
            temp += TAGLIA_TXT; 
    
            /*Sblocco i semafori*/
            oper.sem_num = 0;
            oper.sem_op = 1;
            oper.sem_flg = 0;       
            ret = semop(ds_sem, &oper, 1);
    
            oper.sem_num = 1;
            oper.sem_op = 1;
            oper.sem_flg = 0;
            ret = semop(ds_sem, &oper, 1);
    
            exit(0);
    
        }
    
        getAMessage(int ds_shm, int ds_sem){
          char* temp;
          int codice;
          int index = 1;
          int ret;
          struct sembuf oper;
    
          /*blocco i semafori*/
          oper.sem_num = 0;
          oper.sem_op = -1;
          oper.sem_flg = 0;
          ret = semop(ds_sem, &oper, 1);
    
          oper.sem_num = 1;
          oper.sem_op = -1;
          oper.sem_flg = 0;
          ret = semop(ds_sem, &oper, 1);
    
          temp = shmat(ds_shm, NULL, SHM_W|SHM_R);
          if(temp == (char*) -1){
            printf("errore nella call shmat\n");
            exit(-1);
          }
          /*Stampo tutti i messaggi*/
          readMessages(ds_shm);
    
          scanf("%d", &codice);
          if(codice > NUM_MAX_MSG){
            oper.sem_num = 0;
            oper.sem_op = 1;
            oper.sem_flg = 0;
            ret = semop(ds_sem, &oper, 1);
    
            oper.sem_num = 1;
            oper.sem_op = 1;
            oper.sem_flg = 0;
            ret = semop(ds_sem, &oper, 1);
            printf("Errore, non ci sono tutti questi messaggi nella bacheca\n");
            exit(-1);
          }
          while(index != codice){
            temp += TAGLIA_OBJ + TAGLIA_TXT;
            index++;
          }
          if(strcmp(temp,"") == 0 || strcmp(temp,"_") == 0){
            printf("Il messaggio non è presente nella bacheca\n");
    	exit(-1);
          }
          strncpy(temp,"_",TAGLIA_OBJ);
          temp += TAGLIA_OBJ;
          strncpy(temp,"", TAGLIA_TXT);
          temp += TAGLIA_TXT;
    
          /*Sblocco i semafori*/
          oper.sem_num = 0;
          oper.sem_op = 1;
          oper.sem_flg = 0;
          ret = semop(ds_sem, &oper, 1);
    
          oper.sem_num = 1;
          oper.sem_op = 1;
          oper.sem_flg = 0;
          ret = semop(ds_sem, &oper, 1);
    
          exit(0);
    
        }
    
        int main(){
          char scelta;
          int chiave_msg = 50;
          int status;
          int ds_shm;
          int ds_sem;
          int ds_coda;
          int ctl;
          int ret;     
          boot avvio;
          
          ds_coda = msgget(chiave_msg, IPC_CREAT|0666);
          ctl = msgrcv(ds_coda, &avvio, 2*sizeof(int), 1, IPC_NOWAIT);
          if(ctl == -1){
            printf("Errore: il server non ha installato la bacheca\n");
            exit(-1);
          }
          
          msgsnd(ds_coda, &avvio,2*sizeof(int), IPC_NOWAIT);
          
          ds_shm = avvio.memoria;
          ds_sem = avvio.semaforo;
          
          	while(scelta != 'Q' || scelta != 'q') {
    		printMenu();
    		scanf("%s",&scelta);
    		if(scelta == 'A' || scelta == 'a') 
                    if (fork()!= 0) wait(&status);
    			else readMessages(ds_shm);
    		else if(scelta == 'B' || scelta == 'b') {
    			if (fork()!= 0) wait(&status);
    			else readAMessage(ds_shm);
    		}else if(scelta == 'C' || scelta == 'c') {
    			if (fork()!= 0) wait(&status);
    			else postAMessage(ds_shm,ds_sem);
    		}
    		else if(scelta == 'D' || scelta == 'd') {
    			if (fork()!= 0) wait(&status);
    			else getAMessage(ds_shm,ds_sem);
    		}
    		else if(scelta == 'Q' || scelta == 'q') {
    			printf("Grazie di aver usato\nBACHECA ELETTRONICA VOLATILE\n");
    			exit(0);
    		}
    		else printf("Scelta non valida.\n");
    	}
    	exit(0);
        }

  2. #2
    Il nome della funzione in questione è strncpy, non strcnpy...
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    grazie, però c'è un altro problema: non va la msgrcv nel main() e quando compilo mi stampa "Errore: il server non ha installato la bacheca".

    Aggiungo anche il codice del lato server
    Grazie

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/msg.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/sem.h>
    
    #define DIMENSIONE 2560
    
    typedef struct{
      int tipo;
      int memoria;
      int semaforo;
    }boot;
    
    void errore(char* temp){
      printf("%s", temp);
      exit(-1);
    }
    
    int main(int argc, char* argv[]){
      int ds_shm;
      int ret;
      int ds_sem;
      int ris;
      int chiave=20;
      int chiave_sem=40;
      int ds_coda;
      int chiave_msg=30;
      int ctl;
      boot invio;
    
      if(argc == 1){
        ds_shm = shmget(chiave, DIMENSIONE, IPC_CREAT|IPC_EXCL|0666);
        if(ds_shm==-1){ 
          errore("Errore nella call shmget \n");
         
        }
        printf("ID della memoria condivisa: %d\n", ds_shm);
    
        ds_sem = semget(chiave_sem, 2, IPC_CREAT|IPC_EXCL|0666);
        if(ds_sem == -1) {
          errore("Errore nella chiamata semget \n");
      
        }
        printf("ID semafori: %d\n", ds_sem);
    
        ds_coda = msgget(chiave_msg, IPC_CREAT|IPC_EXCL|0666);
        if(ds_coda == -1){
          errore("errore nella chiamata msgget \n");
        
        }
        invio.tipo = 1;
        invio.memoria = ds_shm;
        invio.semaforo = ds_sem;
    
        ctl = msgsnd(ds_coda, &invio, 2*sizeof(int),IPC_NOWAIT);
        if(ctl == -1){ 
          errore("Errore nell'invio del messaggio di boot\n");
        
        }
        ret = semctl(ds_sem, 0, SETVAL,1);
        ret = semctl(ds_sem, 1, SETVAL,1);
      }
      else if(argc == 2 && strcmp(argv[1],"remove") == 0){
        ds_shm = shmget(chiave, DIMENSIONE, IPC_CREAT|0666);
        ris = shmctl(ds_shm, IPC_RMID,NULL);
        if(ris == -1){
          errore("Errore nella call shmctl\n");
      }
      ds_sem = semget(chiave_sem, 2, IPC_CREAT|0666);
      ret = semctl(ds_sem, 0, IPC_RMID, 1);
      ret = semctl(ds_sem, 1, IPC_RMID, 1);
      
      ds_coda = msgget(chiave_msg, IPC_CREAT|0666);
      msgctl(ds_coda, IPC_RMID, NULL);
      printf("RIMOZIONE COMPLETATA");
      }
      else if(argc > 2){
        errore("La sintassi corretta è: .\bachecaServer remove\n");
      }
    
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.