void PopulateLoadingArray(double **Loading,
size_t MaxAge,
size_t NumGenders)
{
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++)
{
for(Gender = 0; Gender < NumGenders; Gender++)
**(Loading + Age * MaxAge + Gender) =
CalcLoading(Age, Gender);
}
}
}
Передача двумерного массива в функцию
Код:
Первое что меня смущает это строка вычисления адреса элементов массива
**(Loading + Age * MaxAge + Gender)
мне кажется что строка должна быть
**(Loading + Age * NumGenders + Gender)
Если я не прав объясните пож. почему это должно работать
Второе мне не удалось программу заставить работать
полный код
Код:
#include <sys/types.h>
#include <stdio.h>
#define MAX_AGE 130
#define NUM_GENDERS 2
void PopulateLoadingArrayP(double **Loading, size_t MaxAge, size_t NumGenders)
{
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++)
{
for(Gender = 0; Gender < NumGenders; Gender++)
**(Loading + Age * MaxAge + Gender) = Age + Gender;
}
}
int main()
{
double Loading[MAX_AGE][NUM_GENDERS] = {0};
PopulateLoadingArrayP(Loading, 130, 2);
return 0;
}
#include <stdio.h>
#define MAX_AGE 130
#define NUM_GENDERS 2
void PopulateLoadingArrayP(double **Loading, size_t MaxAge, size_t NumGenders)
{
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++)
{
for(Gender = 0; Gender < NumGenders; Gender++)
**(Loading + Age * MaxAge + Gender) = Age + Gender;
}
}
int main()
{
double Loading[MAX_AGE][NUM_GENDERS] = {0};
PopulateLoadingArrayP(Loading, 130, 2);
return 0;
}
При компиляции получаю
passing argument 1 of ‘PopulateLoadingArrayP’ from incompatible pointer type
А при запуске
Segmentation fault (core dumped)
ОС Linux
Компилятор gcc
**(Loading + Age * MaxAge + Gender) = Age + Gender;
Код:
void PopulateLoadingArrayP(double **Loading, size_t MaxAge, size_t NumGenders) {
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++) {
for(Gender = 0; Gender < NumGenders; Gender++)
Loading [Age][Gender] = Age + Gender;
}
}
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++) {
for(Gender = 0; Gender < NumGenders; Gender++)
Loading [Age][Gender] = Age + Gender;
}
}
Проблема, как я понял, в том что double** это указатель на массив указателей, которые в свою очередь указывают на совершенно разные области памяти, в то время как
double Loading[MAX_AGE][NUM_GENDERS] представляет собой сплошную область
Цитата: max_dark
Во первых, функцию можно переписать так
Да это я знаю это в книжке дальше по тексту было))
В отладчике gdb я посмотрел на что **Loading указывает на не выделенную память
А выделенная память лежит по *Loading
И переписал функцию примерно так
Код:
#include <sys/types.h>
#include <stdio.h>
#define MAX_AGE 130
#define NUM_GENDERS 2
void PopulateLoadingArrayP(int **Loading, size_t MaxAge, size_t NumGenders)
{
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++)
{
for(Gender = 0; Gender < NumGenders; Gender++)
*(Loading + Age * NumGenders + Gender) = 5;
}
}
int main()
{
int Loading[MAX_AGE][NUM_GENDERS] = {0};
PopulateLoadingArrayP(Loading, 130, 2);
return 0;
}
#include <stdio.h>
#define MAX_AGE 130
#define NUM_GENDERS 2
void PopulateLoadingArrayP(int **Loading, size_t MaxAge, size_t NumGenders)
{
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++)
{
for(Gender = 0; Gender < NumGenders; Gender++)
*(Loading + Age * NumGenders + Gender) = 5;
}
}
int main()
{
int Loading[MAX_AGE][NUM_GENDERS] = {0};
PopulateLoadingArrayP(Loading, 130, 2);
return 0;
}
Так работает но компилится с предупреждением
warning: passing argument 1 of ‘PopulateLoadingArrayP’ from incompatible pointer type
на строке PopulateLoadingArrayP(Loading, 130, 2);
Код:
void PopulateLoadingArray(double Loading[][NUM_GENDERS],
int MaxAge,
int NumGenders)
{
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++)
{
for(Gender = 0; Gender < NumGenders; Gender++){
Loading[Age][Gender] = Age + Gender;
}
}
}
int MaxAge,
int NumGenders)
{
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++)
{
for(Gender = 0; Gender < NumGenders; Gender++){
Loading[Age][Gender] = Age + Gender;
}
}
}
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TYPE int
#define MAX_AGE 130
#define NUM_GENDERS 2
TYPE* new_array(size_t N) {
return (TYPE*)calloc(N,sizeof(TYPE));
}
TYPE** new_array2d(size_t N,size_t M) {
TYPE** tmp=NULL;
int i;
tmp=(TYPE**)calloc(N,sizeof(TYPE*));
if (tmp == NULL)
return NULL;
for(i=0; i<N; i++) {
tmp = new_array(M);
}
return tmp;
}
void free_array2d(TYPE** m, size_t N) {
int i;
for (i=0; i<N; i++) {
free(m);
}
free(m);
}
void PopulateLoadingArrayP(TYPE **Loading, size_t MaxAge, size_t NumGenders) {
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++) {
for(Gender = 0; Gender < NumGenders; Gender++)
Loading [Age][Gender] = Age + Gender;
}
}
int main()
{
TYPE **Loading;
Loading = new_array2d(MAX_AGE, NUM_GENDERS);
if (Loading) {
PopulateLoadingArrayP(Loading, MAX_AGE, NUM_GENDERS);
free_array2d(Loading, MAX_AGE);
}
return 0;
}
#include <stdlib.h>
#include <string.h>
#define TYPE int
#define MAX_AGE 130
#define NUM_GENDERS 2
TYPE* new_array(size_t N) {
return (TYPE*)calloc(N,sizeof(TYPE));
}
TYPE** new_array2d(size_t N,size_t M) {
TYPE** tmp=NULL;
int i;
tmp=(TYPE**)calloc(N,sizeof(TYPE*));
if (tmp == NULL)
return NULL;
for(i=0; i<N; i++) {
tmp = new_array(M);
}
return tmp;
}
void free_array2d(TYPE** m, size_t N) {
int i;
for (i=0; i<N; i++) {
free(m);
}
free(m);
}
void PopulateLoadingArrayP(TYPE **Loading, size_t MaxAge, size_t NumGenders) {
size_t Age, Gender;
for(Age = 0; Age < MaxAge; Age++) {
for(Gender = 0; Gender < NumGenders; Gender++)
Loading [Age][Gender] = Age + Gender;
}
}
int main()
{
TYPE **Loading;
Loading = new_array2d(MAX_AGE, NUM_GENDERS);
if (Loading) {
PopulateLoadingArrayP(Loading, MAX_AGE, NUM_GENDERS);
free_array2d(Loading, MAX_AGE);
}
return 0;
}
Код:
#include <iostream>
using namespace std;
void randmass(int ** mass, int rows, int cols)
{
for (int i=0; i<rows; i++){
for (int j=0; j<cols; j++){
mass[j]=rand()%100;
cout << mass[j] << " ";
}
cout << endl;
}
}
int main() {
int n=5;
int **matrix=new int*[n];
for (int i=0;i<n;i++) matrix=new int[n];
randmass(matrix, n, n); //вот здесь передается указатель на указатели
for(int i=0; i<n; i++) delete matrix;
delete matrix;
cin.get();
return 0;
}
using namespace std;
void randmass(int ** mass, int rows, int cols)
{
for (int i=0; i<rows; i++){
for (int j=0; j<cols; j++){
mass[j]=rand()%100;
cout << mass[j] << " ";
}
cout << endl;
}
}
int main() {
int n=5;
int **matrix=new int*[n];
for (int i=0;i<n;i++) matrix=new int[n];
randmass(matrix, n, n); //вот здесь передается указатель на указатели
for(int i=0; i<n; i++) delete matrix;
delete matrix;
cin.get();
return 0;
}
через три года награда нашла героя. loooooooool.