Vetor Gigante = Segmentation fault [RESOLVIDO]

1. Vetor Gigante = Segmentation fault [RESOLVIDO]

Ana Paula Grossi
anagrossi

(usa Ubuntu)

Enviado em 19/06/2017 - 05:23h

Olá! Tenho o seguinte código e preciso fazê-lo funcionar com um vetor de 1,6 milhão de posições, mas quando tento recebo o mensagem "Segmentation fault (core dumped)". Como proceder?

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<omp.h>
#define MAX 1600000

void intercalar(int array[], int aux[], int ini1, int ini2, int fim2);
void mergeSort(int array[], int temp[], int esq, int dir);

int main() {

int array[MAX];
int cont;

srand(time(NULL));

for (cont = 0; cont < MAX; cont++) {
array[cont] = rand() % MAX + MAX;
}

FILE *salvatxt;
salvatxt = fopen("ordenado.txt", "w");

fprintf(salvatxt, "Desordenado: \n");
for (cont = 0; cont < MAX; cont++) {
fprintf(salvatxt, "%d, ",array[cont]);
}

int aux[MAX];


#pragma omp parallel
{
mergeSort(array, aux, 0, MAX);
int cont;
int divide = MAX / 32;

#pragma omp for schedule(dynamic,divide) nowait

for (cont = 0; cont < MAX; cont++)
printf("%d, ", array[cont]);

}

fprintf(salvatxt, "\nMerge Sort aplicado:");
for (cont = 0; cont < MAX; cont++) {
fprintf(salvatxt, "%d, ", array[cont]);
}
return 0;

}

void intercalar(int array[], int aux[], int ini1, int ini2, int fim2) {
#pragma omp parallel
{
int in1 = ini1, in2 = ini2, fim1 = in2 - 1, au = 0, cont;
int tid = omp_get_thread_num();

#pragma omp sections
{
#pragma omp section
{
while (in1 <= fim1 && in2 <= fim2) {
if (array[in1] < array[in2]) {
aux[au++] = array[in1++];
} else {
aux[au++] = array[in2++];
}
}
}
#pragma omp section
{
while (in1 <= fim1) {
aux[au++] = array[in1++];
}
}
#pragma omp section
{
while (in2 <= fim2) {
aux[au++] = array[in2++];
}
}
#pragma omp section
{
for (cont = 0; cont < au; cont++) {
array[cont + ini1] = aux[cont];
}
}
}
}
}
void mergeSort(int array[], int temp[], int esq, int dir) {
int meio;
if (esq < dir) {
#pragma omp parallel sections
{
#pragma omp section
{
meio = (esq + dir) / 2;
}
#pragma omp section
{
mergeSort(array, temp, esq, meio);
mergeSort(array, temp, meio + 1, dir);
intercalar(array, temp, esq, meio + 1, dir);
}
}
}

}



  


2. Re: Vetor Gigante = Segmentation fault [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 19/06/2017 - 09:28h

#define MAX 1600000
int array[MAX];

Melhor tentar alocar o vetor com malloc();
Exemplo:
tipo *vetor = malloc(sizeof(tipo)*qtdeElementos);
sizeof(tipo) indica o tamanho em bytes do tipo passado, tipo, pode ser qualquer tipo do C ou do seu programa, como int, float, etc.
qtdeElementos = numero total de elementos no vetor.

malloc retorna um ponteiro para a área de memoria alocada.
Se der erro na alocação o retorno de malloc é nulo (NULL) e o programa deve ser interrompido, verifique se retorna NULL.

Depois lá no final do programa, você deve liberar a memoria alocada com free(vetor), não esqueça de fazer isso pra não gerar memory leaks.



3. Re: Vetor Gigante = Segmentation fault [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/06/2017 - 10:21h

O problema é que você está tentando criar esse vetor gigante na pilha (memória automática, no jargão do C), cujo limite de alocação é geralmente mais restrito do que outros tipos de memória.

O SamL indicou uma solução adequada, sugerindo que você use o tipo de memória que costuma ter menos restrições possíveis. Mas existem outras abordagens possíveis:

- aumentar o limite para alocação de memória na pilha antes de executar o programa (não recomendado, e fora do controle do próprio programa);

- usar memória estática, declarando seu array como global (fora da função), ou mantendo local (dentro da função) mas com atributo explícito static.


4. Re: Vetor Gigante = Segmentation fault [RESOLVIDO]

Ana Paula Grossi
anagrossi

(usa Ubuntu)

Enviado em 20/06/2017 - 08:16h

Obrigada, gente!! Vocês são demais! (:






Patrocínio

Site hospedado pelo provedor HostGator.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Viva o Android

Tópicos

Top 10 do mês

Scripts