• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed linux - "naruszenie ochrony pamięci (zrzut pamięci)"

0 głosów
3,418 wizyt
pytanie zadane 21 grudnia 2020 w C i C++ przez komboboost0 Użytkownik (570 p.)
zamknięte 21 grudnia 2020 przez komboboost0

Cześć. Napisałem program który ma obliczać liczbę pi. Przy niektórych argumentach program działa jak należy (np. 10 oraz 3), jednak przy innych wyskakuje błąd (np. 10 oraz 4) - "naruszenie ochrony pamięci (zrzut pamięci)".

#include <stdlib.h>
#include <stdio.h>
#include <float.h>
#include <string.h>
#include <pthread.h>
#include <time.h>

double pi = 1;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* piSum(void* arg) {
    	char *args = (char*)arg ;
    	char* p = strtok(args, " ");
    	char* array[3];

    	for (int i = 0; p != NULL; i++)
    	{
        	array[i] = p;
        	p = strtok(NULL, " ");
    	}

    	unsigned long thread = atoi(array[0]);
    	unsigned long w = atoi(array[1]);
    	unsigned long zakres = atoi(array[2]);
    	unsigned long zakresN = atoi(array[3]);

    	pthread_t self = pthread_self();

        unsigned long first = 1 + ((thread-1) * zakres);
    	double iloczyn = 1;
    	if (thread == 1) {
        	fprintf(stdout, "thread:%lxd\tsize=%ld\tfirst=%d\n", self, zakres, 1);
        	for (unsigned long index = 1; index <= zakres; index++) {
            		double nawias = 2 * index;
            		iloczyn *= (nawias * nawias) / ((nawias - 1) * (nawias + 1));
        	}
    	}
    	else if (thread < w) {
        	fprintf(stdout, "thread:%lxd\tsize=%ld\tfirst=%ld\n", self, zakres, first);
        	for (unsigned long index = first ; index < first + zakres; index++) {  		
                    double nawias = 2 * index;
            		iloczyn *= (nawias * nawias) / ((nawias - 1) * (nawias + 1));
        	}
    	}
    	else if(thread == w){
        	fprintf(stdout, "thread:%lxd\tsize=%ld\tfirst=%ld\n", self, zakresN, first);
        	for (unsigned long index = first; index < first + zakresN; index++) {
            		double nawias = 2 * index;
            		iloczyn *= (nawias * nawias) / ((nawias - 1) * (nawias + 1));
        	}
    	}

	fprintf(stdout, "thread:%lxd\tprod=%.20f\n", self, iloczyn);

	pthread_mutex_lock(&mutex);
	pi = pi * iloczyn;
	pthread_mutex_unlock(&mutex);

	pthread_exit(0);
}

int main(int argc, char* argv[]){
	unsigned long n = atoi(argv[1]);
	unsigned long w = atoi(argv[2]);
	int boolFlag = 0;
	if(n <= 1 || n >= 1000000000){
		fprintf(stderr, "n musi spelniac warunek 1<n<1000000000\n");
		boolFlag = 1;
	}
	if(w <= 1 || w >= 100){
		fprintf(stderr, "w musi spelniac warunek 1<w<100\n");
		boolFlag = 1;
	}

	if(boolFlag) return 0;
    	unsigned long reszta = n % w;
    	unsigned long zakres = 0;
    	unsigned long zakresN = 0;

    	if (reszta) {
        	zakres = (n - reszta) / w;
        	zakresN = zakres + reszta;
    	}
    	else {
		zakres = n / w;
        zakresN = zakres;
    	}
    	pthread_t threads[w];
    	char data[w][20];
        clock_t t1 = clock();
    	for (unsigned long i = 1; i <= w; i++)
    	{
        	sprintf(data[i], "%ld %ld %ld %ld", i, w, zakres, zakresN);
        	pthread_create(&threads[i], NULL, piSum, data[i]);
    	}
    	for (int i = 1; i <= w; i++) {
        	pthread_join(threads[i], NULL);
    	}
        clock_t t2 = clock();
        double time_s = ((double)t2 - (double)t1) / CLOCKS_PER_SEC;
    	printf("w /threads pi = %.20f\ttime=%f\n", pi*2, time_s);
        
        pi = 1;
        t1 = clock();
        for (int i = 1; i <= n; i++){
            double nawias = 2 * i;
            pi *= (nawias * nawias) / ((nawias - 1) * (nawias + 1));
        }
        t2 = clock();
        time_s = time_s = ((double)t2 - (double)t1) / CLOCKS_PER_SEC;
        printf("wo/threads pi = %.20f\ttime=%f\n", pi*2, time_s);
return 0;
}

O co może chodzić? Pierwszy raz spotykam się z takim błędem.

komentarz zamknięcia: Rozwiązałem problem samodzielnie.
1
komentarz 21 grudnia 2020 przez overcq Pasjonat (22,630 p.)

Może najpierw popraw błędy...

untitled.c:26:38: warning: array index 3 is past the end of the array (which contains 3 elements) [-Warray-bounds]
        unsigned long zakresN = atoi(array[3]);
                                     ^     ~
untitled.c:15:9: note: array 'array' declared here
        char* array[3];
        ^
untitled.c:111:25: warning: multiple unsequenced modifications to 'time_s' [-Wunsequenced]
        time_s = time_s = ((double)t2 - (double)t1) / CLOCKS_PER_SEC;
               ~        ^
2 warnings generated.

 

komentarz 21 grudnia 2020 przez komboboost0 Użytkownik (570 p.)
Pozbyłem się ich, ale błąd z pierwszego postu wstępuje nadal :/
komentarz 21 grudnia 2020 przez komboboost0 Użytkownik (570 p.)
Już sobie poradziłem. Problemem była linijka

char data[w][20];

Wystarczyło podmienić na

char data[w + 1][20];

Podobne pytania

0 głosów
1 odpowiedź 334 wizyt
pytanie zadane 23 stycznia 2023 w C i C++ przez sergion Nowicjusz (150 p.)
0 głosów
0 odpowiedzi 354 wizyt
pytanie zadane 13 kwietnia 2019 w C i C++ przez hidden55 Początkujący (270 p.)
0 głosów
2 odpowiedzi 1,549 wizyt
pytanie zadane 24 października 2016 w C i C++ przez Kapi2222 Obywatel (1,220 p.)

93,729 zapytań

142,668 odpowiedzi

323,283 komentarzy

63,288 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...