Матрицы умножения: ошибка: ожидаемое первичное выражение перед структурой - PullRequest
0 голосов
/ 08 марта 2011

Я пытаюсь написать программу, которая должна умножать матрицы, используя потоки.
Я должен заполнить матрицы, используя случайные числа в потоке. Я компилирую в g ++ и использую PTHREADS. Я также создал структуру для передачи данных из моего ввода командной строки в поток, чтобы он мог генерировать матрицу случайных чисел. Размеры двух матриц также передаются в командной строке.

Я продолжаю получать: main.cpp: 7: ошибка: ожидаемое первичное выражение перед структурой мой код @ строка 7 =:

struct a{  
     int Arow;    
     int Acol;   
     int low;   
     int high;
 };

Мой вклад:
Размеры двух матриц (4 аргумента) верхний и нижний диапазоны, в которых o генерирует случайные числа между.

Полный код:

[headers]  
using namespace std;

void *matrixACreate(struct *);

void *status;


int main(int argc, char * argv[])
{ 


  int Arow = atoi(argv[1]); // Matrix A  
  int Acol = atoi(argv[2]); // WxX  
  int  Brow = atoi(argv[3]); // Matrix B  
  int Bcol = atoi(argv[4]); // XxZ,   
  int low = atoi(argv[5]); // Range low  
  int high = atoi(argv[6]);

struct a{
     int Arow; // Matrix A    
     int Acol; // WxX  
     int low; // Range low  
     int high;
 };


 pthread_t matrixAthread;
 //pthread_t matrixBthread;
 pthread_t runner;
 int error, retValue;

 if (Acol != Brow)
 {
     cout << " This matrix cannot be multiplied. FAIL" << endl;
     return 0;
 }

 error = pthread_create(&matrixAthread, NULL, matrixACreate, struct *a);  
 //error = pthread_create(&matrixAthread, NULL, matrixBCreate, sendB);  
 retValue = pthread_join(matrixAthread, &status);  
 //retValue = pthread_join(matrixBthread, &status);  

 return 0;
}
void matrixACreate(struct * a)
{
    struct a *data = (struct a *) malloc(sizeof(struct a));  
    data->Arow = Arow;  
    data->Acol = Acol;  
    data->low = low;  
    data->high = high;  
    int range = ((high - low) + 1);  
    cout << Arow << endl<< Acol << endl;  
    }// just trying to print to see if I am in the thread

Ответы [ 2 ]

3 голосов
/ 08 марта 2011

Вы не можете объявить struct s в середине функции и ожидать, что другие функции узнают об этом, вам нужно переместить ее перед main.У вас также есть все виды проблем в остальной части вашего кода, я бы посоветовал вам обратиться к некоторым учебникам / книгам по Си и структурам.Я пытался исправить код как мог, но, честно говоря, я не был полностью уверен, что вы пытаетесь сделать ...

struct a {
    int Arow;
    int Acol;
    int Brow;
    int Bcol;
    int low;
    int high;
};

void *matrixACreate(struct a*);

void *status;

int main(int argc, char * argv[]) {

    struct a matrix_mult_info;

    matrix_mult_info.Arow = atoi(argv[1]); // Matrix A
    matrix_mult_info.Acol = atoi(argv[2]); // WxX
    matrix_mult_info.Brow = atoi(argv[3]); // Matrix B
    matrix_mult_info.Bcol = atoi(argv[4]); // XxZ,
    matrix_mult_info.low = atoi(argv[5]); // Range low
    matrix_mult_info.high = atoi(argv[6]);


    pthread_t matrixAthread; //pthread_t matrixBthread; pthread_t runner;
    int error, retValue;

    if (matrix_mult_info.Acol != matrix_mult_info.Brow) { cout << " This matrix cannot be multiplied. FAIL" << endl; return 0; }

    /* Note that since you're creating a new thread, you can't access matrix_mult_info
       simultaneously in both threads without using a lock */
    error = pthread_create(&matrixAthread, NULL, matrixACreate, &matrix_mult_info);
    //error = pthread_create(&matrixAthread, NULL, matrixBCreate, sendB);
    retValue = pthread_join(matrixAthread, &status);
    //retValue = pthread_join(matrixBthread, &status);

    return 0;
}
void matrixACreate(struct a *matrix) {
    struct a *data = (struct a *) malloc(sizeof(struct a));
    data->Arow = matrix->Arow;
    data->Acol = matrix->Acol;
    int range = ((matrix->high - matrix->low) + 1);
    cout << Arow << endl<< Acol << endl;
    free(data);
}// just trying to print to see if I am in the thread
0 голосов
/ 08 марта 2011
void *matrixACreate(struct *);

Это проблема. struct само по себе не является именем типа, поэтому у вас не может быть указателя на него.

Вам нужно будет сказать

void *matrixACreate(struct a *);

И затем он ищет struct a в глобальной области видимости, поэтому вам нужно определить struct a в глобальной области видимости, вместо внутренней


Как ни странно, у @ user470379 было правильное решение, даже если по неправильным причинам. Но все запугивают его, удаляя его ответ.

...