LINUX.ORG.RU

Не компилируются функции, C++

 ,


0

1

Привет всем. Суть проблемы указана в названии треда. Остаётся добавить лишь то, что в C++ я конченый нуб, а потому объяснения должны происходить на пальцах. Надеюсь поможете.

Код:

long reformat (long x, char y)
{
	if (y == "b" or y == "B")
	{
		return x;
	}
	else if (y == "kb" or y == "KB")
	{
		x = x * 1024;
		return x;
	}
	else if (y == "mb" or y == "MB")
	{
		x = x * 1024 * 1024;
		return x;
	}
	else if (y == "gb" or y == "GB")
	{
		x = x * 1024 * 1024 * 1024;
		return x;
	}
	else if (y == "tb" or y == "TB")
	{
		x = x * 1024 * 1024 * 1024 * 1024;
		return x;
	}
}

int main(){}
Компиляцию запускаю по средству команды «g++ -o hello.lor -Wall /.../hello.cpp», однако на выходе получаю не бинарик, а следующие строки...
hello.cpp: In function ‘long int reformat(long int, char)’:
hello.cpp:13: warning: comparison with string literal results in unspecified behaviour
hello.cpp:13: error: ISO C++ forbids comparison between pointer and integer
hello.cpp:13: warning: comparison with string literal results in unspecified behaviour
hello.cpp:13: error: ISO C++ forbids comparison between pointer and integer
P.S.
Если не сложно, посоветуйте учебник по сабжу, желательно с уклоном под linux и опущением всяких абстракций вроде «что такое переменные» и «чем отличается функция от процедуры». Нет, конечно я нуб нубом, однако с такими элементарными вещами знакомство имею.


Тип у - long int, а тип «kb» - char * (или char[2]). Так нельзя сравнивать. у должен иметь такой же тип.

cdshines ★★★★★
()

Это весь исходник? Пока его весь и 13 строку, в ней ошибка.

С++ не имеет никакого уклона, плюсы, они и в Африке плюсы. Бери любой учебник, по собственному опыту могу посоветовал Шилдта, если хочешь более Ъ - K&R.

Zhbert ★★★★★
()

И учебник я советую совсем для начинающих, потому что ты НЕ понимаешь, чем отличаются переменные разных типов. Если будешь и дальше так относиться, то фейлы такие тупые тебе будут и дальше преследовать. олсо, «по средству» намекает, что тебе надо еще с Розенталя начинать.

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

warning: comparison with string literal results in unspecified behaviour

Что там показывать?

Олсо, ТС, нет такого в С++ - or. || вообще-то. Начни _вообще_ сначала.

cdshines ★★★★★
()

Ты сравниваешь символьную переменную y (char) со строковой константой (const char *), отсюда и ошибка. Для сравнения строк есть strcmp(), а переменную y надо сделать не char, а const char *.

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

Ох черт, я и не заметил это «or»... Вот что значит не брать в руки плюсы с полгода =(

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

упс, тип y таки char, но сути не меняет. char и char* не сравниваются.

cdshines ★★★★★
()

Дело в том, что ребята вернулисьRolyak накупавшись и отдохнувшие.

anonymous
()

Может всё-таки попробовать std::string?

Deleted
()

Остаётся добавить лишь то, что в C++ я конченый нуб

Мягко говоря заметно...

Надеюсь поможете
Код:

/0 Какого рода помощи ты ждёшь?! За тебя всё написать?!

erfea ★★★★★
()

однако с такими элементарными вещами знакомство имею

Да щито ты говоришь.

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

gcc хавает or, and и ещё что-то, хотя, скорее всего, это не стандарт.

Это как раз стандарт, называется это alternate tokens и включает and, or, not, bitand, bitor, compl, xor, and_eq, or_eq, not_eq, bitand_eq, bitor_eq, compl_eq, xor_eq.

Begemoth ★★★★★
()

Кстати, неплохой пример для использования switch-fallthrough и enum.

#include <iostream>

enum Units { Bytes, Kilobytes, Megabytes, Gigabytes, Terabytes };

long long reformat(long x, Units units) {
    switch ( units ) {
        case Terabytes:
            x <<= 10;
        case Gigabytes:
            x <<= 10;
        case Megabytes:
            x <<= 10;
        case Kilobytes:
            x <<= 10;
        case Bytes:
            break;
    }
    return x;
}

int main(int argc, char *argv[]) {
    long long bytes = reformat(2, Terabytes);
    std::cout << "2 TB == " << bytes << " bytes" << std::endl;
    return 0;
}

Или только перечислений :)

#include <iostream>

enum Units { Bytes = 0, Kilobytes = 10, Megabytes = 20, Gigabytes = 30, Terabytes = 40 };

long long reformat(long x, Units units) {
    return x << (int)units;
}

int main(int argc, char *argv[]) {
    long long bytes = reformat(2, Terabytes);
    std::cout << "2 TB == " << bytes << " bytes" << std::endl;
    return 0;
}

P.S.

x << 1 == x * 2
x << 2 == x * 2 * 2
// итд

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

а тип «kb» - char * (или char[2])

А вопрос был по C++ - значит тип string constant.

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

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

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

Я нагуглил, что это было в угоду клавиатурам без спецсимволов.

А лет через десять и буковками перестанут пользоваться из-за лени. Чего же тогда делать будут? :)

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

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

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

Спасибо. Насчёт «учебника для совсем начинающих»: до этого я кодил лишь на Delphi, а там и строковые символы, и переменные имеют тип string. Так-то про несовместимость разных типов я знаю.

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

Ну так тем, у кого не было вертикальной черты, тем и добавили в угоду. Я уже ж показывал, что нагуглил: http://stackoverflow.com/questions/2376448/the-written-versions-of-the-logica...

Для Ъ:

They originated in C in the header iso646.h. There were keyboards which couldn't type the symbols needed, so the header made #define's that would assist them. Of course, as time went by this became less used.

In C++, they became what's known as alternate tokens. You need not include anything to use these tokens in a compliant compiler. Alternate tokens are just like regular tokens, except for spelling. So and is exactly the same as &&, it's just a different way of parsing the same thing.

For their use, because they are rarely used it's often more surprising and confusing to use them than it is helpful. I'm sure if it were normal, they would be much easier to read, but people are so used to && and || anything else just gets distracting.

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

Теперь понятно. Просто среди десятков моделей клавиатур, которые я видел с 1987 года, ни разу не встретил такой, на которой бы не было '|' и других спецсимволов. Не повезло. :)

DeVliegendeHollander ★★
()

чем отличается функция от процедуры

Ничем. Эти понятия абсолютно равнозначны и не зависят ни от количества передаваемых, ни от наличия или отсутствия возвращаемого(ых) аргумента(ов). ``Function" ==== ``routine".

y == «b» or y == «B»

chars shall be compared so: (y == 'b') || (y =='B')

mr_doug
()

Помнится, это у меня на собеседовании спрашивали, что-то про 'if (argv[1] == «test»)...'

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

вот и выросло поколение...

А оно разве первое? Помнится, меня лет 15 назад в этом

чем отличается функция от процедуры — Ничем.

пытались убедить.

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

вот и выросло поколение...

В Си можно вернуть тип void. Так что отличия есть только в ассемблере и паскалях и ява всяких.

void a()                                                                                                             
{                                                                                                                    
}                                                                                                                    
                                                                                                                     
void b()                                                                                                             
{                                                                                                                    
    return a();                                                                                                      
}                                                                                                                     
sv75 ★★★★★
()
Ответ на: комментарий от Zhbert

С++

K&R

Ггг. Шаблон в клочья, мозги в стену, кровь, кишки, трупы страуса. Нельзя же так.

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

В Си можно вернуть тип void.

можно, можно, а теперь попробуй ничего не вернуть

и вообще, как конкретный Си относится к вопросу:

чем отличается функция от процедуры

?

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

до этого я кодил лишь на Delphi, а там и строковые символы, и переменные имеют тип string.

Хреново кодил на дельфи ты, путая char и string

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

до этого я кодил лишь на Delphi, а там и строковые символы, и переменные имеют тип string.

Идиот

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

Выпрыгнуть goto из функции?

а эпилог за тебя почтальон Печкин и кот Матроскин будут вызывать? :)

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