Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.63
Loose My Braines
0 / 0 / 0
Регистрация: 29.12.2008
Сообщений: 12
#1

Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. - C++

29.12.2008, 11:22. Просмотров 2305. Ответов 14
Метки нет (Все метки)

Огрррромная просьба!!!Все есть и условие и программа,но!!!!
Условие:Дана Двумерная матрица m*n и одномерный массив,посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива.Счет столбцов в моей проге идет с нулегого.
Загвоз вот в чем:
Код
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include<string.h>
#include <fstream.h>

const int N=499;
int m,i;
const unsigned n=9;

int kol,b,a,c,d;

void output(char *t, int tmass)
{
printf(t, tmass);

}


void InpFile(char *NameF, int *x)
{
m=0;
ifstream finput;
finput.open(NameF);
finput>>x[m];
while (!finput.eof())
{
m++;
finput>>x[m];


if(m>N){ printf("nelzia schitat ");
break;}
}
finput.close();
}

void printMass(int co1, int co2, int **tmass)
{
for( int i = 0; i < co1; i++ )
{
for( int j = 0; j < co2; j++ )
{
output(" %d\t", tmass[i][j]);
}
output("\n", 0);
}
}

int** getMassFromFile( char *fname, int &count1, int &count2 )
{
FILE *file = fopen( fname, "r" );
if( file == NULL ) return NULL;
char str[512], *pstr;
count1 = 0; count2 = 0;
int **mass;
memset( str, 0, 512 );
while( ( fgets( str, 511, file) ) && (count1<500) )
{
count2 = 0;
pstr = strtok( str, " " );
do
{
count2++;
pstr = strtok( NULL, " " );
}
while( pstr );
count1++;
memset( str, 0, 512 );
}
mass = new int*[count1];
for( int a = 0; a < count1; a++ )
{ mass[a] = new int [count2]; }
fseek( file, 0, SEEK_SET );
count1 = 0;
while( fgets( str, 511, file) )
{
count2 = 0;
pstr = strtok( str, " " );
do
{
mass[count1][count2] = atoi(pstr);
count2++;
pstr = strtok( NULL, " " );
}
while( pstr );
count1++;
memset( str, 0, 512 );
}

printMass(count1, count2, mass);

fclose( file );
return mass;
}


int main (void)
{
int **array;
int i,j;

printf("Load source file data: \n ");
array=getMassFromFile( "input.txt", i, j );

FILE *ofile = fopen ("mask.txt", "r");
int maskArray[N];

InpFile("mask.txt", maskArray);


int n,m,sum=0;
for(n=0;n<co1;n++)
{
printf("%d ",maskArray[n]);
}

n=0;

for(n=0;n<co1;n++)
{

if(maskArray[n]==array[0][n])
{
for (m=0; m<co2;m++)
sum+=array[m][n];

printf("Summa %d \n",sum);
}
}

FILE *wfile = fopen ("arrayOuput.txt", "w");
fprintf(wfile, "%d\n", sum );

fclose(wfile);


return 1;
}
это текст,все пашет,ток создать три текстовых файла.А я хочу вот что.У меня ограничение при проверке 5 и в двумерном и в одномерном(строки 114,121 и 126) я хочу чтобы если в массиве больше 5,тож считал,или хотяб предупереждал о том,что массив больше...воооть,помогиииите плиз!!!
или перепишите ее...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2008, 11:22     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива.
Посмотрите здесь:
Посчитать сумму каждого столбца массива C++
Определить сумму элементов каждого столбца левой половины и сумму элементов каждого четного столбца правой половины матрицы A C++
Найти номер строки и столбца с наибольшим элементом матрицы C++
Найдите скалярное произведение строки с наибольшим элементом матрицы и столбца с наименьшим элементом матрицы C++
C++ Найти сумму каждого столбца матрицы
Найти сумму каждого столбца заданной матрицы C++
Определить сумму элементов каждого столбца матрицы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
30.12.2008, 01:32     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #2
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
 
#include <stdio.h>
#include <stdlib.h>
 
#define asize(a)  (sizeof (a) / sizeof (a)[0])   /* считает длину массива */
 
#define M  3   /* количество строк    */
#define N  4   /* количество столбцов */
 
/* считает сумму каждого столбца матрицы, индекса которого нет в массиве */
main()
{
    int mtx[M][N] = {
        { 0, 1, 2, 3 },
        { 4, 5, 6, 7 },
        { 8, 9, 1, 1 }
    };
    int excl[] = { 3, 0 };   
    
    int nrows = M, ncells = N;
    int i, ilow, j, *sums, *ip, nsums;
    
    if ((sums = calloc(ncells-asize(excl), sizeof excl[0])) == NULL)
        return 1;
    for (i = nsums = 0, ip = sums; i < ncells; i++) {
        for (ilow = 0; ilow < asize(excl); ilow++)
            if (excl[ilow] == i) {
                ilow = -1;
                break;
            }    
        if (ilow < 0)
            continue;
        nsums++;
        for (j = 0, *ip = 0; j < nrows; j++)
            *ip += mtx[j][i];
        ip++;
    }
    for (i = 0; i < nsums; i++)
        printf(" %d", sums[i]);
    putchar('\n');
    free((void *) sums);
    return 0;
}
без заполнения матрицы и массива
Loose My Braines
0 / 0 / 0
Регистрация: 29.12.2008
Сообщений: 12
30.12.2008, 18:22  [ТС]     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #3
Хех,ввод и вывод опять из файлов....

Добавлено через 13 часов 9 минут 53 секунды
А можно переделать ее,чтобы ввод и вывод с файлов?????
И чтобы если введены в матрице символы воспринимал их как 0,и если размер матрицы в файле больше размера в программие,выдавал об этом сообщение или хоть как0то решалась эта проблема!!!!
очень-очень срочно!!!
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.12.2008, 01:39     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #4
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
 
#include <stdio.h>
#include <stdlib.h>
 
#define MAXLINE  1000   /* максимальная длина строки */
 
int **mtxcreat(int rows, int cells);
int **mtxfill(int **matrix, int rows, int cells, FILE *inputfile);
int **mtxprint(int **matrix, int rows, int cells, FILE *outputfile);
void mtxfree(int **matrix, int rows);
 
main()
{
    FILE *mfp;
    int **mtx;
    int res, n, tmp, nr, nc, prevnc;
    char line[MAXLINE], *p;
    const char *mfname = "matrix.txt";
    
    if ((mfp = fopen(mfname, "rb")) == NULL)
        return 1;
    for (n = 0; (res = fscanf(mfp, "%d", &tmp)) == 1; n++)
        ;
    if (res != EOF)
        return 2;
    rewind(mfp);        
    for (nr = 0; (p = fgets(line, MAXLINE, mfp)) != NULL; )
        if (sscanf(p, "%d", &tmp) == 1) {
            for (nc = 0; sscanf(p, "%d%n", &tmp, &n) == 1; nc++, p += n)
                ;
            if (nr == 0)    
                prevnc = nc;
            if (nc != prevnc)
                return 3;
            prevnc = nc;
            nr++;
        }    
    rewind(mfp);
    if (nr < 2 || nc < 2)
        return 4;
    if ((mtx = mtxcreat(nr, nc)) == NULL)
        return 5; 
    if (mtxfill(mtx, nr, nc, mfp) == NULL) {
        mtxfree(mtx, nr);
        return 6;
    }    
    if (mtxprint(mtx, nr, nc, stdout) == NULL)
        return 7;
    mtxfree(mtx, nr);
    fclose(mfp);
    return 0;
}
 
/* mtxcreat:  создаёт матрицу [ m x n ] */
int **mtxcreat(int m, int n)
{
    int **mtx, i;
    
    if ((mtx = calloc(m, sizeof(int *))) == NULL)
        return NULL;
    for (i = 0; i < m; i++)
        if ((mtx[i] = calloc(n, sizeof(int))) == NULL) {
            while (--i >= 0)
                free((void *) mtx[i]);
            free((void *) mtx);
            return NULL;
        }
    return mtx;    
}
 
/* mtxfill:  заполняет матрицу mtx [ m x n ] данными из файла ifp */
int **mtxfill(int **mtx, int m, int n, FILE *ifp)
{
    int i, j;
    
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++) {
            if (fscanf(ifp, "%d", &mtx[i][j]) != 1)
                return NULL;
        }
    return ferror(ifp) ? NULL : mtx;
}
 
/* mtxprint:  выводит матрицу mtx [ m x n ] в файл ofp */
int **mtxprint(int **mtx, int m, int n, FILE *ofp)
{
    int i, j;
    
    for (i = 0; i < m; i++)
        if (mtx[i] != NULL)
            for (j = 0; j < n; j++)
                fprintf(ofp, "%3d%s",
                    mtx[i][j], (j == n-1 ? "\n" : ""));
    return ferror(ofp) ? NULL : mtx;
}
 
/* mtxfree:  удаляет матрицу mtx на m строк из памяти */
void mtxfree(int **mtx, int m)
{
    int i;
    
    for (i = 0; i < m; i++)
        free((void *) mtx[i]);
    free((void *) mtx);
}
matrix.txt
Код
 
    0  1  2  3 
    4  5  6  7 
    8  9  1  1
вывод
Код
[guest@localhost tmp]$ ./matrix
  0  1  2  3
  4  5  6  7
  8  9  1  1
[guest@localhost tmp]$
если там символ или лишние цифры, прога выходит
это просто ввод матрицы из файла
Loose My Braines
0 / 0 / 0
Регистрация: 29.12.2008
Сообщений: 12
31.12.2008, 02:04  [ТС]     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #5
Я вас и вправду люблю!!!!вы гений!!!
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.12.2008, 06:30     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #6
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
 
#include <stdio.h>
#include <stdlib.h>
 
int *veccreat(int vlength);
int *vecfill(int *vector, int vlength, FILE *inputfile);
int *vecprint(int *vector, int vlength, FILE *outputfile);
void vecfree(int *vector);
 
int **mtxcreat(int rows, int cells);
int **mtxfill(int **matrix, int rows, int cells, FILE *inputfile);
int **mtxprint(int **matrix, int rows, int cells, FILE *outputfile);
void mtxfree(int **matrix, int rows);
 
#define MAXLINE  1000   /* максимальная длина строки */
 
/* считает сумму каждого столбца матрицы, индекса которого нет в массиве;
   матрица и вектор индексов из файлов, вектор сумм в файл */
main()
{
    FILE *mfp, *vfp, *ofp;          /* указатели на файлы матрицы, вектора, сумм */
    int **mtx, nrows, ncells;       /* матрица, количество строк, столбцов */
    int *excl, vlen;                /* вектор индексов исключения, длина */
    int *sums, *sumsp, nsums;       /* вектор сумм, указатель перехода, кол-во сумм */
    int mres, vres, nchar, tmp, prevncells; /* результаты проверок, подсчёт столбцов */
    int i, j, ilow;                 /* шаги для циклов */
    char line[MAXLINE], *p;         /* строка и указатель для построчного чтения */
    const char *mfname = "matrix.txt";
    const char *vfname = "vector.txt";
    const char *ofname = "cellsums.txt";
    
    /* открывает файлы матрицы, вектора индексов, вектора сумм */
    if ((mfp = fopen(mfname, "rb")) == NULL
     || (vfp = fopen(vfname, "rb")) == NULL
     || (ofp = fopen(ofname, "wb")) == NULL)
        exit(1);
    /* проверяет файлы матрицы и вектора индексов на числа */
    for (vlen = 0;
         (mres = fscanf(mfp, "%d", &tmp)) == 1
      && (vres = fscanf(vfp, "%d", &tmp)) == 1; vlen++)
        ;
    if (mres == 0 || vres == 0) /* если в файлах не числа, выйти */
        exit(2);
    rewind(mfp);
    /* расчитывает количество строк и столбцов матрицы */
    for (nrows = 0; (p = fgets(line, MAXLINE, mfp)) != NULL; )
        if (sscanf(p, "%d", &tmp) == 1) {
            for (ncells = 0; sscanf(p, "%d%n", &tmp, &nchar) == 1; ncells++)
                p += nchar;
            if (nrows == 0)   /* первая строка образец для следующих */ 
                prevncells = ncells;
            if (ncells != prevncells)   /* если это не матрица, выйти */
                exit(3);
            prevncells = ncells;
            nrows++;
        }    
    if (nrows < 2 || ncells < 2)   /* минимальная матрица 2 x 2 */
        exit(3);
    if ((mtx = mtxcreat(nrows, ncells)) == NULL)   /* выделяет память под матрицу */
        exit(4); 
    rewind(mfp);
    if (mtxfill(mtx, nrows, ncells, mfp) == NULL) { /* заполняет матрицу из файла */
        mtxfree(mtx, nrows);
        exit(4);
    }    
    fclose(mfp);
    //if (mtxprint(mtx, nrows, ncells, stdout) == NULL)  // покажет матрицу
      //  exit(4);
    if ((excl = veccreat(vlen)) == NULL) {   /* выделяет память под вектор индексов */
        mtxfree(mtx, nrows);   /* если ошибка, удаляет матрицу из памяти */
        exit(5);
    }    
    rewind(vfp);
    if (vecfill(excl, vlen, vfp) == NULL) { /* заполняет вектор индексов из файла */
        mtxfree(mtx, nrows);   /* если ошибка, удаляет матрицу из памяти */
        vecfree(excl);   /* удаляет вектор индексов из памяти */
        exit(5);
    }
    fclose(vfp);
    //if (vecprint(excl, vlen, stdout) == NULL)  // покажет вектор индексов
      //  exit(5);
    if ((sums = veccreat(ncells)) == NULL) {   /* выделяет память под вектор сумм */
        mtxfree(mtx, nrows);   /* если ошибка, удаляет матрицу из памяти */
        vecfree(excl);   /* удаляет вектор индексов из памяти */
        exit(6);
    }    
    for (i = nsums = 0, sumsp = sums; i < ncells; i++) { /* перебирает столбцы */
        for (ilow = 0; ilow < vlen; ilow++)
            if (excl[ilow] == i) {  /* индекс столбца матрицы в векторе */
                ilow = -1;
                break;
            }    
        if (ilow < 0)   /* если индекс есть в векторе перейти дальше */
            continue;
        nsums++;
        for (j = 0, *sumsp = 0; j < nrows; j++)
            *sumsp += mtx[j][i];   /* сохраняет сумму в вектор сумм */
        sumsp++;
    }
    //if (vecprint(sums, nsums, stdout) == NULL)  // покажет вектор сумм
      //  exit(6);
    if (vecprint(sums, nsums, ofp) == NULL) {  /* выводит вектор сумм в файл */
        mtxfree(mtx, nrows);   /* если ошибка удаляет из памяти матрицу и векторы */
        vecfree(excl);
        vecfree(sums);
        exit(6);
    }    
    fclose(ofp);
    mtxfree(mtx, nrows); /*  удаляет из памяти матрицу и векторы */
    vecfree(excl);
    vecfree(sums);
    return 0;
}
 
/* mtxcreat:  создаёт матрицу [ m x n ] */
int **mtxcreat(int m, int n)
{
    int **mtx, i;
    
    if ((mtx = (int **) calloc(m, sizeof(int *))) == NULL)
        return NULL;
    for (i = 0; i < m; i++)
        if ((mtx[i] = (int *) calloc(n, sizeof(int))) == NULL) {
            while (--i >= 0)
                free((void *) mtx[i]);
            free((void *) mtx);
            return NULL;
        }
    return mtx;    
}
 
/* mtxfill:  заполняет матрицу mtx [ m x n ] данными из файла ifp */
int **mtxfill(int **mtx, int m, int n, FILE *ifp)
{
    int i, j;
    
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++) {
            if (fscanf(ifp, "%d", &mtx[i][j]) != 1)
                return NULL;
        }
    return ferror(ifp) ? NULL : mtx;
}
 
/* mtxprint:  выводит матрицу mtx [ m x n ] в файл ofp */
int **mtxprint(int **mtx, int m, int n, FILE *ofp)
{
    int i, j;
    
    for (i = 0; i < m; i++)
        if (mtx[i] != NULL)
            for (j = 0; j < n; j++)
                fprintf(ofp, "%3d%s",
                    mtx[i][j], (j == n-1 ? "\n" : ""));
    return ferror(ofp) ? NULL : mtx;
}
 
/* mtxfree:  удаляет матрицу mtx на m строк из памяти */
void mtxfree(int **mtx, int m)
{
    int i;
    
    for (i = 0; mtx != NULL && i < m; i++)
        free((void *) mtx[i]);
    free((void **) mtx);
}
 
/* veccreat:  создаёт вектор длины n */ 
int *veccreat(int n)
{
    return (int *) calloc(n, sizeof(int));
}
 
/* vecfill:  заполняет вектор v длины n данными из файла ifp */ 
int *vecfill(int *v, int n, FILE *ifp)
{
    int *vp;
    
    for (vp = v; n > 0 && fscanf(ifp, "%d", vp++) == 1; n--)
        ;
    return ferror(ifp) ? NULL : v;    
}
 
/* vecprint: выводит вектор v длины n в файл ofp */ 
int *vecprint(int *v, int n, FILE *ofp)
{
    while (n--)
        fprintf(ofp, " %d%s",
            *v++, (n == 0 ? "\n" : ""));
    return ferror(ofp) ? NULL : v;
}
 
/* vecfree:  удаляет вектор v из памяти */ 
void vecfree(int *v)
{
    free((void *) v);
}
matrix.txt
Код
 
    0  1  2  3 
    4  5  6  7 
    8  9  1  1 
    4  5  7  8
vector.txt
Код
 
    12  3  0  10  11
cellsums.txt
Код
 20 16
полный вариант
Loose My Braines
0 / 0 / 0
Регистрация: 29.12.2008
Сообщений: 12
31.12.2008, 12:39  [ТС]     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #7
Оооой....у меня не пашит,пишет,что проблема с
Код
if ((mtx = calloc(m, sizeof(int *))) == NULL)  
        return NULL;  
    for (i = 0; i < m; i++)  
        if ((mtx[i] = calloc(n, sizeof(int))) == NULL) {
он по ходу int за переменную воспринимает.....там ничего не пропущенно???
error: invalid conversion from `void*' to `int*'
error: invalid conversion from `void*' to `int**'

Добавлено через 1 минуту 47 секунд
Из множества точек на плоскости сформировать множество точек , расстояние от которых до прямой меньше заданной величины
если не труднго,помогите и с этой,числа до 3-го....
Очень прошу...
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,868
Завершенные тесты: 1
31.12.2008, 12:45     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #8
вот так напиши:
if ((mtx = calloc(m, sizeof(int))) == NULL) - убери звездочку
Loose My Braines
0 / 0 / 0
Регистрация: 29.12.2008
Сообщений: 12
31.12.2008, 13:45  [ТС]     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #9
Спасибо
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.12.2008, 22:00     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #10
WooDooMan не пори, там матрица
я поправил
Loose My Braines
0 / 0 / 0
Регистрация: 29.12.2008
Сообщений: 12
04.01.2009, 16:44  [ТС]     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #11
accept,
Я ЛЮБЛЮ ВАС!!!
ВСЕ РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!!!!
ВЫ ГЕНИЙ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Добавлено через 3 минуты 7 секунд
Спасибо Вам огромное!
Вы гений!
Все работает идеально!!!!))))))))))
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,868
Завершенные тесты: 1
04.01.2009, 16:59     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #12
accept, я, конечно, в ваш код несильно углублялся. но найди мне 10 отличий в таком коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <alloc.h>
using namespace std;
int main()
{
 int** m = (int**) calloc(5, sizeof(int));
 int** n = (int**) calloc(5, sizeof(int*));
 for(int i = 0; i < 5; i++){
   m[i] = (int*) calloc (5, sizeof(int));
   n[i] = (int*) calloc (5, sizeof(int));
   for(int j = 0; j < 5; j++){
     m[i][j] = j;
     n[i][j] = j;
      }
    }
 for(int i = 0; i < 5; i++){
     cout<< m[i][0] << endl;
     cout<< n[i][1] << endl;
 }
 return 0;
}
а еще неплохо в работе отличия найти? а то я как-то их не нашел...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2009, 00:31     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #13
WooDooMan, короче по стандарту операция присваивания производит преобразование типа правого операнда к типу левого. Имплицитное преобразование типов.
Так же по стандарту указатель на void можно присваивать указателю на любой другой тип без явного приведения, потому что стандарт гарантирует правильное сохранение значения указателя и указателю на void можно присваивать указатель любого типа без явного приведения потому что тоже всё сохраняется в правильном виде на любой системе.
Её компилятор не знает этой особенности и потребовал явного приведения, я его вставил.

твой код
Код
int** m = (int**) calloc(5, sizeof(int));
ты выделяешь 5 элементов размера int, а приводишь указатель на первый из них (указатель на число) к типу указателя на указатель на int
в принципе если ты запишешь правильный адрес в такое число, оно будет приведено к типу указателя и ты можешь даже его разыменовать и получить правильное значение, хранящеется по тому адресу

следующий твой код
Код
int** n = (int**) calloc(5, sizeof(int*));
здесь ты выделяешь 5 элементов размера указателя на int и приводишь указатель на первый из них к типу указателя на указатель на int, в результате получается, что если код попадёт на систему где другие адресы, например при расширении адресов в количестве, размер указателей увеличится (раньше их размеры были 2х байтными а не 4х байтными), выделится правильное количество памяти под них, а при твоём предыдущем выделении sizeof(int) неправильное, потому что, то что sizeof(int) == sizeof(int *) - это просто совпадение на сегодняшний день
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,868
Завершенные тесты: 1
05.01.2009, 01:05     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #14
accept, ну вот объяснил ламеру без крика и пыли, буду знать, потому что я всегда для двумеров выделял 4 байта, как приводил в пример, работало ну и славно... теперь буду знать...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2009, 03:33     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива.
Еще ссылки по теме:
Вычислить сумму элементов каждого столбца матрицы C++
Для каждого массива определить номер столбца с наибольшим количеством положительных элементов. C++
Вычислить сумму положительных элементов каждого столбца матрицы. C++
C++ Вычислить номер минимального элемента матрицы, а также сумму между первым и вторым отрицательным элементом
C++ Найти сумму и число положительных элементов каждого столбца матрицы

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

Или воспользуйтесь поиском по форуму:
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2009, 03:33     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. #15
не просто не разобравшись стал код менять, одно дело ошибиться другое профанация (когда портят из-за незнания)
Yandex
Объявления
05.01.2009, 03:33     Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива.
Закрытая тема Создать тему
Опции темы

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