Ir ao conteúdo
  • Cadastre-se
Schubert M.

C Problema com alocação de memória

Recommended Posts

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;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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>

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC desculpe a demora, bem... irei tentar isto e lhe retorno resposta aqui.

 

De qualquer forma, obrigado até agora 😋

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Schubert M. De nada, e pode demorar o quanto for necessário pois o problema é seu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×