2015-11-10 2 views
0

Je suis en train d'écrire une application sur framboise pi avec la mémoire partagée. J'utilise la fonction strstr() dans ma bibliothèque de mémoire partagée auto-écrite. Quand je compile la bibliothèque sur OS X avec clang ++ je n'obtiens aucune erreur. Si je le compile sur mon pi de framboise j'ai l'erreur: 'strstr' n'a pas été déclaré dans cette portée.erreur: 'strstr' n'a pas été déclaré dans cette portée

J'ai essayé de mettre à jour ma framboise mais sans succès, pouvez-vous me donner n'importe quel conseil ou solution quoi faire.

tête-Datei

#ifndef SHAREDMEMORY_H 
#define SHAREDMEMORY_H 

#include <string> 
#include <cstdlib> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/mman.h> 
#include <iostream> 

#define MAX_SERVICES 99 

/** 
* Datei mit der Datenbank. 
*/ 
#define FILEPATH "database.dat" 
/** 
* Anzahl der Zeichen in der 
* Datenbank. 
*/ 
#define CHARACTERS 2500 
/** 
* Größe der Datenbank. 
*/ 
#define FILESIZE (CHARACTERS*sizeof(char)) 

class SharedMemory { 
public: 
    /** 
    * Constructor 
    */ 
    SharedMemory(); 
    /** 
    * Desctructor 
    */ 
    ~SharedMemory(); 
    /** 
    * Method to open file 
    * @param string: Path to file, has to exist 
    * @param int: for reading 0 
    *    for writing 1 
    * @return bool: true on success 
    *    false on error 
    */ 
    bool openFile(std::string, int); 
    /** 
    * Method to map file to memory 
    * @param string: Path to file, has to exist 
    * @param int: for reading 0 
    *    for writing 1 
    * @return bool: true on success 
    *    false on error 
    */ 
    bool mappingFile(int); 
    /** 
    * Method to remove file from memory 
    * @return bool: true on success 
    *    false on error 
    */ 
    bool unmapFile(); 
    /** 
    * Method to write information to file 
    * @param string: data to write 
    * e.g. string="#1:127.0.0.1:8000", #number range 0-99. 
    * @return bool: true on success 
    *    false on error 
    */ 
    bool set(std::string); 
    /** 
    * Method to read information from file 
    * @param string: need to cointains id, if success 
    *    then contains info from id. 
    * e.g. string="1", number range "0"-"99". 
    * @return bool: true on success 
    *    false on error 
    */ 
    bool get(std::string&); 
private: 
    /** 
    * Datei-Deskriptor. 
    */ 
    int fd; 
    /** 
    * Zeiger auf Dateiinhalt. 
    */ 
    char *mapPointer; 
    /** 
    * Path to file 
    */ 
    std::string filePath; 
}; 


#endif /* SHAREDMEMORY_H */ 

Cpp-Datei

#include "SharedMemory.h" 

SharedMemory::SharedMemory() { } 

SharedMemory::~SharedMemory() { } 

bool SharedMemory::openFile(std::string _path, int mode) { 
    if (mode) { 
     fd = open(_path.c_str(), O_RDWR, (mode_t)0600); 
    } else { 
     fd = open(_path.c_str(), O_RDONLY, (mode_t)0600); 
    } 
    if (fd == -1) { 
     return false; 
    } 

    return true; 
} 

bool SharedMemory::mappingFile(int mode){ 
    void* tmpPointer; 
    if (mode) { 
     tmpPointer = mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
    } else { 
     tmpPointer = mmap(0, FILESIZE, PROT_READ, MAP_SHARED, fd, 0); 
    } 

    if(tmpPointer == MAP_FAILED) { 
     close(fd); 
     return false; 
    } 
    mapPointer = (char*) tmpPointer; 

    return true; 
} 

bool SharedMemory::unmapFile() { 
    int ret = munmap(mapPointer, FILESIZE); 
    close(fd); 
    if (ret == -1) { 
     return false; 
    } 

    return true; 
} 

bool SharedMemory::set(std::string s) { 
    /** 
    * Filter id, find the id in the file. 
    * If Values exist and id is valid, insert value 
    * -> if value not exists, insert "No_Service". 
    * if given id is invalid, return false 
    */ 
    int mid = s.find(";"); 
    int begin = s.find("#"); 
    std::string id = s.substr(begin + 1, mid - begin); 
    std::string info = s.substr(mid + 1, s.length()); 
    if (info == "") { 
     info = "No_Service"; 
    } 
    char* i = strstr(mapPointer, id.c_str()); 
    while (*i++ != ';'); 
    for (auto x: info) { 
     *i++ = x; 
    } 
    for (int j = 0; j < (20 - info.length()); ++j) { 
     *i++ = ' '; 
    } 

    return true; 
} 

bool SharedMemory::get(std::string& id){ 
    /** 
    * Filter id, find the id in the file. 
    * save data in string s. 
    */ 
    int tmp; 
    try { 
     tmp = stoi(id); 
    } catch (...) { 
     id = "No_Service"; 
     return false; 
    } 

    if (tmp > 100 || tmp < 1){ 
     id = "No_Service"; 
     return false; 
    } 

    id += ";"; 
    char* i = strstr(mapPointer, id.c_str()); 
    while (*i++ != ';'); 
    id = ""; 
    do { 
     id += *i++; 
    } while(*i != ' ' && *i != ';'); 

    if (id == "No_Service"){ 
     return false; 
    } 

    return true; 
} 
+0

Vous devriez au moins merci de nous aider ou préventivement pour insérer un visage souriant pour mettre l'ambiance. Vous semblez grossier nous demander des choses avec un visage impassible. – gurghet

+0

quand j'écris quelque chose comme bon tout le monde ou il est instantanément supprimé. Je suis nouveau à empiler débordement et je ne sais pas pourquoi cela arrive. J'ai essayé de l'éditer plusieurs fois. pouvez-vous me dire pourquoi il a ce comportement xD? et un administrateur a supprimé mon endphrase où je remerciais tout le monde pour y aider -.- – MrNice

+0

Pas familier avec la tarte aux framboises, mais essayez «inclure »? – IdeaHat

Répondre