Ir para conteúdo

POWERED BY:

Arquivado

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

sarcofagobra

Struct

Recommended Posts

Não quer rodar, o que ta errado no código?

 

#include<stdio.h>
#include<stdlib.h>


struct data {
   int dia;
   int mes;
   int ano;
   void exibir() {
       printf ("%d/%d/%d", dia, mes, ano);
   }
};

void exibir();

int main() {
   data d;
   d.dia = 13;
   d.mes = 5;
   d.ano = 1888;
   exibir();
   system ("pause");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

alem do ja tido, você nao deu um typedef no struct, entao para declarar este struct você teria que usar

 

struct data d;

 

e nao apenas

 

data d;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Isso acontece pois ele está dando exemplos em C++, não C, embora com um método muito problemático e não recomendado.

 

Em C++, você pode tratar structs como classes, podendo então colocar funções na struct. Mas isso gera esse tipo de confusão, pois ficamos sem saber se é realmente para ser uma classe ou se é um erro.

 

Outra coisa que prova isso é que não precisa do typedef struct em C++ para criar um tipo de dado struct sem utilizar a palavra chave struct.

 

Teoricamente, não está errado, mas na prática e no design está erradíssimo. E, se está aprendendo C, e não C++, pior ainda, pois isso NÃO é C.

 

 

Para evitar esse tipo de confusão, simplesmente utilize structs SOMENTE como armazenadores de dados, e classes para armazenar dados e funções (mas lembre-se que structs tem seus dados públicos por padrão enquanto classes tem seus dados e funções privados por padrão).

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Examinei melhor o código e percebi que mesmo com um compilador de c++ esse código não vai funcionar por causa do protótipo do exibir() depois do struct, que aponta para uma função que não existe. A chamada correta para a função seria d.exibir.

 

Então, o exemplo corrigido seria:

 

#include<stdio.h>
#include<stdlib.h>


struct data {
   int dia;
   int mes;
   int ano;
   void exibir() {
       printf ("%d/%d/%d", dia, mes, ano);
   }
};

int main() {
   data d;
   d.dia = 13;
   d.mes = 5;
   d.ano = 1888;
   d.exibir();
   system ("pause");
}

 

 

MAS LEMBRE-SE QUE HÁ UM ERRO GRAVE DE DESIGN AO COLOCAR UMA FUNÇÃO DENTRO DE UMA STRUCT, ALÉM DE OUTROS ERROS. O exemplo correto mesmo seria:

 

#include <stdio.h>


class data {
   public:
       int dia;
       int mes;
       int ano;
       void exibir() {
           printf ("%d/%d/%d", dia, mes, ano);
       }
};

int main() {
   data d;
   d.dia = 13;
   d.mes = 5;
   d.ano = 1888;
   d.exibir();
   getchar();
   return 0;
}

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

caso você esteja estudando em C++

seria melhor fazer


#include <iostream>


class data {
   private:
       int dia;
       int mes;
       int ano;
   public:
       void enterdate(int day, int month, int year);
       void exibir();
};

int main() {
   data d;
   d.enterdate(20, 13, 2001);
   d.exibir();
   getchar();
   return 0;
}

void data::enterdate(int day, int month, int year)
{
  dia = day;
  month = mes;
  year = ano;
}

void data::exibir()
{
 cout << "Dia..:" << dia << endl;
 cout << "Mes..:" << mes << endl;
 cout << "Ano..:" << ano << endl;
}

 

é bom usar o código de forma e indentação correta, ajuda no desenvolvimento e tanto no seu quanto no entendimento dos outros seu professor com certeza agradeceria.. de preferência em arquivos separados para facilitar mais ainda.

 

se for em C

 

#include <stdio.h>


struct data {
       int dia;
       int mes;
       int ano;
};

int main() {
   data d = { 12, 09, 2001 }; //Caso já queira inicializa-lo com dados.
   printf("%d/d%/d&, d.dia", d.mes, d.ano);
   getchar();
   return 0;
}

 

 

Em C de forma alguma se usa funções dentro de struct, e sempre use o struct para definir ao compilador que o tipo de dados que você está querendo passar é uma estrutura e também para dar melhor forma ao código.

 

Atenciosamente Marquinho

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Eu ia fazer um arquivo desses para mostrar ontem, mas estava sem tempo, então deixei como estava mesmo, só corrigindo os erros graves ;D

 

Você só se esqueceu de que você precisa da instrução using para não precisar utilizar o prefixo std:: nas funções da Standard da C++. Além disso, você precisa incluir a biblioteca <cstdio> para usar a função getchar()...

 

#include <iostream>
#include <cstdio>
using namespace std;


class data {
   private:
       int dia;
       int mes;
       int ano;
   public:
       void enterdate(int day, int month, int year);
       void exibir();
};

int main() {
   data d;
   d.enterdate(20, 13, 2001);
   d.exibir();
   getchar();
   return 0;
}

void data::enterdate(int day, int month, int year)
{
  dia = day;
  month = mes;
  year = ano;
}

void data::exibir()
{
 cout << "Dia..:" << dia << endl;
 cout << "Mes..:" << mes << endl;
 cout << "Ano..:" << ano << endl;
}

 

Agora, eu recomendo que não faça isso. O namespace std existe para que não haja conflito de nomes do seu projeto com os da standard, então utilize com o prefixo std::. Você vai ter problemas no começo, xingar bastante isso, mas quando se acostumar verá que é bem melhor.

 

 

#include <iostream>
#include <cstdio>


class data {
   private:
       int dia;
       int mes;
       int ano;
   public:
       void enterdate(int day, int month, int year);
       void exibir();
};

int main() {
   data d;
   d.enterdate(20, 13, 2001);
   d.exibir();
   getchar();
   return 0;
}

void data::enterdate(int day, int month, int year)
{
  dia = day;
  month = mes;
  year = ano;
}

void data::exibir()
{
 std::cout << "Dia..:" << dia << std::endl;
 std::cout << "Mes..:" << mes << std::endl;
 std::cout << "Ano..:" << ano << std::endl;
}

 

Só estou em dúvida se precisa do std:: pro getchar(), não lembro muito bem se bibliotecas vindas da C também estão por trás do namespace std ou se são jogadas no namespace global mesmo...

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

não, não precisa do std:: pro getchar, logo que ele vem do C e não tem muito haver com a class iostream. os prefixos std são padrões da classe iostream, porém tinha até esquecido, mais o uso do using namespace std; é interessante sim e seu uso é recomendado desde que virou padrão logo não terá como entrar em conflito com ninguém. e também não tente usar getchar(); ele vem do C, não é legal usar C com C++. cada função ou comando vindo do C, com toda certeza tem no C++ de forma diferente porém fazendo os mesmos efeitos ou melhores.

 

Atenciosamente Marquinho, obrigado por corrigir não tinha visto a falta do std:: ou do using namespace std;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

O prefixo std não é padrão da classe iostream, mas sim de toda a standard da C++. O uso do using namespace std não é recomendado pelos criadores da C++, pois você pode criar conflidos sem querer. Por exemplo, você sabia que tem (ou pelo o menos tinha até pouco tempo) a função std::counter() ? Se você utilizar a instrução using namespace std; e criar uma função chamada counter (ou mesmo uma classe, esse nome é até comum em programas escritos em inglês), vai haver conflito.

 

Claro que tem como entrar em conflito com as pessoas, pois nós não sabemos de cor todos os nomes que não podemos usar. Isso acontece às vezes.

 

 

Podemos sim utilizar funções da C na C++ - e isso é até recomendado em vários casos. Parece que você não tem muito conhecimento sobre criação de programas mais complexos, onde você inevitavelmente terá que recair para a "C" e suas funções. Lembre-se que a C++ foi desenhada para ser um superconjunto da C. A C89 faz sim parte da C++, e é recomendado o uso da mesma, pois a C++ não tem artifícios para mexer com muitas coisas que a C tem. Afinal, ela é só um superconjunto da C, não uma linguagem diferente.

 

Não, não são todas as funções da C que tem na C++. As mais usadas, tem sim, e é recomendado na maioria dos casos usar as da C++. Mas, em aplicações mais específicas e de mais raro uso, você não encontra classes ou funções da C++ que existem na C para isso.

 

Além disso, não faz o mesmo efeito ou melhor. Eu disse que é recomendado na maioria dos casos usar as funções da C++, mas não são todos. As funções da C são, por serem de mais fácil implementação, na maioria das vezes um pouco mais rápidas (principalmente a parte de I/O - você não imagina o quão a <iostream> é absurdamente mais lenta se comparada com a <stdio.h> da C), por isso em programas onde a velocidade é algo crítico (por exemplo, em sistemas operacionais), é sugerido usar a C. Outra coisa é que vários artifícios da C++ são dependentes da implementação do Sistema Operacional, então, você também não pode utilizar a biblioteca standard da C++ para fazer um sistema operacional, já que não há um por trás para fazer certos artifícios funcionarem (por exemplo, os operadores new e delete, que são implementados pelo sistema operacional, e todas as funções e classes da C++ que a usam, como TODA a Standard Template Library).

 

Então, não é sempre que a C++ é superior. Você deve ser um programador iniciante em C++, que não aprendeu C e acha que a C++ é superior em tudo. Eu sei disso pois eu também passei por essa fase, até aprender sobre a C e ver que não é bem assim. Hoje programo em C e C++ (e estou aprendendo assembly x86), dominando artifícios considerados avançados das 2 linguagens, e tenho uma visão muito melhor do que é e do que não é.

 

 

Você verá quando aprofundar nas 2 linguagens ;D

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem, não "iniciante" também não mim considero, um expert, é vivendo e aprendendo, sempre que gostei de discursões em foruns para saber o que é certo e o que é errado, tem mais o menos 6 anos que estudo programação, lie muito Deitel inclusive comprei até um livro dele, o fato é que não fiquei muito em C, depois partir para o C++, com toda certeza tenho visto funções strcpy() vindas lá do C, em quanto ao using namespace vem lá do Cplusplus.com vie muitas referências quanto ao uso do mesmo, logo percebi que foi isso, mesmo assim obrigado por mim corrigir, tem muita gente por ai , que vê critícas como essa e a veem de forma errada, entendo o uso do C em C++, fiz um jogo, um remake do famoso Snake com C++/C e a Biblioteca SDL, não foi moleza, 3 meses pensando e quebrando a cabeça. o uso da class iostream, é sim pesado, porém nos computadores de hoje em dia, isso não é mais dificil. por hora é melhor acabarmos aqui, talvez ou se ainda não percebi tenhamos de criar um topico para esses tipos de discurções novamente falando , tenho um tempo de estudo, depois de C fui direto para o C++, mas mesmo assim

nunca vou mim considerar um expert, principalmente depois que vi que um outro kra escreveu um livro (não lembro o nome dele) muito melhor e com mais tecnicas do que o próprio Bjarne Stroutrop.

 

ultimamente tenho visto muito sobre Assembly, instruções e etc, e também sobre Engenharia Reversa.

 

Atenciosamente Marquinho, novamente obrigado pelo tratamento, já sofri um bucado em foruns de iniciantes mesmos com muitos kras xigando, enfim. Obrigado(Arigato)

 

essa é uma das dificuldades de se Autodidatico, logo aonde não tenho e nem tive professores para mim ensinar foi só eu e a coragem. Moro em Parelhas/RN onde não tem nada; mesmo assim não é desculpa para meus erros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não saber não é problema nenhum.

 

Essas discussões são boas, e, na minha opinião, são melhores que as threads sobre como chamar tal função.

 

Gostaria de observar que C++ não é um superconjunto de C. O comitê organizador da C apenas leva em consideração aspectos do desenvolvimento da linguagem que não dificultem [demais] a tradução de código em C para C++, e vice-versa. Um código em C que também é C++ válido é considerado C++ a partir do momento em que se usa um interpretador/compilador para a segunda, e vice-versa.

 

Há diferenças sintáticas e semânticas. O que se faz, geralmente, é compilar módulos em C e linkar com partes do sistema feitas em C++.

 

A última versão oficial de C é o 99, pós TC3. O draft é disponível publicamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.