C, Dynamiczna alokacja pamięci, odczyt z pliku

0

Przejdę od razu do rzeczy. Przy kompilacji wyskakuje mi błąd w linijce przy "free(tab)". Męczę się z tym już parę godzin i przydałaby mi się jakaś wskazówka. Próbuję odczytać liczby z pliku, posortować je rosnąco i wyświetlić na ekranie. Dopiero zaczynam przygodę z C więc proszę o wyrozumiałość.

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
int *tab, n,x;
FILE *f;
f = fopen("plik.txt", "r"); //otwieram plik
fscanf(f,"%d", &n); //wczytuje pierwsza liczbe, ktora okresla ile jest kolejnych liczb (w tym wypadku w pliku jest 4 5 7 1 2)

tab = (int *)calloc(n, sizeof(int)); //alokuje sobie pamiec pod tablice
if (tab == NULL) 
{
	printf("Nie mozna przydzielic pamieci.\n");
	return -1;
}
for (int i = 0; i<n; i++)  //wczytuje kolejne liczby do tablicy
{
	fscanf(f, "%d", &x);
	
	tab[i] = x;
}
int z;
for (int j = 0; j < n; j++)
{
	for (int i = 0; i < n; i++) //porzadkuje liczby rosnaco
	{
		if (tab[i] > tab[i + 1])

		{
			z = tab[i];
			tab[i] = tab[i + 1];
			tab[i + 1] = z;
		}

	}
}
for (int i = 0; i < n; i++) //wypisuje uporzadkowane liczby na ekran
	printf("%d", tab[i]);

free(tab); //podczas kompilacji tu mi wyskakuje error. 
	fclose(f);

system("PAUSE");
return 0;

}

0

Wstaw kod w odpowiednie znaczniki.

  1. tab ma być wskaźnikiem: *tab = NULL;.
  2. Musisz zaalokować n+1 miejsca, a nie n.
  3. Tak samo f, też musi być wskaźnikiem: FILE *f;
0

"-Wall" w opcji kompilacji i kompilator mówi w czym problem
https://wandbox.org/permlink/jY34WO8V1lGpoTrt

prog.cc30: error: no match for 'operator=' (operand types are 'FILE {aka _IO_FILE}' and 'FILE* {aka _IO_FILE*}')
f = fopen("plik.txt", "r");

Edit: teraz widzę, że to tylko błąd formatowania pytania, a nie błąd kompilacji.

0

Pomogło zaalokowanie n+1. Dzieki!;]

1
Slevunio napisał(a):

Pomogło zaalokowanie n+1. Dzieki!;]

TO NIE JEST PROBLEM!
Rzeczy nie naprawia się bez zrozumienia co jest źle.
A problemem jest źle napisany algorytm sortujący, który wykracza poza zakres tablicy.
Nie zauważyłeś, że w danych wyjściowych pojawia się wartość, której nie powinno być?

0

Były tylko takie dane, których nie powinno tam być. Po prostu myślałem, że alokując pamięć na tablicę 4 zmiennych powinienem zaalokować 4* int.
Chociaż dalej nie działa to do końca poprawnie. Co prawda w danych wyjściowych otrzymałem posortowaną tablicę, ale wciąż przy free(tab) pojawia mi się błąd "Program: ...17\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe

HEAP CORRUPTION DETECTED: after Normal block (#70) at 0x010A4C88.
CRT detected that the application wrote to memory after end of heap buffer." Nie jestem pewny do końca o co tu chodzi. Po zamknięciu pliku i zwolnieniu pamięci program się kończy. Nie próbuje niczego dopisywać.

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