Mam problemy z pamięcią, czyli dlaczego przy tworzeniu tablicy jej brakuje?

0
#define DT 2050000
	wchar_t *tab;
	tab=(wchar_t*) malloc(DT * sizeof(*tab));
	if(*tab==0)
	{
		printf("brak pamieci\n");
		return 0;
	}

Tutaj malloc() zwraca 0, bez obsługi błędu konsola przy próbie wywołania wywala: "Naruszenie ochrony pamięci (zrzut pamięci)"
"

	wchar_t tab[DT];

Za to kiedy utworzę tablicę statyczna o tym samym rozmiarze, program działa i wszystko jest cacy.

Drugą sprawą jest to że, kiedy ustawię DT na 3000000, konsola wywala program w obu przypadkach.

Macie jakieś pomysły odnośnie przyczyny i możliwego rozwiązania problemu?

1

Nie brakuje pamieci, ale masz literówkę:

if (tab==0)

Niżej pewnie masz inny błąd i stąd "Naruszenie ochrony pamięci (zrzut pamięci)"

0

Naprawiłem literówkę, ale problem się nie zmienił

	if(tab==NULL)
0

Pokaż więcej kodu jeśli nadal masz crash-a.
Radzę też pilnie nauczyć się podstaw korzystania z debugger-a w IDE, z którego korzystasz.

0

Czy w sizeof nie powinno być użyte wchar_t?
Bo patrząc na zapis statycznej deklaracji, to ma być tablica wartości, a nie tablica wskaźników...

0
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
#include <sys/time.h>
#define DT 3050000
#define DL_ACSII 10000
#define DL_PL 381
int pobierz( wchar_t tab[])
{
	FILE *fp;
	fp=fopen("tekst.txt","r");
	int i=0;
	while(1)
	{
		if(i==DT)
			return (-1);
		tab[i]=fgetwc(fp);
		
		if(tab[i]==WEOF)
			return (i);
		++i;
	}
}
void drukuj(wchar_t tab[],int dn)
{
	int i=0;
	while(i<dn)
	{
		//printf("\n");
		freopen(NULL, "w", stdout);
		putwchar(tab[i]);
		freopen(NULL, "w", stdout);
		++i;
	}
	printf("\n");
	freopen(NULL, "w", stdout);
}

int licz_znaki(wchar_t tab[],int ile[],int dn)
{
	int wewl=0;
	for(int k=0;k<DL_ACSII;++k)
	{
		ile[k]=0;
	}	
	
		for(int k=0;k<dn;++k)
	{
		++ile[tab[k]];
		++wewl;
		
	}	
	
	return wewl;
}

void drukuj_znaki(int ile[],double frek[])
{
	printf("\n*********\n");
	int i=0;
	int max=0;
	int k=0;
	
	while(i<DL_PL)
	{
		if(ile[i]>max)
			max=ile[i];
		++i;
	}
	i=max;
	while(i>0)
	{
		while(k<DL_PL)
		{
				if(ile[k]==i)
				{
					switch(k)
					{
						case 10:
							printf("LF-Uni:%d",k);
							break;
						case 32:
							printf("spacja-Uni:%d",k);
							break;
						case 9:				
							printf("tab-Uni:%d",k);
							break;
						default:
							freopen(NULL, "w", stdout);
							putwchar(k);
							freopen(NULL, "w", stdout);
							printf("-Uni:%3d",k);
							freopen(NULL, "w", stdout);
							break;
					}
						//printf("%d,",k);
						printf(" ile:%3d frek:%.8f\n",ile[k],frek[k]);
				}
			++k;
		}
		k=0;
		--i;	
	}
}

int usun_nieprawidlowe(int ile[])
{
	int NZ=0;
	for(int k=0;k<DL_ACSII;++k)
	{
			if(ile[k]>0 && k>127 && !(k==260||k==262||k==280||k==321||k==323||k==211||k==346||k==377||k==379||k==261||k==263||k==281||k==322||k==324||k==243||k==347||k==378||k==380))
		{
			NZ+=ile[k];
			ile[k]=0;
		}
	}
	return NZ;
}

void licz_frek( double frek[],int ile[], double dn)
{
int i=0;
	while(i<DL_ACSII)
	{
		frek[i]=((100*ile[i])/dn);
		++i;
	}
}
int formatuj_PWN(int ile[], int dn)
{
	int wyf=0;
	int i=0;
	while(i<97)
	{
		wyf+=ile[i];
		ile[i]=0;
		++i;
	}
	i=123;
	while(i<128)
	{
		wyf+=ile[i];
		ile[i]=0;
		++i;
	}
	
	i=97;
	int k=65;
	while(i<122)
	{
		ile[i]+=ile[k];
		ile[k]=0;
		++k;
		++i;
	}

	ile[261]+=ile[260];
	ile[260]=0;
	ile[263]+=ile[262];
	ile[262]=0;
	ile[281]+=ile[280];
	ile[280]=0;
	ile[322]+=ile[321];
	ile[321]=0;
	ile[324]+=ile[323];
	ile[323]=0;
	ile[243]+=ile[211];
	ile[211]=0;
	ile[347]+=ile[346];
	ile[346]=0;
	ile[378]+=ile[377];
	ile[377]=0;
	ile[380]+=ile[379];
	ile[379]=0;
	ile[32]=0;
	
	return wyf;
}


int main()
{

struct timeval stop, start;
gettimeofday(&start, NULL);

	setlocale(LC_ALL,"");
	int dn=0;
	int NZ=0;
	int wyf=0;

	wchar_t tab[DT];
	if(tab==NULL)
	{
		printf("brak pamieci\n");
		
	}
	
	int ile[DL_ACSII];
	double frek[DL_ACSII];

	dn=pobierz(tab);
	if(dn<0)
		printf("tl;dr\n");
	else
	{
		
		licz_znaki(tab,ile,dn);
		//drukuj(tab,dn);
		NZ=usun_nieprawidlowe(ile);
		wyf=formatuj_PWN(ile,dn);
		licz_frek(frek,ile,dn-NZ-wyf);
		
		
		drukuj_znaki(ile,frek);
		
	}
printf("\nLiczba wszystkich znaków:%d\nLiczba znaków nieprawidłowych:%d\nLiczba znaków prawidłowych:%d\nLiczba znaków usuniętych(format):%d\nLiczba prawidłowych znaków po formatowaniu:%d\n",dn,NZ,dn-NZ,wyf,dn-NZ-wyf);

gettimeofday(&stop, NULL);
printf("took %lu\n", (stop.tv_usec - start.tv_usec));
return 0;
}

Program ma analizować liczbę wystąpień poszczególnych znaków, wiem że, marnie napisany ale dopiero się uczę.
Moim IDE jest xed i konsola basha a debuggerem getchar() i printf(), nie wiem czy to dobre rozwiązanie.

0

Więcej, to czy wywala czy nie zależy też od długości tekstu który jest w pliczku tekst.txt

1

A czy musisz cały plik trzymać w pamięci? Nie możesz go parsować częściami, robiąc statystyki w locie?

2

IDE - Integrated Development Environment
To jest coś co integruje wiele narzędzi programistycznych:

  • edytor tekstu
  • debugger
  • kompilator, tool chain
  • inne narzędzia (np kontrola wersji, valgrind, ...).

xed - się więc nie kwalifikuje jako IDE, to jest tylko edytor z kolorowaniem składni.
Skoro nie używasz np CodeBlocks/Qt Cretor/Eclipse/CLion/......
i maltretujesz się linią poleceń, to powinieneś się zapoznać z gdb i jak tego używać. Przykład (nie oglądałem, więc może być do ...y)

2

No przepraszam ale najpierw mówisz o jakimś mallocu a potem w kodzie masz wchar_t tab[DT]; więc robisz tablicę na stosie. To jest kilka MB więc może nie dać rady.

1 użytkowników online, w tym zalogowanych: 0, gości: 1