Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > передать вектор структур в функцию


Автор: GroundZero 21.8.2009, 22:32
Вот задался целью передать в функцию вектор структур, или хотябы указатель на него, чтобы производить над ним разлиные операции
Код



#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <resolv.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
 
 
using namespace std;
 
struct input_struct     {   
                 unsigned int ats;
                 unsigned int num1;
                   };  
 
void end_of_str_inpfile(vector<input_struct> input_struct_of_file, int *string_counter) {
        input_struct_of_file.resize(*string_counter);
}
 
int main(int argc, char *argv[]) {
        int string_counter = 15;
        vector<input_struct> input_struct_of_file(10);
        end_of_str_inpfile(input_struct_of_file, &string_counter);
        cout << input_struct_of_file.size();
}
 




после всех наманипуляций (resize) в функции end_of_str_inpfile

размер вектора всеравно остается равен 10и

может я чего-то доконца не понимаю?

Автор: mes 21.8.2009, 22:39
Цитата(GroundZero @  21.8.2009,  21:32 Найти цитируемый пост)
(vector<input_struct> input_struct_of_file, 

передавайте по ссылке/указателю:
vector<input_struct>& input_struct_of_file,

Добавлено через 1 минуту и 56 секунд
Цитата(GroundZero @  21.8.2009,  21:32 Найти цитируемый пост)
int *string_counter

ну а здесь можно и по значению

Автор: GroundZero 21.8.2009, 22:52
вот не могу понять тогда разницу

void func(int * a) и void func(int & a)

если функции отдают? (int * a) то проиходит передача переменной с адресом?

а (int & a) самого значения адреса?

или я уже сам себя запутал?

Автор: mes 21.8.2009, 23:23
Цитата(GroundZero @  21.8.2009,  21:52 Найти цитируемый пост)
вот не могу понять тогда разницу

void func(int * a) и void func(int & a)


семантика похожа, в обоих мы хотим передать объект в фуннкцию, а не копию, но
указатель может быть нулевым, а ссылка нет - то есть при использования ссылки не нужно беспокоиться внутри функции о валидности переданного адреса, но нельзя будет передать NULL.


Автор: GroundZero 22.8.2009, 09:32
а в самом вызове функции получается что мы ссылку передаем (input_struct_of_file)?

end_of_str_inpfile(input_struct_of_file, &string_counter);

почему тогда input_struct_of_file без &???




если считать что при объявлении 
vector<input_struct> input_struct_of_file(10);
input_struct_of_file-является ссылкой на первый элемент

то при передаче структуры в функцию(то есть ссылки)
почему не работает 
void end_of_str_inpfile(vector<input_struct> *input_struct_of_file, int *string_counter)
он же ждет тут указатель на вектор

Автор: mes 22.8.2009, 11:05
Цитата(GroundZero @  22.8.2009,  08:32 Найти цитируемый пост)

end_of_str_inpfile(input_struct_of_file, &string_counter);

почему тогда input_struct_of_file без &???

Посмотрите внимательно в примерах выше и сравните с тем что написали.



Цитата(GroundZero @  22.8.2009,  08:32 Найти цитируемый пост)
если считать что при объявлении 
vector<input_struct> input_struct_of_file(10);
input_struct_of_file-является ссылкой на первый элемент

это Вы грубо говоря по аналогии с массивом ?
Нет, vector  "ведет себя" как обычная переменная.


Цитата(GroundZero @  22.8.2009,  08:32 Найти цитируемый пост)
почему не работает 
void end_of_str_inpfile(vector<input_struct> *input_struct_of_file, int *string_counter)

будет работать, но надо передавать тогда не вектор, а указатель на вектор.

Код

void f(vector<int> * pv, int * pi ) // передача по указателю.
{
// тут мы должны проверить указатели на NULL
if (!pv || !pi) return;

pv->resize(*pi);
}
// и соответственно вызов :
vector<int>  vec;
int val;
f (&vec, &val);

то же самое для ссылки :

Код

void f(vector<int>& v, int& i ) // передача по ссылке
{
// никаких лишних проверок как в верхнем примере не требуется.
   v.resize(i); 
}
// и соответственно вызов :
vector<int>  vec;
int val;
f (vec, val);

Автор: GroundZero 22.8.2009, 18:57
Спасибо большое...

Автор: GroundZero 22.8.2009, 19:15
Люди подсказали и решил сделать подругому

Код

#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <resolv.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
 
 
using namespace std;
 
struct input_struct     {   
                 unsigned int ats;
                 unsigned int num1;
                   };  
 
void end_of_str_inpfile(vector<input_struct> *input_struct_of_file, int *string_counter) {
        input_struct_of_file -> resize(*string_counter);
        input_struct_of_file[*string_counter-1] -> ats  = 123; // <-ВОТ ЭТА СТРОКА
}
 
int main(int argc, char *argv[]) {
        int string_counter = 15;
        vector<input_struct> input_struct_of_file(10);

        end_of_str_inpfile(&input_struct_of_file, &string_counter);
}


тока при компиляции получаю ошибку
не могу понять как правильно обратиться в Элементу "ats" структуры

Автор: mes 22.8.2009, 20:18
Цитата(GroundZero @  22.8.2009,  18:15 Найти цитируемый пост)
        input_struct_of_file[*string_counter-1] -> ats  = 123; // <-ВОТ ЭТА СТРОКА

 input_struct_of_file у Вас указатель, соответсвенно Вы прежде, чем вызвать оператор[] должные указатель разименовать или обращаться к этому оператору напрямую :
Код

// 1
(*input_struct_of_file)[*string_counter-1] . ats  = 123; 
//2
 input_struct_of_file->operator[](*string_counter-1) . ats  = 123; 


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

void end_of_str_inpfile(vector<input_struct> & input_struct_of_file, int & string_counter) {
        input_struct_of_file . resize ( string_counter );
        input_struct_of_file[ string_counter-1 ] . ats  = 123;
}
//...
end_of_str_inpfile(input_struct_of_file, string_counter);


Автор: ller 22.8.2009, 21:10
Так создать себе трудностей, а потом героически их преодолеть smile

Автор: andrew_121 22.8.2009, 21:53
Цитата(ller @  22.8.2009,  21:10 Найти цитируемый пост)
Так создать себе трудностей, а потом героически их преодолеть

 smile 

Автор: GroundZero 23.8.2009, 10:17
выбор был сделан из соображений, как все...
Младший Брат показал всякие Сишные движки и там везде функция определяется так
Код

void func(int* par1, int* par2);


А сам говорит что синтаксис 
Код

void func(int& par1, int& par2);

не встечал в нормальных программах...


Правда есть одно НО, он пишет только на C#, а не на с++
вобщем последовал я его примеру

Автор: mes 23.8.2009, 10:52
Цитата(GroundZero @  23.8.2009,  09:17 Найти цитируемый пост)
выбор был сделан из соображений, как все...
Младший Брат показал всякие Сишные движки и там везде функция определяется так

Т.е пишете на C++ как все на С ?! круто ! тогда и vector не используйте, в С его никто не использует (за неимением такого)  smile 

Цитата(GroundZero @  23.8.2009,  09:17 Найти цитируемый пост)
А сам говорит что синтаксис ... не встечал в нормальных программах...

Понятно практически все программы на C++ не нормальные..  smile 

Цитата(GroundZero @  23.8.2009,  09:17 Найти цитируемый пост)
Правда есть одно НО, он пишет только на C#, 

Следуя вашей логике, если бы Вы были водителем автобуса, а брат троллейбуса, то заправлять свой транспорт не стали бы, так как брат сказал, что у нормального транспорта нет бензобака.
 smile 


Автор: andrew_121 23.8.2009, 11:54
Цитата(GroundZero @ 23.8.2009,  10:17)
выбор был сделан из соображений, как все...
Младший Брат показал всякие Сишные движки и там везде функция определяется так
Код

void func(int* par1, int* par2);


А сам говорит что синтаксис 
Код

void func(int& par1, int& par2);

не встечал в нормальных программах...


Правда есть одно НО, он пишет только на C#, а не на с++
вобщем последовал я его примеру

Срочно учу C#! Потому как хочу писать нормальные программы на нормальном языке smile

Автор: bsa 24.8.2009, 11:30
GroundZero, пожалуйста, используй современное именование стандартных заголовочных файлов принятое в С++:
#include <stdlib.h> -> #include <cstdlib>
#include <string.h> -> #include <cstring> (для strcpy, strcmp и пр.) и/или #include <string> (для класса std::string)
#include <stdio.h> -> #include <cstdio>

И по возможности постарайся не смешивать языки Си и С++. Например, cstdio и cstring тебе вряд ли понадобятся при разработке программ на С++.

Кстати, ссылка - очень удобная фича С++. Поэтому отказываются от нее только там, где это действительно необходимо. Но это не твой случай.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)