Параметр-массив не той размерности
От: Chez Россия  
Дата: 27.10.04 13:34
Оценка:
На засыпку

void foo(char c[10])
{
}

void main()
{
    char arr[1000];
    foo(arr); // Почему этот вызов компилируется???
    // по моему, char[10] не одно и то же, что char[1000]
}


--
Спасибо

Chez, ICQ# 161095094

Re: Параметр-массив не той размерности
От: LaptevVV Россия  
Дата: 27.10.04 13:36
Оценка:
Здравствуйте, Chez, Вы писали:

C>На засыпку


C>
C>void foo(char c[10])
C>{
C>}

C>void main()
C>{
C>    char arr[1000];
C>    foo(arr); // Почему этот вызов компилируется???
C>    // по моему, char[10] не одно и то же, что char[1000]
C>}
C>


C>--

C>Спасибо
Потому что в функцию передается указатель. Хочешь отличать — передавай по ссылке.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Параметр-массив не той размерности
От: Bell Россия  
Дата: 27.10.04 13:36
Оценка:
Здравствуйте, Chez, Вы писали:

C>На засыпку


C>
C>void foo(char c[10])
C>{
C>}

C>void main()
C>{
C>    char arr[1000];
C>    foo(arr); // Почему этот вызов компилируется???
C>    // по моему, char[10] не одно и то же, что char[1000]
C>}
C>


C>--

C>Спасибо

Потому что сигнатуры
void foo(char c[10])

и
void foo(char* c)


эквивалентны.
Любите книгу — источник знаний (с) М.Горький
Re: Параметр-массив не той размерности
От: _nn_ www.nemerleweb.com
Дата: 27.10.04 13:38
Оценка:
Здравствуйте, Chez, Вы писали:

C>На засыпку


C>
C>void foo(char c[10])
C>{
C>}

C>void main()
C>{
C>    char arr[1000];
C>    foo(arr); // Почему этот вызов компилируется???
C>    // по моему, char[10] не одно и то же, что char[1000]
C>}
C>


C>--

C>Спасибо

Потому что массив не передается по значению, передается только адрес первого элемента, и поэтому не проверяется размер массива.
Следовательно вызов этих функций будет одинаков
void foo(char* c);

void foo(char c[1]);

void foo(char c[100]);

void foo(char c[11111]);
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Параметр-массив не той размерности
От: Losar Россия  
Дата: 27.10.04 13:40
Оценка:
Здравствуйте, Chez, Вы писали:

C>На засыпку


C>
C>void foo(char c[10])
C>{
C>}

C>void main()
C>{
C>    char arr[1000];
C>    foo(arr); // Почему этот вызов компилируется???
C>    // по моему, char[10] не одно и то же, что char[1000]
C>}
C>

C>--
C>Спасибо

=)))))))) Сорри за смех, я конечно понимаю что не все всё знают !
лана
Почему этот вызов компилируется??? Потому что char c[10] означает, что в функцию ты передаёшь указатель на с + массив из 10 элементов
по моему, char[10] не одно и то же, что char[1000]??? С точки зрения цифр 1000 10 то это не одно и тоже, но точки зрения программиста это всё указатели, просто на у них разные массивы
Re[2]: Параметр-массив не той размерности
От: Chez Россия  
Дата: 27.10.04 13:49
Оценка: :)
Здравствуйте, _nn_, Вы писали:

__>Потому что массив не передается по значению, передается только адрес первого элемента, и поэтому не проверяется размер массива.

По уму, должен проверяться. Это же internal-ы компилятора, как он там передаёт параметры — по указателю или через COM-порт...
По-моему очень некрасиво сделано.

void foo(char c[10])
{
    c[9] = '*';
}

void main()
{
    char arr[5];
    foo(arr); // и куда же оно запишет '*' ?
}

К тому же можно было бы различать сигнатуры для overload-а...

Ацтой

Chez, ICQ# 161095094

Re[3]: Параметр-массив не той размерности
От: _nn_ www.nemerleweb.com
Дата: 27.10.04 13:56
Оценка:
Здравствуйте, Chez, Вы писали:

C>Здравствуйте, _nn_, Вы писали:


__>>Потому что массив не передается по значению, передается только адрес первого элемента, и поэтому не проверяется размер массива.

C>По уму, должен проверяться. Это же internal-ы компилятора, как он там передаёт параметры — по указателю или через COM-порт...
C>По-моему очень некрасиво сделано.

C>
C>void foo(char c[10])
C>{
C>    c[9] = '*';
C>}

C>void main()
C>{
C>    char arr[5];
C>    foo(arr); // и куда же оно запишет '*' ?
C>}
C>

C>К тому же можно было бы различать сигнатуры для overload-а...
Можно использовать ссылки на массивы.

C>Ацтой


Это одно из фундаментальных свойств языков С/С++, эти языки не проверяют выход за границы массива.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Параметр-массив не той размерности
От: Vamp Россия  
Дата: 27.10.04 13:56
Оценка:
Потому, что существует неявное преобразование из массива в указатель на его первый элемент, называемое "распад". Передать массив по значению с С/С++ нельзя в принципе. Можно передать либо как указатель на первый элемент, либо по ссылке — тогда размерность будет проверена.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Параметр-массив не той размерности
От: _nn_ www.nemerleweb.com
Дата: 27.10.04 14:00
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Потому, что существует неявное преобразование из массива в указатель на его первый элемент, называемое "распад". Передать массив по значению с С/С++ нельзя в принципе.

А если без принципов ?
С:
struct char_10_wrapper
{
 char c[10];
};

void f(char_10_wrapper x)
{
}

char_10_wrapper c10w;
f(c10w);


C++:
template<typename T,size_t N>
struct array_wrapper
{
 T a[N];
};

void f(array_wrapper<char,10> x)
{
}

array_wrapper<char,10> aw10;
f(aw10);

V>Можно передать либо как указатель на первый элемент, либо по ссылке — тогда размерность будет проверена.
Можно еще передать и саму размерность, главное правильный размер передать
void f(char* c,int size)
{
}

char c[10];
f(c,sizeof(c)/sizeof(c[0]));
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Параметр-массив не той размерности
От: Vamp Россия  
Дата: 27.10.04 14:11
Оценка:
__>А если без принципов ?
Беспринципный...
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Параметр-массив не той размерности
От: LaptevVV Россия  
Дата: 27.10.04 14:14
Оценка:
Здравствуйте, Chez, Вы писали:

C>Здравствуйте, _nn_, Вы писали:


__>>Потому что массив не передается по значению, передается только адрес первого элемента, и поэтому не проверяется размер массива.

C>По уму, должен проверяться. Это же internal-ы компилятора, как он там передаёт параметры — по указателю или через COM-порт...
C>По-моему очень некрасиво сделано.

C>
C>void foo(char c[10])
C>{
C>    c[9] = '*';
C>}

C>void main()
C>{
C>    char arr[5];
C>    foo(arr); // и куда же оно запишет '*' ?
C>}
C>

C>К тому же можно было бы различать сигнатуры для overload-а...

C>Ацтой

Так исторически сложилось еще в С, а потом переехало в С++, естественно.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.