Ir ao conteúdo

Posts recomendados

Postado

Boa noite, estou com um projeto em C e há um certo problema.

 

Um programa que faz a leitura de uma tabela, com dados (linhas com informações separadas por \t) e em alguns momentos, como por exemplo ao fazer a leitura da variável n (notes), em alguns momentos ele passa de 1000 caracteres e o programa compila normalmente, porém não executa.

 

No código, na struct scientific_info há o n (notes), que botei 1000 como tamanho, sem constar todas as outras demais variáveis com diferentes tamanhos.

 

Imagino que o problema seja em alocar tudo isto na memória. Gostaria de saber se há uma forma de resolver isto.

/*		| DESCRIPTION |
	scientificname	=	sn
	country			=	ctry
	latitude		=	lat
	longitude		=	log
	collectornumber	=	cn
	collector		=	c
	collectioncode	=	cc
	identifiedby	=	idb
	locality		=	l
	stateprovince	=	sp
	county			=	cty
	notes			=	n
*/

#include <stdio.h>
#include <string.h>

#define TAM 1000

typedef struct local_info {
	char ctry[10], lat[20], log[20], l[750], sp[30], cty[30];
} LOCAL_;

typedef struct collector_info {
	char cn[25], c[500], cc[30];
} COLLECTOR_;

typedef struct scientific_info {
	char sn[50], idb[100], n[1000];
	COLLECTOR_ collector; 
	LOCAL_ local;
} INFO_;

int main() {

	int i, j;
	char top[100];
	INFO_ info[TAM];

	scanf("%[^\n]", top);

	for (i=0; i<TAM; i++) {
		scanf("%[^\t]s", info[i].sn);
		getchar();
		scanf("%[^\t]s", info[i].local.ctry);
		getchar();
		scanf("%[^\t]s", info[i].local.lat);
		getchar();
		scanf("%[^\t]s", info[i].local.log);
		getchar();
		scanf("%[^\t]s", info[i].collector.cn);
		getchar();
		scanf("%[^\t]s", info[i].collector.c);
		getchar();
		scanf("%[^\t]s", info[i].collector.cc);
		getchar();
		scanf("%[^\t]s", info[i].idb);
		getchar();
		scanf("%[^\t]s", info[i].local.l);
		getchar();
		scanf("%[^\t]s", info[i].local.sp);
		getchar();
		scanf("%[^\t]s", info[i].local.cty);
		getchar();
		scanf("%[^\n]s", info[i].n);
		getchar();
	}

	printf("%s", top);
	for (i=0; i<TAM; ++i)
		printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", info[i].sn, info[i].local.ctry, info[i].local.lat, info[i].local.log, info[i].collector.cn, info[i].collector.c, info[i].collector.cc, info[i].idb, info[i].local.l, info[i].local.sp, info[i].local.cty, info[i].n);

	return 0;
}

 

Postado

Olá@Schubert M.

1 hora atrás, Schubert M. disse:

Um programa que faz a leitura de uma tabela, com dados (linhas com informações separadas por \t) e em alguns momentos, como por exemplo ao fazer a leitura da variável n (notes), em alguns momentos ele passa de 1000 caracteres e o programa compila normalmente, porém não executa.

 

De forma geral os compiladores detectam erros de sintaxe.

Os erros lógicos aparecem apenas quando o programa já está em execução.

Se em alguns momentos o buffer supera 1000 caracteres então esse é um erro lógico.

 

E então ???

Postado

OI @AnsiC

 

Sim, seria um erro lógico, me expressei mal

 

Eu já aumentei este valor de 1000 caracteres para 2000, 3000.

 

Indiferente, pois as strings de n nenhuma passa de uns 1300 caracteres, o que eu quis me referir é que ao botar, por exemplo de n[600] para n[1000] o programa é compilado, porém ao dar como entrada (./prog < Entrada) o programa fica 5 segundos freezado e sai.

 

Meu professor de programação de computador mencionou ser problema de locação na memória e que botar como struct universal iria resolver por alocar mais memória, assim ele disse.

 

Porém não resolveu, não sei se compreendeste agora, mas era este o problema em si. Alocar todos os dados de entrada sem cortar o final da string mas  o programa não "aguenta".

  • Curtir 1
Postado

Bem se o problema está na pilha do sistema eu não saberia precisar, mas com relação a memória você experimentar a afirmação do seu professor de outro maneira: Usando a memória heap se puder; por meio da função malloc. Se não houver crashed / erro então era memória mesmo, mas se dê ai voltamos a conversar.

// PILHA
// char top [ 100 ];
// INFO_ info [ TAM ];

// DINAMICA
char  * top  = malloc( sizeof (char  [ 100 ]) );
INFO_ * info = malloc( sizeof (INFO_ [ TAM ]) );

* para usar malloc inclua <stdlib.h>

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!