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

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

03.06.2009, 21:38. Показов 3142. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru