Форум программистов, компьютерный форум CyberForum.ru

Выделение памяти argv - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
siger
13 / 13 / 1
Регистрация: 27.02.2010
Сообщений: 46
19.03.2010, 23:47     Выделение памяти argv #1
Вопрос как на Си выделяется память на int main(int argc, cahr **argv). При запуске программы принципе все равно, но если передан 1 аргумент, а мне нужно добавить 2 нужен ли calloc || malloc ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2010, 23:47     Выделение памяти argv
Посмотрите здесь:

Что есть argc и **argv в функции int main(int argc, char **argv)? C++
C++ Выделение памяти
C++ Выделение памяти (new)
Выделение памяти C++
Выделение памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.03.2010, 02:11     Выделение памяти argv #2
siger, что-то Вы хитрое задумали... Я так себе это представляю:
C
1
2
3
4
5
6
...
int main(int argc, char **argv){
  int a, b;
  a = ( argc > 1 ) ? atoi(argv[1]) : 1; /* 1 - значение по умолчанию для a */
  b = ( argc > 2 ) ? atoi(argv[2]) : 2; /* 2 - значение по умолчанию для b */
...
Hypafrag
 Аватар для Hypafrag
25 / 24 / 1
Регистрация: 19.03.2010
Сообщений: 57
20.03.2010, 10:23     Выделение памяти argv #3
Память выделяется ровно под столько аргументов, сколько указано в argc, проверил на 2 компиляторах
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
20.03.2010, 12:29     Выделение памяти argv #4
siger, а можешь подробнее пояснить, чего конкретно ты хочешь?
siger
13 / 13 / 1
Регистрация: 27.02.2010
Сообщений: 46
21.03.2010, 02:09  [ТС]     Выделение памяти argv #5
Программка принимает на вход 2 файла, если 2 нет, то вместо него используется output.txt, если нет 1 то input.txt . Вот и надо в случаи их отсутствия, выделить память. Или использовать другой массив?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.03.2010, 02:58     Выделение памяти argv #6
м-да...
C
1
2
3
4
5
6
7
8
9
10
11
...
int main(int argc, char **argv){
  char *in_name = "input.txt";
  char *out_name = "output.txt";
...
  if ( argc > 2 )
    out_name = argv[2];
  if ( argc > 1 )
    in_name = argv[1];
...
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
21.03.2010, 09:34     Выделение памяти argv #7
siger, в контексте темы про argv я понял, что тебе надо. Но ради интереса прочитай собственный же пост и прикинь, сколько должен иметь фантазии человек, чтобы понять, что ты имел в виду. Правильно поставленный вопрос - это уже половина ответа и масса сэкономленного времени
siger
13 / 13 / 1
Регистрация: 27.02.2010
Сообщений: 46
21.03.2010, 23:36  [ТС]     Выделение памяти argv #8
Всем спасибо.
А теперь очень тупой вопрос.
Если вариант предложенный easybudda оформить в виде отдельной функции?
Как вернуть два значения для (in_name,out_name)?
Hypafrag
 Аватар для Hypafrag
25 / 24 / 1
Регистрация: 19.03.2010
Сообщений: 57
22.03.2010, 07:18     Выделение памяти argv #9
Вот так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct in_out_pair
{
  char *in;
  char *out;
};
 
struct in_out_pair func(int argc, char **argv)
{
 struct in_out_pair ret;
  ...
  ret.in = in_name;
  ret.out = out_name;
  return ret;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
22.03.2010, 10:49     Выделение памяти argv #10
Цитата Сообщение от siger Посмотреть сообщение
Если вариант предложенный easybudda оформить в виде отдельной функции?
Как вернуть два значения для (in_name,out_name)?
Встречный вопрос - а зачем? В функции выносят часто повторяющиеся участки кода, а такие вещи, как имена файлов переданные в командной строке, один раз в начале программы инициализируются. Зачем нужна функция, которая выполняется всего раз?
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
22.03.2010, 12:30     Выделение памяти argv #11
Цитата Сообщение от easybudda Посмотреть сообщение
Встречный вопрос - а зачем?
для удобства чтения, конечно.
в классах MFC инициализация всегда выносится в отдельную функцию. хотя и вызывается один раз, и по идее - ее обычно можно впихнуть в конструктор.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2010, 15:21     Выделение памяти argv
Еще ссылки по теме:

Выделение памяти C++
Выделение памяти C++
Выделение памяти(С = С++) C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
22.03.2010, 15:21     Выделение памяти argv #12
Цитата Сообщение от Patch Посмотреть сообщение
для удобства чтения, конечно.
Какое-то сомнительное удобство, ну да пусть функцией будет
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
#include <stdio.h>
#include <string.h>
    
/*
* шаманские танцы с параметрами командной строки
*/
 
void setNames(char *in_name, char *out_name, char **names){
    if ( *names ){
        strcpy(in_name, *names);
        strcpy(out_name, ( *++names ) ? *names : "output.txt");
    }
    else {
        strcpy(in_name, "input.txt");
        strcpy(out_name, "output.txt");
    }
}
 
int main(int argc, char **argv){
    char in_name[512], out_name[512];
    
    setNames(in_name, out_name, argv + 1);
    printf("Used for input:\t\t%s\n", in_name);
    printf("Used for output:\t%s\n", out_name);
    
    return 0;
}
Цитата Сообщение от Patch Посмотреть сообщение
в классах MFC инициализация всегда выносится в отдельную функцию.
Так вроде про С речь шла...
Yandex
Объявления
22.03.2010, 15:21     Выделение памяти argv
Ответ Создать тему
Опции темы

Текущее время: 14:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru