2013-05-03 104 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];