Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как граммотно передавать массив символов в функцию и возвращать его из функции?

37K
21 ноября 2010 года
Tolias28
48 / / 20.09.2010
Есть программа, в которой сперва объявляется указатель, потом динамический массив символов размером 362:
 
Код:
char *str;
str=(char*)calloc(362,sizeof(char));
if(str==NULL) MemoryErrorMes();


потом я передаю этот массив в функцию, где он заполняется нужными данными и потом с этими данными нужно работать из главной функции:
InputSMS(str,360,OperatorPrice(pname.PhoneNum));

Вроде все верно, и все это работало. Пока я не модифицировал непонятно каким способом код главной функции, что теперь когда в функции InputSMS любому элементу массива str попытаться присвоить любое значение, то программа вылетает с ошибкой:(

После этого сижу вот над кодом несколько часов, ищу, что же я такого наделал, но ничего не могу найти такого, чтобы имело отношение к str. Так как str я объявляю непосредственно перед функцией и сразу же передаю его в нее. Уже дошел до того, что пробовал над массивом делать calloc не в главной функции, а в средине функции(при этом сам указатель на массив обёявлен в главной функции, и передается как и раньше). И этот способ заработал без проблем! Массиву нормально присваиваются значения в самой функции. Но теперь я столкнулся с проблемой, что никак не могу передать этот массив в главную функцию.:( Помогите пожалуйста бедному человеку:(
37K
21 ноября 2010 года
Tolias28
48 / / 20.09.2010
Цитата:
Пока я не модифицировал непонятно каким способом код главной функции


А модифицировал я в нем лишь следующее:
У меня было перед этим, что объявлялся файловый указатель в главной функции на начале FILE *dbf; и в конце закрывался fclose(dbf);
Я же сделал так, чтобы файл открывался лишь там, где он действительно используется(объявляется указатель и открывается файл непосредственно перед чтением из него данных, а закрывается он сразу после прекращения чтения). Для этого я удалил объявление в главной функции, а также удалил из других функций передаваемый параметр *dbf. Было вот так:

 
Код:
PhoneBook(FILE *dbf)

А стало вот так:
 
Код:
PhoneBook()


И вот после этих манипуляций у меня стала тупо вырубаться программа при попытке записи в массив str любого значения. Я тупо в ауте:confused: Вообще не могу найти никакой логики связи вот этих моих действий и связи с массивом str:eek: Ну почему программа перестала работать при вот таких действиях?? У меня уже просто идей нет, я уже не знаю что делать. Хоть бери и возвращайся к своему резервному коду, который я бекапил до того, как уже успел сделать многое...
14K
21 ноября 2010 года
Fenja
138 / / 20.03.2009
[/ code].
33K
22 ноября 2010 года
hivewarrior
205 / / 16.11.2010
Цитата: Tolias28
Есть программа, в которой сперва объявляется указатель, потом динамический массив символов размером 362:
 
Код:
char *str;
str=(char*)calloc(362,sizeof(char));
if(str==NULL) MemoryErrorMes();


потом я передаю этот массив в функцию, где он заполняется нужными данными и потом с этими данными нужно работать из главной функции:
InputSMS(str,360,OperatorPrice(pname.PhoneNum));

Вроде все верно, и все это работало. Пока я не модифицировал непонятно каким способом код главной функции, что теперь когда в функции InputSMS любому элементу массива str попытаться присвоить любое значение, то программа вылетает с ошибкой:(

После этого сижу вот над кодом несколько часов, ищу, что же я такого наделал, но ничего не могу найти такого, чтобы имело отношение к str. Так как str я объявляю непосредственно перед функцией и сразу же передаю его в нее. Уже дошел до того, что пробовал над массивом делать calloc не в главной функции, а в средине функции(при этом сам указатель на массив обёявлен в главной функции, и передается как и раньше). И этот способ заработал без проблем! Массиву нормально присваиваются значения в самой функции. Но теперь я столкнулся с проблемой, что никак не могу передать этот массив в главную функцию.:( Помогите пожалуйста бедному человеку:

У меня было перед этим, что объявлялся файловый указатель в главной функции на начале FILE *dbf; и в конце закрывался fclose(dbf);
Я же сделал так, чтобы файл открывался лишь там, где он действительно используется(объявляется указатель и открывается файл непосредственно перед чтением из него данных, а закрывается он сразу после прекращения чтения). Для этого я удалил объявление в главной функции, а также удалил из других функций передаваемый параметр *dbf. Было вот так:

И вот после этих манипуляций у меня стала тупо вырубаться программа при попытке записи в массив str любого значения. Я тупо в ауте Вообще не могу найти никакой логики связи вот этих моих действий и связи с массивом str Ну почему программа перестала работать при вот таких действиях?? У меня уже просто идей нет, я уже не знаю что делать. Хоть бери и возвращайся к своему резервному коду, который я бекапил до того, как уже успел сделать многое...
(



Первое, что бросилось в глаза: 362!=360
Если отвечать на заглавие темы, то работаете правильно с массивами. Никуда не надо передавать, данные уже в массиве записаны, ибо работала функция, используя адрес первого элемента массива. Все должно работать.
По второму посту. Зачем из передаваемых параметров удалять указатель на файл? Как функция, по вашему, должна узнать об этом файле? Перемещение места объявления никак не влияет на передаваемые параметры.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог