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


Автор: Sergio 23.4.2007, 14:44
Зраствуйте. Хочу передать структуру как параметр у функцию. Не нашёл инфи по этому. Где нужно определать поля структуры? Вот пример функции:
Код

void AddToList(struct contact) {
                  // <<<Что делать дальше ?? Ведб поля структуры не известны
 }

Зарание спасибо.

Автор: Daevaorn 23.4.2007, 14:54
Структуру надо вначале определить, а уже потом использовать. Например
Код

struct Foo
{
   int a;
};

Автор: vinter 23.4.2007, 14:55
Код

typedef struct tpTEMP
{
         int x;
         int y;
}TEMP;
void AddToList(TEMP &tmp) 
{
          tmp.x = 10;
          tmp.y = 56;
                  
 }


Автор: Sergio 23.4.2007, 15:20
Вот я определил структуру:
Код

 struct contact {
    char Message[512];
    char IP[20];
    char ComputerName[20];
    char NickName[10];
  };

vector<contact> list;

void AddToList(contact _contact) {


 for(int a=0;  a<list.size();  a++)
   {
     if(list.at(a).IP == _contact.IP)
      {
       list.push_back(_contact);
      }
   }
 }

Мне пишет ошибку в цикле:
[C++ Error] File1.cpp(134): E2015 Ambiguity between 'list' and '_STL::list<_Tp,_Alloc>'

Что это может быть?

Автор: Любитель 23.4.2007, 15:20
vinter, а зачем через типедеф? Его юзают в сях - чтобы ключевое слово struct лишний раз не писать, это понятно, но у тебя передача по ссылке => это плюсы.

Добавлено через 3 минуты и 16 секунд
Sergio, у тебя похоже стоит using namespace std. Возникает конфликт межу std::lsit и локальной переменной list. От юзинга неймспейса лучше отказаться (поиск по форуму объяснит почему), да и переменную можно назвать по другому smile

Ещё - в данном случае структуру лучше передавать по константной ссылке для избегания лишних копирований.

Автор: Daevaorn 23.4.2007, 15:25
Цитата(Sergio @  23.4.2007,  16:20 Найти цитируемый пост)
[C++ Error] File1.cpp(134): E2015 Ambiguity between 'list' and '_STL::list<_Tp,_Alloc>'

Конфлик имен. У тебя переменная list и стандартный класс list в одной области видимости. Изменяй название переменной или убирай using namespace std;
Цитата(vinter @  23.4.2007,  15:55 Найти цитируемый пост)
typedef struct tpTEMP{         int x;         int y;}TEMP;

У нас на работе пальцы ломают за такое в С++smile

Автор: Любитель 23.4.2007, 15:33
Цитата(Daevaorn @  23.4.2007,  15:25 Найти цитируемый пост)
У нас на работе пальцы ломают за такое в С++

[offtop]
Прям ломают smile Ты где работаешь? Нескромный вопрос - у тебя сколько пальцев?
[/offtop]

Автор: EvgenZ 23.4.2007, 15:33
Цитата(Daevaorn @ 23.4.2007,  15:25)
typedef struct tpTEMP{         int x;         int y;}TEMP;

У нас на работе пальцы ломают за такое в С++smile[/QUOTE]
оффтопик
//видать большая текучка кадров у вас...  smile  smile 

Автор: Любитель 23.4.2007, 15:35
Цитата(EvgenZ @  23.4.2007,  15:33 Найти цитируемый пост)
видать большая текучка кадров у вас... 

А может у них много мутантов работают? Каких-нибудь стопальцевых? Или регенерация очень развита: палец отломали - два выросло. Серкретное предприятие, блин  smile 

Автор: Daevaorn 23.4.2007, 16:18
Цитата(Любитель @  23.4.2007,  16:33 Найти цитируемый пост)
Нескромный вопрос - у тебя сколько пальцев?

Я так код не пишуsmile
Цитата(EvgenZ @  23.4.2007,  16:33 Найти цитируемый пост)
видать большая текучка кадров у вас...  

нет. вовсе нет. отсеивают хорошо ещё при набореsmile
Цитата(Любитель @  23.4.2007,  16:35 Найти цитируемый пост)
Серкретное предприятие, блин 

Да. На территори режимного институтаsmile

Автор: vinter 23.4.2007, 16:19
Цитата(Daevaorn @  23.4.2007,  15:25 Найти цитируемый пост)
У нас на работе пальцы ломают за такое в С++


Цитата(Любитель @  23.4.2007,  15:20 Найти цитируемый пост)
vinter, а зачем через типедеф? Его юзают в сях - чтобы ключевое слово struct лишний раз не писать, это понятно, но у тебя передача по ссылке => это плюсы

старая привычка, структурами просто не пользуюсьsmile(больше не будуsmile)

Автор: Любитель 23.4.2007, 18:37
Цитата(Daevaorn @  23.4.2007,  16:18 Найти цитируемый пост)
Я так код не пишу

А вдруг случайно... Да и вообще - мож ещё за что-то тоже ломают пальцы там у вас. Я нисколько не сомневаюсь в твоём опыте программрования, но всё-таки секретный объект, спецрежим...

Добавлено через 1 минуту и 35 секунд
Цитата(vinter @  23.4.2007,  16:19 Найти цитируемый пост)
больше не буду

Да это ничего... Главно не иди работать в секретный объект, где работает Daevaorn  smile 

Автор: JackYF 23.4.2007, 19:18
<имхо>
а вообще объявлять переменную с именем list и при этом юзать вектор как-то не то...
все вышеотписавшиеся правы насчет "no_using_namespace", но и имена такие лучше не давай
</имхо>

Добавлено через 3 минуты и 21 секунду
Цитата(Любитель @  23.4.2007,  18:37 Найти цитируемый пост)
Главно не иди работать в секретный объект, где работает Daevaorn  smile

Почему же? Насчет пригрозить поломать пальцы за такой вот typedef'ы - +1. smile

А вообще - отжигаете, господа smile

Добавлено через 7 минут и 10 секунд
А, Любитель уже отписал насчет имен... невнимательно смотрел.

Автор: Любитель 23.4.2007, 20:46
JackYF, ну вот ты хочешь жить, ожидая, что за случайную глупость (не знаю, как у кого, у меня бывает, что машинально что-то напишешь - потом удивляешься, как такое мог написать...) лишишься (в очередной раз...) пальца? Я - нет. Как закончу универ - ни за что не пойду работать к 
Daevaornу.

ЗЫ Блин, надо закрывать тему... 

Автор: likehood 23.4.2007, 21:05
Странный код какой-то.
Вот здесь вот
Код

if(list.at(a).IP == _contact.IP)

по-идее должны сравниваться две строки. Тогда нужно использовать strcmp:
Код

if (!strcmp(list.at(a).IP, _contact.IP))

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

Автор: Daevaorn 23.4.2007, 21:11
Цитата(Любитель @  23.4.2007,  21:46 Найти цитируемый пост)
ну вот ты хочешь жить, ожидая, что за случайную глупость (не знаю, как у кого, у меня бывает, что машинально что-то напишешь - потом удивляешься, как такое мог написать...) лишишься (в очередной раз...) пальца?

Написать глупость по ошибке вполне возможно и допустимо, другое дело, что эта глупость не должна попасть в code review вышестоящих по должности. Главное вовремя одуматьсяsmile

Автор: Любитель 23.4.2007, 21:16
Цитата(likehood @  23.4.2007,  21:05 Найти цитируемый пост)
по-идее должны сравниваться две строки. Тогда нужно использовать strcmp:

Увлёкшись пальцами, мы и не заметили.  smile 

Цитата(likehood @  23.4.2007,  21:05 Найти цитируемый пост)
Чтобы этого не произошло, можносохранить исходный размер вектора во временной переменной.

break

Цитата(Daevaorn @  23.4.2007,  21:11 Найти цитируемый пост)
Написать глупость по ошибке вполне возможно и допустимо, другое дело что эта глупость не должна попасть в code review вышестощих по должности. Главное вовремя одуматься

Ну, я часто делаю, а потом думаю. Опыта в таком деле нет, но я не уверен... ЛУчше обезопасить свои пальцы и работать где-нибудь в другом месте.

ЗЫ Хотя надо привыкать думаь до того, как делать...

Автор: vinter 24.4.2007, 08:42
Цитата(Daevaorn @  23.4.2007,  21:11 Найти цитируемый пост)
Написать глупость по ошибке вполне возможно и допустимо, другое дело, что эта глупость не должна попасть в code review вышестоящих по должности.

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

Автор: Любитель 24.4.2007, 10:54
Цитата(vinter @  24.4.2007,  08:42 Найти цитируемый пост)
там зарубят ты поправишь всего делов то

Вроде только пальцы ломали. Теперь уже рубить начали? И что рубить? И как ты будешь поправлять, если тебя зарубят?

Автор: vinter 24.4.2007, 11:06
Любитель,  smile 

Автор: JackYF 24.4.2007, 16:34
Цитата(vinter @  23.4.2007,  14:55 Найти цитируемый пост)
typedef struct tpTEMP
{
         int x;
         int y;
}TEMP;


Ээ... не знаю, если я такое напишу в здравом уме в программе на С++, то я всячески поддержу угрозу за такое ну если не поломать пальцы, то на недельку лишить компа точно.

Автор: Любитель 28.4.2007, 16:59
Изверги. Я после (не по моей воли :( ) писанины то на одном языке, то на другом иногда пять минут думаю - писать bool или boolean, условие в ифе ставляю в скобки, а после добавляю then... Хотя после 20-30 минут - привыкаю, пишу на чём надо smile

Автор: JackYF 28.4.2007, 17:15
Цитата(Любитель @  28.4.2007,  16:59 Найти цитируемый пост)
зверги. Я после (не по моей воли :( ) писанины то на одном языке, то на другом иногда пять минут думаю - писать bool или boolean, условие в ифе ставляю в скобки, а после добавляю then... Хотя после 20-30 минут - привыкаю, пишу на чём надо smile


Сочувствую... честно, сочувствую... благо время, когда и нас заставляли писать код на Паскале, кончилось (очень надеюсь, что кончилось smile).
после 1-го семестра 1-го курса...

Тут суть такая. Если такое писать в лабы на универ - все равно на код толком никто не смотрит, и простительно... все равно универ мало чему толковому научит в плане программинга... а когда будешь работать, то там уже будешь писать преимущественно на одном языке, и таких проблем уже не будет.

Автор: Любитель 28.4.2007, 18:04
Цитата(JackYF @  28.4.2007,  17:15 Найти цитируемый пост)
писать код на Паскале

boolean - Java. Другой вариант - catch (Exception e). В шарпе выдаёт варнинг (не люблю варнинги). Буква e не нравиться smile В яве без e - эррор. Или свитч на строки - часто хочется его написать в плюсах.

Не надо во всех бедах винить Дельфи/Паскаль smile

Цитата(JackYF @  28.4.2007,  17:15 Найти цитируемый пост)
после 1-го семестра 1-го курса

Ну, я второй заканчиваю. Бесполезно...

Автор: JackYF 28.4.2007, 18:18
Цитата(Любитель @  28.4.2007,  18:04 Найти цитируемый пост)
Не надо во всех бедах винить Дельфи/Паскаль 

smile


Цитата(Любитель @  28.4.2007,  16:59 Найти цитируемый пост)
Изверги. Я после (не по моей воли :( ) писанины то на одном языке, то на другом иногда пять минут думаю - писать bool или boolean, условие в ифе ставляю в скобки, а после добавляю then... Хотя после 20-30 минут - привыкаю, пишу на чём надо smile


эта фразу я принял как с Паскалем, потому что в Java then не ставиться после if'a. Логично? smile

Автор: Любитель 28.4.2007, 18:30
Цитата(JackYF @  28.4.2007,  18:18 Найти цитируемый пост)
эта фразу я принял как с Паскалем, потому что в Java then не ставиться после if'a. Логично?

Да. Просто я говорю как раз не про два языка, а: "то один, то другой ...". То был просто пример. smile

ЗЫ Давайте устроим голосование "можно ли за такой код ломать пальцы"? smile Или просто опрос общественного мнения "за какой код надо ломать пальцы?".

Автор: JackYF 28.4.2007, 18:33
Цитата(Любитель @  28.4.2007,  18:30 Найти цитируемый пост)
ЗЫ Давайте устроим голосование "можно ли за такой код ломать пальцы"? smile Или просто опрос общественного мнения "за какой код надо ломать пальцы?". 

+1. Поддерживаю. Открывай опрос.

Автор: Sartorius 28.4.2007, 18:50
   smile  По поводу экзекуций : на Украине рассказывали мне есть компания , где за вылет с Null pointer exception заставляют выйти на улицу и на противоположном здании 10 раз написать "Я плохой программист"  smile 

Автор: Mayk 28.4.2007, 18:59
Цитата(JackYF @  24.4.2007,  20:34 Найти цитируемый пост)
Цитата(vinter @  23.4.2007,  14:55 Найти цитируемый пост)
typedef struct tpTEMP
{
         int x;
         int y;
}TEMP;
Ээ... не знаю, если я такое напишу в здравом уме в программе на С++, то я всячески поддержу угрозу за такое ну если не поломать пальцы, то на недельку лишить компа точно.

А если данная структура должна быть одновременно доступна и в си++ и в си? 



Автор: Любитель 28.4.2007, 19:04
Mayk, судя по векторам и ссылкам в начальном коде - нужен маленький код для плюсов.

Автор: JackYF 30.4.2007, 00:09
Цитата(Sartorius @  28.4.2007,  18:50 Найти цитируемый пост)
на Украине 

Ну давайте все-таки говорить корректно - "в Украине". Не страна, что ли?



Цитата(Sartorius @  28.4.2007,  18:50 Найти цитируемый пост)
де за вылет с Null pointer exception заставляют выйти на улицу и на противоположном здании 10 раз написать "Я плохой программист"  smile  


Это же какая, интересно? smile



Цитата(Mayk @  28.4.2007,  18:59 Найти цитируемый пост)
А если данная структура должна быть одновременно доступна и в си++ и в си? 


Цитата(JackYF @  24.4.2007,  16:34 Найти цитируемый пост)
если я такое напишу в здравом уме в программе на С++,


Подчеркиваю еще раз, что мое утверждение относилось к программам на С++. На языке С я не пишу (пока, по крайней мере) и его поддерживать не собираюсь.

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