Ir ao conteúdo
  • Cadastre-se
Murilo Marchiori

Passagem de matriz dinamica - c++

Posts recomendados

Ola, boa tarde.

Alguem sabe como passar uma matriz dinamica por referencia? Vou explicar melhor: considerem o seguinte codigo:

#include <iostream>using namespace std;
int main() {    int **matriz, i, m, n;    cout<<"Informe quantas linhas terá a matriz: ";    cin>>m;    cout<<"Colunas: ";    cin>>n;
    matriz = new int*[10];    for ( i = 0; i < m; i++)	  matriz[i] = new int[n];
    for ( i = 0; i < m; i++)    {	  for ( int j= 0; j < n; j++)	  {		matriz[i][j] = i * j;	  }    }    for ( i = 0; i < m; i++)    {	  cout<<endl<<"Linha "<<i+1<<endl;	  for ( int j= 0; j < n; j++)	  {		cout<<matriz[i][j]<<" ";	  }    }
}

Como podem perceber, nesse caso eu crio uma matriz dinamica. Mas eu fiz na main. Gostaria de criar uma função só para isso. Mas não sei como ficaria o protótipo dessa função; pelo que eu sei, um protótipo de uma função com uma matriz ficaria assim:

int calculaMatriz(int matriz[3][4])

Mas e se eu não souber os valores? Tem como?

Compartilhar este post


Link para o post
Compartilhar em outros sites



int **matriz, i, m, n;

Não deveria ser apenas declarado um ponteiro para matriz ao invés de ponteiro para ponteiro? Ai em seguida passava como parametro o endereço dos ponteiros da matriz, conforme o Panic postou acima?

Compartilhar este post


Link para o post
Compartilhar em outros sites


int **matriz, i, m, n;

Não deveria ser apenas declarado um ponteiro para matriz ao invés de ponteiro para ponteiro? Ai em seguida passava como parametro o endereço dos ponteiros da matriz, conforme o Panic postou acima?

Não necessariamente. Depende do que você quer fazer. Se as duas dimensões da array tiverem tamanho desconhecido, você usa **, mas se forem n(conhecido) matrizes de x(desconhecido) elementos, aí você usa *[].

Nesse caso específico é apenas um exercício, pois o cara já conhece os dois tamanhos, então usar dinâmica é inútil (até porque tem processamento mais lento e ocupa mais memória.), então não está "errado" usar **.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salve, galera, olha ai a implementação que eu to tentando fazer. Na primeira função, eu preencho a matriz, e na segunda eu a exibo, ou seja, eu passo (ou tento passar hehe) a matriz da primeira para a segunda função, e então exibo essa matriz. Mas a passagem nao ta dando certo nao, tá dando "Segmentation Fault"... alguem sabe como consertar?

*OBS: Não se preocupem muito com o código de preenchimento da matriz, tá todo bagunçado, talvez vocês nao entendam, depois eu vou organizar direitinho... mas essa parte eu sei q ta funcionando, aquele

cout << matriz[2][2];

no fim da primeira função ta funcionando de boa, sinal que a matriz foi preenchida... o problema tá na passagem, na chamada da função, sei lá... e o lin e o col estão passando certinho tb, o problema tá na passagem da matriz.

#include <iostream>#include <fstream>#include <string.h>#include <stdio.h>
using namespace std;
void calculaMatriz(string **matriz, int &lin, int &col);void mostraMatriz(string **matriz, int lin, int col);
int main(){	string **matriz;	int num1, num2;
	calculaMatriz(matriz,num1,num2);	mostraMatriz(matriz,num1,num2);}
void calculaMatriz(string **matriz, int &lin, int &col){	string line[1000], str = "", str_aux="";	int i=0, j=0, x=0;	lin=0, col=0;
	ifstream entrada;	entrada.open("matriz.txt"); 
	if(entrada.is_open()) 	{		getline(entrada,line[i]); 
		while (x < line[i].size()) 		{			if(line[i].at(x) != '-' && (line[i].at(x) == '1' || line[i].at(x) == '0'))			{				col++;				x++;			}			else				if(line[i].at(x) == '-')				{					col++;					x=x+2;				}				else					if(line[i].at(x) == ' ')					x=x+1;		}	}
	entrada.close(); 
	matriz = new string*[10];	i=0;
	entrada.open("matriz.txt"); 
	if(entrada.is_open())	{				while(!entrada.eof()) 		{			matriz[i] = new string[col];			str_aux = "";			str = "";			getline(entrada,line[i]); 
			x = 0;
			while (x < line[i].size())			{				if(line[i].at(x) != '-' && (line[i].at(x) == '1' || line[i].at(x) == '0'))				{					str= "";					str_aux = "";					str_aux = line[i].at(x); 					str += str_aux; 
					matriz[i][j] = str; 					x++;					if(j<col)						j++;				}				else					if(line[i].at(x) == '-')					{						str = line[i].at(x);						str_aux = line[i].at(x+1); 						str += str_aux; 						matriz[i][j] = str; 						x=x+2;
						if(j<col)							j++;					}					else						x++;			}			i++;			j=0;					}		entrada.close(); 	}	lin = i-1;	cout << matriz[2][2];}
void mostraMatriz(string **matriz, int lin, int col){	int i=0, j=0;
	cout << "\nlin = " << lin;	cout << "\ncol = " << col;	cout << "\n\n";
	for(i=0; i<lin; i++)		for(j=0; j<col;j++)			cout << "\n" << matriz[i][j];
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segmentation fault significa que em algum lugar do programa você está acessando uma região da memória que não devia. Ou excedeu o limite de alguma matriz, ou acessou uma matriz dinâmica antes de alocar, ou simplesmente levou um ponteiro para um lugar qualquer que não devia. Não verifiquei o código inteiro para saber onde estaria, mas se você rodar em modo debug vai saber onde exatamente está o acesso indevido.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Segmentation fault significa que em algum lugar do programa você está acessando uma região da memória que não devia. Ou excedeu o limite de alguma matriz, ou acessou uma matriz dinâmica antes de alocar, ou simplesmente levou um ponteiro para um lugar qualquer que não devia. Não verifiquei o código inteiro para saber onde estaria, mas se você rodar em modo debug vai saber onde exatamente está o acesso indevido.

Ah, beleza, entendi... o phoda é q eu nao tenho debug aqui, mas de boa, nem to achando o erro, vou fazer tudo na mesma função... valeu

De qqer forma, deve ser algum problema na chamada da função mesmo; eu acho q passando desse jeito q eu to tentando, o programa passa só o endereço da memória, e essa matriz deve se perder na passagem... sei la, deve ser alguma coisa por ai...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, observcando melhor seu código achei o erro. Não está na passagem para a função, mas sim na criação da array.

matriz = new string*[10];

Desse jeito você criou uma matriz de ponteiros que apontam para o vácuo, e quando tenta acessar o vácuo dá erro.

depois dessa linha precisa acrescentar um laço e alocar a memória inteira:


matriz = new string*[10];
for(int i=0; i<#tamanhomatriz#; i++)
matriz[i]= new string[#tamanho#];

Pronto, agora está apontando para uma área válida. Altera e testa aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Ok, observcando melhor seu código achei o erro. Não está na passagem para a função, mas sim na criação da array.

matriz = new string*[10];

Desse jeito você criou uma matriz de ponteiros que apontam para o vácuo, e quando tenta acessar o vácuo dá erro.

depois dessa linha precisa acrescentar um laço e alocar a memória inteira:


matriz = new string*[10];
for(int i=0; i<#tamanhomatriz#; i++)
matriz[i]= new string[#tamanho#];

Pronto, agora está apontando para uma área válida. Altera e testa aí.

Nao, continua dando segmentation fault... mas deixa eu te perguntar uma coisa: onde você fala que eu apontei para o vacuo, eu na verdade tentei arrumar isso... depois do segundo "while(!entrada.eof())", da uma olhada ai... só que a diferença é q ao invés de alocar tudo de uma vez, eu aloco uma linha por vez... pelo menos é isso q eu to tentando hehehe.

é porque na verdade eu leio o arquivo duas vezes, uma só pra contar as linhas, e outra pra jogar seu conteudo na matriz... na segunda vez q eu abro, dá uma olhada ai, eu tento fazer o que você falou. é isso mesmo, velho? e valeu pela força ai ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!