Problem z funkcją realloc.

0

Witam funkcja realloc wydaje się nie działać, gdy wpisuje tekst z liczbą wierszy ponad 100 visual studio się wyłącza :). Gdyby ktoś miał jakieś inne zastrzeżenia do kodu to proszę o opinie.

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 1000
const int krok = 100;
FILE *fd;
void error(int nr);
int ile_slow(char *);
int main()
{
	char bufor[MAX_LINE];
	int len, i, l;
	if (!(fd = fopen("tekst.txt", "r")))
	{
		error(2);
	}
	i = 0;
	l = 0;
	int dlugosctablicy = krok;
	char **ilosc_lini = (char **)malloc(100 * sizeof(char*));
	while (fgets(bufor, MAX_LINE, fd)) 
	{
		if (i == dlugosctablicy)
		{
			dlugosctablicy += krok;
			char **nowelinie = (char**)realloc(ilosc_lini, krok * sizeof(char *)); 
			if (!nowelinie) error(5);	
		}
		len = strlen(bufor); 
		bufor[len - 1] = '\0';
		char *napis = (char*)malloc(len + 1 * sizeof(char));
	
		strcpy(napis, bufor); 
		ilosc_lini[i] = napis; 
		l += ile_slow(ilosc_lini[i]);
		i++;
	}
	system("pause");
}
1

Realokujesz zawsze krok * sizeof(char*), czyli 100 * sizeof(char*).

0

char nowelinie = (char)realloc(ilosc_lini, dlugosctablicy * sizeof(char *)); zmieniłem dalej coś przycina tego visuala.

0

Pewnie dlatego, że nigdzie nie używasz nowe_linie. Btw: nazwa ilosc_lini jest niepoprawna na kilku płaszczyznach: jest po polsku, ma błąd ortograficzny, nie odnosi się do zawartości.

0

A masz może jakiś pomysł jak to obejść? Bo:

if (dlugosctablicy < 100) l += ile_slow(ilosc_lini[i]);
else l += ile_slow(nowelinie[i]);

nie mogę zrobić bo kompilator uważa, że "nowelinie" jest niezdefiniowana. ~wiem dlaczego,ale jak to obejść? Mogę dodać na początku np.

char **nowelinie = (char **)malloc(100 * sizeof(char*));
0

Nadpisuj stary wskaźnik zamiast deklarować nowy.

0

W ten sposób?

char **ilosc_linii = (char**)realloc(ilosc_linii, dlugosctablicy * sizeof(char *));
0

Tak deklarujesz nową zmienną. Przypisanie do zmiennej wygląda tak:

a = b;
0

char **nowelinie = (char**)realloc(ilosc_lini, krok * sizeof(char *));
deklarowane w bloku i natychmiast tracone po jego wyjściu.
Więc ofc memory leak. Nie specjalnie nawet sprawdzałem wygląda po dyskusji, że niemal wsyztsko co się dało zostało spieprzone ;-)

0

A dlaczego muszę tworzyć nowe zmienne?
zostawiłem tak

char **ilosc_linii = (char**)realloc(ilosc_linii, dlugosctablicy * sizeof(char *));

wyskakuje:
ps. mogę sprawiać wrażenie, że się na tym jako tako znam, tak naprawdę na tekstach bawię się od wczoraj.

0
ilosc_linii = (char**)realloc(ilosc_linii, dlugosctablicy * sizeof(char *));

PS: zmienna ilość linii nadal nie nazywa się poprawnie.

0

Działa dzięki wielkie.
wiersz = (char**)realloc(wiersz, dlugosctablicy * sizeof(char *)); ~taka nazwa może być :P?

0

Bliżej, ale jak już to wiersze ;​)

0

Racja, dzięki jeszcze raz!

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