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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
siger
13 / 13 / 1
Регистрация: 27.02.2010
Сообщений: 46
#1

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

19.03.2010, 23:47. Просмотров 1139. Ответов 11
Метки нет (Все метки)

Вопрос как на Си выделяется память на 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 (C++):

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Выделение памяти, проверка на утечку памяти - C++
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Что есть argc и **argv в функции int main(int argc, char **argv)? - C++
Здраствуйте, уважаемые кодеры! Что означает argc и **argv в функции int main(int argc, char **argv), ни как не могу понять эти переменные...

Выделение памяти - C++
Какая разница между выделением памяти функциями malloc, calloc, realloc и оператором new? И как изменить размер выделенной памяти без...

Выделение памяти. - C++
Значит так.Задача такая. Ввести строки или строку символов. Сколько мы будем вводить символов неизвестно.Может быть 10 а может быть...

Выделение памяти... - C++
Вот решил себе ликбез устроить и возникли вопросы: 1) Почему char* p = "fffff"; не реагирует на delete p 2) Когда надо...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
20.03.2010, 02:11 #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
25 / 24 / 1
Регистрация: 19.03.2010
Сообщений: 57
20.03.2010, 10:23 #3
Память выделяется ровно под столько аргументов, сколько указано в argc, проверил на 2 компиляторах
Evg
Эксперт CАвтор FAQ
17620 / 5844 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
20.03.2010, 12:29 #4
siger, а можешь подробнее пояснить, чего конкретно ты хочешь?
siger
13 / 13 / 1
Регистрация: 27.02.2010
Сообщений: 46
21.03.2010, 02:09  [ТС] #5
Программка принимает на вход 2 файла, если 2 нет, то вместо него используется output.txt, если нет 1 то input.txt . Вот и надо в случаи их отсутствия, выделить память. Или использовать другой массив?
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
21.03.2010, 02:58 #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
Эксперт CАвтор FAQ
17620 / 5844 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
21.03.2010, 09:34 #7
siger, в контексте темы про argv я понял, что тебе надо. Но ради интереса прочитай собственный же пост и прикинь, сколько должен иметь фантазии человек, чтобы понять, что ты имел в виду. Правильно поставленный вопрос - это уже половина ответа и масса сэкономленного времени
siger
13 / 13 / 1
Регистрация: 27.02.2010
Сообщений: 46
21.03.2010, 23:36  [ТС] #8
Всем спасибо.
А теперь очень тупой вопрос.
Если вариант предложенный easybudda оформить в виде отдельной функции?
Как вернуть два значения для (in_name,out_name)?
Hypafrag
25 / 24 / 1
Регистрация: 19.03.2010
Сообщений: 57
22.03.2010, 07:18 #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
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
22.03.2010, 10:49 #10
Цитата Сообщение от siger Посмотреть сообщение
Если вариант предложенный easybudda оформить в виде отдельной функции?
Как вернуть два значения для (in_name,out_name)?
Встречный вопрос - а зачем? В функции выносят часто повторяющиеся участки кода, а такие вещи, как имена файлов переданные в командной строке, один раз в начале программы инициализируются. Зачем нужна функция, которая выполняется всего раз?
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
22.03.2010, 12:30 #11
Цитата Сообщение от easybudda Посмотреть сообщение
Встречный вопрос - а зачем?
для удобства чтения, конечно.
в классах MFC инициализация всегда выносится в отдельную функцию. хотя и вызывается один раз, и по идее - ее обычно можно впихнуть в конструктор.
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,602
22.03.2010, 15:21 #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 инициализация всегда выносится в отдельную функцию.
Так вроде про С речь шла...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2010, 15:21
Привет! Вот еще темы с ответами:

Выделение памяти - C++
Вот кусок кода, класс и функция добавления в список Класс занимает 64 бита, я добавляю 10 элементов в список - 640 бит Потом отнимаю...

Выделение памяти - C++
Какой суммарный объем памяти в байтах будут занимать поля CObj всех объектов класса CEx в этой программе: class CEx {public: static...

Выделение памяти - C++
Часто возникает такая проблема, когда конфигурирую проект как Release происходит ошибка выделения памяти (при вызывании new), например...

Выделение памяти - C++
Скажите пожалуйста что не так? Не могу получить доступ к элементу str = 12, stlb = 3 bool** tempValues = new(bool*); for(int i = 0;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.03.2010, 15:21
Ответ Создать тему
Опции темы

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