Dúvida - Usando inteiro passado por parâmetro para determinar tamanho de vetor? [RESOLVIDO]

1. Dúvida - Usando inteiro passado por parâmetro para determinar tamanho de vetor? [RESOLVIDO]

Hiroshi Sebin
hirozoid

(usa XUbuntu)

Enviado em 26/05/2014 - 06:38h

Escrevi o seguinte trecho de código para meu curso na faculdade:


void mergeSort(int *vetor, int tam) {
int i, j, k, med;
int aux[tam];

if (tam < 2) return;

med = tam / 2;
mergeSort(vetor, med);
mergeSort(vetor + med, tam - med);

i = 0;
j = med;
k = 0;
while (i<med && j<tam) {
if (vetor[i] > vetor[j]) {
aux[k] = vetor[j];
j++;
} else {
aux[k] = vetor[i];
i++;
}
k++;
}

for (; i<med; i++) {
aux[k] = vetor[i];
k++;
}

for (; j<tam; j++) {
aux[k] = vetor[j];
k++;
}

for(i=0; i<tam; i++) {
vetor[i] = aux[i];
}
}


Tenho uma dúvida: porque eu posso usar o inteiro tam passado como argumento para determinar o tamanho do vetor aux? Imaginei que daria algum erro de compilação, mas ele aceita tranquilamente.

Imaginei isso depois que percebi que podia passar matrizes para a função da seguinte forma:

int preencheMatriz(int linas, int colunas, matriz[linhas][colunas); 


Alguém pode explicar?


  


2. Re: Dúvida - Usando inteiro passado por parâmetro para determinar tamanho de vetor? [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 26/05/2014 - 07:06h

Compilar ele compila. Mas me diz, como ele executou?

Pode até executar a princípio, mas na hora de popular o vetor com um tamanho definido na execução ele vai dar falha de segmentação, pois vai tentar alocar um espaço de memória que já está ocupado.

C não faz alocação dinâmica direta, tem que usar as funções de alocação.

Se não for só por teste, mas sim como atividade avaliativa, esse código está errado, refaça-o.


3. Re: Dúvida - Usando inteiro passado por parâmetro para determinar tamanho de vetor? [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/05/2014 - 16:34h

Se funciona ou não depende da versão do padrão do C (ou C++, se você estiver usando C++ para compilar).

Com o padrão do C de 1989 (ANSI C, também conhecido como ISO C 1990, C89 ou C90), essa construção não existia, mas não sei se era estritamente proibida.

Com o padrão do C de 1999 (ISO C 1999, ou C99) ou com o de 2011 (ISO C 2011, ou C11, se bem que no C11 é considerado um recurso opcional), criou-se a figura do array de tamanho variável (variable length array ou VLA), que é alocado automaticamente a partir do ponto da declaração e também é automaticamente desalocado quando a execução sai do bloco em que ele foi declarado.

Mesmo que um compilador não implemente o C99 nem o C11, pode ser que VLAs existam como uma extensão ao padrão C89. No entanto, é possível também que o compilador aceite compilar o código em questão, pois de fato não há erro de sintaxe, mas o código gerado não seja exatamente correto.

Nenhuma das versões padronizadas do C++ (C++98, de 1998, e C++11, de 2011) suporta VLAs, porque funcionalidade equivalente é oferecida, com vantagens, por classes da biblioteca padrão. Mas isso não impede que compiladores implementem VLAs ao estilo do C.

Uma coisa que eu sempre recomendo, tanto a novatos quanto aos já experientes, é que liguem todas opções de diagnóstico de código do compilador, pois ele muitas vezes é capaz de apontar código potencialmente perigoso ou que possa gerar incompatibilidades. Além disso, é bom saber com muita clareza qual versão da padrão linguagem está sendo usada para compilar o código fonte.

No caso do GCC e do G++, as opções de diagnóstico que eu sempre recomendo são "-Wall -Werror -O2"; às vezes, acrescento também "-pedantic" a essa lista.

Quanto ao padrão da linguagem e eventuais extensões, o default do GCC é (ou era, até a versão 4.6, que é a que eu tenho na minha máquina) se comportar como um C89 com extensões, quando se usa C, e como C++98 com extensões, quando se usa C++, e ambas entendem VLAs.

A opção "-std=" controla a versão da linguagem e extensões que deve ser usada. Curiosamente, não basta especificar "-std=c89" para, a título de teste, desabilitar VLAs: deve-se também incluir a opção de compilação "-pedantic".


4. Re: Dúvida - Usando inteiro passado por parâmetro para determinar tamanho de vetor? [RESOLVIDO]

Hiroshi Sebin
hirozoid

(usa XUbuntu)

Enviado em 26/05/2014 - 19:53h

Executou e funciona perfeitamente.

Usei o codeblocks no Xubuntu 14.04 com compilador gcc padrão. O arquivo é C (extensão .c).

O segundo trecho de código (da passagem de matriz para a função) eu usei no dev-c++ no windows e funciona bem também.

Obrigado, Paulo, sua resposta resolveu minhas dúvidas. Aqui (http://en.wikipedia.org/wiki/Variable-length_array) tem a explicação.

Grato.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts