LINUX.ORG.RU

Анализ, компиляция и прогон программы для создания memory mapped файла и записи его содержимого


0

1

Помогите исправить ошибки

#include<stdlib.h>
#include<stdio.h>
#include<fcntl.h>
#include<iostream>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/mman.h> 
int main()
{
    int fd; /* Файловый дескриптор для файла, в 
котором будет храниться наша информация*/
    size_t length; /* Длина отображаемой части файла */
    int i; 
    /* Ниже следует описание типа структуры, которым мы забьем
    файл, и двух указателей на подобный тип. Указатель ptr
    будет использоваться в качестве начального адреса 
    выделенной области памяти, а указатель tmpptr – для 
    перемещения внутри этой области. */
    struct A {
        double f;
        double f2;
    };
A *ptr,tmpptr;
    /* Открываем файл или сначала создаем его (если 
такого файла не было). Права доступа к файлу при создании 
определяем как read-write для всех категорий пользователей 
(0666). Из-за ошибки в Linux мы будем вынуждены ниже в 
системном вызове mmap() разрешить в отображении файла и 
чтение, и запись, хотя реально нам нужна только запись. 
Поэтому и при открытии файла мы вынуждены задавать O_RDWR. */
    fd = open("mapped.dat", O_RDWR | O_CREAT, 0666);
    if( fd == -1){
        /* Если файл открыть не удалось, выдаем 
сообщение об ошибке и завершаем работу */
        printf("File open failed!\n");
        exit(1);
    }
    /* Вычисляем будущую длину файла (мы собираемся записать
    в него 100000 структур) */
    length = 100000*sizeof(struct A);
    /* Вновь созданный файл имеет длину 0. Если мы его 
    отобразим в память с такой длиной, то любая попытка 
    записи в выделенную память приведет к ошибке. Увеличиваем
    длину файла с помощью вызова ftruncate(). */
    ftruncate(fd,length);
    /* Отображаем файл в память. Разрешенные операции над
    отображением указываем как PROT_WRITE | PROT_READ по 
    уже названным причинам. Значение флагов ставим в 
    MAP_SHARED, так как мы хотим с охранить информацию, 
    которую занесем в отображение, на диске. Файл 
    отображаем с его начала (offset = 0) и до конца 
    (length = длине файла). */
    ptr = (struct A )mmap(NULL, length, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
    /* Файловый дескриптор нам более не нужен, и мы его
    закрываем */
    close(fd);
    if( ptr == MAP_FAILED ){
        /* Если отобразить файл не удалось, сообщаем об
        ошибке и завершаем работу */
        printf("Mapping failed!\n");
        exit(2);
    }
    /* В цикле заполняем образ файла числами от 1 до 100000
    и их квадратами. Для перемещения по области памяти 
    используем указатель tmpptr, так как указатель ptr на 
    начало образа файла нам понадобится для прекращения 
    иотображения вызовом munmap(). */
    tmpptr = ptr;
    for(i = 1; i <=100000; i++){
        tmpptr.f = i;
        tmpptr.f2 = tmpptr.f*tmpptr.f;
        tmpptr++;
    }
    /* Прекращаем отображать файл в память, записываем 
    содержимое отображения на диск и освобождаем память. */
    munmap((void *)ptr, length);
    return 0;
}

при конпеляции выдает ошибки 7_2.cpp: В функции «int main()»:

7_2.cpp:54:83: ошибка: нет подходящей функции для вызова «main()::A::A(void*)»

7_2.cpp:54:83: замечание: candidates are:

7_2.cpp:20:12: замечание: main()::A::A()

7_2.cpp:20:12: замечание: candidate expects 0 arguments, 1 provided

7_2.cpp:20:12: замечание: main()::A::A(const main()::A&)

7_2.cpp:20:12: замечание: no known conversion for argument 1 from «void*» to «const main()::A&»

7_2.cpp:58:17: ошибка: no match for «operator==» in «* ptr == 4294967295u»

7_2.cpp:73:15: ошибка: no «operator++(int)» declared for postfix «++» [-fpermissive]

если c++

  • mmap возвращает указатель
  • подумать о -> и .
  • почитать про объявление через запятую

если си

  • убрать iostream
  • mmap возвращает указатель
  • подумать о -> и .
  • почитать про объявление через запятую
  • или typedef, или полностью struct A
anonymous ()
Ответ на: комментарий от Hunter_nub

Сравнивай с оригиналом.

#include<stdlib.h>
#include<stdio.h>
#include<fcntl.h>
#include<iostream>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/mman.h>

/* Ниже следует описание типа структуры, которым мы забьем
файл, и двух указателей на подобный тип. Указатель ptr
будет использоваться в качестве начального адреса 
выделенной области памяти, а указатель tmpptr – для 
перемещения внутри этой области. */
struct A {
    double f;
    double f2;
};

int main()
{
    int fd; /* Файловый дескриптор для файла, в 
котором будет храниться наша информация*/
    size_t length; /* Длина отображаемой части файла */
    int i; 
A *ptr, *tmpptr;
    /* Открываем файл или сначала создаем его (если 
такого файла не было). Права доступа к файлу при создании 
определяем как read-write для всех категорий пользователей 
(0666). Из-за ошибки в Linux мы будем вынуждены ниже в 
системном вызове mmap() разрешить в отображении файла и 
чтение, и запись, хотя реально нам нужна только запись. 
Поэтому и при открытии файла мы вынуждены задавать O_RDWR. */
    fd = open("mapped.dat", O_RDWR | O_CREAT, 0666);
    if( fd == -1){
        /* Если файл открыть не удалось, выдаем 
сообщение об ошибке и завершаем работу */
        printf("File open failed!\n");
        exit(1);
    }
    /* Вычисляем будущую длину файла (мы собираемся записать
    в него 100000 структур) */
    length = 100000*sizeof(struct A);
    /* Вновь созданный файл имеет длину 0. Если мы его 
    отобразим в память с такой длиной, то любая попытка 
    записи в выделенную память приведет к ошибке. Увеличиваем
    длину файла с помощью вызова ftruncate(). */
    ftruncate(fd,length);
    /* Отображаем файл в память. Разрешенные операции над
    отображением указываем как PROT_WRITE | PROT_READ по 
    уже названным причинам. Значение флагов ставим в 
    MAP_SHARED, так как мы хотим с охранить информацию, 
    которую занесем в отображение, на диске. Файл 
    отображаем с его начала (offset = 0) и до конца 
    (length = длине файла). */
    ptr = (struct A*)mmap(NULL, length, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
    /* Файловый дескриптор нам более не нужен, и мы его
    закрываем */
    close(fd);
    if( ptr == MAP_FAILED ){
        /* Если отобразить файл не удалось, сообщаем об
        ошибке и завершаем работу */
        printf("Mapping failed!\n");
        exit(2);
    }
    /* В цикле заполняем образ файла числами от 1 до 100000
    и их квадратами. Для перемещения по области памяти 
    используем указатель tmpptr, так как указатель ptr на 
    начало образа файла нам понадобится для прекращения 
    иотображения вызовом munmap(). */
    tmpptr = ptr;
    for(i = 1; i <=100000; i++){
        tmpptr->f = i;
        tmpptr->f2 = tmpptr->f * tmpptr->f;
        tmpptr++;
    }
    /* Прекращаем отображать файл в память, записываем 
    содержимое отображения на диск и освобождаем память. */
    munmap((void *)ptr, length);
    return 0;
}
anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.