Jump to content

Tamanho de um vector


fearz7
 Share

Recommended Posts

A questão e muito simples pessoal, quero algo que me permita saber o tamanho de um vector por exemplo:

int main(int argc, char** argv) {

    int a[] = {2, 4};

    char c[] = "ola";
    
printf ("%d\n", strlen(c)); // resultado seria 3

printf ("%d\n", strlen(a)); // resultado da-me 1 , contudo e um vector com duas posições ... 


    
    return (EXIT_SUCCESS);
}
Link to comment
Share on other sites

o strlen() é para strings, strings em C são arrays que têm '\0' que diz que a string termina.

podes usar algo assim:

#include <stdio.h>
int main()
{
    int a[] = {2, 4,3,5};

    printf("%d\n",(sizeof(a)/sizeof(int)));

    return 1;
}

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

é um bocado mais complicado, porque se tivermos uma array com 10 elementos, mas se só definirmos 7 elementos, os outros 3 elementos, podem ter um valor aleatório da memória ou estar em 0(conforme o compilador).

já não estou muito dentro de C, mas tens esta forma tambem:

#include <stdio.h>

int arraylen(int ar[])
{
    int i;
    int *ptemp=ar;

    for(ptemp;*ptemp!=NULL;++ptemp)
        i++;

    return i;
}

int main()
{
    int a[10] = {2, 4,3,5,5,7,9};

    printf("%d",arraylen(a));

    return 1;
}

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Em primeiro lugar, que compilador é que estás a usar? Deves fazer #include pelo menos do stdio.h e do string.h.

Em gcc 4.4.5, esse código dá um warning "passing argument 1 of ‘strlen’ from incompatible pointer type" ao compilar, que é precioso. O que é que te leva a crer que podes usar strlen (uma função que devolve o tamanho de uma string - array de caracteres terminado por '\0') com um array de inteiros?

Aquilo que strlen faz é apenas começar no início do array e contar o número de posições que pode avançar até encontrar um 0 (o caracter '\0' de terminação de strings tem o código ASCII 0).

O teu array c tem a seguinte composição:

char c[] = {'o','l','a','\0'}

Que em código ASCII corresponde a ter {111,108,97,0}. A função strlen conta 3 posições diferentes de 0, e quando chega à quarta encontra a terminação da string e devolve o resultado 3, que é correto.

Acontece que um char ocupa 8 bits e um int ocupa 32 bits (num computador pessoal moderno). Dito de outra forma, em memória cada inteiro corresponde a 4 caracteres. Quando dizes à função strlen para interpretar o array de inteiros como se fosse uma sequência de caracteres, ele vai olhar para o que está na memória de 8 em 8 bits.

Aqui temos que ter em conta um novo conceito que é a endianness do sistema (não gosto muito do artigo em português da wikipedia). Os 32 bits de um inteiro cabem em 4 bytes e estes podem estar ordenados de forma diferente. No sistema little-endian colocas os bytes com menor valor no início, no sistema big-endian colocas os bytes com maior valor no início. Um exemplo para perceberes melhor usando o sistema decimal:

Se cada byte correspondesse a um algarismo decimal, escrever o número quinhentos e vinte e três em little-endian seria 325, e em big-endian 523.

Acontece que o teu sistema é little-endian. Os números 2 e 4 são menores que 256 e por isso cabem num byte, ou seja, os 4 bytes que representam o número 2 são {2,0,0,0} e os 4 bytes que representam o número 4 são {4,0,0,0}. Sendo assim, o array 'a' interpretado como uma sequência de caracteres tem os seguintes valores numéricos: {2,0,0,0,4,0,0,0}. Quando strlen processa este array, encontra um 0 (código de terminação de string) no segundo elemento e por isso devolve o valor 1.

Se quiseres confirmar aquilo que estou a dizer, podes percorrer o array 'a' com um apontador para caracteres e fazer print dos valores que encontras (são 2 inteiros -> 2*4 = 8 bytes):

#include "stdio.h"
#include "string.h"

int main(int argc, char** argv) {

    int a[] = {2, 4};

    char c[] = "ola";
    
    char *p = (char*)a;
    
    int i;
    for(i=0;i<8;i++) {
      printf("%d\n",(int)(*p));
      p++;
    }

    return 0;
}

Para finalizar, é importante dizer-te que (com a excepção das strings que incluem o caracter de terminação '\0') é impossível saber o número de elementos de um array em C, ou seja, tens que guardar o tamanho do array noutra variável (isto não é exatamente assim, para o caso de arrays que estão definidos no código - i.e. em que o compilador sabe o seu tamanho, podes usar sizeof(array)/sizeof(tipo)).

Já agora, se o teu sistema fosse big-endian, sabes dizer-me qual seria o valor devolvido por strlen(a)? =)

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

pedrosorio grande resposta  😁

não me tinha lembrado do big e litle endian.

Eu sou adepto de utilizar um numero fixo no array, ou até utilizar uma lista ou algo do genero(se quiser aumentar o tamanho do container)

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

    int a[10] = {2, 4,3,5,5,7,9};

Em C não existe inicialização parcial. Um objecto ou é totalmente inicializado (todos os sub-objectos recursivamente se necessário) ou não é, de todo, inicializado.

O exemplo acima inicializa a[0] com 2, ... a[6] com 9, a[7], a[8], e a[9] com 0 (zero).

Outra coisa: na função estás a comparar um int com NULL. O compilador aceita, mas faz conversões implicitas. É melhor, para as pessoas que vão ver o código, comparar com 0.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.