Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 09.05.2009
Сообщений: 16

Массивы. Программа не работает

03.06.2009, 21:38. Показов 3039. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код программы. Он не работает. Укажите, пожалуйста, на ошибке и помогите их исправить.
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
 
//Prototype func
void PrintArray(double **p);
double** ConstructAr();
void DestructArray(double **p);
 
const int TERM = -1;
 
/////////////////////////////////
 
void main (void)
{
    double **pA;
    clrscr();
 
    pA = ConstructAr();
    PrintArray(pA);
    DestructArray(pA);
    getch();
}
 
double** ConstructAr()
{
    double** p = NULL;
    int N, M;
    //poluchaem lo-vo strok
    do
    {
        randomize();
        N = random(10);
    }while (N < 1 || N > 10);
    printf("N = %d\n", N);
    //videlyaem pamyat'
    p = (double **)malloc(sizeof(double *)*N + sizeof(int));
    //zapominaem v -1 kol-vo strok
    ((int *)p)[0] = N;
 
    //organizuem postrochnyi vvod
    for (int i=1; i<N+1; i++)
        {
            //opredelyaem kol-vo simvolov v stroke
            do
            {
                randomize();
                M = random(10);
            }while(M < 1 || M > 10);
            M=2;
            printf("M = %d", M);
            //videlyaem pamyat'
            p[i] = (double *) malloc(M*sizeof(double) + sizeof(int));
            ((int *)(p[i]))[M] = TERM;
            //vvodim elti s klavy
            for (int j=0; j<M; j++)
            {
                double m;
                do
                {
                    printf("\nEnter A[%d][%d](1<=A[%d][%d]<=10): ", i,j,i,j);
                    scanf("%lf", &m);
                }while(m<1 || m>10);
                p[i][j]=m;
            }
        }
        return p;
}
void DestructArray(double **p)
{
    if(!p) return;//proverka korrekt
 
    int N; // kol-vo strok
    N = ((int *)p)[-1];
    for(int i=0; i<N; i++)
    {
        ((int *)(p[i]))--;
        free(p[i]);
    }
    ((int *)p)--;
    free(p);
    printf("End free");
}
 
void PrintArray(double **p)
{
    int N,j;
    N = ((int*)p)[0];
    printf("Poluch N=%d\n", N);
    getch();
 
    for(int i=1; i<N+1; i++)
    {
getch();
        j = 0;
        while(((int *)(p[i]))[j] != TERM)
            printf("%f ", p[i][j++]);
            printf("\n");
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.06.2009, 21:38
Ответы с готовыми решениями:

Не работает программа когда массивы имеют разные размерности
Если ввожу все 3 переменны одинаковые работает,а как сделать чтобы работало при разных размерностях #include &lt;stdio.h&gt; ...

не работает программа.Массивы
условие вычислить сумму положительных элеметов массива а(4,5) и разделить на неё каждый элемент.полученную матрицу вывести на экран. ...

Программа не работает (Двумерные массивы)
Program VbIvodMatricy; const N = 3; M = 5; type Mas = array of integer; var Table: mas; i,j,max: integer; Begin

31
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
04.06.2009, 21:31
Студворк — интернет-сервис помощи студентам
кажется, нашел.
у меня вот так работает. под борландом.
с теринатором были проблемы.
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <stdlib.h>
#include "stdio.h"
#include "conio.h"
#include "math.h"
 
 
//Prototype func
void PrintArray(double **p);
double** ConstructAr();
void DestructArray(double **p);
 
const int TERM = -1;
 
/////////////////////////////////
 
void main (void)
{
    double **pA;
    clrscr();
 
    pA = ConstructAr();
    PrintArray(pA);
    DestructArray(pA);
    getch();
}
 
double** ConstructAr()
{
    double** p = NULL;
        double**t;
    int N, M;
    //poluchaem lo-vo strok
    do
    {
        randomize();
        N = random(10);
    }while (N < 1 || N > 10);
    //N=2; -был тест
    printf("N = %d\n", N);
    //videlyaem pamyat'
    p = (double **)malloc(sizeof(double *)*N + sizeof(int));
    //zapominaem v -1 kol-vo strok
    ((int *)p)[0] = N;
    t = (double **)(&((int *)p)[1]);    //указатель на начало собственно массива указателей строк
 
    //organizuem postrochnyi vvod
    for (int i=0; i<N; i++)
        {
            //opredelyaem kol-vo simvolov v stroke
            do
            {
                randomize();
                M = random(10);
            }while(M < 1 || M > 10);
            //M=2; -был тест
            printf("M = %d", M);
            //videlyaem pamyat'
            t[i] = (double *) malloc(M*sizeof(double) + sizeof(int));
                        *(int *)(t[i][M]) =TERM;
            //vvodim elti s klavy
            for (int j=0; j<M; j++)
            {
                double m;
                do
                {
                    printf("\nEnter A[%d][%d](1<=A[%d][%d]<=10): ", i,j,i,j);
                    scanf("%lf", &m);
                }while(m<1 || m>10);
                t[i][j]=m;
            }
        }
        return p;
}
void DestructArray(double **p)
{
    if(!p) return;//proverka korrekt
        double ** t;
    int N; // kol-vo strok
    N = ((int *)p)[0];
        t = (double **)(&((int *)p)[1]);    //указатель на начало собственно массива указателей строк
 
    for(int i=0; i<N; i++)
    {
        free(t[i]);
    }
    free(p);
    printf("End free");
}
 
void PrintArray(double **p)
{
    int N,j;
        double **t;
    N = ((int*)p)[0];
        t = (double**)(&((int *)p)[1]); //указатель на начало собственно массива указателей строк
    printf("Poluch N=%d\n", N);
    getch();
 
    for(int i=0; i<N; i++)
    {
getch();
        j = 0;
        while(*(int *)(t[i][j]) != TERM)
            printf("%f ", t[i][j++]);
            printf("\n");
    }
}
0
0 / 0 / 0
Регистрация: 09.05.2009
Сообщений: 16
04.06.2009, 21:38  [ТС]
*(int *)(t[i][M]) =TERM; здесь у меня под борландом не работает
Incompatible type conversion
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
04.06.2009, 21:52
Любопытно... разные версии боланда?
попробуй заменить на
*(int *)(t[i]+M) =TERM;
0
0 / 0 / 0
Регистрация: 09.05.2009
Сообщений: 16
04.06.2009, 21:55  [ТС]
у меня какой был 6-ой версии. Так уже было, та же ошибка
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
04.06.2009, 21:59
Цитата Сообщение от masime Посмотреть сообщение
Incompatible type conversion
...а дальше? там продолжение должно быть.
0
0 / 0 / 0
Регистрация: 09.05.2009
Сообщений: 16
04.06.2009, 22:05  [ТС]
нет продолжения "Е2110 Incompatible type conversion" на этой строчке
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
04.06.2009, 22:17
похоже, у тебя что-то с борландом.
отправил другу на проверку, у него борланд-5.
работает. вот в таком виде *(int *)(t[i]+M) =TERM;
у меня вообще 3.1. работает.
0
0 / 0 / 0
Регистрация: 09.05.2009
Сообщений: 16
04.06.2009, 22:27  [ТС]
не знаю, тока сегодня установил, из-за того что 3.1 не работает. Скажите, это будет правильным решением данной задачи или рациональным. Что бы мне контрольную не закосячить.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
04.06.2009, 22:32
правильным - да.
массив создает, корректно печатает, удаляет.
но рациональным?... см. выше. - использование "рваных" массивов НИКОГДА не удобно. и следовательно - не рационально.
с практической точки зрения задание бессмысленно.
удачи.

кстати, а почему борданд 3.1 не работает? проблемы с установкой?
0
0 / 0 / 0
Регистрация: 09.05.2009
Сообщений: 16
04.06.2009, 22:43  [ТС]
просто удалял файлы и случайно по ходу удалил нужный файл, теперь не компилирует. А установки то и не было, просто скопировал папку с файлами.
А если в следующем задании мне нужно будет записать этот массив в бинарный файл и потом его прочитать можно будет?

Добавлено через 7 минут 41 секунду
Ну это "рваный" массив?
P.S.Patch,cпасибо огромное за помощь, время покажет правильно мучился или нет.)) И остальным, кто принимал участие, тоже спасибо.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
04.06.2009, 22:48
если надо - могу кинуть борланд 3.1.
на ответ 15 минут, потом иду спать.
все остальные вопросы - через 8 часов.
0
0 / 0 / 0
Регистрация: 09.05.2009
Сообщений: 16
14.06.2009, 11:39  [ТС]
Опять поднимаю эту тему. Теперь надо этот массив записать в бинарный файл, подскажите, пожалуйста, как это сделать. Примерно функция выглядит так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int SaveArray(char *name, double **p)
{
    if(!p) return -1;
    int N, M;
    FILE *f;
    if(!(f=fopen(name, "wb")))return-1;
    N=((int*)p)[0];
    fwrite(&N, sizeof(N),1,f);
    for(int i=1; i<N+1;i++)
    {
        int j=0;
        do
        {
            fwrite(p[i][j], sizeof(int),1,f);//вот здесь не правильно!!!!
        }while(((int *)(p[i]))[j] != TERM);
    }
    fclose(f);
    printf("Save ok");
    return 1;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.06.2009, 11:39
Помогаю со студенческими работами здесь

Массивы. Не могу понять как работает программа
Здравствуйте. Я как и многие в этом разделе новичок. У меня возникли трудности в понимании данной программы #include &lt;iostream&gt;...

Программа , которая выводит время, за которое программа работает
Вообщем, нужно что бы считалось время от начала работы программы, и выводилось на экран.

Почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает
почему программа не работает на MFC статичной библиотеки. а вот на стандартном мфс работает. Имею в ввиду что сделал прогу которая меняет...

Программа работает на Delphi 2007 или более ранней но не работает на старших версиях (10.1 например)
В программе используются дополнительные файлы и dll написанные на fortran их кода нет ;( в ранних вернсиях все хорошо, в старшей 10.1 или...

После AVZ не работает программа Credo Межевой план автоматически закрывается и не работает цифровая подпись
После AVZ не работает программа Credo Межевой план автоматически закрывается и не работает цифровая подпись. Помогите пожалуйста!


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru