Массив строк

Тема в разделе "Общие вопросы по С и С++", создана пользователем Pegas, 2 апр 2007.

Статус темы:
Закрыта.
  1. Pegas

    Pegas Гость

    Здравствуйте! Помогите пожалуйста решить такую задачку. Нужно сделать таблицу констант. Создал структуру внутри класса, в которой описал массив строк (для занесения типа константы). Есть процедура создания записей, есть процедура вывода на экран. Так вот, внутри процедуры создания пробовал выводить на экран массив строк - всё нормально, а вот в другой процедуре не выводится ничего. Вот структура:
    struct dan_tab
    {
    char tip[10]; - массив строк.
    dan_tab *next;
    int elem;
    };
    dan_tab *per;
     
  2. Pegas

    Pegas Гость

    Если нужно могу кинуть обе процедуры, они не большие. Занесение самих констант организовано списком dan_tab *next, int elem; - эта часть указатели списка самих констант, char tip[10] - это массив типа констант (например int, float). И кстати список выводится в процедуре вывода на экран без проблем, загвоздка именно в массиве строк.
     
  3. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    char tip[10] - это строка длиной 9 символов, а не массив строк.
     
  4. MechWarrior

    MechWarrior Гость

    Вопрос не совсем понятен. char tip[10] - это же вроде массив символов, а не строк. Обычно для его вывода передают указатель (pchar) на первый (т.е. tip[0]) символ, и такие С-строки должны завершаться \0 (символом с нулевым кодом) - указателем конца строки.
     
  5. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Pegas+2:04:2007, 11:32 -->
    <span class="vbquote">(Pegas @ 2:04:2007, 11:32 )</span><!--QuoteEBegin-->Так вот, внутри процедуры создания пробовал выводить на экран массив строк - всё нормально, а вот в другой процедуре не выводится ничего.
    [snapback]60923" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Показывай код, все быстрее разрешится
     
  6. Pegas

    Pegas Гость

    //class Table Constant

    Код (Text):
    class Tab_Konst
    {
    public:
    char ch, buffer[4028];
    int max;
    Tab_Konst();
    ~Tab_Konst();
    void Win_tab();
    void Creat_tab();
    void Print_tab();

    struct dan_tab
    {
    char tip[10];
    dan_tab *next;
    int elem;
    };
    dan_tab *per;

    };
    void Tab_Konst::Tab_Konst()
    {
    ;
    }


    void Tab_Konst::Creat_tab()
    {
    int key, i = 1;
    char ch; max = 0;
    dan_tab *tek, tip_konst[10]; per = NULL;
    clrscr();
    cout<<"Vvedite konstantu : ";
    cin>>key;
    per = new(dan_tab);
    tek = per;
    (*per).elem = key;
    (*per).next = NULL;
    cout<<"Vvedite tip konstanti : ";
    cin>>tip_konst[i].tip;
    cout<<tip_konst[i].tip;
    i++;
    cout<<"Prodolgit vvod? y/n \n";
    cin>>ch;
    while (ch=='y')
    {
    cout<<"Vvedite konstantu : ";
    cin>>key;
    (*tek).next = new(dan_tab);
    tek = (*tek).next;
    (*tek).elem = key;
    (*tek).next = NULL;
    cout<<"Vvedite tip konstanti : ";
    cin>>tip_konst[i].tip;
    cout<<tip_konst[i].tip;
    i++;
    cout<<"Prodolgit vvod? y/n \n";
    cin>>ch;
    if (ch=='n')
    {
    cout<<"Press F2 to exit";
    ;break;
    }
    }
    max = i;
    };

    /********************************************************************************
    */

    void Tab_Konst::Print_tab()
    {
    dan_tab *q, tip_konst[10];
    char ch;
    int y = 7, k = 0;
    Win_tab();
    gotoxy(2,25);
    cout<<" Alt-C - Add     Alt-X - Delete       F2 - Menu   ";
    gotoxy(2,2);
    q = per;
    if (q==NULL)
    {
    cout<<" V dannoy tablice net konstant    ";
    cout<<" Press F2 to exit... ";
    //  ;break;
    }
    else
    {
    gotoxy(3,4);
    cout<<" |---------------------------------------------------------------------|\n";
    gotoxy(3,5);
    cout<<" |                    Konstanta                  |     Tip     |\n";
    gotoxy(3,6);
    cout<<" |---------------------------------------------------------------------|\n";
    }

    while (q != NULL)
    {
    gotoxy(15,y);
    cout<<(*q).elem;
    q = (*q).next;
    gotoxy(40,y);
    cout<<tip_konst[k].tip;
    y++;
    k++;
    }

    }


    dan_tab *tek, tip_konst[10]
    cin>>tip_konst[i].tip;
    cout<<tip_konst[i].tip;
    i++;
    вот сдесь массив символов превращается в массив строк
     
  7. Pegas

    Pegas Гость

    Согласен, но после прохождения цыкла char tip[1] - 1-я строка, [2] - 2-я строка и тд. Я правильно понимаю?
     
  8. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Неправильно. Код - каша нечитаемая. Ты его сам писал? Я тебе должен рассказать что у тебя в коде к чему? dan_tab - это данные по одной записи. Чтобы работать с набором, можно использовать динамический список (для которого у тебя есть dan_tab*next) или массов (tip_konst[10]). У тебя используются оба, причем иногда пишется в массив, иногда в список, все без головы и общего понимания смысла. Читается тоже, с ожидаемым результатом. Резюме - сесть и подумать над кодом, для каждой (!) строки самостоятельно написать комментарий что в ней делается и зачем.
     
  9. Pegas

    Pegas Гость

    Хорошо, приму к сведенью, но всё-таки есть идеи как вызвать массив tip_konst в процедуре Print_tab?

    <!--QuoteBegin-grigsoft+2:04:2007, 16:42 -->
    <span class="vbquote">(grigsoft @ 2:04:2007, 16:42 )</span><!--QuoteEBegin-->Ты его сам писал?
    [snapback]60961" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Я думаю вряд ли кто-то сможет повторить то, что я написал :), я просто только начинающий программист, так что не суди так строго.
    <!--QuoteBegin-grigsoft+2:04:2007, 16:42 -->
    <span class="vbquote">(grigsoft @ 2:04:2007, 16:42 )</span><!--QuoteEBegin-->Я тебе должен рассказать что у тебя в коде к чему?
    [snapback]60961" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    У меня список для самих констант, а массив строк для типов констант, почему два варианта? Просто хотел поэкспериментировать.
     
  10. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    У тебя массив определяется в каждой функции - и удаляется при ее выходе. Сделай его членом класса.
     
  11. Pegas

    Pegas Гость

    Тогда такой вопрос: Как структуру можно сделать членом класса? Если я вытащу из структуры этот массив символов, он не преобразуется в строку (я других способов не знаю). А можно этот массив как-то наследовать? Я пробовал у меня возникли проблемы. Примерно так:
    В конце процедуры ставил - Print_tab(tip_konst[10]);
    Объявлял процедуру - void Tab_Konst::print_tab(dan_tab dannie), и дальше выводил через dannie.tip
    А вот при объявлении функции-члена класса void Print_tab(dan_tab); - возникает ошибка.

    Если можно, подскажите пожалуйста, каким образом наследовать массив строк в функцию-член класса?
     
  12. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Pegas+3:04:2007, 08:20 -->
    <span class="vbquote">(Pegas @ 3:04:2007, 08:20 )</span><!--QuoteEBegin-->каким образом наследовать массив строк в функцию-член класса?
    [snapback]61007" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Очень многозначительная фраза :) Сам-то понял что сказал?
    Ну и по делу:
    Объявляешь структуру (можно в классе, можно вне его):
    struct dan_tab
    {
    char tip[10]; // тип константы в строковом виде
    int elem; // значение константы
    };
    Далее в классе объявляешь массив как: dan_tab array[10] // массив из 10 структур типа dan_tab
    Теперь обращение к элементам структуры по индексу будет выглядеть как array.tip и array.elem.
    Надеюсь, что помог...
     
  13. Pegas

    Pegas Гость

    <!--QuoteBegin-European+3:04:2007, 09:04 -->
    <span class="vbquote">(European @ 3:04:2007, 09:04 )</span><!--QuoteEBegin-->Далее в классе объявляешь массив как: dan_tab array[10] // массив из 10 структур типа dan_tab
    Теперь обращение к элементам структуры по индексу будет выглядеть как array.tip и array.elem.
    [snapback]61017" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Дело в том, что при входе в процедуру Print_tab(), я обращаюсь к этому массиву, а там какой-то мусор из памяти. Но в принцыпи я так и делаю как Вы говорите, только со списком на хранение констант.
    И ещё большое спасибо за отзыв, очень надеюсь на Вашу помощь, уже 3 недели не могу разрешить эту проблему, нервы кончаются, наверно щас всё сотру и начну с начала. :)
     
  14. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Pegas+3:04:2007, 10:37 -->
    <span class="vbquote">(Pegas @ 3:04:2007, 10:37 )</span><!--QuoteEBegin-->Дело в том, что при входе в процедуру Print_tab(), я обращаюсь к этому массиву, а там какой-то мусор из памяти.
    [snapback]61029" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Если ты объявил его в классе и правильно инициализировал, то мусора там быть не может. Значит проблема в одном или сразу в нескольких: 1 - объявлении, 2 - заполнении, 3 - обращении

    <!--QuoteBegin-Pegas+3:04:2007, 10:37 -->
    <span class="vbquote">(Pegas @ 3:04:2007, 10:37 )</span><!--QuoteEBegin-->уже 3 недели не могу разрешить эту проблему, нервы кончаются, наверно щас всё сотру и начну с начала
    [snapback]61029" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Иногда это очень помогает
     
  15. Pegas

    Pegas Гость

    <!--QuoteBegin-European+3:04:2007, 10:42 -->
    <span class="vbquote">(European @ 3:04:2007, 10:42 )</span><!--QuoteEBegin-->Если ты объявил его в классе и правильно инициализировал
    [snapback]61032" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Вот тут у меня как раз сомнения, я смотрел в книге пример, там вроде того:
    например моя структура

    struct dan_tab
    {
    char tip[10];
    int elem;
    };
    а за ней вот так

    void Print_tab(dan_tab);
    у меня эта запись вызывает ошибку, в книге процедурно-ориентировано, а у меня классы, может как-то по другому надо писать?
     
  16. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Pegas+3:04:2007, 10:51 -->
    <span class="vbquote">(Pegas @ 3:04:2007, 10:51 )</span><!--QuoteEBegin-->void Print_tab(dan_tab);
    у меня эта запись вызывает ошибку
    [snapback]61034" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Показывай все объявление и текст ошибки
     
  17. Pegas

    Pegas Гость

    class Tab_Konst
    {
    public:
    char ch, buffer[4028];
    int max;
    Tab_Konst();
    ~Tab_Konst();
    void Win_tab();
    void Creat_tab();

    struct dan_tab
    {
    char tip[10];
    int elem;
    };
    void Print_tab(dan_tab);
    };

    И потом при вызове процедуры

    void Tab_Konst::print_tab(dannie);

    Ошибка - void Print_tab(dannie); не является членом класса Tab_Konst

    примерно так, я попробовал так:

    class Tab_Konst
    {
    public:
    char ch, buffer[4028];
    int max;
    Tab_Konst();
    ~Tab_Konst();
    void Win_tab();
    void Creat_tab();
    //void Print_tab();

    struct dan_tab
    {
    char tip[10];
    int elem;
    };
    void Tab_Konst::print_tab(dan_tab);
    };

    void Tab_Konst::print_tab(dan_tab)
    {
    dan_tab Dan[10];
    char ch;
    int y = 7, k = 0;
    ...
    }

    но проблема не решилась
     
  18. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Во-первых, если хочешь чтобы тебе помогали, то форматируй текст хотя бы чуть-чуть, а также используй теги кода, а то такую кашу читать тяжело.
    Во-вторых, прочти хотя бы 50 страниц книжки про объектно-ориентированное программирование.
    Ну и в третьих, проще за тебя все сделать, чем объяснить:
    Код (Text):
    // Объявление

    class Tab_Konst
    {
    public:
    Tab_Konst();
    ~Tab_Konst();

    void Win_tab();
    void Create_tab();
    void Print_tab();

    private:
    char ch, buffer[4028];
    int max;

    struct dan_tab
    {
    char tip[10];
    int elem;
    };

    dan_tab dannie[10];
    };

    // Реализация

    void Tab_Konst::Print_tab()
    {  
    // Вывод массива dannie
    }

    // Пример использования

    int main()
    {
    Tab_Konst SomeTab;
    SomeTab.Create_tab();
    SomeTab.Print_tab();

    return 0;
    }
     
  19. Pegas

    Pegas Гость

    Огромное спасибо за помощь, всё работает, обязательно перечитаю ООП, оно мне тяжело даётся, но буду стараться.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей