C - tablica dynamiczna

C - tablica dynamiczna
KA
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 4 lata
  • Postów:7
0

Cześć, próbuje zrobić program, który wyszukuje liczby pierwsze w podanym przedziale sitem Eratostenesa. Zrobiłem to na normalnej tablicy, ale w zadaniu musi być użyta tablica dynamiczna. Spróbowałem tak to zrobić, działa, ale wyskakuje jakiś błąd, prawdopodobnie związany z pamięcią, ale nie wiem z czego wynika i nie umiem się tego dopatrzeć. Z góry dziękuję za pomoc ```c

Kopiuj
#include "pch.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>


int main()
{
	int a, b, limit, i, j;
	printf("Podaj przedzial\n");
	scanf_s("%d", &a);
	scanf_s("%d", &b);
	int *tablica = (int*)malloc(b*sizeof(int));
	limit = floor(sqrt(b));
	//inicjuj tablice
	for (i = 1, j = a ; i <= b; i++, j++) tablica[i] = j;
	//algorytm - sito eratostenesa
	for (i = 2; i <= limit; i++)
	{
		if (tablica[i] != -1)
		{
			j = i + i;
			while (j <= b)
			{
				tablica[j] = -1;
				j += i;
			}
		}
	}
	//wypisz wynik
	printf("Liczby pierwsze z zakresu od %d do %d\n\n", a, b);
	for (i = a; i <= b; i++) if (tablica[i] != -1) printf("%d, ", i);
	free(tablica);
	return 0;
}
edytowany 1x, ostatnio: kq
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Szczecin
1
Kopiuj
for (i = 1, j = a ; i <= b; i++, j++) tablica[i] = j;

Masz UB, tablice są indeksowane od zera.


KA
To nic nie zmienia, jest tak samo
daniel1302
  • Rejestracja:ponad 16 lat
  • Ostatnio:2 dni
0

A podasz nam ten blad? :) Wiekszosc pewnie nie ma jak tego skompilowac bo uzywasz gowno funkcji z M$


Head of the pprof.
KA
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 4 lata
  • Postów:7
0

HEAP CORRUPTION DETECTED

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Jakie wpisujesz przedziały?


KA
2-100, 4-123, na każdym tak samo
Patryk27
Pokaż poprawiony kod.
KA
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 4 lata
  • Postów:7
0
Kopiuj
#include "pch.h"
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>


int main()
{
	int a, b, limit, i, j;
	printf("Podaj przedzial\n");
	scanf_s("%d", &a);
	scanf_s("%d", &b);
	int *tablica = (int*)malloc(b*sizeof(int));
	limit = floor(sqrt(b));
	//inicjuj tablice
	for (i = 0, j = a ; i <= b; i++, j++) tablica[i] = j;
	//algorytm - sito eratostenesa
	for (i = 2; i <= limit; i++)
	{
		if (tablica[i] != -1)
		{
			j = i + i;
			while (j <= b)
			{
				tablica[j] = -1;
				j += i;
			}
		}
	}
	//wypisz wynik
	printf("Liczby pierwsze z zakresu od %d do %d\n\n", a, b);
	for (i = a; i <= b; i++) if (tablica[i] != -1) printf("%d, ", i);
	free(tablica);
	return 0;
}
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
1

Nadal masz off-by-one: while (j <= b), i <= b;


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.