Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Передача указателя в функцию с/с++
цитата
14/10/09 в 10:33
 freeek
ньюбский вопрос к С/С++ кодерам, по сабжу ничего внятного не нашел

суть:

Код:

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


так вот, как правильно передать в функцию указатель на массив структур или массив указателей
цитата
14/10/09 в 11:37
 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);
}
цитата
14/10/09 в 12:11
 freeek
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);
}


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

по теме: интерисует покамест только С,
т.е. логи такая же как при передаче указатела на обычный массив? имя массива и есть указатель на его первый элемент?
цитата
14/10/09 в 12:17
 Dr.Syshalt
freeek писал:

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


Разумеется
цитата
14/10/09 в 12:20
 freeek
smail101.gif а я че то не в те дебри ушел, спутали -> из пхп

оценил
цитата
18/10/09 в 12:51
 freeek
а такой момент как область видимости?

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

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

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

поправте
цитата
18/10/09 в 13:06
 freeek
маденький код для наглядности, в данном случае работает так как и ожидаем, но если переносим описание 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;
}


в связи с этим как правильно описать передать структуру определеную локально
цитата
19/10/09 в 14:36
 Dr.Syshalt
freeek писал:

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


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

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

Только зачем такой геморрой? icon_neutral.gif
цитата
19/10/09 в 18:21
 freeek
самиобразование icon_wink.gif
хочу сразу разобраться с этим вопросом и попутными, чтоб потом не ломать голву, почему не работает

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

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


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


Эта страница в полной версии