Ir ao conteúdo
  • Cadastre-se

Passagem de matriz dinamica - c++


Murilo Marchiori

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?

Link para o comentário
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 **.

Link para o comentário
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];
}
Link para o comentário
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.

Link para o comentário
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...

Link para o comentário
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í.

Link para o comentário
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 ^^

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!