Erro ao retornar vetor por ponteiro [RESOLVIDO]

1. Erro ao retornar vetor por ponteiro [RESOLVIDO]

Lucas
DcoderLA

(usa Debian)

Enviado em 05/11/2020 - 17:45h

Boa noite a todos,

Estou implementando um algoritmo de ordenação por quick sort, onde quero contar o numero de atribuições e comparações deste. Tenho três funções, uma de partição, outra auxiliar para fazer o algoritmo e outra que chama esta última. Quero fazer as contagens na função de partição, e pra isso estou passando um ponteiro de vetor por parâmetro, o que ocorre é que na primeira vez que tento da certo, mas se tento executar o algoritmo uma segunda vez da falha de segmentação. Eis os códigos:

int particao(int *v, int ini, int fim, int *r) {

int aux;
int pivo = v[ini];
int i = ini + 1;
int j = fim;
static int troca = 0, comp = 0;

//retorno = malloc(2 * sizeof(int));

while (i <= j)
{
comp++;
while ((i <= j) && v[i] <= pivo) {
i++;
comp++;
}

while(v[j] > pivo) {
j--;
comp++;
}

if (i < j)
{
aux = v[i];
v[i] = v[j];
v[j] = aux;
troca++;
}
}

aux = v[ini];
v[ini] = v[j];
v[j] = aux;
//troca++;

// *c = comp;
// *t = troca;

r[0] = troca;
r[1] = comp;

return j;
}


/* Auxiliar para a ordenação por QUICK SORT */
int * quick_sortR(int *v, int ini, int fim) {

int j;
static int *retorno, *r;
static int troca = 0;
static int comp = 0;

retorno = malloc(2 * sizeof(int));
// r = malloc(2 * sizeof(int));

if (ini < fim)
{
comp++;
j = particao(v, ini, fim, r);
if(ini < (j -1)) {
quick_sortR(v, ini, fim);
troca++;
}

if((j+1) < fim) {
quick_sortR(v, j + 1, fim);
troca++;
}

}

retorno[0] = r[0];
retorno[1] = r[1];

// free(r);

return retorno;
}


/* Ordenação por QUICK SORT */
void quick_sort(int *v, int tam, int tipo_v) {

int *r;
// FILE *arq;

r = quick_sortR(v, 0, tam -1);

//quick_sortR(v, 0, tam -1);

printf("\nTrocas: %d Comparações: %d\n", r[0], r[1]);

}


void gera_vetor(int *v, int n, int tipo) {

int i = 0;

if (tipo == 1)
{
srand(time(NULL));
for (i = 0; i < v10; i++)
v[i] = rand() % 10;
}

if (tipo == 2)
{
for (i = 0; i < n; i++)
v[i] = i;
}

if(tipo == 3)
for (i = 0; i < n; i++)
v[i] = n - i - 1;
}


#include <stdio.h>
#include <stdlib.h>

int main() {

// int i;
int *vd;
// int *vc;
// int *vm;
// int tam = v10;

vd = malloc(v10 * sizeof(int));
// vc = malloc(v100 * sizeof(int));
// vm = malloc(v1000 * sizeof(int));

printf("\n");

gera_vetor(vd, 10, 1);
for (int i = 0; i < 10; i++)
printf("%d ", vd[i]);

quick_sort(vd, 10, 1);

printf("\n");

for (int i = 0; i < 10; i++)
printf("%d ", vd[i]);

printf("\n");

printf("\n");


free(vd);
// free(vc);
// free(vm);

return 0;
}



Dede já agradeço a ajuda de todos !!!

Behaves ...



  


2. MELHOR RESPOSTA

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 05/11/2020 - 21:19h

DcoderLA escreveu:

Eu dei uma mudada na função, agora está assim:
int particao(int *v, int ini, int fim) {

int aux;
int pivo = v[ini];
int i = ini + 1;
int j = fim;
static int troca = 0, comp = 0;


while (i <= j)
{
comp++;
while ((i <= j) && v[i] <= pivo) {
i++;
comp++;
}

while(v[j] > pivo) {
j--;
comp++;
}

if (i < j)
{
aux = v[i];
v[i] = v[j];
v[j] = aux;
troca++;
}
}

aux = v[ini];
v[ini] = v[j];
v[j] = aux;
//troca++;

return j; //retornar vetor de tamanho 3
}


/* Auxiliar para a ordenação por QUICK SORT */
int * quick_sortR(int *v, int ini, int fim) {

int j;
static int *retorno, troca = 0, comp = 0;
// FILE *arq;

retorno = malloc(2 * sizeof(int));

if (ini < fim)
{
j = particao(v, ini, fim);
comp++;
if(ini < (j -1)) {
quick_sortR(v, ini, fim);
troca++;
}

if((j+1) < fim) {
quick_sortR(v, j + 1, fim);
troca++;
}

}

retorno[0] = troca;
retorno[1] = comp;

return retorno;
}


/* Ordenação por QUICK SORT */
void quick_sort(int *v, int tam, int tipo_v) {

int *r;
// FILE *arq;

r = quick_sortR(v, 0, tam -1);

//quick_sortR(v, 0, tam -1);

printf("\nTrocas: %d Comparações: %d\n", r[0], r[1]);

}


int main() {

// int i;
int *vd;
// int *vc;
// int *vm;
// int tam = v10;

vd = malloc(v10 * sizeof(int));
// vc = malloc(v100 * sizeof(int));
// vm = malloc(v1000 * sizeof(int));

printf("\n");

gera_vetor(vd, 10, ALEATORIO);
for (int i = 0; i < 10; i++)
printf("%d ", vd[i]);

quick_sort(vd, 10, ALEATORIO);

printf("\n");

for (int i = 0; i < 10; i++)
printf("%d ", vd[i]);

printf("\n");

printf("\n");


free(vd);
// free(vc);
// free(vm);

return 0;
}


No gdb houve essa resposta:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a7837e in _int_malloc (av=av@entry=0x7ffff7dcfc40 <main_arena>,
bytes=bytes@entry=8) at malloc.c:3557
3557 malloc.c: Arquivo ou diretório inexistente.


Ainda sou novo no uso do gdb, poderia me ajudar onde como reconhecer o erro por gentileza ? Sei que é algo no malloc da função mas não consigo perceber o que ele tem de errado.

Vc tem de colocar um breakpoint em uma linha qualquer e manda executar. O programa vai parar no ponto desejado, aí vc imprime o valor das variável.
Geralmente vc olha o valor logo depois de entrar em funções. Daí vc vai executando o programa linha a linha e verificando o valor das variáveis ou cria outro breakpoint vai p frente se o código for muito grande. E vai executando assim.
Problemas c ponteiros são muito difíceis de serem encontrados. Segmentation fault é acesso a local de memória q não está disponível, geralmente tentando acessar um item slém do final de um array.


3. Re: Erro ao retornar vetor por ponteiro [RESOLVIDO]

leandro peçanha scardua
leandropscardua

(usa Ubuntu)

Enviado em 05/11/2020 - 18:49h

Rode no gdb
https://www.ic.unicamp.br/~rafael/materiais/gdb.html


4. Re: Erro ao retornar vetor por ponteiro [RESOLVIDO]

Lucas
DcoderLA

(usa Debian)

Enviado em 05/11/2020 - 20:29h

Eu dei uma mudada na função, agora está assim:
int particao(int *v, int ini, int fim) {

int aux;
int pivo = v[ini];
int i = ini + 1;
int j = fim;
static int troca = 0, comp = 0;


while (i <= j)
{
comp++;
while ((i <= j) && v[i] <= pivo) {
i++;
comp++;
}

while(v[j] > pivo) {
j--;
comp++;
}

if (i < j)
{
aux = v[i];
v[i] = v[j];
v[j] = aux;
troca++;
}
}

aux = v[ini];
v[ini] = v[j];
v[j] = aux;
//troca++;

return j; //retornar vetor de tamanho 3
}


/* Auxiliar para a ordenação por QUICK SORT */
int * quick_sortR(int *v, int ini, int fim) {

int j;
static int *retorno, troca = 0, comp = 0;
// FILE *arq;

retorno = malloc(2 * sizeof(int));

if (ini < fim)
{
j = particao(v, ini, fim);
comp++;
if(ini < (j -1)) {
quick_sortR(v, ini, fim);
troca++;
}

if((j+1) < fim) {
quick_sortR(v, j + 1, fim);
troca++;
}

}

retorno[0] = troca;
retorno[1] = comp;

return retorno;
}


/* Ordenação por QUICK SORT */
void quick_sort(int *v, int tam, int tipo_v) {

int *r;
// FILE *arq;

r = quick_sortR(v, 0, tam -1);

//quick_sortR(v, 0, tam -1);

printf("\nTrocas: %d Comparações: %d\n", r[0], r[1]);

}


int main() {

// int i;
int *vd;
// int *vc;
// int *vm;
// int tam = v10;

vd = malloc(v10 * sizeof(int));
// vc = malloc(v100 * sizeof(int));
// vm = malloc(v1000 * sizeof(int));

printf("\n");

gera_vetor(vd, 10, ALEATORIO);
for (int i = 0; i < 10; i++)
printf("%d ", vd[i]);

quick_sort(vd, 10, ALEATORIO);

printf("\n");

for (int i = 0; i < 10; i++)
printf("%d ", vd[i]);

printf("\n");

printf("\n");


free(vd);
// free(vc);
// free(vm);

return 0;
}


No gdb houve essa resposta:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a7837e in _int_malloc (av=av@entry=0x7ffff7dcfc40 <main_arena>,
bytes=bytes@entry=8) at malloc.c:3557
3557 malloc.c: Arquivo ou diretório inexistente.


Ainda sou novo no uso do gdb, poderia me ajudar onde como reconhecer o erro por gentileza ? Sei que é algo no malloc da função mas não consigo perceber o que ele tem de errado.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts