Форум программистов, компьютерный форум, киберфорум
С под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
1

Ошибка в компиляции

05.04.2013, 17:40. Просмотров 982. Ответов 11
Метки нет (Все метки)

Доброго дня.

Написал код, при компиляции выдает сообщения на ошибки в строках. Пытался сам разобраться, но не понимаю, что с ними не так. Взял пример из методички и переделал под свое задание.
Вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <alloca.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
 
struct sort
{   int **mas;
} *mem_mas;
 
    //Сортировка вставками
void insert(int **mas, int reg, int n)
{
    int i, a, tmp;
    for(i=1; i<n; i++)
    {
        tmp = mas[reg][i];
        for(a = i-1; (a >= 0) && (tmp < mas[reg][a]); a--)
            mas[reg][a+1] = mas[reg][a];
        mas[reg][a+1] = tmp;
    }
}
 
void print(int **mas, int n, int k)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < k; j++)
            printf("%d ", mas[i][j]);
        printf("\n");
    }
}
 
int main()
{
    int n, k, i, j;
    int shmid = shmget(IPC_PRIVATE, 2, IPC_CREAT|0666);
    if (shmid < 0)
    {
        fprintf(stdout,"\nОшибка");
        return 0;
    }
    
    *mem_mas = (sort *)shmat(shmid, NULL, 0);   //тут
    
    printf("\nУкажите размерность матрицы:\nколичество строк: ");
    scanf("%d\n", &n);
    printf("количество столбцов: ");
    scanf("%d\n", &k);
    
    int **mas = (int **)malloc(n*sizeof(int*));
    for (i = 0; i < n; i++)
        *mas[i] = (int *)malloc(k*sizeof(int));   //и тут
    
    srand(time(NULL));
    for (i = 0; i < n; i++)
        for (j = 0; j < k; j++)
            mas[i][j] = rand()%100;
    
    printf("\nИсходная матрица:\n");
    print(mas, n, k);
    
    for (i = 0; i < n; i++)
        if (fork() == 0)    
            insert(mas, i, n);
    wait(NULL);
    
    printf("\nОтсортированная матрица:\n");
    print(mas, n, k);
    return 1;
}
Вот сообщения об ошибках:
Код
gcc -Wall -o "lab4a" "lab4a.c" (в каталоге: /home/victor/Lab)
Сборка завершилась с ошибкой.
lab4a.c: В функции «main»:
lab4a.c:49:14: ошибка: «sort» undeclared (first use in this function)
lab4a.c:49:14: замечание: each undeclared identifier is reported only once for each function it appears in
lab4a.c:49:20: ошибка: expected expression before «)» token
lab4a.c:58:11: предупреждение: в присваивании указатель преобразуется в целое без приведения типа [по умолчанию включена]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2013, 17:40
Ответы с готовыми решениями:

Ошибка при компиляции. Где ошибка? (Работа с классом)
Уважаемые форумчане! При компиляции проекта возникает ошибка &quot; undefined reference to...

Ошибка компиляции. Ошибка - frxpngimage.dcu
Ошибка при компиляции приложения. Само приложение делал на учебе , закинул всю папку на флешку с...

При компиляции ошибка. Ошибка c++ C2678
Ошибка c++ C2678 #include &lt;windows.h&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt;...

Ошибка компиляции
Не могу скомпелировать код: #include &lt;iostream.h&gt; int main() { string s = &quot;&quot;; ...

11
1000 / 787 / 306
Регистрация: 02.09.2012
Сообщений: 2,395
06.04.2013, 06:35 2
строка 49: нет такого типа данных sort, есть - struct sort.
Или замените на struct sort, или используйте typedef в объявлении struct.
1
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
06.04.2013, 11:08  [ТС] 3
grgdvo, нет, все равно ругается

Код
gcc -Wall -o "lab4a" "lab4a.c" (в каталоге: /home/victor/Lab)
lab4a.c: В функции «main»:
lab4a.c:49:3: ошибка: expected expression before «mem_mas»
lab4a.c:58:11: предупреждение: в присваивании указатель преобразуется в целое без приведения типа [по умолчанию включена]
Сборка завершилась с ошибкой.
это ошибки, если поставил typedef

Добавлено через 52 минуты
Все забудьте, разобрался
0
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
08.04.2013, 21:44  [ТС] 4
Задача еще актуальна.

Теперь проблемы с выводом на экран или процессами fork().
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <alloca.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
 
struct sort
{   int **mas;
} *mem_mas;
 
    //Сортировка вставками
void insert(int reg, int n)
{
    int i, a, tmp;
    for(i=1; i<n; i++)
    {
        tmp = mem_mas->mas[reg][i];
        for(a = i-1; (a >= 0) && (tmp < mem_mas->mas[reg][a]); a--)
            mem_mas->mas[reg][a+1] = mem_mas->mas[reg][a];
        mem_mas->mas[reg][a+1] = tmp;
    }
}
 
void print(int **mas, int n, int k)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < k; j++)
            printf("%d ", mas[i][j]);
        printf("\n");
    }
}
 
int main()
{
    int n, k, i, j;
    
    int shmid = shmget(IPC_PRIVATE, 16, IPC_CREAT|0666);
    if (shmid < 0)
    {
        fprintf(stdout,"\nОшибка");
        return 0;
    }
    
    mem_mas = (struct sort *)shmat(shmid, NULL, 0);
    
    printf("\nУкажите размерность матрицы:\nколичество строк: ");
    scanf("%d", &n);
    printf("количество столбцов: ");
    scanf("%d", &k);
    printf("\n");
        
    mem_mas->mas = (int **)malloc(n*sizeof(int*));
    for (i = 0; i < n; i++)
        mem_mas->mas[i] = (int *)malloc(k*sizeof(int));
    
    srand(time(NULL));
    for (i = 0; i < n; i++)
        for (j = 0; j < k; j++)
            mem_mas->mas[i][j] = rand()%100;
    
    printf("\nИсходная матрица:\n");
    print(mem_mas->mas, n, k);
    
    for (i = 0; i < n; i++)     //снова проблемы с процессом и обмен данными
    {
        if (fork() == 0)    
            insert(i, k);
        wait(NULL); 
    }
    
    printf("\n");
    printf("\nОтсортированная матрица:\n");
    print(mem_mas->mas, n, k);
    
    return 1;
}
0
Миниатюры
Ошибка в компиляции  
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
13.04.2013, 17:40  [ТС] 5
Что, никто не хочет помочь?
Ну хоть подскажите, что не так!
0
1000 / 787 / 306
Регистрация: 02.09.2012
Сообщений: 2,395
14.04.2013, 17:31 6
Ну что не так?! fork в цикле! что тут еще может быть не так...
прежде чем исправлять, скажите, какая задача у вас? что нужно сделать?
отсортировать кажду строчку массива отдельным процессом?
0
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
14.04.2013, 21:43  [ТС] 7
Задача
Упорядочить по возрастанию элементы в каждой строке матрицы А. Входные данные: целое положительное число n, целое положительное число k, массив чисел от А размерности n×k. Использовать n или n+1процессов для решения задачи.
Разработать алгоритм решения задания, с учетом разделения вычислений между несколькими процессами. Для обмена информацией между процессами использовать разделяемую память.
Тут конечно не говорится, что надо отсортировать каждую строчку отдельно, но надо же как то включать процессы в программу.

Понимаю, что проблемы связаны с fork'ом, но не знаю почему. В моей методичке есть похожий пример с использованием fork'а в цикле и там все работает(я лично проверял).

Добавлено через 2 минуты
А хотя нет, тут есть намек на построчную сортировку отдельными процессами.
0
1000 / 787 / 306
Регистрация: 02.09.2012
Сообщений: 2,395
15.04.2013, 17:20 8
Для начала нужен алгоритм параллельной обработки:
Шаг1. Пока идет последовательно. Ввести n и k
Шаг2. Выделить разделяему память размером n*k*sizeof(int). Зачем malloc делаете? Честно говоря вообще не могу представить, что вы получите после fork, когда в сегменте общей памяти лежит указатель на двумерный массив, созданный в динамической памяти. Такое ощущение, что фигня получится и процессы будут сортировать каждый свой кусок динамической памяти, а не общую память. Итак, должны получить корректный дескриптор сегмента общей памяти.
Шаг3. Приатачиваем этот сегмент к текущему процессу (пока единственному) через shmat и заполняем массив начальными данными.
Шаг4. (Разбиение на процессы) Создаем n процессов и запоминаем их идентификаторы примерно так как здесь:
C++
1
2
3
4
5
6
7
8
9
10
/* Start up children */
for (int ii = 0; ii < numberOfChildren; ++ii) {
   if ((p = fork()) == 0) {
      // Child process: do your work here
      exit(0);
   }
   else {
      childPids[ii] = p;
   }
}
Обращаем внимание, что после форк у child'а стоит exit!! не нужно child снова заворачивать в цикл и чтобы он дальше продолжал плодить своих child'ов. Перед exit ставим вызов процедуры сортировки строки - как у вас.
Шаг5. (Слияние). Опять же используем как советуют люди по ссылке, дожидаемся всех процессов. Для случая 2x6 ждать будет уже не кого, но это проверка все равно нужна!
Шаг6. Выводим на экран массив

Как-то так
0
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
15.04.2013, 19:10  [ТС] 9
grgdvo, должно быть так?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <alloca.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
 
struct sort
{   int **mas;
} *mem_mas;
 
    //Сортировка вставками
void insert(int reg, int n)
{
    int i, a, tmp;
    for(i=1; i<n; i++)
    {
        tmp = mem_mas->mas[reg][i];
        for(a = i-1; (a >= 0) && (tmp < mem_mas->mas[reg][a]); a--)
            mem_mas->mas[reg][a+1] = mem_mas->mas[reg][a];
        mem_mas->mas[reg][a+1] = tmp;
    }
}
 
void print(int **mas, int n, int k)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < k; j++)
            printf("%d ", mas[i][j]);
        printf("\n");
    }
}
 
int main()
{
    int n, k, i, j, p;
    
    printf("\nУкажите размерность матрицы:\nколичество строк: ");
    scanf("%d", &n);
    printf("количество столбцов: ");
    scanf("%d", &k);
    printf("\n");
        
    int shmid = shmget(IPC_PRIVATE, n*k*sizeof(int), IPC_CREAT|0666);
    if (shmid < 0)
    {
        fprintf(stdout,"\nОшибка");
        return 0;
    }
    
    mem_mas = (struct sort *)shmat(shmid, NULL, 0);    
    
    srand(time(NULL));
    for (i = 0; i < n; i++)
        for (j = 0; j < k; j++)
            mem_mas->mas[i][j] = rand()%100;
    
    printf("\nИсходная матрица:\n");
    print(mem_mas->mas, n, k);
    
    for (i = 0; i < n; i++)
        if ((p = fork()) == 0)    
        {
            insert(i, k);
            exit(0);
        }
    
    for (i = 0; i < n; i++)
        wait(NULL);
    
    printf("\n");
    printf("\nОтсортированная матрица:\n");
    print(mem_mas->mas, n, k);
    
    return 0;
}
Если да, то пишет Segmentation fault.
0
1000 / 787 / 306
Регистрация: 02.09.2012
Сообщений: 2,395
16.04.2013, 18:05 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <alloca.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
 
#define MATRIX(r, c) pMatrix[(r) * colcount + (c)]
 
int rowcount = 0;
int colcount = 0;
int *pMatrix = NULL;
 
void insertsort(int row) {
    for(int sortpos = 1; sortpos < colcount; sortpos++) {
        int sortitem = MATRIX(row, sortpos);
        int insertpos = (sortpos - 1);
        for(; (insertpos >= 0) && (sortitem < MATRIX(row, insertpos)); insertpos--)
            MATRIX(row, insertpos + 1) = MATRIX(row, insertpos);
        MATRIX(row, insertpos + 1) = sortitem;
    }
}
 
void print(const char* msg) {
    printf("%s\n", msg);
    for (int row = 0; row < rowcount; row++) {
    for (int col = 0; col < colcount; col++)
        printf("%d ", MATRIX(row, col));
    printf("\n");
    }
    printf("\n");
}
 
void getvalue(const char *msg, int &value) {
    printf("%s", msg);
    scanf("%d", &value);
}
 
int main() {
    printf("Укажите размерность матрицы.\n");
    getvalue("количество строк: ", rowcount);
    getvalue("количество столбцов: ", colcount);
 
    int shmid = shmget(IPC_PRIVATE, rowcount * colcount * sizeof(int), IPC_CREAT | 0666);
    if (shmid < 0) {
    perror(NULL);
        return 0;
    }
    pMatrix = (int *)shmat(shmid, NULL, 0);
 
    srand(time(NULL));
    for (int row = 0; row < rowcount; row++)
        for (int col = 0; col < colcount; col++)
             MATRIX(row, col) = rand()% 100;
    print("Исходная матрица:");
 
    for (int row = 0; row < rowcount; row++) {
        if ((fork()) == 0) {
            insertsort(row);
            exit(0);
        }
    }
 
    for (int row = 0; row < rowcount; row++)
    wait(NULL);
 
    print("Отсортированная матрица:");
    return 0;
}
Динамические двумерные (и дальше) массивы в разделяемой памяти хранить не очень удобно, потому что специфичнская интерпретация оператора []. Поэтому надо переходить к одномерной индексации. Segmentation fault потому что память не выделили под mem_mas, который и не нужен уже.

И еще показалось, что ошибка была в сортировке вставками... где-то было n, а надо было k. Вообщем все переименовал, чтобы было понятно что за что отвечает. Вроде работает

Bash
1
2
3
4
5
6
7
8
9
10
Укажите размерность матрицы.
количество строк: 2
количество столбцов: 20
Исходная матрица:
93 15 38 33 46 60 19 70 69 33 57 21 87 7 54 31 38 54 78 21 
42 4 22 99 19 49 2 42 81 26 89 26 41 80 12 87 40 83 9 62 
 
Отсортированная матрица:
7 15 19 21 21 31 33 33 38 38 46 54 54 57 60 69 70 78 87 93 
2 4 9 12 19 22 26 26 40 41 42 42 49 62 80 81 83 87 89 99
1
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
17.04.2013, 00:12  [ТС] 11
grgdvo, ОГРОМНОЕ СПАСИБО!
Только объясните пару строчек, 10 и 14. Что они делают?

Добавлено через 4 часа 59 минут
еще вопрос, это только мне кажется странным, что двумерные массивы заключаются в круглые скобки или так и должно быть?
0
1000 / 787 / 306
Регистрация: 02.09.2012
Сообщений: 2,395
18.04.2013, 00:54 12
Строчка 10, это макрос, подставляющий вместо выражения вида MATRIX(a,b) -> pMatrix[...]. Этим макросом я скрыл доступ к одномерному массиву как к двумерному, чтобы в программе можно было писать понятным языком, но теперь уже с круглыми скобками.

Строка 14, это указатель на будущий массив, размещенный в общей памяти.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2013, 00:54

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка компиляции,
Помогите пожалуйста найти ошибку. Программа не собирается, но ошибок не выдает... Созданы два...

Ошибка компиляции
Добрый вечер. Не могу реализовать функцию: замена элемента массива на переданное значение При...

Ошибка компиляции
Привет пацаны, уже часа 3 ебусь с софтом, вроде всё годно идет, и вот остается написать лишь сраную...

Ошибка компиляции
Задание: Треугольник Паскаля Дано целое число N. Требуется найти и вывести N верхних строк...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.