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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вот такая задачка... ...с пересылкой указателей. 
:(
    Опции темы
neutrino
Дата 12.7.2002, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Нам дали такое задание:
Почему следуюшая прога не печатает количество елементов в массиве:
Код

int func(int vec[6]) {
 int a = sizeof(vec)/sizeof(vec[0]);
 return a;
}

void main () {
 int vec[6], k;
 k=func(vec);
 cout<<k;
}

Б принципе можно понять, что в функцию посылается указатель, который занимает 2 байта и sizeof(vec[0])=sizeof(int)=2, так и выходит 1. А теперь вопрос поинтереснее: как можно это исправить? Конечно кроме тривиального решения: return 6.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Alex101
Дата 12.7.2002, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А ежели так:
void main () {
int vec[6], k;
 cout<<(sizeof(vec)/sizeof(int));
}
В функцию передается только указатель, все же...


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


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Да, ты прав, именно в этом весь "прикол". Но как это можно исправить? Просто переписать строку a=sizeof(vec)/sizeof(vec[0]) в main нельзя, надо именно с функцией.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Temnozor
Дата 12.7.2002, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дело в том, что int vec[6] в main'е - это массив,
а в другую функцию массив мы передать не можем в принципе (в C++).
Мы передаем только указатель на массив.
(Кто думает, что массив и указатель на массив - одно и тоже, жестоко ошибается).
Примочка типа
Код
int func(int vec[6])
радует глаз, но компилятором всегда игнорируется. Для него что int* vec, что int vec[], что int vec[6] - все едино указатель.
Поэтому в функции vec оператор sizeof возвращает размер указателя, а не массива.
Выход:
Надо писать sizeof(vec)/sizeof(vec[0]); прямо в main.
В vec'е оператором sizeof размер массива не определить.
--------------------
Take a ride on, ride on, on your rotting horse on that deadly ground Take a ride, ride on, on your rotting horse with a pounding sound.
PM   Вверх
Temnozor
Дата 12.7.2002, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Опа.
Пока писал предыдущее сообщение, две мессаги появились.
--------------------
Take a ride on, ride on, on your rotting horse on that deadly ground Take a ride, ride on, on your rotting horse with a pounding sound.
PM   Вверх
Alex101
Дата 12.7.2002, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(neutrino @ 12.7.2002, 14:06)
Да, ты прав, именно в этом весь "прикол". Но как это можно исправить? Просто переписать строку a=sizeof(vec)/sizeof(vec[0]) в main нельзя, надо именно с функцией.

А для подобных задач как раз и сделаны классы....


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


Шустрый
*


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

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



Варианты:

1. Не маяться дурью, и писать без функции.

2. Перевавать в функцию указатель на массив и размер массива. Но зачем тогда функция??

3. Сделать так:

Код

void main()
{
  int Arr[6], n;
  memset(Arr, 0, sizeof(Arr));
  n=Calc(Arr);
  ......................
}

int Calc(int ArrayOfInt)
{
  int nRes=0;
  for(int i=0; i<=0xffff; i++)
  {
     if(ArrayOfInt[i]!=0)
     {
        nRes=i;
        break;
     }
  }
  return nRes;
}


Не очень корректно, но может сработать.
PM MAIL   Вверх
neutrino
Дата 12.7.2002, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Да, но как это в функции сделать? К такому решению я и пришел (смотрите концовку моей темы). Видимо это дурь какая-то. Так лектору и скажу. :(
Всем спасибо за участие.
2Lion: Спасибо за решение.




--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Люда
Дата 12.7.2002, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ежели обязательно в ф-ции, посылай в нее sizeof(vek), а в ф-ции дели на sizeof(int), вот и массив пересылать не надо и ф-ция присутствует :rolleyes
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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