Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Указатель на массив, как правельно реализовать?

24K
08 октября 2007 года
Delta_Q
26 / / 06.09.2007
Как реализовать указатель на весь масив в функцию?

К примеру имеем некий тип:
 
Код:
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;
}

Вот как передать указатель на весь массив, а не на отдельную ячейку?
Чтоб в функции можно было работать со всми ячейками масива?
4.5K
08 октября 2007 года
e-XperT
127 / / 04.07.2006
Имя функции указывает на первый элемент массива, и передавая массив в функцию через указатель передается только адрес первого элемента, далее смещаясь по адресам можно добраться до других элементов.
3
08 октября 2007 года
Green
4.8K / / 20.01.2000
А в чем проблема?
Передавая указатель на первый элемент массива, ты вполне можешь итерироваться по всему массиву, как это у тебя и сделано во втором примере. Главное иметь информацию о размере массива.

А так, для информации, почитай вот это:
http://forum.codenet.ru/showthread.php?p=204908
http://forum.codenet.ru/showthread.php?p=205152
24K
08 октября 2007 года
Delta_Q
26 / / 06.09.2007
А как мне смещатсья по адресу первого? если указтель не просто на какой-то тип, а на целую структуру?
Можно примерчик?
3
08 октября 2007 года
Green
4.8K / / 20.01.2000
Цитата: Delta_Q
А как мне смещатсья по адресу первого? если указтель не просто на какой-то тип, а на целую структуру?
Можно примерчик?


 
Код:
tWorld* Func(tWorld* W, int size)
{
    for(int i=0; i<size; i++) {
        W.z = 0;
    }
    return W;
}
24K
09 октября 2007 года
Delta_Q
26 / / 06.09.2007
Неполучаеться...

Т.е. У меня есть большйо масив Структуры, и когда я декларирую функцию 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);
3
09 октября 2007 года
Green
4.8K / / 20.01.2000
Вообще-то это элементарные вопросы. Рекомендую почитать что-нибудь из основ С/С++.

Так однозначно работать не будет:
WrD[1] = *Func(WrD[1],256);
Т.к. ты должен (судя по декларации функции) передавать не значение элемента, а указатель.

Так тоже работать не будет:
WrD = *Func(WrD,256);
т.к. функция возвращает указатель, а после разыменования этого указателя получается ссылка на сам (первый) элемент. Кроме того массив вообще не может быть переприсвоен.

Работать будет так:
tWorld w;
w = *Func(WrD,256);

или так
tWorld* pw;
pw = Func(WrD,256);

Только, что ты хочешь?
24K
09 октября 2007 года
Delta_Q
26 / / 06.09.2007
Возможно я неправельно поставил вопрос.
Ситуация следущая:
Есть структура типа той что описано выше.
 
Код:
typedef struct tpWrd{
int Terra;
int Sky;
float x;
float y;
float z;
}tWorld;

Делаем масив на основе этой стуктуры.
Мне надо сделать так чтобы в функции которую я сделаю были доступны все ячейки масива.
Если я делаю указатель то он указывает лиш на один элемент масива, а надо работаь со всемия чейками.

З.Ы. Это мне надо чтоб из базы данных загнать в масив информацию.
Я там ошибся, вот такработать будет с конкретной ячейкой WrD[1] = *Func(&WrD[1]);
24K
09 октября 2007 года
Delta_Q
26 / / 06.09.2007
Все понял как сделать:

Если есть масив 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++; //Переход к следующей ячейки
    }
}

Вобщем это работает...
Это корректная реализация?
3
09 октября 2007 года
Green
4.8K / / 20.01.2000
Запись tWorld W[] в объявлении параметра функции аналогична записи tWorld* W. Поэтому нет смысла в этой строчке:
tWorld* Wp=W; //Cоздаем указатель

Ещё раз повторяю:
Передавая указатель на первый элемент массива, ты вполне можешь итерироваться по всему массиву, как это у тебя и сделано во втором примере.
276
09 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: Green
Запись tWorld W[] в объявлении параметра функции аналогична записи tWorld* W. Поэтому нет смысла в этой строчке:
tWorld* Wp=W;



Вспоминая тему char * и char[].
Тоесть если просто обявление переменной, то [] или * имеет значение, а если для параметра функции - то не имеет ?

24K
09 октября 2007 года
Delta_Q
26 / / 06.09.2007
Да Грин ты прав.
Просто в букваре от Бьерн Страуструпа почемуто в примере указывалось именно запись void fp(char v[]). Вот я и запутался.
3
09 октября 2007 года
Green
4.8K / / 20.01.2000
Цитата: Rebbit
Вспоминая тему char * и char[].
Тоесть если просто обявление переменной, то [] или * имеет значение, а если для параметра функции - то не имеет ?


Как понимаешь, char[] - не может быть типом, т.к. не задана размерность массива. При инициализации
char str[] = "hello world";
размерность определяется автоматически, и на самом деле str будет иметь в данном случае тип char[12].
А как параметр функции запись char[] аналогична записи char*.
Но не стоит путать такую запись с записью, например, char(&)[12].
Это будет уже ссылка на массив определенной размерности.

276
09 октября 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: Green
При инициализации
char str[] = "hello world";
размерность определяется автоматически, и на самом деле str будет иметь в данном случае тип char[12].


Етого то я и не понимал. Пасиб.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог