2013-05-03 136 views
0

我一直在爲我的大學課程而工作,而且我幾乎完成了,但是我得到了這個奇怪的錯誤,並且根本找不到任何解決方案。這只是程序中的一個功能。所以它會在這部分代碼中引發錯誤。異或算子似乎是問題所在。我試圖重命名「nesto」變量的名稱,以防與某些函數的名稱相同但沒有成功。請幫忙!想法?建議?需要幫助C++編譯器和鏈接器錯誤消息

錯誤:不對應的呼叫 '(的std :: string {又名性病:: basic_string的})(INT &)'

void* ukupno(void* naziv){ 
    while(kraj!=1){ 
     sem_wait(&s_suma); 
     for(int v=0;v<uk_buffer;v++) 
       nesto^= buffer(v); 

     sem_post(&s_dohvati); 
     } 
    } 

這裏是整個代碼:

#include <iostream> 
#include <fstream> 
#include <cstdlib> 
#include <string.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include <algorithm> 
#include <pthread.h> 
#include <semaphore.h> 
#include <signal.h> 
#include <sys/wait.h> 

using namespace std; 
bool zastavica=1,kraj; 
int uk_buffer,broj=0,nesto=0; 
string buffer; 


sem_t s_dohvati; 
sem_t s_broji_rijeci; 
sem_t s_suma; 


void otvori_dat(string naziv){ 
    fstream dat; 
    cout<<"naziv " << naziv << endl; 
    dat.open("naziv",ios::in); 
    } 

void* dohvati(void* naziv){ 

    fstream dat; 
    dat.open((char*)naziv,ios::in); 
    if(!dat){ 
      cout<<"Greska kod otvaranja datoteke !!! " << endl; 
      exit(-1);} 
    kraj = false; 
    while(!kraj){ 
       getline(dat,buffer); 
       uk_buffer = buffer.length(); 
       if(dat.eof()) kraj = true; 

       sem_post(&s_broji_rijeci); 
       sem_post(&s_suma); 

    if(kraj) sem_wait(&s_dohvati),sem_wait(&s_dohvati); 
    }        
    dat.close(); 
    } 

void broji_txt(){ 
      for(int i=0;i<uk_buffer;i++) 
        if(isalnum(buffer[i])){ 
         broj++; 
         while(isalnum(buffer[++i])); 
         } 
       }   


void broji_html(){ for (int i=1;i<uk_buffer;i++) 
       if (buffer[i-1]=='<'&&buffer[i]!='/') 
         broj++; 
         } 


void* broji_rijeci(void* naziv){ 
    while(kraj!=1){ 
     sem_wait(&s_broji_rijeci); 
      if(zastavica) broji_txt(); 
      else broji_html(); 
     sem_post(&s_dohvati);//postavljanje 
     } 
    } 

void* ukupno(void* naziv){ 
    int nesto=0; 
    while(kraj!=1){ 
     sem_wait(&s_suma); 
     for(int v=0;v<uk_buffer;v++) 
       nesto^= buffer(v); 

     sem_post(&s_dohvati); 
     } 
    } 

void analiza(char* naziv){ 
    pthread_t pt_dohvati, pt_broji_rijeci, pt_suma; 

    sem_init (&s_dohvati,0,0); 
    sem_init (&s_broji_rijeci,0,0); 
    sem_init (&s_suma,0,0); 

    pthread_create (&pt_dohvati,NULL,dohvati,(void*)naziv);  //zadnji parametar je ono što šaljem; 
    pthread_create (&pt_broji_rijeci,NULL,broji_rijeci,NULL); 
    pthread_create (&pt_suma, NULL, ukupno, NULL); 

    pthread_join(pt_dohvati,NULL); 
    pthread_join(pt_broji_rijeci,NULL); 
    pthread_join(pt_suma,NULL); 
    cout << "Datoteka " << naziv << " ima " << broj << "rijeci/tagova, zastitna suma je: " <<(unsigned int)nesto; 
} 


int main(int arg0 , char* arg1[]){ 
    char* pom; 
    int br_arg = arg0-1;//po njemu se orijentiramo 

    for(int k=1; k<=br_arg;k++){ 
     pom=strchr(arg1[k],'.'); 
     if(strcmp(pom,".txt") == 0)    zastavica=1; 
     else if(strcmp(pom,".html") == 0) zastavica=0; 
     else cout<< "Datoteka " << arg1[k] << " nije podrzanog formata " << endl; 
     switch(fork()){ 
        case 0 : analiza(arg1[k]),exit(0); 
        case -1 : cerr<< "Pogreska pri stvaranju procesa" << endl; 
        default : continue; 
         } 
           } 
      for(int i=0; i < br_arg ;i++) wait (NULL);   
return 0; 
} 
+0

現在取悅行號的錯誤...... – Gene 2013-05-03 01:07:40

+0

是啊,同樣的問題+, - 等運營商... – T0plomj3r 2013-05-03 01:08:26

回答

1

錯誤消息告訴你,如果你得到的不是函數而是字符串,就沒有辦法使用函數調用語法。而不是buffer(v),你的意思可能是buffer[v]。括號中使用的類型的事項。

+0

True!這是解決方案,但我仍然無法編譯 – T0plomj3r 2013-05-03 01:14:12

+0

如何?你會得到另一個編譯器錯誤? – hvd 2013-05-03 01:16:53

+0

幾乎每個線程創建,連接和sem_wait/post和@ id的「未定義的引用'sem_post'」噸ID返回1退出狀態 – T0plomj3r 2013-05-03 01:20:48

0

您尚未提供足夠的代碼說,但是看起來這個錯誤沒有可見的聲明

buffer(v); 

編輯

好的。現在我們可以看到。嘗試buffer[v]

+0

.. 。也許這5行代碼中的任何一行代碼爲 – 4pie0 2013-05-03 01:06:15

0

你的緩衝區是字符串

string buffer; 

究竟什麼是

nesto^= buffer(v); 

變化緩衝區,因爲你想索引它是載體或任何其他容器的陣列。如果你想從緩衝區的一封信作爲一個字符串然後執行:

nesto^= buffer[v];