Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2010, 21:32   #1
Megapixar
Пользователь
 
Регистрация: 06.01.2009
Сообщений: 13
По умолчанию Передача двумерного массива в функцию

Решил вот я написать программу которая составляет магические квадраты. Там две Функции первая составляет квадрат, вторая проверяет на равенство сумм, вот только не получаеться передать значение из первой функции во вторую...
Код:
#include "stdafx.h"
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <malloc.h>
void generkv();
void proverka(int **,int);
int _tmain(int argc, _TCHAR* argv[])//10
{ 
	
	generkv();
	

		return 0;
}
void generkv()
{const int n1=4;
	int **kv=NULL;
	int *p2,i,j,h,n2,k=0,ind,*mas,kvadrat[n1][n1];
	n2=n1*n1;
	mas=(int*)malloc(n2*sizeof(int));                
		 if(!mas)
			 {printf("error");
			  exit(1);
			 }
		// kvadrat=(int*)malloc(n2*sizeof(int));               
		// if(!kvadrat)
			// {printf("error");
			//  exit(1);
			// }
for(i=0;i<n2;i++)
{mas[i]=i+1;
printf(" %d ",mas[i]);
}
srand(time(NULL));

						for(i=0;i<n1;i++)
							{ for(j=0;j<n1;j++)
								{	
									ind=rand()%(n2-k);
									k++;
									kvadrat[i][j]=mas[ind];
										for(h=ind+1;h<n2;h++)
											mas[h-1]=mas[h];
									
									p2=(int*)realloc(mas,(n2-1)*sizeof(int));
										if(p2)
											mas=p2;
										else 
											return;
									
								}
						    }
						
						proverka(kvadrat,n1); // вот здесь пишет ошибку  не возможно перевести из int[][] в int**
}
void proverka(int **kvadrat,int n1)
{ int i,j;
  double Sum,s1,s2,s3,s4;
	Sum=n1*(n1*n1+1)/2;
	s1=Sum;
	s2=Sum;
	s3=Sum;
	s4=Sum;
	printf("Sum=%f",Sum);
	for(i=0;i<n1;i++)
	{	if(s1!=Sum || s2!=Sum)
			generkv();
		else
		{s1=0;
		s2=0;}
		for(j=0;j<n1;j++)
			{	s1=s1+*(*(kvadrat+i)+j);
				s2=s2+*(*(kvadrat+j)+i);
			}

	}
				for(i=0;i<n1;i++)
					{	if (s3!=Sum || s4!=Sum)
								generkv();
							else
								{s3=0;
								s4=0;}
								for(j=0;j<n1;j++)
								{if(i==j)
									s3=s3+*(*(kvadrat+i)+j);
								else if ((i+j)==(n1+1))
									s4=s4+*(*(kvadrat+i)+j);
								}
					}	
				for(i=0;i<n1;i++)
							{ printf("\n");
								for(j=0;j<n1;j++)
							 printf(" %d ",kvadrat[i][j]);
							}
}

Последний раз редактировалось Stilet; 01.04.2010 в 10:47.
Megapixar вне форума Ответить с цитированием
Старый 31.03.2010, 23:33   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
proverka(kvadrat,n1); // вот здесь пишет ошибку не возможно перевести из int[][] в int**
ну правильно
квадрат объявлен как массив, а параметр функции описал как двойной указатель

посмотри, мож поможет

Код:
	int **pmat; // объявление указателей на массивы
	int R; // размерность матрицы
	pmat = new int *[R];  // создаём массив указателей
	for (int i = 0; i < R; i++)
	{
		*(pmat + i) = new int[R]; //создаём матрицу указателей
	}
	randomize();
	for (int i = 0; i < R; i++)  // цикл по строкам
	{
		for (int j = 0; j < R; j++) //цикл по столбцам
		{
			*(*(pmat + i) + j) = random(9); //заполняем случайными числами 0..9
		}
           }
вместо *(*(pmat + i) + j) можно писать p[i][j]
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]

Последний раз редактировалось Stilet; 01.04.2010 в 10:48.
RUSt88 вне форума Ответить с цитированием
Старый 01.04.2010, 00:56   #3
Megapixar
Пользователь
 
Регистрация: 06.01.2009
Сообщений: 13
По умолчанию

Вроде понял, спасибо
Megapixar вне форума Ответить с цитированием
Старый 01.04.2010, 10:01   #4
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

Можно было просто написать так:
Код:
proverka((int **)kvadrat,n1); // вот здесь пишет ошибку не возможно перевести из int[][] в int**
Т.е. сделать приведение типов.
Либо описать kvadrat как
Код:
int **kvadrat = (int **)new int[n1*n1];
Либо еще как-нибудь... есть много способов
evgn вне форума Ответить с цитированием
Старый 01.04.2010, 14:14   #5
Megapixar
Пользователь
 
Регистрация: 06.01.2009
Сообщений: 13
По умолчанию

Ребята новая проблема.....по ходу, при генерации квадрата он все время генерирует один и тот же.
Код:
// Генерация магических квадратов.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <malloc.h>
void generkv();
void proverka(int *kvadrat,int);

int _tmain(int argc, _TCHAR* argv[])
{ 
	
	generkv();
	

		return 0;
}
void generkv()
{const int n1=3;
	int *p2,i,j,h,n2,k=0,ind,*mas,kvadrat[n1][n1];
	n2=n1*n1;
	mas=(int*)malloc(n2*sizeof(int));                
		 
	if(!mas)
			 {printf("error");
			  exit(1);
			 }
		
for(i=0;i<n2;i++)
	mas[i]=i+1;

	
			for(i=0;i<n1;i++)
					{ for(j=0;j<n1;j++)
						{	srand(time(NULL));
							ind=rand()%(n2-k);
							k++;
							kvadrat[i][j]=mas[ind];
								for(h=(ind+1);h<n2;h++)
										mas[h-1]=mas[h];
									
							p2=(int*)realloc(mas,(n2-1)*sizeof(int));
									if(p2)
											mas=p2;
										else 
											return;
									
						}
				    }
				//free(mas);
//free(p2);
proverka(*kvadrat,n1);
}


void proverka(int *kvadrat,int n1)
{ int i,j;
  double Sum,s1,s2,s3=0,s4=0;
	Sum=n1*(n1*n1+1)/2;
	
	for(i=0;i<n1;i++)	
		{	s1=0;
	
				for(j=0;j<n1;j++)
					s1=s1+ *(kvadrat + i*n1 + j);
						
			if(s1!=Sum)
			generkv();// здесь если ставить printf("%f", s1); то все печатает, а если вызывать функцию то не работает.....
	// printf("%f", s1);
		}


	for(i=0;i<n1;i++)	
	{
		s2=0;
				for(j=0;j<n1;j++)
					s2=s2+ *(kvadrat + j*n1 + i);
		
			
		if(s2!=Sum) 
		generkv();// здесь если ставить printf("%f", s2); то все печатает, а если вызывать функцию то не работает.....
//printf("%f", s2);
	}
	
		
			for(i=0;i<n1;i++)
					{	
							for(j=0;j<n1;j++)
									{if(i==j)
									s3=s3+ *(kvadrat + i*n1 + j);}
					}
if (s3!=Sum)
generkv();// здесь если ставить printf("%f", s3); то все печатает, а если вызывать функцию то не работает.....
//printf("%f", s3);				
			for(i=0;i<n1;i++)
					{
								for(j=0;j<n1;j++)
									{if((i+j)==(n1-1))
									s4=s4+ *(kvadrat + i*n1 + j);}
					}
		
if (s4!=Sum)
generkv();// здесь если ставить printf("%f", s4); то все печатает, а если вызывать функцию то не работает.....
//printf("%f", s4);
							
							if(s1==Sum && s2==Sum && s3==Sum && s4==Sum)				
				{for(i=0;i<n1;i++)
									{ printf("\n");
										for(j=0;j<n1;j++)
									 printf(" %d ",*(kvadrat + i*n1 + j));
									}

				}
				else 
		
printf("  f%ff    %f    %f   %f    %f",Sum,s1,s2,s3,s4);
}

Последний раз редактировалось Stilet; 01.04.2010 в 14:54.
Megapixar вне форума Ответить с цитированием
Старый 01.04.2010, 14:43   #6
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

Код:
srand(time(NULL));
перемести в начало _tmain().
srand вообще обычно один раз вызывается.
evgn вне форума Ответить с цитированием
Старый 01.04.2010, 14:46   #7
Megapixar
Пользователь
 
Регистрация: 06.01.2009
Сообщений: 13
По умолчанию

а вот в этом кусочке что за проблема??
if(s1!=Sum)
generkv();// здесь если ставить printf("%f", s1); то все печатает, а если вызывать функцию то не работает.....
// printf("%f", s1);
Megapixar вне форума Ответить с цитированием
Старый 01.04.2010, 15:00   #8
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

А как оно не работает?
Скорее всего у тебя просто происходит переполнение стека, т.к. функция generkv вызывается рекурсивно неизвестно сколько раз.
evgn вне форума Ответить с цитированием
Старый 01.04.2010, 15:06   #9
Megapixar
Пользователь
 
Регистрация: 06.01.2009
Сообщений: 13
По умолчанию

Ну да, она вызываеться до тех пор пока не сгенерится квадрат, у которого суммы элементов по строкам, столбцам и диагоналям будут равны. Так что это нереально осуществить?
Megapixar вне форума Ответить с цитированием
Старый 01.04.2010, 15:08   #10
evgn
Разрабатываюсь....
Пользователь
 
Регистрация: 16.11.2008
Сообщений: 68
По умолчанию

Почему не реально? Реально. Но надо подумать над алгоритмом. Избежать такой дикой рекурсии. И память у тебя выделяется, но нигде не освобождается.
evgn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача двумерного динамического массива в метод Дырдин Общие вопросы C/C++ 1 19.03.2010 09:45
Си++. Передача массива в функцию. Diamond2107 Помощь студентам 7 03.12.2009 20:15
Передача массива в функцию D[I]K Общие вопросы C/C++ 4 13.09.2009 21:31
передача массива в функцию JOFRIF Общие вопросы C/C++ 8 02.08.2009 12:46
Передача двумерного массива аля матрицы из функции bondik Общие вопросы C/C++ 1 20.05.2009 15:46