Реклама на сайте Advertise with us

Передача указателя в функцию с/с++

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 14/10/09 в 10:33       Ответить с цитатойцитата 

ньюбский вопрос к С/С++ кодерам, по сабжу ничего внятного не нашел

суть:

Код:

int main()
{
  struct new_st
  {
    char somevar[80];
    сhar charvar;
    float dblevar;
    int digit;
  };
 
  struct new_st stArray[50];

/*
  bla bla bla
*/
  void someFunction(struct* )
  {
    //some action
  }
}


так вот, как правильно передать в функцию указатель на массив структур или массив указателей

0
 

Чингачгук, вождь красноглазых

С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824

Ссылка на сообщениеДобавлено: 14/10/09 в 11:37       Ответить с цитатойцитата 

Код:
// правильно так:

void someFunction(struct* st, long count) {
}

...

main() {
   struct new_st stArray[50];
   ...
   someFunction(stArray, 50);
}



Чтобы при обработке структур не вылезти за пределы массива, someFunction() должна знать его размер. А если это C++ - то лучше ссылки использовать, а не указатели. Безопаснее. От массивов тоже лучше отказаться, а использовать STL - если этот кусок, конечно, не сильно критичен по времени исполнения.

Код:
include <vector>

someFunction( const std::vector<new_st>& st ) {
...
}

main() {
   std::vector<new_st> stArray;
   ...
   someFunction(stArray);
}

5
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 14/10/09 в 11:42       Ответить с цитатойцитата 

3
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 14/10/09 в 12:11       Ответить с цитатойцитата 

Dr.Syshalt писал:
Код:
// правильно так:
void someFunction(struct* st, long count) {
}
...
main() {
   struct new_st stArray[50];
   ...
   someFunction(stArray, 50);
}

Чтобы при обработке структур не вылезти за пределы массива, someFunction() должна знать его размер. А если это C++ - то лучше ссылки использовать, а не указатели. Безопаснее. От массивов тоже лучше отказаться, а использовать STL - если этот кусок, конечно, не сильно критичен по времени исполнения.
Код:
include <vector>
someFunction( const std::vector<new_st>& st ) {
...
}
main() {
   std::vector<new_st> stArray;
   ...
   someFunction(stArray);
}


да верно, немного некоректно привел пример

по теме: интерисует покамест только С,
т.е. логи такая же как при передаче указатела на обычный массив? имя массива и есть указатель на его первый элемент?

0
 

Чингачгук, вождь красноглазых

С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824

Ссылка на сообщениеДобавлено: 14/10/09 в 12:17       Ответить с цитатойцитата 

freeek писал:

т.е. логи такая же как при передаче указатела на обычный массив? имя массива и есть указатель на его первый элемент?


Разумеется

5
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 14/10/09 в 12:20       Ответить с цитатойцитата 

smail101.gif а я че то не в те дебри ушел, спутали -> из пхп

оценил

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 18/10/09 в 12:51       Ответить с цитатойцитата 

а такой момент как область видимости?

если мы описали структуру в main

будет ли наша функция знать об этом типе данных?

т.е. либо мы описываем структуру в глобальной области
либо в формальной области функции?

поправте

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 18/10/09 в 13:06       Ответить с цитатойцитата 

маденький код для наглядности, в данном случае работает так как и ожидаем, но если переносим описание cars в тело main, то возникает ошибка использования необпределенного типа

Код:
struct cars
{
      char marka[50];
      int produce;
      float drived;
      float price;
};

void fill(struct cars*);


int _tmain(int argc, _TCHAR* argv[])
{   
   struct cars car[2];
   fill(car);
   printf("newPrice: %.2f\nsecPrice: %.2f\n",car[0].price,car[1].price);
}



void fill(struct cars* st)
{
   st->price = 9956.23;
   (++st)->price = 1245.325;
   return;
}


в связи с этим как правильно описать передать структуру определеную локально

0
 

Чингачгук, вождь красноглазых

С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824

Ссылка на сообщениеДобавлено: 19/10/09 в 14:36       Ответить с цитатойцитата 

freeek писал:

в связи с этим как правильно описать передать структуру определеную локально


Никак. Для этого и существует область видимости.
Если нужно передать неопределенный тип данных - используют void*

То есть можешь определить ее в двух местах, в main и функции, и в функции, которой передан void*, кастить к нужному виду

Только зачем такой геморрой? icon_neutral.gif

5
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 19/10/09 в 18:21       Ответить с цитатойцитата 

самиобразование icon_wink.gif
хочу сразу разобраться с этим вопросом и попутными, чтоб потом не ломать голву, почему не работает

я видел код где структуру описывают в формальной области, что то типа

Код:
void func(struct { int var; char var;} abc){
...
}


последний вопрос, если можно, где почитать:
запись массива структур в файл
и импорт из файла обратно в массив ткой же структуры?

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »