LINUX.ORG.RU

баг или я что-то не понимаю?

 


0

1

есть функция

int bubble_sort()
{
    extern int f_size, str_cnt;
    extern char *f_buffer;
    extern char **str_ptr;

    char *tmp;
    char s_fl;
    int i, j;

    printf("\n bubble sort\n");

    for (i = 0; i < str_cnt && s_fl != 0; i++) {
        for (j = 0, s_fl = 0; j < str_cnt-i-1; j++) {
            if ( *(str_ptr[j]+N_CHRCMP) > *(str_ptr[j+1]+N_CHRCMP) ) {
                s_fl = 1;
                tmp = str_ptr[j];
                str_ptr[j] = str_ptr[j+1];
                str_ptr[j+1] = tmp;
            }
        }
    }

    return 1;
}

вызывается из main

bubble_sort();

так вот если я не поставлю в функцию printf(«bla bla bla\n») то она и не вызывается вовсе, то есть может и вызывается, но массив не отсортирован и дальнейшее выполнение программы не имеет смысла

может я что-то не так делаю?

http://pastebin.com/kuquB4Hz

★★★

Последнее исправление: IvanR (всего исправлений: 1)

если я не поставлю в функцию printf(«bla bla bla\n») то она и не вызывается вовсе

А если сделать return s_fl?

ziemin ★★
()
Ответ на: комментарий от ziemin

встаил в функцию

    return (int)s_fl;

вызываю так:

    if (!bubble_sort()) {
        printf("bad\n");
    }

в выводе есть bad массив не отсортирован!!!!!!!

IvanR ★★★
() автор топика
Последнее исправление: IvanR (всего исправлений: 2)
Ответ на: комментарий от IvanR

флаг и должен быть 0, сделал так

return i;

вызываю так:

    if (bubble_sort()) {
        printf("good\n");
    } else {
        printf("bad\n");
    }

хотя нет, флаг должен быть 1

IvanR ★★★
() автор топика
Последнее исправление: IvanR (всего исправлений: 1)
Ответ на: комментарий от ziemin

номер символа в строке. по которому сортируем строки в массиве

если 0, то по первому символу, если 1 или 2 или n. то сооствественно по нному.

навверху есть вот это:

#define N_CHRCMP 0

IvanR ★★★
() автор топика
Последнее исправление: IvanR (всего исправлений: 1)
Ответ на: комментарий от ziemin

добавил в первый пост ссылку на весь файл на всякий случай,

программа читает файл со строками, сортирует их и выводит все строки. в которых буква, по которой сортируются строки дублируется.

IvanR ★★★
() автор топика

Попытался осознать алгоритм, поломал мозг.

Что-то это очень странный пузырёк какой-то. Я даже не удивляюсь, что этот код ничего не сортирует.

anonymous
()
Ответ на: комментарий от ziemin

все, понял, он не инициализирован, по видимому его значение менялось (он был в другом месте). когда я делал printf, спасибо, это не баг, это фича.

IvanR ★★★
() автор топика
Ответ на: комментарий от anonymous

отсекает лишние итерации, если таковые имеются, на википедии прочитал

читабельнее было бы так

s_fl == 1

IvanR ★★★
() автор топика
Ответ на: комментарий от IvanR

Да я знаю, что пузырьки разные бывают. Это я типа (неудачно) попытался посеять сомнения. Для пользы дела.

anonymous
()
Ответ на: комментарий от ziemin

типа того.

я вообще-то не очень понимаю, что такое extern, сначала без них было, потом когда поудалял все отладочные printf, то программа перестала работать, я подумал, что это магия и начал шаманить :)

IvanR ★★★
() автор топика
Ответ на: комментарий от anonymous

там через аргументы многовато передавать пришлось бы, вот и поделал все глобальными

IvanR ★★★
() автор топика
Ответ на: комментарий от IvanR

Это если в другом объектном файле определена переменная (или функция или ещё что). А у тебя в том же.

Кстати я попался на твое сравнение - инициализировать надо единичкой. ты так и сделал?

ziemin ★★
()
Ответ на: комментарий от ziemin

угу, единичкой и сравнение попраил, не s_fl != 0, а s_fl == 1

IvanR ★★★
() автор топика
Последнее исправление: IvanR (всего исправлений: 1)

На плюсах это выглядит так

void buble_sort(int *array, int counter){

bool sorted=false;
  while (!sorted){
	sorted=true;
	for (int i = 0; i < (counter-1); i++) {
	
		if ( array[i] > array[i+1]) 
		{
			int tmp = array[i];
			array[i] = array[i+1];
			array[i+1] = tmp;
			sorted=false;
		}
	}
   }

}
SergikXP
()

может я что-то не так делаю?

Читай на досуге K&R

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от SergikXP

дак и потом во внешнем цикле тоже желательно ставить счетчик, поскольку за счет него можно уменьшить количество внутренних итераций, а флаг количество внутренних не уменьшает, в то время, как после каждого прохода количество внутренних должно редуцироваться, ну не должно (желательно), просто один проход становится лишним, поскольку самый большой элемент уже наверху.

IvanR ★★★
() автор топика
Ответ на: комментарий от Anon

бгг...

это вообще-то _Bool, в С++ bool это встроенный тип - ему не нужны никакие заголовки. да и ключ -std=C99 нужно скормить компайлеру.

SergikXP
()
Ответ на: комментарий от SergikXP

С++ bool это встроенный тип - ему не нужны никакие заголовки

И? Это не делает тот код кодом на С++.

ключ -std=C99 нужно скормить компайлеру

ключ -std=gnu99 нужен лишь потому, что ты итератор цикла объявил в цикле, а не заранее.

Anon
()
Ответ на: комментарий от SergikXP
cat 111.c
#include <stdbool.h>
void buble_sort(int *array, int counter){

bool sorted=false;
  while (!sorted){
	sorted=true;
	for (int i = 0; i < (counter-1); i++) {
	
		if ( array[i] > array[i+1]) 
		{
			int tmp = array[i];
			array[i] = array[i+1];
			array[i+1] = tmp;
			sorted=false;
		}
	}
   }

}

gcc 111.c -c -Wall -Werror -std=gnu99
#OK

Anon
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.