Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
paulodelon
18 / 1 / 0
Регистрация: 28.02.2017
Сообщений: 110
1

Как принять в функции main неопределенное количество параметров?

26.07.2017, 16:52. Просмотров 903. Ответов 22
Метки нет (Все метки)

Добрый день)
Нужно что бы функция main принимала от одного до трех параметров в виде маcсива значений { 0x1d ,0x72, 0x01}

Вызов происходил из консоли
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2017, 16:52
Ответы с готовыми решениями:

Передача параметров функции в main()
Вот у меня есть две функции, которые в дальнейшем нужно вызвать в void main ()....

Как создать неопределенное (т.е. не ограниченное в коде) количество экземпляров класса?
Если кратко, опишу задачу так. Есть баланс предприятия - "срез" показателей,...

Передать целый массив в качестве входных параметров для функции main()?
Было рабочее оконное приложение Qt, теперь всю реализацию "впихнуть" в...

что такое int argc, char *argv[] в качестве параметров главной (main) функции?
И зачем

Неопределенное поведение пользовательской функции
значит писал для лабы вот такой код: town.h #include <Windows.h> #include...

22
zss
Модератор
Эксперт С++
7378 / 6778 / 4291
Регистрация: 18.12.2011
Сообщений: 17,911
Завершенные тесты: 1
26.07.2017, 17:03 2
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

у main есть 2-й стандартный вариант
C++
1
int main(int argc,char** argv);
argc - количество слов в командной строке (включая строку вызова самой программы)
argv - адреc массива содержащего строки со словами.
Причем, нулевая строка содержит полный адрес вызова программы.
т.е. если вызов был
Bash
1
myprog  0x1d 0x72 0x01
то argc=4
argv[0]="c:\datafolder\myprog.exe"
argv[1]= "0x1d"
argv[2]= "0x72"
argv[3]= "0x01"
0
paulodelon
18 / 1 / 0
Регистрация: 28.02.2017
Сообщений: 110
26.07.2017, 18:41  [ТС] 3
C++
1
2
3
4
5
6
7
8
int main(int argc, char* argv[])
{   
 
    char inBuf[3];// = { 0x1d ,0x72, 0x01 };   // масив для запроса  0x1d ,0x72, 0x01
    //memcpy((void*)inBuf,(void*)&(argv[1]),sizeof(argv[1]));
    inBuf[0] = *argv[1];
    inBuf[1] = *argv[2];
    inBuf[2] = *argv[3];
присваивает не правильное значение
0
zss
Модератор
Эксперт С++
7378 / 6778 / 4291
Регистрация: 18.12.2011
Сообщений: 17,911
Завершенные тесты: 1
26.07.2017, 21:12 4
C++
1
2
3
4
char inBuf[3][5];
    strcpy(inBuf[0],argv[1]);
    strcpy(inBuf[1],argv[2]);
    strcpy(inBuf[2],argv[3]);
1
Байт
Эксперт C
18944 / 12160 / 2538
Регистрация: 24.12.2010
Сообщений: 24,762
26.07.2017, 23:09 5
paulodelon, Вы же пытаетесь в С (С++) программировать? Попробуйте для начала разобраться с указателями. Без понимания того, что это есть такое, вы так и будете задавать нелепые вопросы и получать непонятные вам ответы.
Скажу вам по большому секрету, что указатели эти проклятые есть во всех языках программирования. Только многие языки всячески скрывают от вас их существование и использование, чтобы не терзать ваши юные и ранимые души. Но С (С++) - языки для профессионалов, и в силу этого они не прячут истинное положение вещей от вашего взора.
Скажу секрет еще бОльший - без использования указателя (сиречь - адреса) все занятие программированием - совершенно бесполезное, тупое и не эффективное занятие.
1
paulodelon
18 / 1 / 0
Регистрация: 28.02.2017
Сообщений: 110
27.07.2017, 10:11  [ТС] 6
Спасибо за объективную критику ) Раньше на C# писал там как то указатели не часто использовались ) почитаю про указатели )

Добавлено через 47 минут
из за двухмерного масива работает некорректно

C++
1
2
3
strcpy(inBuf[0],argv[1]);
    strcpy(inBuf[1],argv[2]);
    strcpy(inBuf[2],argv[3])
записывает что то типа такого,
C++
1
2
3
    strcpy(inBuf[0][0],argv[1]);
    strcpy(inBuf[1][1],argv[2]);
    strcpy(inBuf[2][2],argv[3])
0
Байт
Эксперт C
18944 / 12160 / 2538
Регистрация: 24.12.2010
Сообщений: 24,762
27.07.2017, 10:16 7
paulodelon, Покажи весь код. И напечатай аргументы. Вот так
C
1
2
3
4
5
int main(int argc, char argv[])
{  int i;
   for(i=0; i<argc; i++)
     printf("i=%d a=%s\n", , i, argv[i]);
}
0
paulodelon
18 / 1 / 0
Регистрация: 28.02.2017
Сообщений: 110
27.07.2017, 10:18  [ТС] 8
Нужно что бы значение было доступно в одномерном массиве

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
int main(int argc, char* argv[])
{   
    int i;
    for (i = 0; i<argc; i++)
        printf("i=%d a-%s\n",  i, argv[i]);
 
    char inBuf[3][5];//= { 0x1d ,0x72, 0x01 };   // масив для запроса  0x1d ,0x72, 0x01
    
    strcpy(inBuf[0], argv[1]);
    strcpy(inBuf[1], argv[2]);
    strcpy(inBuf[2], argv[3]);
 
    /*inBuf[0] = 0x1d;
    inBuf[1] = 0x72;
    inBuf[2] = 0x01;*/
 
 
 
    int inBufSize = sizeof(inBuf);
    DWORD ReturnedLength = 0;
    char sim;
 
    // Вызов функций
    UsbScan(DeviceName);
    show(DeviceName);
    hUsb = CreateFile((LPCWSTR)DeviceName,
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ,
        NULL,
        OPEN_ALWAYS,
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
        NULL);
 
 
    if (hUsb == INVALID_HANDLE_VALUE)
    {
        ValueToDisplay.Format(_T("Error %d: Failed to open USB file handle.\n"), GetLastError());
        _tprintf(ValueToDisplay);
        return 0;
    }
    /*else {
        printf("File was crated");
    }*/
 
    /*Success = DeviceIoControl(hUsb,
        IOCTL_USBPRINT_SOFT_RESET,
        NULL,
        0,
        NULL,
        0,
        &size,
        NULL);
    if (!Success)
    {
        //DisplayData("ERROR: Returned from DeviceIoControl.\n");
        CloseHandle(hUsb);
        return 0;
    }*/
    //ValueToDisplay.Format("Size : %d\n", size);
    //DisplayData(ValueToDisplay);
 
    Success = WriteFile(hUsb, inBuf, inBufSize, &ReturnedLength, NULL);
 
    ReturnedLength = 0;
    
    Success=ReadFile(hUsb, &sim, sizeof(sim),&ReturnedLength,NULL);
    
    printf("%d",(int)sim);
    return 0;
}
0
Байт
Эксперт C
18944 / 12160 / 2538
Регистрация: 24.12.2010
Сообщений: 24,762
27.07.2017, 10:28 9
Цитата Сообщение от paulodelon Посмотреть сообщение
Нужно что бы значение было доступно в одномерном массиве
Попытайся показать, что ты хочешь получить. Или приведи пример. Например:
Пусть программы вызывается так: prog.exe aa bbb cccc
В переменной char inBuf[] должно получиться "aabbbcccc"
Вот как-то наподобие этого.

Добавлено через 5 минут
paulodelon, трудно понять, чего тебе надо...
1
DrOffset
8919 / 4800 / 1175
Регистрация: 30.01.2014
Сообщений: 7,836
27.07.2017, 10:30 10
Лучший ответ Сообщение было отмечено paulodelon как решение

Решение

Цитата Сообщение от paulodelon Посмотреть сообщение
Нужно что бы значение было доступно в одномерном массиве
В одномерном массиве какого типа?
Что-то типа этого?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdio>
#include <cstdlib>
 
int main(int argc, char ** argv)
{
    if(argc > 3)
    {
        unsigned char bytes[3];
        bytes[0] = std::strtol(argv[1], 0, 16);
        bytes[1] = std::strtol(argv[2], 0, 16);
        bytes[2] = std::strtol(argv[3], 0, 16);
 
        std::printf("%02x %02x %02x", bytes[0], bytes[1], bytes[2]);
    }
}
http://coliru.stacked-crooked.com/a/5b69899c8146adc6
2
paulodelon
18 / 1 / 0
Регистрация: 28.02.2017
Сообщений: 110
27.07.2017, 10:36  [ТС] 11
Пусть программы вызывается так: prog.exe 0x1d 0x72 0x01
В переменной char inBuf[]
inBuf[0] = 0x1d;
inBuf[1] = 0x72;
inBuf[2] = 0x01;

Добавлено через 5 минут
Спасибо )
0
Байт
Эксперт C
18944 / 12160 / 2538
Регистрация: 24.12.2010
Сообщений: 24,762
27.07.2017, 10:47 12
Тьфу ты! Оказывается, аргументы должны рассматриваться как 16-ричные числа не превосходящие 255(10)
DrOffset, а strtol сработает на аргументе "0x1d" ? Не надо ли ему подать просто "1d" ?
Я просто давно не пользовался этой функцией и забыл детали.

Добавлено через 1 минуту
Хотя пример по ссылке показывает, что все - Ok!
0
DrOffset
8919 / 4800 / 1175
Регистрация: 30.01.2014
Сообщений: 7,836
27.07.2017, 10:52 13
Цитата Сообщение от Байт Посмотреть сообщение
а strtol сработает на аргументе "0x1d" ?
Наличие 0x при разборе 16-ричного представления не обязательно, но учитывается реализацией:
prefix (0x or 0X) indicating hexadecimal base (applies only when the base is 16 or ​0​)
http://ru.cppreference.com/w/cpp/string/byte/strtol
0
Байт
Эксперт C
18944 / 12160 / 2538
Регистрация: 24.12.2010
Сообщений: 24,762
27.07.2017, 10:54 14
Значит, функция strtol такая умная! Интересно, как она разрешает конфликты типа strtol("0x1d", 0, 20);
0
DrOffset
8919 / 4800 / 1175
Регистрация: 30.01.2014
Сообщений: 7,836
27.07.2017, 10:55 15
Цитата Сообщение от Байт Посмотреть сообщение
Интересно, как она разрешает конфликты типа strtol("0x1d", 0, 20);
Никак. 0x ожидается только если base - 0 или 16. В цитате об этом сказано
1
Байт
Эксперт C
18944 / 12160 / 2538
Регистрация: 24.12.2010
Сообщений: 24,762
27.07.2017, 10:59 16
Из описания
http://cppstudio.com/post/816/
ничего извлечь не удалось

Добавлено через 2 минуты
DrOffset, да, все понятно. Спасибо!
0
DrOffset
8919 / 4800 / 1175
Регистрация: 30.01.2014
Сообщений: 7,836
27.07.2017, 11:01 17
Цитата Сообщение от Байт Посмотреть сообщение
ничего извлечь не удалось
То есть как? А вот:
Возможный префикс, указывающий основание, восьмеричное или шестнадцатеричное («0″ или «0x» соответственно)
И вот:
В последовательности может присутствовать знак плюс или минус, и, если basis равно 16 — префикс 0x или 0X.
Правда про base=0, - автоопределение основания, ничего не написано, но это ладно.
1
Байт
Эксперт C
18944 / 12160 / 2538
Регистрация: 24.12.2010
Сообщений: 24,762
27.07.2017, 11:08 18
Цитата Сообщение от DrOffset Посмотреть сообщение
То есть как?
Просто у меня ссылочка другая. Там более скупо.
Но вообще-то, я такие умные функции применять избегаю. Хз, что они придумают - а мне потом отвечать. Лучше уж свою попроще скострумить на скорую руку. Во всяком случае, знаешь навярняка, что от нее ждать...
0
DrOffset
8919 / 4800 / 1175
Регистрация: 30.01.2014
Сообщений: 7,836
27.07.2017, 11:24 19
Цитата Сообщение от Байт Посмотреть сообщение
Но вообще-то, я такие умные функции применять избегаю. Хз, что они придумают - а мне потом отвечать.
Если поведение стандартизировано и документировано, почему бы и не использовать?
0
paulodelon
18 / 1 / 0
Регистрация: 28.02.2017
Сообщений: 110
27.07.2017, 12:54  [ТС] 20
Подскажите как из char sim[256](полученные байты по USB ) привести к int то есть к целому числу ?
0
27.07.2017, 12:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2017, 12:54

Количество параметров в функции
Можно ли функцией подсчитать количесвто переданных в нее параметров? или быть...

Как принять и возвратить массив в другой функции?
пример: прототип функции ??? int main() { создаём функцию которая...

Как принять заранее неизвестное количество аргументов и передать их в конструктор?
Допустим есть функция которая создает объект template&lt;typename T&gt; T*...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru