Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вот такая задачка...


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

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.

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

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

Автор: Temnozor 12.7.2002, 13:10
Дело в том, что 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 размер массива не определить.

Автор: Temnozor 12.7.2002, 13:11
Опа.
Пока писал предыдущее сообщение, две мессаги появились.

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

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

Автор: Lion 12.7.2002, 13:21
Варианты:

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;
}


Не очень корректно, но может сработать.

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


Автор: Люда 12.7.2002, 14:20
Ежели обязательно в ф-ции, посылай в нее sizeof(vek), а в ф-ции дели на sizeof(int), вот и массив пересылать не надо и ф-ция присутствует :rolleyes

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)