С нами с 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
}
}
|
так вот, как правильно передать в функцию указатель на массив структур или массив указателей
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 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);
}
|
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 14/10/09 в 11:42 |
|
|
|
|
С нами с 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);
}
| |
да верно, немного некоректно привел пример
по теме: интерисует покамест только С,
т.е. логи такая же как при передаче указатела на обычный массив? имя массива и есть указатель на его первый элемент?
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 14/10/09 в 12:17 |
freeek писал: |
т.е. логи такая же как при передаче указатела на обычный массив? имя массива и есть указатель на его первый элемент? |
Разумеется
|
|
|
|
С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134
|
Добавлено: 14/10/09 в 12:20 |
а я че то не в те дебри ушел, спутали -> из пхп
оценил
|
|
|
|
С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134
|
Добавлено: 18/10/09 в 12:51 |
а такой момент как область видимости?
если мы описали структуру в main
будет ли наша функция знать об этом типе данных?
т.е. либо мы описываем структуру в глобальной области
либо в формальной области функции?
поправте
|
|
|
|
С нами с 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;
} |
в связи с этим как правильно описать передать структуру определеную локально
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 19/10/09 в 14:36 |
freeek писал: |
в связи с этим как правильно описать передать структуру определеную локально |
Никак. Для этого и существует область видимости.
Если нужно передать неопределенный тип данных - используют void*
То есть можешь определить ее в двух местах, в main и функции, и в функции, которой передан void*, кастить к нужному виду
Только зачем такой геморрой?
|
|
|
|
С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134
|
Добавлено: 19/10/09 в 18:21 |
самиобразование
хочу сразу разобраться с этим вопросом и попутными, чтоб потом не ломать голву, почему не работает
я видел код где структуру описывают в формальной области, что то типа
Код: | void func(struct { int var; char var;} abc){
...
} |
последний вопрос, если можно, где почитать:
запись массива структур в файл
и импорт из файла обратно в массив ткой же структуры?
|
|
|
|