Массив строк

  • Автор темы Pegas
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

Pegas

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

Pegas

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

grigsoft

Well-known member
15.11.2005
735
0
#3
char tip[10] - это строка длиной 9 символов, а не массив строк.
 
M

MechWarrior

#4
Вопрос не совсем понятен. char tip[10] - это же вроде массив символов, а не строк. Обычно для его вывода передают указатель (pchar) на первый (т.е. tip[0]) символ, и такие С-строки должны завершаться \0 (символом с нулевым кодом) - указателем конца строки.
 
04.09.2006
2 566
3
#5
<!--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]
Показывай код, все быстрее разрешится
 
P

Pegas

#6
//class Table Constant

Код:
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++;
вот сдесь массив символов превращается в массив строк
 

grigsoft

Well-known member
15.11.2005
735
0
#8
Неправильно. Код - каша нечитаемая. Ты его сам писал? Я тебе должен рассказать что у тебя в коде к чему? dan_tab - это данные по одной записи. Чтобы работать с набором, можно использовать динамический список (для которого у тебя есть dan_tab*next) или массов (tip_konst[10]). У тебя используются оба, причем иногда пишется в массив, иногда в список, все без головы и общего понимания смысла. Читается тоже, с ожидаемым результатом. Резюме - сесть и подумать над кодом, для каждой (!) строки самостоятельно написать комментарий что в ней делается и зачем.
 
P

Pegas

#9
Хорошо, приму к сведенью, но всё-таки есть идеи как вызвать массив 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]

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

grigsoft

Well-known member
15.11.2005
735
0
#10
У тебя массив определяется в каждой функции - и удаляется при ее выходе. Сделай его членом класса.
 
P

Pegas

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

Если можно, подскажите пожалуйста, каким образом наследовать массив строк в функцию-член класса?
 
04.09.2006
2 566
3
#12
<!--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.
Надеюсь, что помог...
 
P

Pegas

#13
<!--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 недели не могу разрешить эту проблему, нервы кончаются, наверно щас всё сотру и начну с начала. :)
 
04.09.2006
2 566
3
#14
<!--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]
Иногда это очень помогает
 
P

Pegas

#15
<!--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);
у меня эта запись вызывает ошибку, в книге процедурно-ориентировано, а у меня классы, может как-то по другому надо писать?
 
04.09.2006
2 566
3
#16
<!--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]
Показывай все объявление и текст ошибки
 
P

Pegas

#17
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;
...
}

но проблема не решилась
 
04.09.2006
2 566
3
#18
Во-первых, если хочешь чтобы тебе помогали, то форматируй текст хотя бы чуть-чуть, а также используй теги кода, а то такую кашу читать тяжело.
Во-вторых, прочти хотя бы 50 страниц книжки про объектно-ориентированное программирование.
Ну и в третьих, проще за тебя все сделать, чем объяснить:
Код:
// Объявление 

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;
}
 
P

Pegas

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