Cześć,
miałem do napisania prosty program który wczytuje z pliku tekstowego m liczb w postaci binarnej w taki sposób ze pierwszym znakiem musi zawsze byc '1' (np.1001, 100, 10101111, 1110010 gdzie 1 wiersz 1 liczba) do dwuwymiarowej tablicy dynamicznej typu char. Nastepnie napisac funkcje bin2int konwertująca owe liczby na liczby na typu int. Potem posegregowac je malejąco. I tu wszystko jest ok i działa natomiast jedyny problem jest z tym ze gdy próbuje zwolnić pamięć z tej tablicy to program crashuje a robie to tak jak na książkowych przykładach :< Moze ktos zauwazy w czym jest problem i da jakies tipy :)
#include <stdio.h>
#include <stdlib.h>
int bin2int(char *t);
int main()
{
int m, n; //m-ile liczb z pliku wczytac,n-maksymalna dlugosc liczby
printf("Podaj maksymalna ilosc wczytanych liczb i maksymalna dlugosc liczby:\n");
scanf("%d %d", &m, &n);
//Tworze 2wymiarowa tablice dynamiczna
char **tab = malloc(m*sizeof(char*));
for (int i = 0; i < n;i++)
tab[i] = malloc(n*sizeof(char));
const char nazwa_pliku[] = "test.txt";
FILE *fp;
if ((fp = fopen(nazwa_pliku, "r")) == NULL){
perror("Blad");
exit(0);
}
else
printf("Plike do odczytu zostal otwarty\n");
//Wczytywanie z pliku do tablicy
printf("Wczytano\n");
for (int i = 0; i < m; i++)
{
if (fscanf(fp, "%s", tab[i]) != 1) break;
else
printf("%s --> %d\n", tab[i],bin2int(tab[i]));
}
putchar('\n');
//Sortowanie
for (int i = 1; i < m; i++)
{
for (int j = 0; j < m - i; j++)
{
if (bin2int(tab[j]) <= bin2int(tab[j + 1]))
{
char *tmp;
tmp = tab[j];
tab[j] = tab[j + 1];
tab[j + 1] = tmp;
}
}
}
//Po posortowaniu
printf("Po posortowaniu:\n");
for (int i = 0; i < m; i++)
{
printf("%s -- > %d\n", tab[i], bin2int(tab[i]));
}
//Zwalniam pamiec
for (int i = 0; i < m; i++)
{
free(tab[i]);
}
free(tab);
fclose(fp);
printf("Koniec programu\n");
return 0;
}
int bin2int(char *t)
{
int dlugosc = strlen(t);
int wynik = 0;
for (int i = 0; i < dlugosc; i++)
{
if (t[i] == '1') wynik = wynik * 2 + 1;
else if (t[i] == '0') wynik *= 2;
}
return wynik;
}