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


Автор: FTTA 11.2.2013, 15:00
Есть такой код:

Код

#include<iostream.h>
#include<conio.h>
#include <tchar.h>
#include<vector.h>

struct PARA
{
    char name[11];
    int value;
};
main()
{
char*p,*t;
int z;
int i=0;
vector<PARA> Spusok(3);
do
    {
    cout<<"\n Vvedit imja ta znachenna ,,name value,,\n";
    cin.get(p,20);
    t=strrchr(p,' ');
    Spusok[i].value=atoi(t);//--1--
    z=strlen(p)-strlen(t);
    strncpy(Spusok[i].name,p,z);//--2--
    i++;
    }
while(i<3);
return 0;
}


Когда програма уже выполняется, выдаётся ошибка access violation на строчку №22. Но когда сделать так Spusok[0].value=atoi(t); все работает
Подскажите пожалуйста в чем причина, или посоветуйте хорошую книжку по С++.

Автор: NoviceF 11.2.2013, 18:20
Код

struct PARA
{
    char name[11];
    int value;
};

зачем изобретать велосипед, если есть std::pair http://cplusplus.com/reference/utility/pair/?kw=pair

Код

char*p,*t;
int z;

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

Код

cin.get(p,20);

http://cplusplus.com/reference/istream/istream/get/
A pointer to an array of characters where the string is stored as a c-string

Указатель, который передаётся в эту функцию, должен указывать на уже созданный массив, а ты предаёшь указатель, который указывает неизвестно куда (смотри пример использования по ссылке выше). Плюс указываешь длину читаемых символов 20, несмотря на то, что предполагается, что ты читаешь имя, длина которого 10 символов (11й на терминальный нуль).
Дальше не смотрел, но сначала это исправить бы.

И вообще, если уж используешь STL, лучше использовать его возможности, а не Си функции.

Как учебник могу рекомендовать Герберт Шилдт C++ базовый курс, издание 2010.

Автор: korian 11.2.2013, 20:02
Цитата(NoviceF @  11.2.2013,  17:20 Найти цитируемый пост)
зачем изобретать велосипед, если есть std::pair http://cplusplus.com/reference/utility/pair/?kw=pair

как раз в данном случае изобретать велосипед всегда имеет смысл. Я бы на самом деле std::pair нигде и никогда бы не использовал, кроме как для std::map. Хотя и в map я бы лучше вставил хрень с key/value полями, потому как я хочу знать по имени класса и по именам полей, что живет в этом классе, а не догадываться что такое first и что такое second.

Автор: NoviceF 11.2.2013, 20:14
Цитата(korian @  11.2.2013,  21:02 Найти цитируемый пост)
 я хочу знать по имени класса и по именам полей, что живет в этом классе


Сам контейнер может называться достаточно красноречиво, чтобы понять, что такое first и что такое second, но на истину не претендую, в промышленном масштабе пока ничего не делал )

Но в любом случае, автору есть над чем подумать.. взять хотя бы хидеры, имя класса,  поле name типа char, а не string..

Автор: borisbn 11.2.2013, 22:26
FTTA, весь ввод данных можно уложить в эти строки
Код
    cin >> Spusok[ i ].name >> Spusok[ i ].value;

итого получается
Код
#include <iostream>
#include <vector>
#include <string>
struct PARA {
    std::string name;
    int value;
};

int main() {
    int i = 0;
    std::vector<PARA> Spusok( 3 );
    do {
        std::cout<<"\n Vvedit imja ta znachenna ,,name value,,\n";
        std::cin >> Spusok[ i ].name >> Spusok[ i ].value;
        i++;
    }
    while ( i < 3 );
    return 0;
}

Автор: bsa 14.2.2013, 08:49
borisbn, хидеры забыл приинклюдить. У ТС с его знаниями языка на уровне турбо с++ могут возникнуть проблемы.  smile 

Автор: borisbn 14.2.2013, 09:27
bsa, подправил. и std:: добавил )

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