LINUX.ORG.RU

C programming, float возвращает 0

 


0

2

Привет,

Пишу задание, несложное, но встретился с такой проблемой, если использовать integer то все считает правильно, но при использовании float, тупо возвращает 0. Может кто встречался с этой проблемой уже?

http://pastebin.com/U7YcjUf5



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

А тип переменных Пушкин указывать будет?

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

Я долго бороздил интернеты, америкосы дружно говорят, что stdio.h сам присваивает тип. При попытке

float max (float x, float y) получаю следующее:

|23|error: conflicting types for 'max'|

|12|note: previous implicit declaration of 'max' was here|

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

Правильно: функция определяется после ее использования. Вот если бы ты компилял как положено, с -Wall -Werror, то сразу бы заметил «косяки».

Перемести эту функцию до main, а лучше — как я и говорил — воспользуйся стандартными макросами. Или сам допиши:

#define max(a,b) ((a < b ? a : b))
тогда не придется для каждого типа свою функцию max заводить. И дешевле получится.

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от maxylopes

А, что конкретно я не так при компиляции делаю?

Не указываешь -Wall (чтобы видеть все предупреждения) и не указываешь -Werror (чтобы не наплевать на них).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от maxylopes

Неправильно представлял себе работу поинтеров

А они-то тут при чем?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от maxylopes

Ты прав, когда говоришь, что оно само присваивает тип. Но ты не понимаешь какой. А по умолчанию, если ты не указал тип явно, то компилятор гадать не будет, он просто подставит int и все.

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

float max (float x, float y) получаю следующее:

|23|error: conflicting types for 'max'|

C не умеет перегрузку функций, насколько я помню, а значит нельзя создать две функции max, одну для интов, одну для флоатов, пишите как выше уже указали макрос.

maloi ★★★★★
()
Ответ на: комментарий от Eddy_Em
#define max(a,b) ((a < b ? a : b))

Макросы-макросики.

$ ./test
max: 6
$ cat test.c
#include <stdio.h>

#define max(a,b) ((a < b ? a : b))

int main() {

	printf("max: %d\n", max(1 + 5, 2 + 10));
	return 0;
}
AptGet ★★★
()
Ответ на: комментарий от AptGet

Гы. Я на автомате вместо max min написал ☺

#include <stdio.h>
#define max(a,b) ((a > b ? a : b))

int main() {
	printf("max: %d\n", max(1 + 5, 2 + 10));
	return 0;
}

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

Ну, звиняй, батько: с такими подходами придется делать 100500 функций: imax, fmax, dmax и т.д., и т.п.

Можно просто обойтись лишними скобками в макросе вокруг «переменных», а ещё лучше прочесть-таки Голуба перед тем, как блеснуть в очередной раз умом и сообразительностью.

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

Вот более наркоманский пример, но с ВНЕЗАПНЫМ результатом:

tc@orion:~$ ./test
max: 11, a: 11
tc@orion:~$ cat test.c
#include <stdio.h>

#define max(a,b) ((a > b ? a : b))

int main() {
	int a = 1;

	printf("max: %d, a: %d\n", max(a += 5, 10), a);
	return 0;
}
AptGet ★★★
()
Ответ на: комментарий от beastie

Ну да, нужны тут скобки.

А то что-то вроде max(3>>2, 3>>0) не сработает. А при арифметических операциях не нужны вроде как

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

Ъ используют std::max

Это не Ъ, а плюсовики.

а за макросы min/max в стандартных заголовках принято кастрировать

Если они — для тебя самого, то все ОК.

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

Если они — для тебя самого, то все ОК.

Вот именно, в стандарте таких макросов нет.

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

нет он прав, а вообще зависит от значения переменных :).

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

И дешевле получится.

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

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

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

У этих ваших «нормальных языков» недостатков больше, чем достоинств.

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

Об этом тут часто пишут, но я не понимаю такую точку зрения. С++ включает в себя почти весь С, как он может быть хуже самого С?

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

как он может быть хуже самого С?

Может, если его не по назначению использовать. Вот например, мне С++ нафиг не нужен, т.к. я не пишу ничего такого, что нуждалось бы во всех этих классах и прочей нечисти.

Eddy_Em ☆☆☆☆☆
()

Советую все учебные/тестовые примеры компилировать с флагами -Wall -Wextra -pedantic

В данном случае предупреждения раскроют суть ошибки :)

Для профилактики можно еще компилировать код на С компилятором для С++, там более жестокие требования к синтаксису.

KennyMinigun ★★★★★
()
template <class T>
inline const T& max(const T& a, const T& b) 
{
	return a > b ? a : b;
}

:-)

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

Спасибо. Книга есть по С, но на английском и читается медленно, думаю глава будет про флаги. Хочу киндл приобрести, или таблет, ресурс русских книг в пдф покрупнее будет, чем библиотека универа немецкого :).

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

>америкосы дружно говорят, что stdio.h сам присваивает тип Уже нет, всё должно быть явно, даже то что делается автоматом советую делать явно

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

С++ включает в себя почти весь С, как он может быть хуже самого С?

Например так:
main.cpp

#include <cstdlib>
#include <iostream>
using std::cout;

int main() {
    for ( int i = 0; i < 100; i++ ) {
        cout << "Hello, world!\n";
    }

    return EXIT_SUCCESS;
}
main.c
#include <stdio.h>
#include <stdlib.h>


int main() {
    int i;
    for ( i = 0; i < 100; i++ ) {
        printf("Hello, world!\n");
    }

    return EXIT_SUCCESS;
}
В результате:
$ g++ --version
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая 
коммерческую ценность и применимость для каких-либо целей.

$ time g++ -O2 main.cpp -o main_cpp

real    0m0.416s
user    0m0.324s
sys     0m0.080s

$ gcc --version
gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая 
коммерческую ценность и применимость для каких-либо целей.

$ time gcc -O2 main.c -o main_c

real    0m0.100s
user    0m0.068s
sys     0m0.016s

$ time ./main_cpp

real    0m0.003s
user    0m0.000s
sys     0m0.000s

$ time main_c

real    0m0.002s
user    0m0.000s
sys     0m0.000s

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

И еще: есть же стандартные макросы max и min

Не стоит использовать макрос. Помимо того, что выражение может быть вычислено несколько раз, так и результат может быть неверным.
Вот пример:

int a, b;
...
int r = min(a++, b--);

чему будут равны r, a, b?

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

#define max(a,b) ((a < b ? a : b))

Повторюсь, такой макрос источник проблем.

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

компилятор гадать не будет, он просто подставит int и все.

Иногда это проявляется загадочным «makes pointer form integer without a cast»:

sometype_t * a = some_undeclared_function();

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

Мне, кстати, тоже казалось, что надо скобки, но вроде не. Да и как они помогут от вычисления a 2 раза?

Никак. Макрос в данном случае большое зло.

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

Ъ используют std::max

Да.

а за макросы min/max в стандартных заголовках принято кастрировать

Да.

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

Дольше выполняется к тому же.

Пруф будет? Да, разница в пределах погрешности пруфом не считается.

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

Как бы пойнт и был в этом.

да, пардон — с телефона промахнулся. это Эдди бить надо. ;)

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

> а за макросы min/max в стандартных заголовках принято кастрировать

Если они — для тебя самого, то все ОК.

Керниган&Пайк с тобой не согласны. Если внимательно прочесть главку «1.4. Макрофункции» книги «Практика программирования», то будет понятно почему. Там прямо-таки анатомически по пунктам разжёвано, почему «в С макрофункции больше проблем создают, чем решают».

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