LINUX.ORG.RU

C++ шаблон булевой функции


1

1

Немогу определить bool функцию
если ставлю её перед main, ругается что argv неопределен,
а если в теле main, то ругается что там нельзя определять ф-ю
ЧЯДНТ?

(если перед)
: In function ‘bool bbbb(int)’:
: error: ‘argv’ was not declared in this scope

(если в теле)
: In function ‘int main(int, char**)’:
:14: error: a function-definition is not allowed here before ‘{’ token
:20: error: ‘bbbb’ was not declared in this scope

/* Это тестовый файл*/
#include <iostream>
using namespace std;

int i = 0;

bool aaaa;
bool bbbb (int i)
{
aaaa = ( argv[1] * argv[2] > 0 );
return aaaa;
}

int main(int argc, char *argv[])
{

bbbb (i);
cout << aaaa << endl;

return 0;
}

Кури любую книжку или гугл по ключевым словам «область видимости»

Gvidon ★★★★
()

C++ шаблон булевой функции

Какой многообещающий заголовок, и...

если ставлю её перед main, ругается что argv неопределен,
а если в теле main, то ругается что там нельзя определять ф-ю

...какой разрыв шаблона.

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

Угу, Герберт Шилдт, полный справочник по C++
наверно у Вас тоже возникали трудности при первых шагах, не?

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

конечно были проблемы. но я все же сначала книги читаю.

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

о переносе argv внутрь

как именно?
Почитал теорию, сделал кусок, скомпилировал, нашёл сбойный кусок, почитал(погуглил) теорию, попытался переделать чтобы починить, неполучилось, спросил совета.
Я делаю что-то нетак?

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

функиция твоя должна быть такой:

bool myfun(int _argc){
blabla with _argc;
return true;
}

int main(int argc, char ** argv){

if(myfun(argc)){
blabla;
}
return 0;
}

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

а что? вполне хороший эквивалент true

anonymous
()

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

no-such-file ★★★★★
()

Я добавил этот топик в избранное, как идеальное задание для студентов: «Найдите ошибку»

AlexVR ★★★★★
()

Как ты достал уже...

comp00 ★★★★
()
Ответ на: Как то так от andreyu

Спасибо! Именно то, что было нужно!

А как вы строки перемножаете?

с помощью функции atol (удалил за ненадобностью-в топике)

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

1. Не используй atoi, ибо:

If the converted value would be out of the range of representable values by an int, it causes undefined behavior. See strtol for a more robust cross-platform alternative when this is a possibility.

2. Минимизируй использование argc/argv, разбирая их в одном месте. Не надо лишний раз их куда-либо передавать.

3. Использование argv без проверок - это очень и очень плохое дело.

4. Не используй глобальных переменных.

#include <iostream>
#include <stdlib.h>

bool bbbb(long int a, long int b)
{
    return ((a*b)>0);
}

int main(int argc, char *argv[])
{
    bool is_bad_args = false;
    long int a, b;
    
    if (argc !=3)
    {
        is_bad_args = true;
    } else {
        char * pEnd;
        a = strtol ( argv[1], &pEnd, 10);
        if (pEnd == argv[1]) is_bad_args = true;
        b = strtol ( argv[2], &pEnd, 10);
        if (pEnd == argv[2]) is_bad_args = true;
    }
    
    if (is_bad_args)
    {
        std::cout << "Using:\n\t" << argv[0] << " number_1 number_2" << std::endl;
        return 1;
    }

    std::cout << bbbb(a,b) << std::endl;

    return 0;
}
AlexVR ★★★★★
()
Ответ на: комментарий от MikeDM

Да какие нафиг плюсы - тут банальный C читать надо.

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

[offtop=on]
Спасибо Вам за столь «своевременное» сообщение по теме. Позволю себе тоже немного оффтопа(по любому тема уже давно решена)

Я добавил этот топик в избранное, как ... задание для студентов: «Найдите ошибку»
...из под стола выполз и больше ничего уже делать не мог

1)Наблюдается причинно-следственная связь:

Я добавил этот топик в избранное->из под стола выполз->и больше ничего уже делать не мог

2)Интересно, если Вы (как преподаватель?) работаете под столом, то где были Ваши студенты?
[offtop=off]

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

*Извините, иногда неприятно читать высокомерные комментарии, со стороны тех, кто когда-то тоже был новичком

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

неприятно читать высокомерные комментарии

Ах тебе правду читать неприятно?! А спамить святой /dev своими вопросами из книги «С++ за 21 день для чайников», ответы на которые можно найти в гугле по первой ссылке, я уж молчу про man и хорошую книгу, типа K&R, или Страуструпа.

когда-то тоже был новичком

LOL, ты не новичек, ты - нубье, самое, что ни на есть. Тебе настолько интересен язык, что ты даже проблему сам решить не удосужился! Даже банально пораскинуть мозгами, и хотя бы перевести , что тебе gcc хочет сказать. Шел бы ты в крайзисы играть, не дорос ты еще для больших дел.

comp00 ★★★★
()

Автор - наркоман. Прочти уже хоть какую-нибудь книгу перед тем, как писать программы быдлокодить.

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

наверно у Вас тоже возникали трудности при первых шагах, не?

При моих первых шагах я возился с прошивками для ПК на базе i8080 и курил схемотехнику. Что характерно, без всякого интернета и гугла.

Уйди прочь с уютного ЛОРа.

anonymous
()

Где тег домашняя работа?

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

Я добавил этот топик в избранное, как идеальное задание для студентов: «Найдите ошибку»

может для абитуриентов? Что-бы отсеять явных идиотов.

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

с помощью функции atol (удалил за ненадобностью-в топике)

тонко.

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

2. Минимизируй использование argc/argv, разбирая их в одном месте. Не надо лишний раз их куда-либо передавать.

что за бред? Я что, весь getopt(3) в main должен держать, да?

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

Это тот, что перебирается в цикле? И как же ты тогда с ним собираешься работать? Параметр х проверить тут, а параметр у - тут?

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

Это тот, что перебирается в цикле? И как же ты тогда с ним собираешься работать? Параметр х проверить тут, а параметр у - тут?

А как думаешь, как сделано, что все приложениях на gtk поддерживают общие для gtk ключи запуска + каждый свои собственные. Внезапно, модульность.

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

Это тот, что перебирается в цикле?

открой наконец man 3 getopt

И как же ты тогда с ним собираешься работать? Параметр х проверить тут, а параметр у - тут?

я делаю функцию, и передаю ей (int argc, char *const argv[]), а уже в ней getopt(3).

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

все приложениях на gtk поддерживают общие для gtk ключи запуска + каждый свои собственные.

не только gtk, coreutils тоже.

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

я делаю функцию, и передаю ей (int argc, char *const argv[]), а уже в ней getopt(3).

и как это противоречит:

... разбирая их в одном месте ...

При этом:

...
int main(int argc, char* argv[]) {
    QApplication app(argc, argv);
    MyOptions opts(argc, argv);
...

не противоречит и второй части высказывания:

... Не надо лишний раз их куда-либо передавать.

Но до этого ТС ещё не дошёл.

AlexVR ★★★★★
()

вот, улучшил твой шаблон. кто лучше?

#include <vector>
#include <string>
using namespace std;

vector<string> g_argv;

bool aaaa;
bool bbbb (int i)
{
  aaaa = ( g_argv[1].c_str() * g_argv[2].c_str() > 0 );
  return aaaa;
}

int main (int argc, char *argv[]) {
  for (int i = 0; i < argc; g_argv.push_back (argv[i++]));
  bbb (i);
  cout << aaaa << endl;

  return 0;
}
waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 2)
Ответ на: комментарий от AlexVR

и как это противоречит:

я тою фразу понял так, что argv надо в main() обрабатывать, и никуда не передавать. Думаю ТС понял также.

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

Указатели вполне себе можно перемножать.

ты идиот. УказателИ нельзя даже складывать, это тоже самое, что делить на ноль. Складывать можно только указатель и разность указателей(ptrdiff_t), причём только тогда, когда эта разность указателей на один и тот же массив(за исключением фиктивного эл-та сразу после посл. эл-та массива). В иных случаях «результат» твоего говнокода не определён.

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

Перемножить то можно, но это UB в общем случае.

ты-то вроде не дебил и не тролль? Или вчера был День Радио, а завтра День Победы?

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

ты-то вроде не дебил и не тролль? Или вчера был День Радио, а завтра День Победы?

Еще раз, перемножить указатели можно, как и поделить на ноль можно. Но это UB.

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