Jump to content
crazygod

[Ajuda] Problema com vectores...

Recommended Posts

crazygod

Boas, gostava de pedir ajuda para detectar um erro, que sinceramente não sei onde esta...

aqui deixo o código (não esta comentado, devido a sua simplicidade e porque fiz este para mostrar-vos qual o meu problema)

#include<stdio.h>

#define size1 20
#define size2 9
#define TRACO '-'



void IniciarVector(char *s,int n)
{
int i;
for(i=0;i<n;i++)
	s[i]=TRACO;
}

void Mostrar(char *s)
{

int i;
for(i=0;s[i]!='\0';i++)
	printf("-> %c <-> %d\n",s[i],i);

}

int main()
{
char a1[size1], a2[size2];

IniciarVector(a1,size1);
IniciarVector(a2,size2);

Mostrar(a1);	

printf("\n e agora o a2\n");
Mostrar(a2);
return 0;
}

o problema esta no vector a1, porque quando exibo os resultados mostra mais do que os 19 caracteres que devia, mostra mais precisamente 28!!

uma ajuda se faz favor

Obrigado

Share this post


Link to post
Share on other sites
AlexPnt

Uma primeira olhadela e reparo que no ciclo em que mandas imprimir cada caracter do array, a maneira como o estás a controlar é até aparecer um '/0'. Ora, simplesmente não existe nenhum '/0' no teu vector, e por isso ele continua a ler muito depois disso.

Ou seja isto

for(i=0;s[i]!='\0';i++)

nao devia ser substituido por isto? 

for(i=0;i<n;i++)

  em que este n , seria um um novo parametro de entrada e mais concretamente seria o tamanho de cada array.

Isto na funcao Mostrar.

Outra maneira seria colocares tu manualmente, um '/0' no array quando o inicializas, na funcao IniciarVector e tudo o resto ja fazia sentido.

Espero ter ajudado :P


Programming is an art form that fights back.

Share this post


Link to post
Share on other sites
crazygod

és o meu herói  :P

obrigado, agora ja deu, dahh...tava na ideia que ele colocava sozinho o '\0', mas so coloca quando passo-o por um gets()...

apesar que tentei no meu ciclo de iniciar o vector no fim colocar : " s='\0'; "

mas continuava a ter erros....(devia de faltar algo mais)

olha, mais um vez obrigado pela ajuda...

Share this post


Link to post
Share on other sites
KiNgPiTo

A maneira mais rápida é:


void IniciarVector(char *s,int n)
{
        int i;
        for(i=0;i<n;i++)
                s[i]=TRACO;
        s[i]='\0';
}

Share this post


Link to post
Share on other sites
crazygod

pois mas dessa maneira, nao me esta a funcionar!!

(eu antes de colocar aqui a minha duvida tentei isso que disses-te KiNgPiTo, mas não esta a funcionar, continua a imprimir os numeros ate 28)

mas (e aqui vai uma curiosidade)

se eu apagar a linha em que inicio o segundo vector

//IniciarVector(a2,size2);

o codigo ja funciona direito (utilizando '\0' na função de iniciar)

Share this post


Link to post
Share on other sites
bubulindo

Claro que não...

A funcão funciona se for assim:

void IniciarVector(char *s,int n)
{
        int i;
        for(i=0;i<n-1;i++)
                s[i]=TRACO;
        s[++i] = '\0';
}


Se reparares, estás a adicionar o '\0' para lá do vector que definiste... Quando inicializas o vector a2, escreves por cima do último '\0' que escreveste em a1. Então quando corres o código, vês os dois vectores seguidos até encontrares o '\0' definido no vector a2 (que é escrito para além da definicão do mesmo).

Se criares um vector a3 e seguires o mesmo raciocínio vais ver que ao listar o vector a1, vai aparecer os 3 vectores.

Percebeste? Tenta inicializar o vector com algo que não um caracter identico e isto torna-se aparente. Podes também usar memset(), e depois alterar a última posicão.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
crazygod

a função memset() ainda não sei utilizar...(ando a estudar C pelo um livro)

pois, sinceramente não sei se percebi, porque como esta a passar um novo vector "a2"....

e como a minha variavel "i" começa com o valor 0 no inicio do for, não faz muito sentido que ele ainda escreve na varial que ele ja terminou "a1"...

mas sim, era isso que ele estava a fazer, tens toda a razao, mas vou (amanhã) estudar melhor o que disses-te e tentar compreender melhor, para não voltar a cair no mesmo erro...

Obrigado

-----alterado----

mas se eu fizer como dizes, ai sim, estou a escrever para alem da dimensão do vector

void IniciarVector(char *s,int n)
{
        int i;
        for(i=0;i<n-1;i++)
                s[i]=TRACO;
        s[++i] = '\0';
}

mas se eu colocar

s='\0'

e não

s[++i]='\0';

estou a escrever mesmo na ultima dimensão do vector...

(não leves a mal estar a discutir isto contigo, mas é para ver se entendo)

Share this post


Link to post
Share on other sites
bubulindo

Se colocares só s, vais ter um erro ou vais escrever na primeira posicão do vector. Agora não tenho a certeza qual vai acontecer, mas aposto no erro do compilador.

Os vectores não são nada mais que posicões de memória. E o computador coloca os vectores todos juntinhos uns aos outros... Logo, se escreveres para lá do tamanho do vector 1, vais escrever dentro do vector a2.

Experimenta isto:

void Mostrar(char *s)
{

        int i;
        for(i=0;s[i]!='\0';i++)  {
                printf("-> %c <-> %d\n",s[i],i);
                printf("address = %u \n", &s[i]);//adicionado. 
        }
}

O que vais ver é o endereco de memória das posicões dos vectores. Como vais ver, as posicões são sequenciais, e as posicões que não vão aparecer são as que têm o '\0' porque saltam fora do ciclo.

Estás a ver a ideia?

Isto não significa que o computador vai sempre ordenar as variáveis do teu programa de forma sequencial. Mas isso está a acontecer agora e é por causa disso que tu vês o resultado que colocaste.

Não levo a mal, é uma dúvida legitíma. Espero que percebas o que se está a passar.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
crazygod

já percebi o "enorme" erro que estava a cometer....

eu estava a definir o vector (por exemplo) com 10 chars...e estava a tentar usar usar 11 chars...("não estava a contar com o 0")

e claro se eu não definir o '\0' para aparecer no fim da string, num vector de chars nunca irá aparecer....(mas no então, salvo erro, aparecem "sozinhos" quanto crio um vector para strings)

desculpa lá a trabalheira toda que tiveste a explicar, mas não volto a cometer o mesmo erro...

mais um vez obrigado, não só pela correcção, mas principalmente pela explicação

Fika Bem

Share this post


Link to post
Share on other sites
bubulindo

Só podias não cometer o mesmo erro, se percebesses porque o cometeste. E para isso, alguém tem de explicar ou tens de passar muitas horas às voltas com o programa para perceber o que se passou.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
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

×
×
  • 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.