typedef struct tpWrd{
int Terra;
int Sky;
float x;
float y;
float z;
}tWorld;
//Определили переменную:
tWorld WrD[256];
Указатель на массив, как правельно реализовать?
К примеру имеем некий тип:
Код:
Теперь надо передать в Функцию указатель на весь масив, как это сделать?
Код:
tWorld* Func(tWorld* W)
{
for(int i=0;i<256;i++){
W->z = 0;
}
return W;
}
{
for(int i=0;i<256;i++){
W->z = 0;
}
return W;
}
Вот как передать указатель на весь массив, а не на отдельную ячейку?
Чтоб в функции можно было работать со всми ячейками масива?
Имя функции указывает на первый элемент массива, и передавая массив в функцию через указатель передается только адрес первого элемента, далее смещаясь по адресам можно добраться до других элементов.
Передавая указатель на первый элемент массива, ты вполне можешь итерироваться по всему массиву, как это у тебя и сделано во втором примере. Главное иметь информацию о размере массива.
А так, для информации, почитай вот это:
http://forum.codenet.ru/showthread.php?p=204908
http://forum.codenet.ru/showthread.php?p=205152
Можно примерчик?
Цитата: Delta_Q
А как мне смещатсья по адресу первого? если указтель не просто на какой-то тип, а на целую структуру?
Можно примерчик?
Можно примерчик?
Код:
tWorld* Func(tWorld* W, int size)
{
for(int i=0; i<size; i++) {
W.z = 0;
}
return W;
}
{
for(int i=0; i<size; i++) {
W.z = 0;
}
return W;
}
Т.е. У меня есть большйо масив Структуры, и когда я декларирую функцию tWorld* Func(tWorld* W, int size);
и при сипользовании ее для масива
tWorld WrD[256];
WrD = *Func(WrD,256);
мне нужно передать указатель на весь масив? а компелятор ругаетсья мол error C2664:cannot convert parameter 1 from 'tWorld (*__w64 )[256]' to 'tWorld *'
Это работает для одной ячейки масива:
WrD[1] = *Func(WrD[1],256);
Так однозначно работать не будет:
WrD[1] = *Func(WrD[1],256);
Т.к. ты должен (судя по декларации функции) передавать не значение элемента, а указатель.
Так тоже работать не будет:
WrD = *Func(WrD,256);
т.к. функция возвращает указатель, а после разыменования этого указателя получается ссылка на сам (первый) элемент. Кроме того массив вообще не может быть переприсвоен.
Работать будет так:
tWorld w;
w = *Func(WrD,256);
или так
tWorld* pw;
pw = Func(WrD,256);
Только, что ты хочешь?
Ситуация следущая:
Есть структура типа той что описано выше.
Код:
typedef struct tpWrd{
int Terra;
int Sky;
float x;
float y;
float z;
}tWorld;
int Terra;
int Sky;
float x;
float y;
float z;
}tWorld;
Делаем масив на основе этой стуктуры.
Мне надо сделать так чтобы в функции которую я сделаю были доступны все ячейки масива.
Если я делаю указатель то он указывает лиш на один элемент масива, а надо работаь со всемия чейками.
З.Ы. Это мне надо чтоб из базы данных загнать в масив информацию.
Я там ошибся, вот такработать будет с конкретной ячейкой WrD[1] = *Func(&WrD[1]);
Если есть масив tWorld WrD[256]
Делаем такую функцию:
Код:
void func(tWorld W[], int iK)
{
tWorld* Wp=W; //Cоздаем указатель
for(int i=0,i<iK,i++){
Wp->x = 1;
Wp->y = 1;
Wp++; //Переход к следующей ячейки
}
}
{
tWorld* Wp=W; //Cоздаем указатель
for(int i=0,i<iK,i++){
Wp->x = 1;
Wp->y = 1;
Wp++; //Переход к следующей ячейки
}
}
Вобщем это работает...
Это корректная реализация?
tWorld* Wp=W; //Cоздаем указатель
Ещё раз повторяю:
Передавая указатель на первый элемент массива, ты вполне можешь итерироваться по всему массиву, как это у тебя и сделано во втором примере.
Цитата: Green
Запись tWorld W[] в объявлении параметра функции аналогична записи tWorld* W. Поэтому нет смысла в этой строчке:
tWorld* Wp=W;
tWorld* Wp=W;
Вспоминая тему char * и char[].
Тоесть если просто обявление переменной, то [] или * имеет значение, а если для параметра функции - то не имеет ?
Просто в букваре от Бьерн Страуструпа почемуто в примере указывалось именно запись void fp(char v[]). Вот я и запутался.
Цитата: Rebbit
Вспоминая тему char * и char[].
Тоесть если просто обявление переменной, то [] или * имеет значение, а если для параметра функции - то не имеет ?
Тоесть если просто обявление переменной, то [] или * имеет значение, а если для параметра функции - то не имеет ?
Как понимаешь, char[] - не может быть типом, т.к. не задана размерность массива. При инициализации
char str[] = "hello world";
размерность определяется автоматически, и на самом деле str будет иметь в данном случае тип char[12].
А как параметр функции запись char[] аналогична записи char*.
Но не стоит путать такую запись с записью, например, char(&)[12].
Это будет уже ссылка на массив определенной размерности.
Цитата: Green
При инициализации
char str[] = "hello world";
размерность определяется автоматически, и на самом деле str будет иметь в данном случае тип char[12].
char str[] = "hello world";
размерность определяется автоматически, и на самом деле str будет иметь в данном случае тип char[12].
Етого то я и не понимал. Пасиб.