Воскресенье, 24 Ноября 2024, 03:24

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Прошу помощи по структурам
black_houseДата: Понедельник, 13 Апреля 2015, 20:23 | Сообщение # 1
участник
Сейчас нет на сайте
Есть структура с массивом указателей на указатели

Код
struct slist
{
    char** list_stop;    //список остановок
};


как в list_stop записывать строки?

Код
char** d2 = (*(m+n))->list_stop;
cout<<"Введите список остановок\n";
for (int i=0; i<c; i++) //с - кол-во остановок
{
    cin>>h;
    *d2 = new char[strlen(h) + 1];
    strcpy_s(*d2, strlen(h) + 1, h);
    d2++;
}


так не работает sad


Snow Dream [2d, Android] (v1.3)


Сообщение отредактировал black_house - Понедельник, 13 Апреля 2015, 20:29
TymonrДата: Понедельник, 13 Апреля 2015, 20:56 | Сообщение # 2
With OpenSource forever
Сейчас нет на сайте
Почему не использовать
Код
std::string
?


Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы.
Как правильно задавать вопросы в технических форумах
black_houseДата: Понедельник, 13 Апреля 2015, 20:59 | Сообщение # 3
участник
Сейчас нет на сайте
нельзя нам такое использовать, надо либо cin>>h;, либо cin.getline(h, 100);
с последним не копилится, а с первым вариантом, он компилит, но при обращении ругается на не тот адрес


Snow Dream [2d, Android] (v1.3)
ModelkinДата: Понедельник, 13 Апреля 2015, 21:07 | Сообщение # 4
почетный гость
Сейчас нет на сайте
Код
struct slist
{
     char** list_stop;    //список остановок
};
Это есть структура с указателем на указатель. Никакого массива тут нет.
Код
char** d2 = (*(m+n))->list_stop;
Здесь ты объявляешь еще один указатель на указатель типа char и пытаешься присвоить ему непонятную хрень. У тебя нет вообще переменной типа slist, а ты пытаешься обратиться к его члену.
А дальше уже не важно.
Так не делают ты все переусложняешь. Читай еще, про строки в C.
Я бы написал код, но не понял что ты хочешь добиться.
black_houseДата: Понедельник, 13 Апреля 2015, 21:14 | Сообщение # 5
участник
Сейчас нет на сайте
черт, забыл добавить
Код
int n=0;    //начальное кол-во транспорта
pubt* m[100];


все это глобально

Добавлено (13 апреля 2015, 21:14)
---------------------------------------------
Вот кода поболее, может понятнее станет, в main только обращение к функции



Snow Dream [2d, Android] (v1.3)


Сообщение отредактировал black_house - Понедельник, 13 Апреля 2015, 21:12
ModelkinДата: Понедельник, 13 Апреля 2015, 21:58 | Сообщение # 6
почетный гость
Сейчас нет на сайте
Не выделена память для *list_stop, он указывает на неизвестно куда
for (int i=0; i<c; i++)
{
std::cin>>h;
d2 = new char*;
*d2 = new char[strlen(h) + 1];
strcpy_s(*d2, strlen(h) + 1, h);
d2++;
}
так будет работать, если выделить память. Но все равно, непонятно зачем так сделано. массива же все равно нет. Надо его создавать чтоб list_stop указывал на массив.
black_houseДата: Понедельник, 13 Апреля 2015, 22:07 | Сообщение # 7
участник
Сейчас нет на сайте
спасибо большое smile
так нас обучают. я спрашивал, преподаватель говорит, что char** и есть массив указателей


Snow Dream [2d, Android] (v1.3)
ModelkinДата: Понедельник, 13 Апреля 2015, 22:12 | Сообщение # 8
почетный гость
Сейчас нет на сайте
Цитата black_house ()
char** и есть массив указателей
. Это указатель на несуществующий массив. Для него никто за нас память не выделит.
понял, у тебя массив и создается в цикле. Я сразу не въехал что c - это количество остановок.
a b c d - завязывай с такими названиями, давай что-то значащие названия. А то сам запутаешься.
black_houseДата: Понедельник, 13 Апреля 2015, 22:20 | Сообщение # 9
участник
Сейчас нет на сайте
a b c d - локальные переменные только для этой функции, так что я их и использую, так то стараюсь более точные названия использовать

Snow Dream [2d, Android] (v1.3)
ModelkinДата: Понедельник, 13 Апреля 2015, 22:29 | Сообщение # 10
почетный гость
Сейчас нет на сайте
Погодь, если у тебя в цикле создается массив, то надо в него перенести объявление с присвоением. Иначе, в структуру не попадет результат.
Код
  std::cout<<"Тип транспорта\n";
       std::cin>>g;
       (*(m+n))->type_t = new char[strlen(g)+1];
       strcpy_s((*(m+n))->type_t, strlen(g)+1, g);

       std::cout<<"Введите список остановок\n";
       for (int i=0; i<c; i++)
       {
        std::cin>>h;
         char** d2 = (*(m+n))->list_stop = new char*;
        *d2 = new char[strlen(h) + 1];
        strcpy_s(*d2, strlen(h) + 1, h);
        d2++;
       }
Вот так например.
И все равно не правильно. Надо же еще и индекс "c" использовать. Короче не правильно. Легче будет создать массив сразу как юзер ввел количество остановок.
Вот так, наверное:
Код
  char** d2 = (*(m+n))->list_stop = new char*[c];

     std::cout<<"Введите список остановок\n";
     for (int i=0; i<c; i++)
     {
      std::cin>>h;
      *(d2 + i) = new char[strlen(h) + 1];
      strcpy_s(*(d2 + i), strlen(h) + 1, h);
      //////////d2++;
     }
   std::cout<<"Проверим вывод остановок:\n";
   for (int i=0; i<c; i++)
   {
       std::cout  << ((*(m+n))->list_stop)[i] << "\n";
   }


Сообщение отредактировал Modelkin - Понедельник, 13 Апреля 2015, 23:21
black_houseДата: Понедельник, 13 Апреля 2015, 22:50 | Сообщение # 11
участник
Сейчас нет на сайте
char** d2 = (*(m+n))->list_stop = new char*; это чтобы именно в структуре был результат?
а разве он в первом случае не попадет, мы же с адресами работаем, он должен, обращаясь по адресу, попадать в структуру и в ней писать?

Добавлено (13 апреля 2015, 22:47)
---------------------------------------------
вроде работает smile

Добавлено (13 апреля 2015, 22:50)
---------------------------------------------
самый первый вариант работает, сейчас проверил, все нормально


Snow Dream [2d, Android] (v1.3)
ModelkinДата: Понедельник, 13 Апреля 2015, 23:22 | Сообщение # 12
почетный гость
Сейчас нет на сайте
Мы создаем новый указатель через new каждый раз. А в структуре был другой.
Совсем голова не варит. Надо будет проверить, что я там накарябал.
Ты смотрел что там в самой структуре, в результате? Или просто что ошибок нет?

Добавлено (13 апреля 2015, 23:22)
---------------------------------------------
В общем я сам взял и проверил. Первый вариант не правильный, в структуру не пишет. Я его и написал просто чтоб показать что надо память выделять.
Последний пишет правильно.
А там сам смотри. Если тебя устроило, что не вылетает и этого достаточно, то пусть так и будет. smile Вылетит когда попробуешь вывести результат из структуры.

OpenGOOДата: Понедельник, 13 Апреля 2015, 23:26 | Сообщение # 13
почти ветеран
Сейчас нет на сайте
Цитата black_house ()
char** d2 = (*(m+n))->list_stop;

Это кто тебя научил так делать?


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
black_houseДата: Вторник, 14 Апреля 2015, 15:42 | Сообщение # 14
участник
Сейчас нет на сайте
Modelkin, я пробовал вывести список, все выводит smile
OpenGOO, сам как-то, может и коряво, но проще для понимания, имхо


Snow Dream [2d, Android] (v1.3)
OpenGOOДата: Вторник, 14 Апреля 2015, 16:05 | Сообщение # 15
почти ветеран
Сейчас нет на сайте
Цитата black_house ()
OpenGOO, сам как-то, может и коряво, но проще для понимания, имхо

Этот индуский код запутает кого угодно. Проще и понятнее было бы так
Цитата
char** d2 = m[n]->list_stop;


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
black_houseДата: Вторник, 14 Апреля 2015, 18:23 | Сообщение # 16
участник
Сейчас нет на сайте
OpenGOO, я и не знал, что так можно biggrin спасибо за совет))

Snow Dream [2d, Android] (v1.3)
SaiteiДата: Понедельник, 20 Апреля 2015, 21:51 | Сообщение # 17
старожил
Сейчас нет на сайте
Закрываю тему (если проблема не была решена до конца - напишите в ЛС)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг