Ir ao conteúdo
  • Cadastre-se

C++ Quando vou chamar a função diz que ela não foi declarada


Polaris

Posts recomendados

A partir de uma matriz 4x7 de números aleatórios, programei pra achar o menor elemento da matriz e, depois de encontrá-lo, achar o maior valor daquela linha. O programa dá todo certo se em um arquivo só, porém, se passo a função pra um .h, quando vou chamar a função, diz que ela não foi declarada. O que estou fazendo de errado?

Programa principal:

#include <iostream> /* manipulacao de fluxo de dados padrão do sistema */
#include <cstring>  /* manipulacao de cadeia de caracteres       */
#include <ctime>    /* manipulacao de tempo                      */
#include <cmath>    /* manipulacao de funcoes matematicas        */
#include <cstdlib>  /* blibliotecas para utilizacao do c         */
#include <cstdio>   /* biblioteca padrão de entrada do c         */
#include <cctype>   /* biblioteca de conversao de tipos de dados */
#include <iomanip>  /* formatacao de variaveis na saida          */
#include <locale.h> /* exibir acentuação                         */
#include "minmax.h"
using namespace std; 
int main(int argc, char** argv) {
	setlocale(LC_ALL,"Portuguese"); // instrução para mostrar ascentos
	int M[4][7];
	int i, j;
	srand(time(NULL));
	
	cout << "A matriz 4x7 de valores aleatórios possui o seguinte aspecto:\n ";
	for (i=0; i<4; i++)
	{ for(j=0; j<7; j++) {	
		M[i][j] = rand()%100;
		cout << M[i][j] << setw(3);}
		cout <<endl;
		}
	minmax(M);
	
	
		
	
		
		
		
		
		
	


	return 0;
}

 

O arquivo .h:

#include <iostream> /* manipulacao de fluxo de dados padrão do sistema */
#include <cstring>  /* manipulacao de cadeia de caracteres       */
#include <ctime>    /* manipulacao de tempo                      */
#include <cmath>    /* manipulacao de funcoes matematicas        */
#include <cstdlib>  /* blibliotecas para utilizacao do c         */
#include <cstdio>   /* biblioteca padrão de entrada do c         */
#include <cctype>   /* biblioteca de conversao de tipos de dados */
#include <iomanip>  /* formatacao de variaveis na saida          */
#include <locale.h> /* exibir acentuação                         */

using namespace std; 
	int valormm (int S[4][7]){
	int num, n, i, j, l, c, menor, maior;
	
	for (i=0; i<4; i++)
	{ for(j=0; j<7; j++) {	
		if (i==0 && j==0){
			num=S[0][0];}
		if (S[i][j] < num){
			num = S[i][j];
			l = i;
		}
		}}
	
		
	for (i=0; i<4; i++)
	{ for(j=0; j<7; j++) {	
		if (i==0 && j==0){
			n=S[l][0];}
		}}
		
		for (i=0; i<4; i++)
	{ for(j=0; j<7; j++) {
		if (S[l][j] > n){
			n = S[l][j];
			c = j;
		}
		}}
		
	cout <<"\n\nMenor valor da matriz: " << num << endl;
	cout << "O valor MINMAX é igual a " << n << " e se encontra na linha " << l+1 << " e coluna " << c+1 << "." << endl;
	
	
	return 0;}

 

Link para o comentário
Compartilhar em outros sites

Postei um exemplo disso em 

 

ontem. Sugiro dar uma olhada.

 

Sobre seu programa

 

  • Não encontrei a definição de minmax() em matriz.h
  • pode deixar os #include todos apenas no header
  • declare apenas o que precisa
  • não use acentos em comentários. Não ajuda em nada
  • prefira // ao invés de /* */ para comentários de uma linha. Foram criados para isso
  • a grafia correta é "acento" e não "ascentos"
  • evite comentários óbvios. Seu programa não tem um comentário sequer sobre o algoritmo, sobre o que o programa faz, sobre nada. No entanto ressaltou cada #include com um comentário.
  • Sobre os comentários, entenda que locale é algo bem mais amplo que "exibir  acentuação" como comentou
  • declare uma variável por linha.
  • NUNCA use variáveis globais. São uma bomba-relógio e estão proibidas em muitas escolas e empresas. Em especial variáveis com nomes singelos como aux, i, j...
  • declare as variáveis de controle de loops for DENTRO do comando. Isso já tem 40 anos.

 

 

Link para o comentário
Compartilhar em outros sites

@Polaris   e você não postou o Header  ( minmax.h ) ,  e nem precisa ser hum header , pode ser um arquivo simples mesmo de  c  ou c++  , mesmo ,  mas precisa informar o caminho  ( PATH  ) ,  e está funcinando , veja nesse print :

minmax.thumb.jpg.f74efb3e8602805dc1eba84a43905be9.jpg

 

e a chamada da função 

minmax(M);

na função  principaL   ( int main()  )  , poderia ser assim ,

#include "C:\Users\devai\source\repos\arquivo\arquivo.cpp"
using namespace std;
int main(int argc, char** argv) {
	setlocale(LC_ALL, "Portuguese"); // instrução para mostrar ascentos
	int M[4][7];
	int i, j;
	srand(time(NULL));
	cout << "A matriz 4x7 de valores aleatórios possui o seguinte aspecto:\n ";
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 7; j++) {
			M[i][j] = rand() % 100;
			cout << M[i][j] << setw(3);
		}
		cout << endl;
	}
	valormm(M);
	return 0;
}

 

Link para o comentário
Compartilhar em outros sites

10 horas atrás, Polaris disse:

O arquivo .h:

10 horas atrás, Polaris disse:

Programa principal:

 

@devair1010 no tópico os arquivos aparecerem separados por esses parágrafos. 

 

Acrescentei duas respostas mais modernas no tópico  para este problema em
 

 

onde pode comparar 3 soluções para esse mesmo exercício, uma mais para C do que C++. Uma em C++ mais anos 90 e outra um pouco mais moderna tipo C++'11

:) 

Link para o comentário
Compartilhar em outros sites

@Polaris Essa biblioteca [.hpp & .cpp] não é parte do exercício [historicamente], independentemente do dialeto, por norma a solução é sempre de um procedimento, de ‘loops’ [FOR] e a cereja do bolo: sua matriz [escalar que se imagina como uma tabela]. Circunstâncias excepcionais são escritas no enunciado  quando se desejar algo mais que o elementar. Sugestão: não perca mais tempo com coisas ainda não necessárias. Em fim, segue teu programa como ele é, pois, praticamente só destaquei as partes importantes do programa [indentação].

/******************************************************************************
*******************************************************************************/
#include <iostream> /* manipulacao de fluxo de dados padrão do sistema */
#include <cstring>  /* manipulacao de cadeia de caracteres       */
#include <ctime>    /* manipulacao de tempo                      */
#include <cmath>    /* manipulacao de funcoes matematicas        */
#include <cstdlib>  /* blibliotecas para utilizacao do c         */
#include <cstdio>   /* biblioteca padrão de entrada do c         */
#include <cctype>   /* biblioteca de conversao de tipos de dados */
#include <iomanip>  /* formatacao de variaveis na saida          */
#include <locale.h> /* exibir acentuação                         */

using namespace std; 
int minmax (int S[4][7]) {
	int num, n, i, j, l, c, menor, maior;
	
	for (i=0; i<4; i++) {
	    for(j=0; j<7; j++) {	
		    if ((i == 0) && (j == 0)) {
			    num= S[0][0];
		        
		    }
		if ((S[i][j]) < num) {
			num= S[i][j];
			l= i;
	}}}
	
		
	for (i=0; i<4; i++) {
	    for(j=0; j<7; j++) {	
		if ((i == 0) && (j == 0)) {
			n= S[l][0];}
	}}
		
	for (i=0; i<4; i++) {
	    for(j=0; j<7; j++) {
		if ((S[l][j]) > n) {
			n= S[l][j];
			c= j;
	}}}
		
	cout <<"\n\nMenor valor da matriz: " << num << endl;
	cout << "O valor MINMAX é igual a " << n << " e se encontra na linha " << l+1 << " e coluna " << c+1 << "." << endl;
	
	
	return 0;
    
}

int main() {
    setlocale(LC_ALL,"Portuguese"); // instrução para mostrar ascentos
	int M[4][7], i, j;
	
	srand(time(NULL));
	
	/* Resposta: Parte 1 */
	cout << "A matriz 4x7 de valores aleatórios possui o seguinte aspecto:\n ";
	
	for (i= 0; i < 4; i++) {
	    for(j=0; j<7; j++) {	
		    M[i][j]= rand()%100;
		
		    cout << M[i][j] << setw(3);}
		    cout << endl;
	}
	
	
	/* Resposta: Parte 2 */
	minmax(M);
	
	
    return 0;
}

Saída

A matriz 4x7 de valores aleatórios possui o seguinte aspecto:
 49 77  2 11 65 61 36
 56 76 79  1 21 42 86
 41 95 93 57 28 66  3
 11 74 31 96 94 89 38


Menor valor da matriz: 1
O valor MINMAX é igual a 86 e se encontra na linha 2 e coluna 7.

 

Link para o comentário
Compartilhar em outros sites

@arfneto a definição de minmax não tava no .h porque antes eu estava tentando com a função como "minmax", e depois alterei pra "valormm". Estava tentando certo no arquivo mas colei errado pra cá.

Quanto aos includes funcionarem estando apenas nos headers, não sabia, bom saber.

Quanto aos comentários, é claro que não fui eu que escrevi um por um, os includes são copiados de um arquivo pronto que utilizo.

Quanto às variáveis, qual a grande vantagem de declarar uma por linha ou de declarar as variáveis de controle de loop dentro do comando?

E por que não é bom as variáveis globais? Isso se aplica até para quando uso elas como controle de loop (como "i" ou "j")? Porque faço isso constantemente

@devair1010 sério? não sabia da não necessidade de ser um header. Tem alguma vantagem/desvantagem de salvar necessariamente como header? Digo pois estou iniciando agora no mundo da programação, e sempre salvo em header, e não em arquivos simples.

E realmente não sei o que aconteceu, hora que mandei aqui ficava dizendo que "minmax" não tava definida, e não compilava. Fui, repassei tudo pra um novo arquivo da mesma forma, e compilou e executou normalmente

@arfneto vou ver, obrigado

@mauro_b eu entendo, inclusive não tinha feito o programa desta maneira inicialmente. Tinha feito de maneira mais simples, e sem essa divisão do programa com o header e etc, porém foi pedido para fazermos dessa forma também, por isso a mudança

Uma última dúvida: o programa está rodando normalmente, e identifica o minmax assim como esperado, bem como a linha e coluna em que está. Porém, quando o minmax está na primeira coluna, a indicação da coluna na resposta dá errada (indica um numero como 402735 como coluna). Onde pode estar o erro, sendo que fiz o procedimento para indicação de linhas e colunas da mesma maneira, e a indicação da linha sempre está certa? 

Link para o comentário
Compartilhar em outros sites

@arfneto     nesses parágrafos  que  @Polaris   postou , não consegui visualizar o código desse

#include "minmax.h" 
  
mas creio que esteja errado , pois está delimitado com aspas duplas
e seria com esses símbolos assim :

#include <minmax.h> 

 " 

,   e outra coisa é que na função principaL ele chama a função  

minmax(M);

mas no arquivo.h  , o que tem é a função 

int valormm (int S[4][7])
{
    int num, n, i, j, l=0, c=0, menor=0, maior=0;

@Polaris    creio que ele mostra esse número errado , que você disse , por que você não inicializou as variáveis , e essa variáveL  c , na hora que foi criada já havia algum valor naquela posição da memória e isso é chamado de lixo de memoria , e no código , quando não usa essa variável , ao final ela ainda conterá aquele valor de lixo de memória .

Link para o comentário
Compartilhar em outros sites

Em 06/03/2021 às 06:41, Polaris disse:

O arquivo .h:

 

@devair1010 O texto do #include está depois dessa indicação no post #1, e o arquivo de main() está depois de 
 

Em 06/03/2021 às 06:41, Polaris disse:

Programa principal:

 

mas não dá pra saber o nome dos arquivos :) . E o autor resolveu mudar o nome da função no meio do caminho, de minmax() para valormm() e esqueceu de mudar no programa principal...

 

13 horas atrás, Polaris disse:

a definição de minmax não tava no .h porque antes eu estava tentando com a função como "minmax", e depois alterei pra "valormm". Estava tentando certo no arquivo mas colei errado pra cá

 

Mas depois no #6 o autor já havia se acertado com a nomenclatura :)

Sobre #include e headers

 

13 horas atrás, Polaris disse:

Quanto aos includes funcionarem estando apenas nos headers, não sabia, bom saber

 

#include e headers são dois lados da mesma coisa. Não sei como ensinam essas coisas hoje em dia e não sou muito otimista. A julgar pelo número de vezes que expliquei para alguém a diferença entre #include "stdio.h" e #include <stdio.h> é razoável ser pessimista na verdade. E mais as discussões sobre o que é válido escrever num pre-processador.

 

O compilador nada sabe sobre #include e headers ou coisa assim. Um programa roda antes do compilador e sem surpresas ele é chamado pré-processador. E ele trata essas coisas todas que começam por '#' como #define, #pragma #if e claro #include

 

Ao ver um #include o pré-processador simplesmente troca a linha toda do #include pelo conteúdo de arquivo que estiver em "arquivo" ou <arquivo> .

 

Qual a diferença entre "coisa" e <coisa> afinal?

 

Há dois níveis de #includesystem includes e user includes e não sei como descrevem isso em português porque nunca li. Variáveis de ambiente separam isso para guiar o compilador e o pré-processador: os system includes correspondem a pastas no sistema e são válidos para o sistema como um todo. Os user includes existem para cada usuário.

 

Abaixo um exemplo de uma máquina Windows usada para desenvolvimento em java e C e C++
 

INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\você\Tools\MSVC\14.28.29910\ATLMFC\include;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\você\Tools\MSVC\14.28.29910\include;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared;C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt
IntelliJ IDEA Community Edition=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.2.2\bin;
JAVA_HOME=C:\Program Files\Amazon Corretto\jdk11.0.9_12

 

O pré-processador começa a busca pelos arquivos citados nos #include pelas pastas da lista de "include" do usuário e depois passa para a s pastas da lista do sistema.

 

    #include   <coisa.xls>

 

Esse comando vai fazer o processador buscar por "coisa.xls" na pasta dos includes do sistema diretamente. Se isso estiver por exemplo no diretório corrente não vai ser encontrado, porque não seria inteligente incluir o diretório corrente na lista de system includes, já que isso permitira toda sorte de fraudes. Em geral o acesso aos includes do sistema é somente para leitura...

 

Mas esse comando

 

    #include "stdio.h"

 

faz o pré-processador procurar por "stdio.h" primeiro na pasta de includes do usuário e DEPOIS na do sistema. Isso pode ter uma razão séria ou pode ser só uma bobagem. Isso permitiria que alguém substituisse as declarações de stdio.h por outras. para o bem e para o mal.

 

Extensões e headers

 

Convenções são sempre importantes e há uma razão para usar .h e .hpp e coisas assim nos nomes de arquivos a serem incluídos. No entanto não há qualquer regra e nada tem a ver com C ou C++. O pré-processador não entende de linguagem, apenas de texto e vai trocar o que estiver lá. O nome header é meio ingênuo também, porque não há razão para não ter um #include no meio ou no fim do programa, e um #include no final seria talvez mais um footer do que um header :D

 

Um include pode outros include dentro deles e assim por diante. Por isso na prática não se precisa ficar repetindo em programas simples toda aquela série de #include.  O padrão até outro dia determinava um número máximo de 15 #include dentro de #include dentro de #include, mas cada implementação pode ter suas escolhas. gcc por exemplo acho que aceita hoje 200.

 

E claro que isso pode dar confusão: referências cíclicas podem fazer A incluir B que inclui C e C inclui A.  E por isso existem coisas como #pragma once e #ifdef para evitar incluir mais de uma vez alguma declaração. @Polaris isso explica que o fato de não precisar repetir os #include em main() que já estavam em outros #include é apenas consequência da definição.

 

Comentários, /* */ e //

 

13 horas atrás, Polaris disse:

Quanto aos comentários, é claro que não fui eu que escrevi um por um, os includes são copiados de um arquivo pronto que utilizo

 

@PolarisSeu programa tem então uma série de comentários possivelmente irrelevantes sobre os #include, usando acentos, que nada acrescentam, e usando /* xxx */ para os comentários o que só aumenta a chance de erro. No programa em si parece não haver NENHUM comentário, e isso é o contrário do esperado. No geral é melhor usar // para os comentários e comentar o que está fazendo e porque está fazendo.

 

Se você apagar por engano um barra no fim de um comentário desses o pré-processador vai "comer" todo o texto até o próximo */ e vai sumir uma parte do c;odigo por exemplo. E pode levar um tempo até você achar o problema porque pode sumir um include :) 

 

Declarações

 

13 horas atrás, Polaris disse:

Quanto às variáveis, qual a grande vantagem de declarar uma por linha ou de declarar as variáveis de controle de loop dentro do comando

 

Para o compilador quebras de linha e espaços e declarações múltiplas são irrelevantes. Mas para quem está lendo --- e pode ser você na semana que vem --- isso vale muito. 

 

Para inicializar uma variável, encontrar a definição, ler o programa, mudar um tipo de int para short por exemplo, deve notar que é muito mais fácil saber e achar cada valor em sua linha do que ficar "caçando" por valores no meio do texto.

 

É muito comum alterar um programa que alguém fez, voltar a um programa que você escreveu no ano passado e coisas assim, e por isso essas convenções "se pagam" em tempo recorde. 


As empresas e escolas esperam e muitas vezes exigem código que siga padrões e seja fácil de manter e entender, de modo que qualquer um possa ser substituído e qualquer um possa ler e se achar rapidamente em programas de outros. Época  nada romântica e baseada em tempo e dinheiro apenas. Isso muitas vezes envolve códigos de boas práticas que limitam o número de linhas de uma função, estabelecem nomenclatura de variáveis, posição de chaves na linha, espaçamento de colchetes e parenteses. Empresas tem comitês de revisão de código para garantir isso. Há programas que leêm e analisam programas buscando isolar não conformidades e reformatar programas. Veja por exemplo o clang-tidy que faz isso e mais. Intellisense da Microsoft pode usar inteligência artificial e buscar na base de código da empresa a formatação comum e alinhar os novos códigos de acordo, desde 2019 eu acho.

 

Variáveis globais e escopo

 

13 horas atrás, Polaris disse:

Quanto às variáveis, qual a grande vantagem de declarar uma por linha ou de declarar as variáveis de controle de loop dentro do comando?

E por que não é bom as variáveis globais? Isso se aplica até para quando uso elas como controle de loop (como "i" ou "j")? Porque faço isso constantemente

 

Vou usar seu problema como exemplo para explicar isso, e estou gastando meu tempo explicando essas coisas porque parecem ser conceitos desprezados nos cursos para iniciantes, a julgar pelo que leio aqui. Então pode ser interesante ter um exemplo prático co a diferença entre o que parece ser convenvional e o convencional em códigos de produção.

 

@PolarisComo eu disse acima, eu deixei 3 soluções para esse problema em https://www.clubedohardware.com.br/forums/topic/1526856-definição-do-elemento-minmax/?tab=comments#comment-8117644 aqui mesmo no forum
 

Sugiro comparar, em especial a última, com o código final que está usando. é claro a mesma coisa e deve dar o mesmo resultado, mas serve para mostrar o que provavelmente se esperaria que escrevesse numa empresa comum ou numa faculdade com um professor ou orientador criterioso.

 

O fato é que o vetor
 

    int M[4][7];


de seu programa vira algo como 
 

    Matriz M(4,7);


no outro programa e vou mostrar porque se faz isso mais abaixo

 

Eis o que acontece: em seu programa 

 

int main(int argc, char** argv)
{
	setlocale(LC_ALL,"Portuguese"); // instrução para mostrar ascentos
	int M[4][7];
	int i, j;
 // ...

 

M, que é do tipo int[4][7], é global. Em qualquer lugar do programa qualquer um, de propósito ou por engano, pode alterar esse valor. E as variáveis i e j são globais e ao sair de cada loop continuam existindo e vivas. No meio de um loop se o cara se engana e escreve outro loop com a mesma variável duas páginas abaixo no programa, o valor de i se perdeu para sempre. Esse tipo de erro é um desastre, uma bomba relógio.

 

E nem todo programa tem 30 linhas e UMA função.

 

 No início de C não era possível declarar variáveis no for, e levou uns 10 anos de muita pressão para que isso fosse incluído na linguagem, e isso foi no final dos 80 eu acho.

 

No caso de C++ a linguagem já começou com isso como objetivo: a redução do escopo, do tempo de vida, de variáveis. E em C+= qualquer par de chaves cria novo escopo e variáveis declaradas ali dentro vivem só ali dentro.

 

EXEMPLO

 

int main()
{
    string teste{"fora"};
    {
        string teste{"dentro"};
        int i = 12;
        cout << "teste = " << teste << " e i = " << i <<  "\n";
    };
    cout << "teste = " << teste << " e i = " << i <<  "\n";
    return 0;   
}

 

Esse programa não compila porque i só existe entre as chaves

 


PS C:\src\CPP\flt> g++ -o tst -Wall -std=c++2a coisa.cpp
coisa.cpp: In function 'int main()':
coisa.cpp:12:49: error: 'i' was not declared in this scope
   12 |     cout << "teste = " << teste << " e i = " << i <<  "\n";
      |                                                 ^
PS C:\src\CPP\flt> 

 

Tirando a referência a i no segundo cout

 

#include <iostream>
using namespace std;

int main()
{
    string teste{"fora"};
    {
        string teste{"dentro"};
        int i = 12;
        cout << "teste = " << teste << " e i = " << i <<  "\n";
    };
    cout << "teste = " << teste << "\n";
    return 0;   
}

 

O programa mostra

 

PS C:\src\CPP\flt> g++ -o tst -Wall -std=c++2a coisa.cpp
PS C:\src\CPP\flt> ./tst
teste = dentro e i = 12
teste = fora
PS C:\src\CPP\flt> 

 

porque o valor da string teste volta para o declarado e i desaparece...

 

OUTRO exemplo nas versões modernas de C++

 

Em C++ é válido :

 

#include <iostream>
using namespace std;

int main()
{
    string teste{"fora"};
    {
        string teste{"dentro"};
        int i = 12;
        cout << "teste = " << teste << " e i = " << i <<  "\n";
    };
    if ( int i = 42; teste == "fora")
    {
        cout << "teste vale \"" << teste <<
        "\" e i vale " << i << "dentro do if apenas\n";
    };
    switch( int i = 35; teste[0])
    {
        case 'f':
            cout << "i vale " << i << " dentro do switch\n";
            break;
        default:
            break;
    }
    cout << "teste = " << teste << "\n";
    return 0;   
}

 

E mostra

 


PS C:\src\CPP\flt> g++ -o tst -Wall -std=c++2a coisa.cpp
PS C:\src\CPP\flt> ./tst
teste = dentro e i = 12
teste vale "fora" e i vale 42 dentro do if apenas
i vale 35 dentro do switch
teste = fora
PS C:\src\CPP\flt> 

 

Voltando ao programa e a classe Matriz
 

class Matriz
{
private:
    unique_ptr<int> M;
    int     linhas;
    int     colunas;
    int     min_max;

public:
    int     minmax();
    void    mostra();

public:
    matriz();
    matriz(int, int);
};

 

Isso é o que se chama encapsulamento na literatura de objetos. O vetor M que era int[5][7] agora está dentro da classe, e pode ter qualquer tamanho.

Se algum programa quer usar Matriz não precisa avisar ninguem de nada.

 

Compare com o seu programa, que precisa ter as variáveis M do tipo int[4][7] e as variáveis i e j int, para poder rodar o seu programa. Esse é exatamente o lance que levou o prof. Stroustrup a escrever C++ 40 anos atrás

 

Matriz tem duas funções, chamadas métodos na literatura., e qualquer pode usar mostra() para mostrar a matriz e minmax para mostrar o minmax.

 

Mas ninguém tem acesso ao vetor M dentro de matriz, nem ao número de linhas ou de colunas, e nem ao valor calculado de minmax. Isso porque estão marcados lá dentro do label private.

 

Isso quer dizer que basta ter o header Matriz.h por exemplo, descrevendo a classe,  e o código compilado de Matriz --- ou o fonte em Matriz.cpp --- e qualquer um pode usar isso. 

 

E você pode ter
 

	Matriz A; // 4x7 padrão
	Matriz B(5,8); // essa 4x8
        Matriz* pA[300]; // 300 ponteiros para novas Matriz

 

Sem ter que escrever uma única linha sobre Matriz. Compare com o programa que escreveu, e considere que o trabalho é praticamente o mesmo. Mas sem as globais e com a classe pode usar isso a vida toda em outros lugares sem reescrever nada. E ainda tem a liberdade de mudar a classe sem avisar ninguém, desde que não mude a parte pública, a assinatura das funções. 

 

14 horas atrás, Polaris disse:

E realmente não sei o que aconteceu, hora que mandei aqui ficava dizendo que "minmax" não tava definida, e não compilava. Fui, repassei tudo pra um novo arquivo da mesma forma, e compilou e executou normalmente

 

Por isso as convenções são importantes, e obrigatórias em outras linguagens: use a função minmax em um arquivo minmax.h. Inclua minmax.h em seu programa. Se mudar o nome da função mude tudo.

 

Daqui seis meses você não vai lembrar que a função valormm() está dentro do arquivo minmax.h e alguém que for mexer em seu programa então vai odiar você por ter feito ele perder horas buscando nos arquivos onde estaria a definição de valormm(): dentro de minmax.h. 

Link para o comentário
Compartilhar em outros sites

@devair1010  acho que sim. Só que no meio do caminho ele mudou o nome da função e não mudou o nome do arquivo e assim o #include já era. Ou não: porque se você cria outro arquivo para a função nova fica tudo certo. Já vi muita gente se desesperar por erros assim: uma vez com  um grupo inteiro do meu pessoal: resolveram refatorar o código e uma função em que um pessoal estava trabalhando passou para outro arquivo, com outro nome de arquivo. E a versão antiga, tipo essa minmax aí, ficou no arquivo antigo/ Só que esqueceram de mudar o nome da função. E alguns programas ficaram com o #include para o arquivo antigo e outros com o #include para o arquivo novo. Como ninguém tinha mudado o nome da função alguns programas usavam a versão antiga e outros a versão nova, e os testes davam erros "estranhos". E recompilar não adiantava porque os dois headers tinham a mesma função com a mesma assinatura...

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...