Ir ao conteúdo
  • Cadastre-se
cezarvaz

Passagem de matriz headers

Recommended Posts

Oi pessoal!

Estou com uma dúvida que à primeira vista achava simples, mas vamos lá...

Estou tentando passar um array para um header de forma que ele calcule alguma coisa

e traga o array calculado de volta modificando o original.

Preciso fazer também com array dinamico.

Fiz uma montagem simples para não tomar muito o tempo de vocês:

Qualquer ideia será bem vinda!!!!

no cout<<vet<<' '; não deveria sair os elementos multiplicados????

//calc.hpp

#define CALC_H
#include <iostream>
#include <fstream>
#include <sstream>
#include <stdlib.h>
using namespace std;
void calc (int lista[], int elementos)         // recebe os agumentos
{
    for(int i=0; i<elementos; i++)
        cout<<lista*10<<' ';
}
#endif
 
passa.cpp
#include <iostream>
#include "calc.hpp"
void passa (int lista[], int elementos);         // protótipo da função
int main()
{
    int vet[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};         // declaração e inicialização
    
    calc(vet,10);  
    
    for(int i=0; i<10; i++)
        cout<<vet<<' ';
}
 
 

 

Editado por dif
inserir o código com o botão CODE <>

Compartilhar este post


Link para o post
Compartilhar em outros sites
22 horas atrás, cezarvaz disse:

no cout<<vet<<' '; não deveria sair os elementos multiplicados????

você deveria usar o indice:

for(int i=0; i<10; i++)        
cout<<vet[i]<<' '; 

 

Sobre o resto você pode criar 2 arquivos chamados "util.algo" onde esse algo seriam um .h onde você teria os protótipos das funções e outro .c onde estariam implementados as funções, logo depois é só fazer o include do .h #include"util.h"

Editado por vangodp
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi muito bem. Tentando ser mais específico o que não consegui foi passar a matriz do main para o header e no header fazer um cálculo e retornar a matriz para o main já modificada e no main mostrar ela.

Espero que ajude!

C++Bib.rar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde todos,

Retomei o meu hobby, estou aprendendo C;

o arquivo H (terminação .h) deve conter apenas declarações ou até mesmo variáveis, algumas externas (apontam pra fora do escopo).

Em C, a implementação de H file fica C file ou O file de mesmo nome. Por exemplo: hello.h que só tem nomes para programar, como se fosse um guia de ferramentas disponíveis, já em  hello.c ou hello.o  tem todas as rotinas ocultas no caso de hello.o principalmente.

Resumindo:

  hello.h - é um monte de nomes sem nada, um mapa.
  hello.c ou hello.o - é onde está a implementação/ rotinas/ tarefas/ programa.

 

Entendi que a função calc não está fazendo tarefa nenhum... porém a tarefa pouco importa você quer usar uma função que esteja fora do escopo do arquivo atual, de maneira oculta, sem visualizar sua implementação, é sobre isso o exercício? 

Editado por Mauro Britivaldo
Sintaxe

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu não uso o calc.hpp para fazer isso que tipo de extensão eu uso para conseguir .bib? 

O que quero é transferir a matriz para uma função externa(.hpp ou .bib) e depois retornála de volta. a matriz sai de passa.cpp e por passagem de parametro vai para calc.hpp. calc.hpp retorna a matriz depois de um calculo para passa.cpp e exibe a matriz agora modificada no cálculo.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O exercício eu entendi agora com certeza, problema é que não sei escrever um exemplo em C++;

:tw_confounded:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde @cezarvaz

Em C, usamos *.c para arquivos de código, e usamos *.h para aquivos de cabeçarios.

Já no C++ usa se *.cpp para arquivos de código, e usas e *.hpp para arquivos de cabeçario.

 

Então como exemplo disto em C tenho:

 

Arquivo square.h (header) 

/** @file square.h @author Mauro Britivaldo @date 13 de Jul 2017 */
#ifndef SQUARTE_H_INCLUDED
#define SQUARTE_H_INCLUDED

  extern int Data; /**< Link externo para o número **/
  /**
    @brief  Função elava número inteiro ao quadrado
    @param  Número interio com valor maior que 1
    @return Número quadrado
  */
  void fnSquare(int* iNumeroInteiro);

#endif // SQUARTE_H_INCLUDED

 

Arquivo Código (*.c) de implementar square.h

/** @file square.c implementação *.h @date 7/13/2016 */

int Data; /**< Valor anterior a potencia */
/**
  @brief  Função elava número inteiro ao quadrado
  definição da função declarada no arquivo *.c
*/
void fnSquare(int* n)
{
  Data = *n; // Atribuindo o valor antes da potência
  *n = (*n) * (*n);

  return;
}

 

Arquivo main.c usando função fnSquare 

#include <stdio.h>
#include "square.h" // fnSquare

int main()
{
  int iNumber;
    printf( "Entre com numero inteiro: " );
    scanf( "%d", &iNumber );

    fnSquarte(&iNumber);  // Fazendo a potencia de 2.
    printf("%d^2 e igual: %d\nDone\n\n", Data, iNumber );

    return 0;
}

:thumbsup:

Editado por Mauro Britivaldo
Sintaxe

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como poucas mudanças, você pode adaptar para qualquer tipo de objeto.

Por exemplo:

extern int Data; pode virar extern int Data[3][3]; mesmo para int Data

e para resolver os quadrados, um loop percorrendo o ponteiro por exemplo:

for(i = 0; i < 9; i++)

  *(n + i) = *(n + i) * (*(n + i));

Resolve, já que se associamos o ponteiro de um matriz a um ponteiro pode percorre como vetor.

Editado por Mauro Britivaldo
Sintaxe

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para copilar abra um novo projeto no Code::Blocks (Recomendo) 

Ou través do comando: >square> gcc main.c square.c -o square.o

Para windows comando>square> gcc main.c square.c -o square.exe 

23 minutos atrás, cezarvaz disse:

Ainda tá nebuloso...não tá compilando não terias um exemplo com matrizes!?

Squart.rar

kkkk sim, mas taria te dando a resposta, tentei ensinar um pouco do que sei, se não consegui então a resposta também não vou dar kkk

:tw_joy:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, consegui resolver!

Obrigado pelas dicas!!!!

segue a resposta, se servir para alguém beleza!

Arquivo Main:

#include <stdio.h>
#include <iostream>
#include "inicializa_gx.hpp"
using namespace std;
int main()
{
    // uma matriz de 5 x 8 comun
    float **matriz = new float*[3];
    int lin=5;
    int col = 8;
    for(int i = 0; i < lin; i++)
    {
        matriz = new float[8];
    }

    for(int i = 0; i < lin; i++)
    {
        for(int j = 0; j < col; j++)
        {
            matriz[j]=5; 
            cout<<matriz[j]<<" ";
        }
        cout<<endl;
    }    
    
    // seta os valores dela por referência
    inicializa_gx(matriz,lin,col);

    // loop pra verificar os resultados
    for(int i = 0; i < lin; i++)
    {
        for(int j = 0; j < col; j++)
        {
            // teste dos valores em cada casa
            cout<<matriz[j]<<" ";
        }
        cout<<endl;
    }

    // espera alguem teclar algo 
    scanf("%c");

    return 0;
}

Arquivo inicializa_gx.hpp

void inicializa_gx(float **g, int& l, int& c)
{
    for(int i = 0; i < l; i++)
    {
        for(int j = 0; j < c; j++)
        {
            g[j] = g[j]*10.0f; // calcula
        }
    }
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

você pode até ter conseguido porém essa não é a forma correta. Para começar você deve entender a diferença entre declaração e implementação de funções, e também entender perfeitamente o cometido dos protótipos de função.

Em c, se ja chegou a estudar, você não precisa ter a função adiante de main, basta você levar a função abaixo de main e por o prototipo antes. Agora bem.... vamos pensar que temos 6 arquivos, main.cpp, file1.hpp, file1.cpp, file2.hpp, file3.cpp, calculos.hpp e calculos.cpp, e agora vou lhe demonstrar porque você não "deve" levar a função ao hpp. Suponhamos que você tem as implementações de varias funções necessárias nesses arquivos chamado file1.cpp e file2.cpp que precisam das funções que estão declaradas em calculos.hpp e implementadas em calculos.cpp, o correto seria você sair adicionando o calculo.hpp como cabeçalho nos arquivos file1.cpp e file2.cpp isso seria como por o prototipo adiante das funçoes nesses arquivos igual que fazemos em main.c quando queremos levar a implementação a outra parte deixando o prototipo antes de main. com isso sabemos que tudo vai funcionar, pois ao programa encontrar o prototipo sabe que a implementação está em outra parte.

 

Se você levar a implementação ao hpp, cada vez que fizer um include desse hpp você estará como implementando varias copias dessa função nos seu arquivos, Em alguns casos funcionará em outros pode que não por conflitos. você tem total liberdade de fazer o que bem quiser porém existem certos passos para garantir o bom funcionamento do programa, o que lhe funciona perfeitamente agora depois te pode dar muita dor de cabeça. você acha que milhares de programadores estão usando os arquivos cpp por ***** e que se fosse assim todos deveríamos estar usando somente os hpp? Se pensar assim seu caminho vai ser muito cumprido.>_<

 

Não sei se da para entender tudo, vou por um arquivo aqui para você dar uma olhada: cabeçalhos.rar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vangodp, Abração você sempre tem um jeito didático e efetivo de explicar.

Muito obrigado!!!!

Não querendo abusar da tua paciência, como eu poderia então implementar o programinha acima

de forma correta? com a matriz dinâmica e tudo. e quando eu uso o destrutor nela?

Se puderes contribuir, agradeço imensamente.

 

Abração!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

você tem que se fazer somente 1 pergunta.... Realmente você precisa que seja um array?
Certamente você poderia usar algo como vector<vector<int>> matriz;. Sendo assim isso tem um tamanho praticamente ilimitado.  você até mesmo poderia preparar uma classe matriz com os métodos que precisar, utilizando operadores sobrecarregados etc. Incluso utilizar templates fazendo que essa classe seja muito útil em qualquer projeto seu e servir muito bem para praticar sobre operadores sobrecarregados, iteradores, containers(STL) etc etc.

 

Por outro lado você pode estar nos seus inícios, caso isso seja assim certamente isso tudo que mencionei anteriormente seja muita carne para digerir. >_<  Então sugiro você continuar estudando sobre classes, operadores, construtores, destrutores etc etc etc, tudo tem seu tempo:cabeçalhos2.rar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado!!!

Mas ao compilar os códigos no Main dá os erros da figura

testei no CodeBlocks e no Dev C++.

O que será isso? 

 

erro.png

ambos erros nos arquivos .cpp!!!

//main.cpp

#include <iostream>
#include "calc.hpp"
using namespace std;


int main(){
    int vet[10] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};         // declaração e inicialização
    
    calc(vet, 10);  
    
    for(int i=0; i<10; i++)
        cout<<vet<<' ';

}

 

calc.hpp

#ifndef CALC_H
#define CALC_H

void calc(int lista[], int elementos);         // protótipo da função

#endif //CALC_H

 

calc.cpp

#include <iostream>
#include <fstream>
#include <sstream>
#include <stdlib.h>
using namespace std;
void calc ( int lista[], int elementos ) {     // recebe os agumentos
    for ( int i = 0; i < elementos; i++ )
       lista *= 10;

}

 

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

×