LINUX.ORG.RU

Plain C: вызов функции в цикле (нубское)

 ,


0

2
#include <stdio.h>

int main()
{
	char s1[] = "01100001111010110110101111001011";
	char s2[] = "11100111011010100110110101000001";
	
	int i;
	for (i = 1; i <= 8; i++) {
		int d = dist(s1, s2);
		printf("%d %d\n", i, d);
	}
	
	return 0;
}

int dist(char s1[], char s2[])
{
	int d;
	
	int i;
	for (i = 0; i < 32; i++) {
		if (s1[i] != s2[i]) {
			d += 1;
		}
	}
	
	return d;
}

Почему только первая итерация дает 10, а остальные разные числа, причем меняющиеся?


Потому что d в dist() надо инициализировать перед использованием (с -Wall -Wextra -Werror компилятор сам всё расскажет).

xaizek ★★★★★
()
- for (i = 0; i < 32; i++) {
+ for (d = i = 0; i < 32; i++) {
anonymous
()

Потому что d в dist() надо инициализировать
for (d = i = 0; i < 32; i++) {

Помогло.

-Wall -Wextra -Werror

Отрабатывает, но говорит «implicit declaration of function». Лечится объявлением dist() перед main(). Такая процедура - это обязательно или рекомендуемо?

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

Такая процедура - это обязательно или рекомендуемо?

Обязательно, конечно, ознакомиться для начала с основами. Но если ищешь правильный путь методом тыка, то хорошо было бы для начала следовать указаниям компилятора. Компилятор плохого не посоветует.

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

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

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

Критичная, т.к. один компилятор позволяет, другой может и послать на. Этих компиляторов столько уже набралось.

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

Если я ничего не путаю, то декларирование функций как у Вас это классический вариант С, до ansi, в стандарте рекомендуют использовать прототипы функций. Я изучал С тут, рекомендую.

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

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

Это тяжёлое наследие однопроходных компиляторов, под которые C изначально был спроектирован. В последние ~25 лет это не особо актуально, но стандарт требует.

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

Очень важно, чтобы этих ворнингов не было. Конечно, если вы не хотите долгими зимними вечерами искать причины корок. Дело в том, что при отсутствии прототипа компилятор предполагает определённые умолчательные размеры для входных параметров и возвращаемого значения, а также способ их передачи в функцию и обратно, и эти параметры вполне могут не совпасть с настоящими параметрами этой функции.

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