erro no codigo com strlen() [RESOLVIDO]

1. erro no codigo com strlen() [RESOLVIDO]

Max Prass
jeisonmp

(usa Ubuntu)

Enviado em 17/09/2012 - 19:10h

Olá galera.. sou novo aqui no fórum e sou estudante de eng. da computação. Programo C há 2 anos. Estou a criar um montador do qual lê de um arquivo os códigos assemblies e converte para instruções de máquina. Trata-se de uma máquina virtual que estou criando.

Porém estou com um problema que está me chateando há algum tempo.

Eu tenho uma sub-rotina em que eu passo uma string por valor em um dos parâmetros e dentro dessa rotina eu faço uma contagem utilizando a função strlen() de string.h.

Eu estou lendo as strings em linha. E cada linha representa uma string do qual eu passo para esse parâmetro para então converter para instruções de máquina.

O fato é que quando a string esta vazia eu não consigo contá-la. E pior ainda, estranhamente quando eu adiciono uma função que eu criei que conta a string antes de verificar se ela está vazia ou não. Ela simplesmente conta certo.

Parece bruxaria. Se alguém puder me dar alguma luz eu agradeço muito.

O código é o que segue.


int GENERATE_ASSEMBLIES (Memory **inicio, Memory **fim, char c[])
{
#if SYSTEM == LINUX

//ESSE É TRECHO MÁGICO QUE FAZ FUNCIONAR A FUNÇÃO strlen() ABAIXO.
//SE EU TIRAR ELA, A STRING FICA VAZIA E O MEU CÓDIGO NEM CHEGA ATÉ AQUI.

int cont = strlen_max(c, strlen(c));

if (strlen(c) == 1 || strlen(c) == 0)
{
MEMORY_add(inicio, fim, c, "");
return 1;
}
#endif

#if SYSTEM == WINDOWS
{
if (!strcmp(c, "") == 1)
{
MEMORY_add(inicio, fim, c, "");
return 1;
}
}
#endif

int i = 0;

char instruction[5];
strcpy(instruction, "");

int count = strlen(c);

while (c[i] != ' ' && i <= count)
{
sprintf(instruction, "%s%c", instruction, c[i]);
i++;
}

if (!strcmp(instruction, "push") == 1)
{
//Essa função adiciona a string numa struct e retorna 1 se sucesso.
return (MEMORY_add(inicio, fim, c, "00"));
}

...//continua.


Obrigado!


  


2. incompatibilidade ao compilar c - linux vs windows

Max Prass
jeisonmp

(usa Ubuntu)

Enviado em 25/09/2012 - 18:45h

Eu ainda não consegui desvendar esse erro no linux. Estou um pouco desanimado com a programação no linux, porque estão me ocorrendo alguns erros, que aparentemente não deveriam ocorrer, e não tenho onde pesquisar.


3. Re: erro no codigo com strlen() [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/09/2012 - 23:49h

Não leve a mal -- aliás, por favor, veja com bons olhos --, mas sua mensgaem está muito difícil de entender, O código está mal formatado, e um [i] no meio do código foi interpredado pelo backend do fórum como tag para início do texto em itálico (você lembrou de colocar o código entre as tags [code] e [/code]?). O contexto de compilação não está claro (por exemplo, de onde vem o valor da macro não-padrão SYSTEM, que você aparentemente está usando para identificar se a plataforma de compilação é Linux ou Windows?), e vocâ não diz algumas coisas que poderiam nos ajudar a entender o fluxo de código, nem mostra um exemplo de entrada fornecida, para que se possa, de fato, avaliar se o resultado que você está obtendo é mesmo o que deveria obter.

Lembre-se de que a linguagem C foi feita no UNIX e para o UNIX (depois é que ela foi portada para outras máquinas e sistemas). É extremamente improvável que a função strlen(), que aliás é simplíssma no que faz, esteja com algum tipo de "erro" num sistema UNIX (que é o que o Linux imita) que não devesse se apresentar de forma idêntica noutro sistema qualquer, seja o Windows ou qualquer outro.

Aliás, a julgar pela jeito do que vai nos blocos ceracdos por #if e #end, tal distinção não deveria precisar existir de modo algum.

Mesmo sem muitas informações que poderiam ser úteis, eu arrisco um chute: se o seu programa estiver tratando código em Assembly que foi lido de um arquivo e se esse arquivo tiver sido gerado com num editor do Windows, é possível que a fonte dos seus problema seja a diferença na convenção usada pelos dois sistemas para representar quebras de linha em arquivos de texto (o UNIX usa apenas LF ('\n'), e o Windows usa CR seguido de LF ("\r\n")). No Windows, as funções de I/O de texto da biblioteca padrão se encarregam de converter implicitamente a sequência CR+LF em apenas LF se você não disser explicitamente que o arquivo é binário na hora em que o abre com a função fopen(); o UNIX nunca fará isso, pois não existe qualquer distinção entre arquivos de texto e arquivos binários.


4. Re: erro no codigo com strlen() [RESOLVIDO]

Max Prass
jeisonmp

(usa Ubuntu)

Enviado em 26/09/2012 - 10:00h

Imagina Paulo, agradeço muito a sua resposta. Como eu vi outros tópicos sem codificação pensei que não tivesse problema. Vou me lembrar nos próximos posts. Obrigado.

A macro que criei foi somente pra distinguir um sistema ou outro, ela é definida em um arquivo .h que tem no projeto, do qual é muito grande por isso não coloquei o código todo.

Você acertou perfeitamente o chute, é exatamente o que estou fazendo ali. Um exemplo seria ler de um arquivo que contém 3 linhas, na primeira e segunda linha contendo um palavra em cada, e na segunda não contendo nada, apenas usado o "enter". Esta segunda linha é que chega vazia no parâmetro no linux ("sem fim de arquivo", e no windows ela interpreta da forma como desejo. Portanto faz todo sentido o que você me falou, pois na função que criei eu altero o último caractere de tudo que entra ali colocando um \n no fim.

Realmente eu não conhecia estas informações, pois não fiz a cadeira de I/O ainda. Acho que eliminaria esse meu problema. Vou analisar a leitura das strings antes de entrar nessa função, tenho certeza que é o que você me falou.

É muito bom saber que posso contar com informações de quem realmente entende do assunto.

Obrigado.

Jeisonmp


5. Resolução

Max Prass
jeisonmp

(usa Ubuntu)

Enviado em 26/09/2012 - 11:05h

Só para concluir, explico como resolvi meu problema nas strings no linux, conforme o Paulo me indicou. Simplesmente colocando um 0 no fim do caracter, assim.


char instruction[20] = palavra //palavra lida de um arquivo.;
instruction[strlen(instruction)-1] = 0;

if (!GENERATE_ASSEMBLIES ( &inicio_mem,
&fim_mem,
instruction
)
{
return 0;
}


Lembrando que somente quando queria executar no linux.
Assim, quando eu passava a instruction no parametro, ela já estava correta.

Flw!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts