• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

suzy

nao e estranho?

43 mensagens neste tópico

:wallbash:

estou a tra balhar no visual studio 2005, nao sei se isso tem muito a haver. mas parece-me que sim..

tipo exemplo:

int x;
x=5;
int vet[x];

no gcc e no dev d funciona , no visual studio, diz que o vetor nao está com tamanho definido, da me erro.

alguem sabe se e necessario colocar alguma funcao? ou alguma coisa? obrigada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso parece-me uma facilidade do GCC. Posso estar errado, mas não encontro em sítio nenhum (nem no standard, no qual ainda pensei que estivesse) provas de que isso seja uma declaração válida. Ao declarares um array, o valor que está entre os parêntesis rectos tem que ser uma constante.

Para alocar espaço dinamicamente, tens que alocar o espaço com o operador new:

int x;
x=5;
int *vet = new int[x];

É como o malloc/calloc/... no C, mas mais simples, não esquecendo o delete no final (onde utilizarias o free() em C).

EDIT: É mesmo assim. A sintaxe que utilizaste e que funcionou no GCC é uma extensão deste compilador. Não é standard.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso não é C++ válido.

Isso dá erro porque quando declaras um array, o compilador reserva-te um espaço fixo na memória. Ao fazeres isso é impossível o compilador saber quanta memória reservar, logo dá-te erro.

Isso compila-te com o GCC porque o GCC é um compilador de C. Experimenta compilar isso com o G++.

Não faço ideia como é que o compilador de C trata os arrays de comprimento variavel.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então isso faz parte do C99... tenho a ideia de o GCC já tinha isso há mais tempo.

Isso dá erro porque quando declaras um array, o compilador reserva-te um espaço fixo na memória.

Não é bem assim quando se trata de variáveis locais (ou dinâmicas).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

C99 é o standard de C, não de C++.

Sendo uma variável local (só é possível utilizar arrays de tamanho variável em declarações locais), o mais certo é adicionar código para verificar qual o tamanho pretendido em runtime e fazer avançar o stack pointer de acordo com esse tamanho. A libertação é feita automaticamente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é bem assim quando se trata de variáveis locais (ou dinâmicas).

É é. Se declarares simplesmente um array o compilador reserva-te espaço na memoria para ele, não há volta a dar-lhe. X bytes(dependendo do tipo de dados) vezes o numero de elementos que queres. Teres um ponteiro para um endereço de memoria que pode posteriormente ser aumentado, sim isso é possivel, mas não é um array, é um ponteiro para um endereço de memoria que tem a primeira parte de um conjunto de dados de um determinado tipo.

Uma coisa que eu me surpreende é ver frequentemente discussões que envolvem as palavras: "heap, stack, arrays dinâmicos, variaveis locais, etc.". Eu nunca sequer me dei ao trabalho de descobrir o que significam. No entanto todo este tema parece-me bem mais simples do que essas jincanas.

Anyway, o TD já mostrou o código que deve ser usado uns tópicos acima, não muito mais a dizer em relaçao a isto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma coisa que eu me surpreende é ver frequentemente discussões que envolvem as palavras: "heap, stack, arrays dinâmicos, variaveis locais, etc.". Eu nunca sequer me dei ao trabalho de descobrir o que significam. No entanto todo este tema parece-me bem mais simples do que essas jincanas.

Mais surpreendente ainda é dizeres que nunca te deste ao trabalho de ver o que significam, quando são dos conceitos mais básicos de arquitectura de computadores e fundamentais para programar qualquer programa relativamente complexo em C/C++. E ainda fazes parecer que não são conceitos importantes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mais surpreendente ainda é dizeres que nunca te deste ao trabalho de ver o que significam, quando são dos conceitos mais básicos de arquitectura de computadores e fundamentais para programar qualquer relativamente complexa em C e C++. E ainda fazes parecer que não são conceitos importantes.

Desculpa responder assim... mas... LOL.

Dos conceitos mais básicos podem ser, na verdade desconfio que os tenha todos apreendidos, ainda que não alinhe o festival de vocabulário caro do C++.

Pelo menos é raro encontrar código que recorra features da linguagem que eu não tenha usado ou que não perceba.

O meu ponto é precisamente esse, criam-se demasiadas nomenclaturas e complicam-se coisas que até são simples.

Depois criam-se "programadores" que sabem mais palavras caras do que propriamente usar uma linguagem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quanto aos heap e stack concordo com o pedrotuga.

Quanto aos arrays dinâmicos, variáveis locais, e etc. concordo com o Triton.

LOL

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Dos conceitos mais básicos podem ser, na verdade desconfio que os tenha todos apreendidos, ainda que não alinhe o festival de vocabulário caro do C++.

Depois criam-se "programadores" que sabem mais palavras caras do que propriamente usar uma linguagem.

Quando esse vocabulário nem é específico de C++, mas sim de arquitectura de computadores / Sistemas Operativos...

Secalhar é mais ao contrário. Criam-se demasiados programadores que pensam que sabem programar, mas não fazem ideia de como fazer algo que não seja básico.

Por mim prefiro não trabalhar com nenhum programador que não saiba o que é a stack ou o heap.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Eu nunca sequer me dei ao trabalho de descobrir o que significam.

Por isso é que não sabes que *não é* bem assim, variáveis locais tem diferenças apreciáveis das variáveis estáticas. É até bastante fácil para um "compilador" decidir qual será o tamanho de uma variável local em "runtime".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como não é bem assim?

Podes dar um exemplo de uma declaração DE UM ARRAY que não tenhas que dizer ao compilador quanto espaço reservar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Podes dar um exemplo de uma declaração DE UM ARRAY que não tenhas que dizer ao compilador quanto espaço reservar?

Em C99 (não C89 nem, acho eu, C++)

#include <stdio.h>
void variavel(int len) {
  int array[len];                      /* array variável */
  int k = len;
  int sum = 0;
  while (k--) array[k] = 42;                /* tudo a 42 */
  k = len;
  while (k--) sum += array[k];                   /* soma */
  printf("42 * %d == %d\n", len, sum);      /* e imprime */
}

int main(void) {
  int len;
  printf("Introduz tamanho do array: ");
  fflush(stdout);
  if (scanf("%d", &len) == 1) {
    variavel(len);             /* array variável tamanho */
                            /* escolhido pelo utilizador */
  }
  return 0;
}

pmg$ /usr/bin/gcc -std=c99 -pedantic -Wextra -Wall vararr.c
pmg$ ./a.out
Introduz tamanho do array: 1000
42 * 1000 == 42000
pmg$ ./a.out
Introduz tamanho do array: 1
42 * 1 == 42
pmg$

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pmg... não leves a mal eu responder assim, mas isso é uma resposta que é merecedora de um:

"Grande avaria que fizeste!"

Respondeste com código em C, não em C++. Esse é de resto o problema da autora deste tópico, escreveu código que está errado e compilou-o com um compilador de C.

Depois ficou surpreendida porque com outro compilador não o compilava. Na verdade não podia, era impossível, o material tem sempre razão, o código não era de faco C++ válido.

Vou repetir:Em C++, uma declaração válida de um array, tem que explicitar o tamanho deste, caso contrário é completamente impossível ao compilador saber quanto espaço reservar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como não é bem assim?

Podes dar um exemplo de uma declaração DE UM ARRAY que não tenhas que dizer ao compilador quanto espaço reservar?

Procura neste mesmo tópico para um exemplo em C, ainda que não-standard.

Mas esta questão não se prende apenas com aquilo que podes fazer com sintaxe normal de uma linguagem. Se só programas em linguagens de muito alto nível, interpretadas ou com gestão automática de memória, como linguagens para a web, não há nenhum problema prático directo em não distinguir entre espaço de alocação estático, local e dinâmico, porque nessas linguagens é tudo igual. Mas em linguagens como C/C++, de mais baixo nível, compiladas para código nativo, em que tens que fazer a tua própria gestão de memória e que não impõem nenhum limite aos desejos do programador, aí já é essencial saber-se bem não só as diferenças entre os tipos de alocação mas também como funciona um computador do ponto de vista arquitectural e como é feita a gestão de memória na biblioteca do compilador e pelo sistema operativo. Caso contrário o potencial para se cometerem erros (bugs) graves é bastante grande.

Tiraste ou estás a tirar algum curso de informática, ou és autodidacta? Não tou agora a ver nenhum livro para te recomendar (se fores curioso, claro), até porque isto cobre várias áreas, mas por exemplo a Wikipedia é capaz de ser um bom local para aprender sobre este tema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pmg... não leves a mal eu responder assim, mas isso é uma resposta que é merecedora de um:

"Grande avaria que fizeste!"

LOL, não levo nada a mal.

Respondeste com código em C, não em C++.

Tens toda a razão: o meu código é C, e deixei isso bem explícito.

Como neste tópico já se tinha falado de C, fiquei confuso sobre se a tua dúvida era exclusiva do C++ ou não.

Vou repetir:Em C++, uma declaração válida de um array, tem que explicitar o tamanho deste, caso contrário é completamente impossível ao compilador saber quanto espaço reservar.

Não sei C++, mas o meu programa de C, se compilado com o compilador de C++, de facto dá erro na compilação

pmg$ g++ -pedantic vararr.c
vararr.c: In function ‘void variavel(int)’:
vararr.c:3: error: ISO C++ forbids variable-size array ‘array’
pmg$

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então isso faz parte do C99... tenho a ideia de o GCC já tinha isso há mais tempo.

É capaz. Acho que algumas funcionalidades que foram adicionadas ao novo standard foram desenvolvidas primeiro pela malta do GCC e só depois propostas para standardização.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qualquer dia é bem capaz disso seradicionado também ao C++, a não ser que isso vá contra algum "conceito" de C++ puro...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qualquer dia é bem capaz disso seradicionado também ao C++, a não ser que isso vá contra algum "conceito" de C++ puro...

Pelo que li, algumas funcionalidades do C99 vão ser adicionadas à nova revisão do C++ (denominada C++0x) que deve sair em 2009. Penso que variable-length arrays é uma delas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Njay,

Sou engenheiro electrotecnico, entretanto o meu curso mudou de nome para engenharia electrotecnia e de computadores, mas foi só uma questão de nome, eu até escolhi o ramo de telecomunicações, pelo que a minha área de conhecimento mais académico é mais processamento de sinal, comuncações RF, telefone, ópticas e um pouco de redes de dados, trafego, modelações, etc. do que computadores.

Mas no meu curso até se aprende mais C++ do que em qualquer curso de eng informatica de que eu tenha conhecimento. Quem diz C++ diz assembly ou no meu caso que sou de telecomunicações Matlab.

Apesar disso, linguagens de baixo nível são coisas que não me despertam muito interesse actualmente pois não trabalho com elas e não estoua ver em que é que me possam ser úteis num projecto pessoal meu.

Tenho um robot que fiz por brincadeira mas nem sequer cheguei a por lá um controlador, tirando esse pequeno brinquedo não me estou a ver a usar uma linguagem como C++ tão cedo para nenhum fim prático.

Anyway, o que estás a dizer não é novidade nenhuma para mim,mas já lá vao quase 10 anos desde que eu aprendi esse tipo de coisas e raramente tenho usado esse tipo de conhecimento.

O que eu te estou a dizer, pela terceira vez, é que quando disseste "não é bem assim" estavas enganado. É exactamente assim, como eu disse desde inicio.

Em relação ao C eu nunca disse nada nem tenho nada a dizer, C não é C++. Para dizer a verdade, assim que me lembre não me lembro de alguma vez ter desenvolvido ou participado no desenvolvimento de software em C, pelo que posso dizer:

Nunca programei em C.

Mas não sei porque é que estamos a falar em C neste tópico.

pmg, eu não tenho dúvida nenhuma em relação a este tópico, como já disse, não percebi por que é que desatou toda a gente ( menos eu e o Thedark ) a falar na linguagem C.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
O que eu te estou a dizer, pela terceira vez, é que quando disseste "não é bem assim" estavas enganado. É exactamente assim, como eu disse desde inicio.

Não é, Pedro. Uma variável estática vê o seu espaço de memória alocado em tempo de compilação. Quando o programa arranca esse espaço já lá existe, e vai existir até que o programa acabe. Uma variável local pode até nem nunca vir a ter espaço alocado. Espaço para ela é alocado na pilha, quando a execução entra na função, e é um espaço temporário, que só existe enquanto a execução estiver dentro da função, e é por isso que é possível (em alguma implementações de C, e não há nada que impeça que tal seja implementado em C++) ter variáveis locais de tamanho dinâmico.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O scope de uma variável, assim como a sua implementação, é completamente irrelevante para esta discussão.

Seja quando for que o espaço é reservado o compilador tem que saber quanto espaço é. Pelo menos um compilador de C++ é assim que funciona. Não existe uma estrutura física cujo tamanho não seja conhecido. Podem existir é ponteiros que apontem para endereços de memoria cujo comprimento a aser usado a partir daí pode variar.

Quanto aos arrays de comprimento variáveis do C:

Isso não vai ser implementado em C++ porque o C++ não tem muitas limitações do C, não são precisos workarounds. Não é preciso uma feature dessas. Nomeadamente existe o new que permite gerir a memória em condições sem ginga jogas rebuscadas.

Tambem não sei que implicações é que isso teria nas prórprias especificações da linguagem e que outras consequencias teria. A interpretação que eu faço da forma de gerir a memória em C++, leva-me a crer que isso é precisamente o aquilo que o C++ não deve fazer. É como se estivesse a dizer ao programador: não é possível fazer isto porque não é assim que se faz isto em condições.

Por exemplo, o código escrito pelo pmg é um bom exemplo de como obter um segmentation fault.

Mas isto é só a minha interpretação.

Mas esta discussão assim é um pouco estéril. Mostra-me um exemplo que discutimos a prtir daí. Por mim só preciso do exemplo da suzy.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso não vai ser implementado em C++ porque o C++ não tem muitas limitações do C, não são precisos workarounds. Não é preciso uma feature dessas. Nomeadamente existe o new que permite gerir a memória em condições sem ginga jogas rebuscadas.

Não é nenhum workaround. E não me digas se eu preciso ou não de uma feature. Se tu não precisas, não digas que os outros não têm uso para lhe dar. Memória alocada na stack é muito usada, por exemplo, em pequenos buffers usados em cálculos auxiliares em funções (com a função alloca() da Standard C Library). Alocar memória na stack é centenas de vezes mais rápido do que a alocar memória dinâmicamente no heap com o new ou o malloc.

Por exemplo, o código escrito pelo pmg é um bom exemplo de como obter um segmentation fault.

Porquê?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora