Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> массивы и функции, кто спорит... 
:(
    Опции темы
pish_r
  Дата 16.4.2003, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 27.2.2003

Репутация: нет
Всего: нет



Вчера один изучающий C/С++ поднес мне код, и попросил найти ошибку.

Я увидал следующее:
Код


int func(char a[6]);
main(){
...
}
int func(char a[6]){
...
}


Первым делом по привычке говорю- нельзя в функцию передавать массив таким образом, нужно ч/з указатель...
Код

int func(char *a);

Он же утверждал, что и так работает...
Поспорили мы с ним, а я сегодня проверил, и действительно так работает... А я всю жизнь думал что таким образом мы передадим 7 элемент массива а...
Вот и спорь после этого с начинающими...
withstupid.gif
--------------------
________________-=тУт быЛ pisH_r=-
PM MAIL   Вверх
Paradox
Дата 16.4.2003, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



А что действительно праильно работает? Может просто во время работы фии имеется выход за пределы массива, работать будет но не правильно, а ошибки не выдаст (в С не контролируется выход за границы массива)


--------------------
---
PM MAIL WWW   Вверх
pish_r
Дата 16.4.2003, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 27.2.2003

Репутация: нет
Всего: нет



Во-первых, хорошо компалится...
А во вторых, работает... Чудеса прям...
--------------------
________________-=тУт быЛ pisH_r=-
PM MAIL   Вверх
Alex101
Дата 16.4.2003, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



Здесь и должно работать - в функцию передается копия массива (удобнее, конечно, ссылкой, но иногда и копию приходится передавать).
В принципе, твоя функция аналогична такой:
Код
int func(char a[]){
...
}

А выход за границы массива в C не проверяется.
А насчет 7-го элемента массива - это ежели был бы такой вызов функции:
Код
func(a[6]);

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


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
man2002ua
Дата 16.4.2003, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 943
Регистрация: 12.11.2002
Где: Киев

Репутация: нет
Всего: 2



видимо компилятор опускает значение [6] и переводит в
int func(char a[]).



--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
pish_r
Дата 16.4.2003, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 27.2.2003

Репутация: нет
Всего: нет



Цитата

А насчет 7-го элемента массива - это ежели был бы такой вызов функции:
Код

func(a[6]);

А так - тут все нормально.

Т.е если я так использую функцию при таком обьявлении, эрора не будет... Просто логически неверная конструкция...
А то я уж испужался... Пят лет на С/С++ програмлю smile.gif

Это сообщение отредактировал(а) pish_r - 16.4.2003, 09:29
--------------------
________________-=тУт быЛ pisH_r=-
PM MAIL   Вверх
Alex101
Дата 16.4.2003, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



Цитата(pish_r @ 16.4.2003, 06:28)
Т.е если я так использую функцию при таком обьявлении, эрора не будет... Просто логически неверная конструкция...
А то я уж испужался... Пят лет на С/С++ програмлю smile.gif

Да, при таком объявлении еррора не будет (вообще никакого). Может быть даже так удобнее и понятнее.
А вот если ты ее вызовешь
Код
func(a[6]);
- то тут туши свет, вместо массива передал один элемент.

Это сообщение отредактировал(а) Alex101 - 16.4.2003, 20:26


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
brb
Дата 17.4.2003, 04:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Господа!
Вам всем ++ заморочил голову!
В старом и добром С
func(a[6]) == int func(int a[]),
а
int func(char a[6]) == int func(char a[])!
Это же шаблон, тэг, заголовок, описание функции, а не ее вызов! Причем тут элемент массива!
Как на это будет реагировать ++ надо разбираться, но полагаю будет ругаться или и, впрямь, затолкает в стек 7 байт с адреса char*a;
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
pish_r
Дата 17.4.2003, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 27.2.2003

Репутация: нет
Всего: нет



Вообщем, распечатать Страуструпа, и перед сном вместо супружеского долга читать smile.gif
--------------------
________________-=тУт быЛ pisH_r=-
PM MAIL   Вверх
Gannibal
Дата 17.4.2003, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 742
Регистрация: 15.4.2003
Где: 010101

Репутация: нет
Всего: 17



Правильн брб говорил просто в Ц обявить функции вот посмотрим если например такои пример будет

Код

int proba(int a, int b)
int main(){
.
.
}
     
int proba(int a, int b){
return(a+b);
}


по моиму тожe самое получаетсиа только там чар употреблиал вот и всe.... как строку....


--------------------
Я родился в этом безумном мире - и Я сделаю всё чтобы в нём выжить!
PM MAIL ICQ   Вверх
pish_r
Дата 17.4.2003, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 27.2.2003

Репутация: нет
Всего: нет



Цитата(M @ 17.4.2003, 01:51)
Правильн брб говорил просто в Ц обявить функции вот посмотрим если например такои пример будет

Код

int proba(int a, int b)
int main(){
.
.
}
     
int proba(int a, int b){
return(a+b);
}


по моиму тожe самое получаетсиа только там чар употреблиал вот и всe.... как строку....

Почитай еще раз о чем мы говорили.
--------------------
________________-=тУт быЛ pisH_r=-
PM MAIL   Вверх
Alex101
Дата 17.4.2003, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 891
Регистрация: 8.4.2002
Где: Москва

Репутация: нет
Всего: 10



Цитата(brb @ 17.4.2003, 01:20)
Господа!
Вам всем ++ заморочил голову!
В старом и добром С
func(a[6]) == int func(int a[]),
а
int func(char a[6]) == int func(char a[])!
Это же шаблон, тэг, заголовок, описание функции, а не ее вызов! Причем тут элемент массива!

А я что сказал 16.04.2003?smile.gif
А насчет седьмого элемента - комментарий к push_rовскому высказыванию...


--------------------
С уважением, А. Фролов.
PM MAIL ICQ   Вверх
Gannibal
Дата 17.4.2003, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 742
Регистрация: 15.4.2003
Где: 010101

Репутация: нет
Всего: 17



pish_r da no vio ravno govoritsia o massivach i fce, eto normal'noe opridelenie toje samoe bylo by esli v fce main napishesh

char a[6];

rabotat' toje budet.....


--------------------
Я родился в этом безумном мире - и Я сделаю всё чтобы в нём выжить!
PM MAIL ICQ   Вверх
brb
Дата 18.4.2003, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



pish_r
Правильно! Читай страуструпа, только вот про Си там ничего нет!
--------------------
Сказки - удивительная вещь! Самое удивительное, что в них верят только маленькие дети, которым их рассказывают мамы и мамы, которым их рассказывают подросшие дети.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.