Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передать вектор структур в функцию 
:(
    Опции темы
GroundZero
Дата 21.8.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.8.2009

Репутация: нет
Всего: нет



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



#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и

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

Это сообщение отредактировал(а) GroundZero - 21.8.2009, 22:45
PM MAIL   Вверх
mes
Дата 21.8.2009, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(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

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

Это сообщение отредактировал(а) mes - 21.8.2009, 22:40


--------------------
PM MAIL WWW   Вверх
GroundZero
Дата 21.8.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.8.2009

Репутация: нет
Всего: нет



вот не могу понять тогда разницу

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

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

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

или я уже сам себя запутал?
PM MAIL   Вверх
mes
Дата 21.8.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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

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


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




--------------------
PM MAIL WWW   Вверх
GroundZero
Дата 22.8.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.8.2009

Репутация: нет
Всего: нет



а в самом вызове функции получается что мы ссылку передаем (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)
он же ждет тут указатель на вектор
PM MAIL   Вверх
mes
Дата 22.8.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(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);


Это сообщение отредактировал(а) mes - 22.8.2009, 11:06


--------------------
PM MAIL WWW   Вверх
GroundZero
Дата 22.8.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.8.2009

Репутация: нет
Всего: нет



Спасибо большое...
PM MAIL   Вверх
GroundZero
Дата 22.8.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.8.2009

Репутация: нет
Всего: нет



Люди подсказали и решил сделать подругому

Код

#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" структуры
PM MAIL   Вверх
mes
Дата 22.8.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(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);



Это сообщение отредактировал(а) mes - 22.8.2009, 20:24


--------------------
PM MAIL WWW   Вверх
ller
Дата 22.8.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



Так создать себе трудностей, а потом героически их преодолеть smile
PM MAIL   Вверх
andrew_121
Дата 22.8.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



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

 smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
GroundZero
Дата 23.8.2009, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.8.2009

Репутация: нет
Всего: нет



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

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


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

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

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


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

PM MAIL   Вверх
mes
Дата 23.8.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(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 




--------------------
PM MAIL WWW   Вверх
andrew_121
Дата 23.8.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



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

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


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

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

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


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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 24.8.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



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

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

Кстати, ссылка - очень удобная фича С++. Поэтому отказываются от нее только там, где это действительно необходимо. Но это не твой случай.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1125 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.