Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2015, 14:21   #1
WolfEater
Пользователь
 
Регистрация: 15.02.2015
Сообщений: 21
По умолчанию Ошибка компиляции

У меня такое задание по лабораторной работе.
Напишите программу на языке Cи, в которой:
1) Запускается четное количество потоков параллельно.
2) Каждый нечетный поток (например, первый) создает файл с именем из своего PID, записывает в него произвольное число символов (от нескольких символов до сотен миллионов символов) и закрывает этот файл.
3) Каждый четный поток (например, второй) открывает файл, созданный предыдущим потоком с нечетным номером (в нашем случае первым), читает его, считает количество символов в файле и закрывает его; при этом четный поток не должен иметь никакой информации о количестве записываемых в файл символов и о том, закончена ли запись в файл нечетным потоком.
4) Каждый из потоков выводит следующую информацию: ThreadID, PID, PPID, время, имя файла, количество записанных или считанных символов.
5) Количество пар создаваемых потоков передается аргументом в программу с командной строки. Программа должна ждать завершения работы всех потоков, анализировать и сообщать о причинах завершения потоков. Для передачи имен файлом между потоками можно использовать символьный массив в основной программе.

Но при попытке компиляции (компилятор gcc) выдает такие ошибки:
j.c: In function ‘main’:
j.c:99:14: error: ‘new’ undeclared (first use in this function)
j.c:99:14: note: each undeclared identifier is reported only once for each function it appears in
j.c:99:18: error: expected ‘;’ before ‘pthread_t’
j.c:100:18: error: expected ‘;’ before ‘pthread_t’
j.c:101:21: error: expected ‘;’ before ‘char’
j.c:104:28: error: expected ‘;’ before ‘char’
j.c:105:65: error: expected ‘)’ before ‘int’
j.c:111:63: error: expected ‘)’ before ‘int’

Подскажите пожалуйста как их исправить?
WolfEater вне форума Ответить с цитированием
Старый 22.09.2015, 14:22   #2
WolfEater
Пользователь
 
Регистрация: 15.02.2015
Сообщений: 21
По умолчанию

Код моей программы
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
 
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <dirent.h>
 
char** files; // массив с именами файлов
 
void* create_file(void *arg) // поток создания файла
{
    int* tmp =(int*) arg; // индекс указывающий на имя файла
    int ind = *tmp;
    int rec_error;
    free (tmp);
 
    FILE* fl;
    long unsigned int PID;
    int pid, ppid, num;
    long unsigned int len, i = 0;
    char buf;
    time_t vremya= time(NULL);
    num = ind*2 + 1; // номер потока
    len = random(); // количество символов в файле
    PID = pthread_self(); // ThreadID
    pid = getpid(); // PID
    ppid = getppid(); // PPID
    sprintf(files[ind], "%s/%lu%s", getenv("PWD"), PID, ".txt"); // имя файла
    fl = fopen(files[ind], "w");// создаем файл
    if( fl ) // если файл создан
    {
        while( i!=len) // пока не запишем все символы
        {
            if( i % 2 ) buf = '0';
            else buf = '1';
            fputc(buf, fl);
            i++;
        } 
        if( fclose(fl) == EOF) printf("Fclose Error"); // закрываем файл
    }
    // выводим на экран информацию о потоке и файле
    printf("\nThread #%i\n\tThreadID: %lu\n\tPID: %i\n\tPPID: %i\n\tTimeDate: %s\tFileName: %s\n\tLength: %lu\n", num, PID, pid, ppid, ctime(&vremya), files[ind], len);
    pthread_exit(NULL);
}
 
void* read_file(void *arg) // поток читающий файл
{
    int* tmp =(int*) arg; // индекс указывающий на имя файла
    int ind = *tmp;
    free (tmp);
    
    FILE* fl;
    long unsigned int PID;
    int i = 0, pid, ppid, num;
    long int len = 0;
    //char t[32];
    char buf[256];
    time_t vremya= time(NULL);
    num = ind*2 + 2;   // номер потока
    PID = pthread_self(); // ThreadID
    pid = getpid(); // PID
    ppid = getppid(); // PPID
    fl = fopen(files[ind], "r"); // открываем файл для чтения
    if( fl ) // если файл открылся
    {
        strcpy(buf, files[ind]); // считываем название файла
        while( i!=EOF ) // пока не достигнем конца файла
        {
            i = fgetc(fl); // считываем по-символьно
            if( i!=EOF ) len++; // счетчик символов
        }
        if( fclose(fl) == EOF) printf("Fclose Error"); // закрываем файл
    }
    else // если файла нет
    {
        strcpy(buf, "file not found");
    }
    // выводим результаты работы
    printf("\nThread #%i\n\tThreadID: %lu\n\tPID: %i\n\tPPID: %i\n\tTimeDate: %s\tFileName: %s\n\tLength: %lu\n", num, PID, pid, ppid, ctime(&vremya), buf, len);
    pthread_exit(NULL);
}
 
// запускаем приложение
int main(int argc, char* argv[])
{
int i, qnt, res, tmp;
    FILE* fl;
    pthread_t* ws;
    pthread_t* rs;
    srandom(time(NULL));
    if( argc == 2 ) qnt = atoi(argv[argc-1]); // выбираем количество пар потоков из командной строки
    else qnt = 0;
    if( qnt ) // если в командной строке прописано количество пар потоков
    {
        ws = new pthread_t[qnt]; // создаем указатели на потоки записи
        rs = new pthread_t[qnt]; // создаем указатели на потоки чтения
        files = new char*[qnt]; // создаем массив имен файлов
        for(i=0; i<qnt;i++)
        {
            files[i] = new char[256]; // инициализируем строку имени файла
            res = pthread_create(&ws[i], NULL, create_file, new int(i)); // запускаем нечетный поток
            if (res != 0) // проверка на успех
            {
                perror("creation failed");
                exit(EXIT_FAILURE);
            }
            res = pthread_create(&rs[i], NULL, read_file, new int(i)); // запускаем четный поток
            if (res != 0) // проверяем
            {
                perror("Thread creation failed");
                exit(EXIT_FAILURE);
            }
        }
        // проверяем завершение потоков, а так же удаляем файлы и очищаем память
        for(i=qnt-1; i>=0; i--)
        {
            tmp = i*2+1;
            res = pthread_join(ws[i], NULL);
            if (res == 0) printf("Picked up a thread #%i\n", tmp);
            else perror("pthread_join failed");
            tmp = i*2+2;
            res = pthread_join(rs[i], NULL);
            if (res == 0) printf("Picked up a thread #%i\n", tmp);
            else perror("pthread_join failed");
            fl = fopen(files[i], "r");
            if( fl )
            {
                fclose(fl);
                remove(files[i]);
            }
            free (files[i]);
        }
 
        free (files);
        free (ws);
        free (rs);
    }
 
    printf("All done\n");
    exit(EXIT_SUCCESS);
}
WolfEater вне форума Ответить с цитированием
Старый 22.09.2015, 14:31   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

new это C++, а не C. Там malloc.

И в С до С99 нельзя объявлять переменные в любом месте функции, только в начале.
Если хотите C99 пишите при компиляции в параметрах gcc -std=c99

И при объявлении переменной структуры надо писать struct (struct pthread_t*), либо typedef создать.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 22.09.2015 в 14:34.
Alex11223 вне форума Ответить с цитированием
Старый 22.09.2015, 14:46   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Может проще изменить тип файла, чтоб был .cpp?
waleri вне форума Ответить с цитированием
Старый 22.09.2015, 14:47   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так в задании и не просят С++.
Цитата:
Напишите программу на языке Cи
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.09.2015, 07:01   #6
WolfEater
Пользователь
 
Регистрация: 15.02.2015
Сообщений: 21
По умолчанию

Если вам не сложно можете помочь перевести программу в Си.
WolfEater вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка компиляции Okadzi Общие вопросы C/C++ 5 02.03.2012 00:35
C++ Ошибка компиляции xays Общие вопросы C/C++ 1 10.02.2012 02:50
Ошибка компиляции (С++) Virgilij Помощь студентам 0 26.01.2012 21:02
Ошибка компиляции? hardorsoft Помощь студентам 5 19.05.2011 15:17
C++ ошибка компиляции Seil_29 Помощь студентам 9 20.12.2009 22:23