Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
MatheusINF

C++ Erro na compilação de array

Recommended Posts

Fala galera beleza?

Bom comecei na facul Estrutura de dados e o professor usar C++, como eu utilizava o C estou com algumas dificuldades, como nesse algoritmo

#include <iostream>
#include <stdlib.h>

using namespace std;

void Bubble(int v[],int n)
{
      int i,j,guarda,trocou,k=n;

      while(1){
           trocou = 0;
           cout <<"\nRepete: "<<n-k+1<<": ";
           for(i=0; i<k-1; i++){
               if(v[i] > v[i+1])
               {
                  trocou =1;
                  guarda = v[i];
                  v[i] = v[i+1];
                  v[i+1] = guarda;

               } // FIM IF
            } // FIM FOR
               for(i=0; i<k; i++)
                  cout<<" "<<v[i];

               k--;
               if(!(trocou))
                  return ;
        } // FIM WHILE
}// FIM BUBBLE

int main()
{
     int i, n;

     cout<<"Digite quantos valores tem o vetor: ";
     cin  >> n;

     int v[n];


     for(i=0;  i<n; i++)
     {
           cout<<"Entre com o valor para V["<< i <<"]:  ";
           cin>> v[i];
     } // FIM FOR

     cout<<"Vetor desordenado: ";
     for(i=0; i<n; i++)
          cout<<" "<<v[i];

     cout<<"\n";

     Bubble(v,n);

     cout <<"\nVetor ordenado: \n";

     for(i=0; i<n; i++)
          cout<<" "<<v[i];

    cout<<endl;
} // FIM MAIN

Quando eu executo ele da um Erro "ISO C++ forbids variable length array 'v' [-Wvla]", eu não sei o motivo, se alguem souber pode me ajudar ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui compilou! Meu palpite é que a opção de compatibilidade com as versão C++ está como ativo e emitindo um alerta; não é erro, e sim um alerta acerca de que VLA não é compatível com ISO C++. Qual a IDE? observe se existe uma linha de comando com este tag: -std=xxx, o que tem no lugar dos x's?

 

 

Editado por AnsiC
melhorar a mensagem

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 horas atrás, AnsiC disse:

Qual a IDE?

Eu uso o Code Blocks mnw, será que a versão pode influenciar? lá na faculdade esse código estava executando normal \:

Editado por MatheusINF

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, sua versão tem alguma opção ativa na aba de configuração do compilador que está com algo assim, eu presumo: std=c++98

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
38 minutos atrás, MatheusINF disse:

Eu uso o Code Blocks mnw, será que a versão pode influenciar? lá na faculdade esse código estava executando normal \:

 

O compilador deve estar configurado para usar uma versão padrão da linguagem C++, como C++11, acredito que se alterar as configurações do compilador para usar -std=gnu++11 na linha de comando de compilação, que é a versão C++11 da linguagem com extensões GNU, o código deva funcionar.

 

Mas arrays com comprimento variável e comprimento flexível não são parte da versão padrão do C++, estes são recursos da linguagem C que não estão presentes no C++, mas alguns compiladores podem implementá-los e permitir usá-los no C++ (quando o compilador é configurado para isso).

 

Entretanto seria melhor aprender a fazer usando apenas os recursos do C++ para não ter problema quando não tiver essa opção, nesse caso poderia usar ponteiro, new e delete[].

 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
33 minutos atrás, isrnick disse:

Mas arrays com comprimento variável e comprimento flexível não são parte da versão padrão do C++, estes são recursos da linguagem C que não estão presentes no C++, mas alguns compiladores podem implementá-los e permitir usá-los no C++ (quando o compilador é configurado para isso).

Porém a cessão N3690 § 8.3.4, p185  tem um exemplo de uso.

 

Editado por AnsiC
melhorar a mensagem
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

-std=gnu++11

 

adicionado 11 minutos depois
35 minutos atrás, isrnick disse:

O compilador deve estar configurado para usar uma versão padrão da linguagem C++, como C++11

Realmente está configurado pra ler C++11, vou tentar muda mnw, Vlwws

 

Editado por MatheusINF
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhor compilador que existe é o GCC; com ele não existe essas frescuras.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 minutos atrás, AnsiC disse:

Melhor compilador que existe é o GCC; com ele não existe essas frescuras.

 

O compilador que vem incluso na versão do Codeblocks com compilador é o GCC (=MinGW).

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 minutos atrás, isrnick disse:

O compilador que vem incluso na versão do Codeblocks com compilador é o GCC (=MinGW).

Pois então, pensei que não. Já que usamos std=c++11 e não há erros.

  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, AnsiC disse:

Pois então, pensei que não. Já que usamos std=c++11 e não há erros.

 

Deveria dar erro se usar -std=c++11, pois aí está especificando que só vai usar recursos padrões da linguagem, sem extensões. Usa-se isso quando não quer que coisas que não façam parte da versão oficial da linguagem funcionem.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo que li me leva acreditar que não resultar em mensagem de alerta ou erro não é algo ruim porque toda norma deve ser a soma de normas anteriores e mais, se não como ficaria o quesito compatibilidade, um caos com certeza.

Editado por AnsiC
melhorar a mensagem
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
54 minutos atrás, AnsiC disse:

Tudo que li me leva acreditar que não resultar em mensagem de alerta ou erro não é algo ruim porque toda norma deve ser a soma de normas anteriores e mais, se não como ficaria o quesito compatibilidade, um caos com certeza.

 

A que norma anterior você se refere? Nenhuma das normas da linguagem C++ inclui arrays com comprimento variável na linguagem.

 

Vale notar que C++ não é C com mais recursos, são linguagens diferentes.

Sim, o C++ foi criado a partir do C, mas foi padronizado pela primeira vez em 1998 e baseou-se na versão C89/C90 da linguagem C (arrays com comprimento flexível só foram inclusos na versão C99 da linguagem C), e cada uma seguiu seu próprio caminho desde então, logo recursos que existem no C não precisam necessariamente existir no C++.

Compartilhar este post


Link para o post
Compartilhar em outros sites
38 minutos atrás, isrnick disse:

A que norma anterior você se refere?

N3690 

 
38 minutos atrás, isrnick disse:

Nenhuma das normas da linguagem C++ inclui arrays com comprimento variável na linguagem.

Então eu imaginei coisas, junto de uma sala de 45 estudantes de Física (na época atualmente 4), e continua vendo tais ilusões até hoje :tw_confounded: !!!

 

 
38 minutos atrás, isrnick disse:

Vale notar que C++ não é C com mais recursos, são linguagens diferentes.

Sim, o C++ foi criado a partir do C, mas foi padronizado pela primeira vez em 1998 e baseou-se na versão C89/C90 da linguagem C (arrays com comprimento flexível só foram inclusos na versão C99 da linguagem C), e cada uma seguiu seu próprio caminho desde então, logo recursos que existem no C não precisam necessariamente existir no C++.

Agora que você falou isso, lembrei de uma matéria que dizia claramente existir uma repulsa do "criado do Linux" com relação aos programadores que usam linguagem C++. Os programadores de C são Deuses e os de C++ são hereges. Viva Linux !!! 

Editado por AnsiC
melhorar a mensagem

Compartilhar este post


Link para o post
Compartilhar em outros sites
21 minutos atrás, AnsiC disse:

N3690 

 

N3690 não é um padrão, está escrito logo na primeira página do documento:

 

Citação

Warning

 

This document is not an ISO International Standard. It is distributed for review and comment. It is subject to change without notice and may not be referred to as an International Standard.

 

Recipients of this draft are invited to submit, with their comments, notification of any relevant patent rights of which they are aware and to provide supporting documentation.

Fonte: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

 

N3690 é um documento que foi usado como uma das referências durante o processo de definição da norma C++14:

https://isocpp.org/blog/2013/05/new-paper-n3690-programming-languages-c-committee-draft

 

Mas o que consta na norma de fato é o que realmente é válido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é um rascunho, ou coisa assim. 

adicionado 1 minuto depois
6 minutos atrás, isrnick disse:

N3690 não é um padrão, está escrito logo na primeira página do documento:

É um norma.

adicionado 3 minutos depois

Enfim, eu garanto para você que usar std=c++11, não é um problema, pelo menos não aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 minutos atrás, AnsiC disse:

é um rascunho, ou coisa assim. 

adicionado 1 minuto depois

É um norma.

standard = norma

 

This document is not an ISO International Standard = Este documento não é uma Norma Internacional ISO.

Compartilhar este post


Link para o post
Compartilhar em outros sites
28 minutos atrás, isrnick disse:

This document is not an ISO International Standard = Este documento não é uma Norma Internacional ISO.

Então é um rascunho de norma.

Que posteriormente foi retirada na versão final.

 

 

Quando colocamos -std=c++14 sabe o que acontece, nada o mesmo resultado e com full warning ativo que -std=c++11. Até o editor online onlinegdb também passou pelo teste c++1x. Só o nosso colega que está amarrado :exorcize:

 

Que legal valeu!!

Editado por AnsiC
melhorar a mensagem
  • Curtir 1

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






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

×