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

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

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

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

29.12.2008, 11:22. Просмотров 2310. Ответов 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,тож считал,или хотяб предупереждал о том,что массив больше...воооть,помогиииите плиз!!!
или перепишите ее...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2008, 11:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Посчитать сумму каждого столбца матрицы,номер которого не является элементом одномерного массива. (C++):

Посчитать сумму каждого столбца массива - C++
#include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;time.h&gt; using namespace std; int main () { int n = 50, m...

Определить сумму элементов каждого столбца левой половины и сумму элементов каждого четного столбца правой половины матрицы A - C++
Матрица A (M кратно 4) разделена по вертикали на две половины. Определить сумму элементов каждого столбца левой половины и сумму элементов...

Найти номер строки и столбца с наибольшим элементом матрицы - C++
Доброго времени суток,прошу помочь в решении данной задачи(желательно отправить код). Найти наибольший элемент матрицы А(5х3) и номер...

Найдите скалярное произведение строки с наибольшим элементом матрицы и столбца с наименьшим элементом матрицы - C++
Пусть дана истинная матрица размером N × N, все элементы которой различны. Найдите скалярное произведение строки с наибольшим элементом...

Найти сумму каждого столбца матрицы - C++
Дана целочисленная матрица 4х6. Найти сумму каждого столбца матрицы.

Определить сумму элементов каждого столбца матрицы - C++
Данная матрица целых чисел размером 3x4. Определите сумму каждого столбца этой матрицы. Результат вывести на экран монитора.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4822 / 3243 / 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;
}
без заполнения матрицы и массива
0
Loose My Braines
0 / 0 / 0
Регистрация: 29.12.2008
Сообщений: 12
30.12.2008, 18:22  [ТС] #3
Хех,ввод и вывод опять из файлов....

Добавлено через 13 часов 9 минут 53 секунды
А можно переделать ее,чтобы ввод и вывод с файлов?????
И чтобы если введены в матрице символы воспринимал их как 0,и если размер матрицы в файле больше размера в программие,выдавал об этом сообщение или хоть как0то решалась эта проблема!!!!
очень-очень срочно!!!
0
accept
4822 / 3243 / 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]$
если там символ или лишние цифры, прога выходит
это просто ввод матрицы из файла
0
Loose My Braines
0 / 0 / 0
Регистрация: 29.12.2008
Сообщений: 12
31.12.2008, 02:04  [ТС] #5
Я вас и вправду люблю!!!!вы гений!!!
0
accept
4822 / 3243 / 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
полный вариант
0
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-го....
Очень прошу...
0
Lord_Voodoo
Супер-модератор
8589 / 2189 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 1
31.12.2008, 12:45 #8
вот так напиши:
if ((mtx = calloc(m, sizeof(int))) == NULL) - убери звездочку
0
Loose My Braines
0 / 0 / 0
Регистрация: 29.12.2008
Сообщений: 12
31.12.2008, 13:45  [ТС] #9
Спасибо
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.12.2008, 22:00 #10
WooDooMan не пори, там матрица
я поправил
0
Loose My Braines
0 / 0 / 0
Регистрация: 29.12.2008
Сообщений: 12
04.01.2009, 16:44  [ТС] #11
accept,
Я ЛЮБЛЮ ВАС!!!
ВСЕ РАБОТАЕТ!!!!!!!!!!!!!!!!!!!!!!!
ВЫ ГЕНИЙ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Добавлено через 3 минуты 7 секунд
Спасибо Вам огромное!
Вы гений!
Все работает идеально!!!!))))))))))
0
Lord_Voodoo
Супер-модератор
8589 / 2189 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 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;
}
а еще неплохо в работе отличия найти? а то я как-то их не нашел...
0
accept
4822 / 3243 / 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 *) - это просто совпадение на сегодняшний день
0
Lord_Voodoo
Супер-модератор
8589 / 2189 / 61
Регистрация: 07.03.2007
Сообщений: 10,890
Завершенные тесты: 1
05.01.2009, 01:05 #14
accept, ну вот объяснил ламеру без крика и пыли, буду знать, потому что я всегда для двумеров выделял 4 байта, как приводил в пример, работало ну и славно... теперь буду знать...
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.01.2009, 03:33 #15
не просто не разобравшись стал код менять, одно дело ошибиться другое профанация (когда портят из-за незнания)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2009, 03:33
Привет! Вот еще темы с ответами:

Найти сумму каждого столбца заданной матрицы - C++
Помогите решить такую задачу. Дан двумерный массив 3х3(нужно заполнять вручную), найти сумму каждого его столбца. Зараннее большое спасибо

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

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

Для каждого массива определить номер столбца с наибольшим количеством положительных элементов. - C++
Использование функций, возвращающих одно значение. Даны целочисленные массивы A, B. Для каждого массива определить номер столбца с...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.01.2009, 03:33
Закрытая тема Создать тему
Опции темы

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