Часть 2. Я начинающий, подскажите как...(Все вопросы начинающих!!!)
ListBox1->Columns=3;
каким образом записать строку в второй и третий столбцы?
Посмотрел...:)
Я до этого именно так и сделал, перегрузил круглые скобки. Просто хотелось, чтоб выглядело по человечески. Ну шо ж, нет так нет
Есть форма на ASP.Net, в текстбоксы пишутся определенные данные, после чего их необходимо преобразовать в "документальный" вид. Т.е. есть некий шаблон документа, в который в определенные места надо подставить значения из текстбоксов. Формат файла, куда идут данные, был выбран rtf в виду открытости и доступности формата. Вся загвоздка в том, что русский текст в rtf надо записывать в кодировке Win-1251. Т.е. например чтобы в нем отображалось имя "антон", в самом файле должно стоять "\'e0\'ed\'f2\'ee\'ed". Воопрос собственно в том, как на платформе .Нет перекодировать исходный текст в строку символов соотв. кодировки? Бился над этой проблемой пару-тройку часов, но так и не пошло у меня.
Привожу кусок кода:
Encoding EncWin1251 = Encoding.GetEncoding("Windows-1251");
System.Environment.CurrentDirectory = @"C:\Users\1\Documents\Visual Studio 2005\WebSites\Test3\";
StreamReader StrmReader = File.OpenText("regCard.rtf");
StringBuilder RegCard = new StringBuilder(StrmReader.ReadToEnd());
string[] FormKeys = Request.Form.AllKeys;
foreach (string str in FormKeys)
{
RegCard.Replace(string.Format("<{0}>",str),Request.Form.Get(str));
}
FileStream fs = new FileStream(@"d:\NewReg.rtf", FileMode.Create, FileAccess.Write);
StreamWriter StrmWriter = new StreamWriter(fs, EncWin1251);
StrmWriter.Write(RegCard);
StrmWriter.Flush();
StrmWriter.Close();
//это последний вариант, который тоже не прокатил.
Желательно при всем этом конечный результат не сохранять, а так и хранить в памяти. Самый близкий вариант пока с таким циклом:
System.Windows.Forms.RichTextBox rtb = new System.Windows.Forms.RichTextBox();
foreach (string str in FormKeys)
{
rtb.Text=Request.Form.Get(str);
RegCard.Replace(string.Format("<{0}>",str),rtb.Rtf);
}
Правда RichTextBox много лишнего запихивает, не беда конечно, но пока на этом варианте не хочу останавливаться.
В общем, если кто-то подскажет как подобное провернуть, используя класс Encoding, то буду очень признателен.
private string TranToWin1251RTF(string str)
{
StringBuilder StrBuil = new StringBuilder("\\f0\\fs20");
char[] chr = str.ToCharArray();
foreach (char ch in chr)
{
int code = (int)ch;
if (code > 1039 && code < 1104)
StrBuil.Append(string.Format("\\'{0:x}", (code - 848)));
else
StrBuil.Append(ch);
}
StrBuil.Append("\\par");
return StrBuil.ToString();
}
Я до этого именно так и сделал, перегрузил круглые скобки. Просто хотелось, чтоб выглядело по человечески. Ну шо ж, нет так нет
Плохо смотрел.
В первой ссылке, которую я дал, описано, как сделать задание индексов матриц в круглых скобках. И подробно объяснено, почему нельзя перегрузить квадратные скобки.
Однако, во второй ссылке описан способ работы с матрицами с помощью квадратных скобок. Привожу скопипащенный оттуда код, объединённый в одно целое.
#include "stdafx.h"
#include <memory.h>
#include <assert.h>
template<class T>
class Row {
public:
Row(int cols=0):row(NULL) {SetRowSize(cols);}
~Row() {SetRowSize(0); }
Row(const Row &r):row(NULL) {
SetRowSize(r.numCols);
for (int i=0; i<numCols; i++)
row = r.row;
}
void SetRowSize(int n) {
if(row) delete[] row;
if (n>0) {
row = new T[n];
memset(row,0,sizeof(T)*n/sizeof(char));
}
else row = NULL;
numCols = n;
}
int size() { return numCols;}
T& operator[](int column) {
assert(column < numCols);
return row[column];
}
private:
int numCols;
T* row;
};
template<class T>
class Matrix {
public:
Matrix(int rows=0, int cols=0): matrix(NULL) {
SetSize(rows,cols);
}
Matrix(const Matrix& m): matrix(NULL) {
SetSize(m.numRows,m.numCols);
for (int r=0; r<numRows; r++)
matrix[r] = Row<T>(m.matrix[r]);//assign to primitive array, NOT overloaded []--to get a copy
}
void SetSize(int rows, int cols) {
if (rows) delete[]matrix;
if (cols > 0 && rows >0) {
matrix=new Row<T>[rows];
for (int i=0; i<rows; i++)
matrix.SetRowSize(cols);
}
else
rows=NULL;
numCols=cols; numRows=rows;
}
int GetCols() { return numCols;}
int GetRows() { return numRows;}
Row<T>& operator[](int index) {
assert(index < numRows);
return matrix[index];
}
private:
int numCols, numRows;
Row<T>* matrix;
};
int _tmain(int argc, _TCHAR* argv[])
{
Matrix<int> a(2,2);
a[0][0]=2;
a[0][1]=4;
a[1][0]=8;
a[1][1]=16;
for (int i=0; i<2; i++)
for (int j=0; j<2; j++)
printf("%d ", a[j]);
return 0;
}
Набирал, компилил, проверял в Visual Studio 2005. Все настройки по умолчанию. Работает.
Если нужна дополнительная функциональность, следует перегрузить другие операторы. В той статье многое описано.
в общем случае:
{
Led.light = !Led.light;
}
{
Led.light = !Led.light;
}
А для такой конструкции ? (P3-кнопка; P1-диод )[QUOTE]
while (1) {
if ((P3==0xff) && (P1==0xff)){}
if ((P3==0x7f) && (P1==0xff))
{
SFRPAGE = CONFIG_PAGE; //включение диода
PORT_init ();
SFRPAGE = TMR3_PAGE;
Timer3_init (SYSCLK / 12/10);
};
if ((P3==0xff) && (P1==0xbf)){};
if ((P3==0x7f) && (P1==0xbf))
{
EA = 0; //выключение
TF3 = 0;
P1MDOUT = 00;
LED = 00;
}
}
}
Пока не буду вникать в порты и таймеры. Надо попробовать код типа:
{
if (P3==0x7f)
{
if(P1==0xff)
{
//включение диода
}
else if(P1==0xbf)
{
//выключение диода
}
};
}
Ну и while (1) мне не нравится. Лучше сделать на прерываниях.
{
if (P3==0x7f)
{
if(P1==0xff)
{
//включение диода
}
else if(P1==0xbf)
{
//выключение диода
}
};
}
Ну и while (1) мне не нравится. Лучше сделать на прерываниях.
Спасибо, попробовал, но все-равно почему-то срабатывает только по одному разу :confused: вот полностью код программы, может найдете ошибку:
sfr16 TMR3=204;
#define SYSCLK 3062500
sbit LED=P1^6;
void PORT_init (void);
void Timer3_ISR (void);
void Timer3_init (int counts);
void main (void) {
WDTCN = 0xde;
WDTCN = 0xad;
EA = 1;
while (1) {if (P3==0x7f)
{
if(P1==0xff)
{
SFRPAGE = CONFIG_PAGE;
PORT_init ();
SFRPAGE = TMR3_PAGE;
Timer3_init (SYSCLK / 12/10);
}
else if(P1==0xbf)
{
EA = 0;
TF3 = 0;
P1MDOUT = 00;
LED = 00;
}};}
}
void PORT_init (void)
{ XBR2 = 64;
P1MDOUT = 64;
}
void Timer3_init (int counts)
{ TMR3CN = 0;
RCAP3 = -counts;
EIE2 = 1;
TR3 = 1;
}
void Timer3_ISR (void) interrupt 14
{
TF3 = 0;
LED = ~LED;
}
Как же я ошибку найду - я не знаю этот диалект Си. Попробуй так:
void main (void)
{
bool latch = true;
while (1)
{
if ((P3 == 0x7f) && latch)
{
LED = ~LED;
latch = false;
}
if (P3 == 0xff) latch = true;
}
}
Если булевского типа нет, то используй 0 и 1.
Формулировка:
Преобразовать строку таким образом, чтобы цифры каждого слова в ней были отсортированы по убыванию.
Что я уже написал:
#include <math.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
using namespace std;
void main ()
{
char stroka[100];
char* a[100];
cout << "enter text" << endl; cin >> stroka;
for(int fff=0;fff<3;fff++)
{a[fff] = strtok(stroka,",");
while( a[fff] != NULL )
{fff+=1;
a[fff] = strtok( NULL, "," );}
}
}
То есть я запрашиваю текст и потом разбиваю его на массив.
Подскажите, что мне делать дальше, если есть возможность - сделайте наброски, как это должно выглядеть. Желательно более менее простым языком, ибо я новичок в программировании.
Буду благодарен за любую помошь.
Подскажите, пожалуйста, какую функцию надо использовать и какой файл надо подключать.
Подскажите, пожалуйста, какую функцию надо использовать и какой файл надо подключать.
_mkdir, mkdir. Подробности в MSDN.
void main (void)
{
bool latch = true;
while (1)
{
if ((P3 == 0x7f) && latch)
{
LED = ~LED;
latch = false;
}
if (P3 == 0xff) latch = true;
}
}
Если булевского типа нет, то используй 0 и 1.
К сожалению не работает :confused: вернее работает, но как и прежде только один раз
Спасибо, все нашла!
А я пыталась сделать это через CreateDirectory. Но у меня папка либо вообще не создавалась, либо создавалась, но не там, где надо и с каким-то кривым именем.
Ну ладно. Тогда упрощай себе задачу - двигайся от простого к сложному. Проверь такой код:
void main (void)
{
int i = 3000;
int j = 0;
while (1)
{
LED = ~LED;
while (i)
{
i--;
j = 1000;
while (j) j--;
}
}
}
Диод должен мигать (если SYSCLK == 3062500, то раз в секунду). Если он перестанет - значит какое-то левое прерывание сработало или что-то типа того.
Ну и порт должен быть где-то настроен на выход, если этого нет по умолчанию...
void main (void)
{
int i = 3000;
int j = 0;
while (1)
{
LED = ~LED;
while (i)
{
i--;
j = 1000;
while (j) j--;
}
}
}
Диод должен мигать (если SYSCLK == 3062500, то раз в секунду). Если он перестанет - значит какое-то левое прерывание сработало или что-то типа того.
Ну и порт должен быть где-то настроен на выход, если этого нет по умолчанию...
Мигает, нормально все! :)
Ок. Двигаемся дальше.
void main (void)
{
while (1)
{
if (P3 == 0x7f) LED = 0;
else LED = 1 ;
}
}
тут диод должен гореть (или тухнуть - зависит от схемы) при удержании кнопки. Принимать другое состоянии при отпускании.
void main (void)
{
while (1)
{
if (P3 == 0x7f) LED = 0;
else LED = 1 ;
}
}
тут диод должен гореть (или тухнуть - зависит от схемы) при удержании кнопки. Принимать другое состоянии при отпускании.
ВООБЩЕ НЕ ГОРИТ!
вот как я написал:
void Port_IO_Init(void);
sbit LED=P1^6;
void main (void)
{ Port_IO_Init;
EA=1;
while (1)
{
if (P3 == 0x7f) LED = 0;
else LED = 1 ;
}
}
void Port_IO_Init()
{
SFRPAGE = CONFIG_PAGE;
P1MDOUT |= 0x40;//устанавливаю порт 1.6 в push-pull
XBR2 = 0x40;//разрешаю crossbar
}
Вот! Что-то изменилось и это хорошо. Если предположить, что вместо Port_IO_Init() использовалось Port_IO_Init, только в коде, выложенном в Интернет, то сразу появляется подозрения, что ошибка из-за настроек. Например, переместились на другую страницу (банк) памяти и не вернулись. При этом пытаемся читать какие-то данные из P3, который в другом банке памяти.
Ай, точно, вчера что-то невнимательно смотрел..все работает: нажимаю-гаснет, отпускаю-горит!:)
Надо делать рассчеты на компьютере, на котором не установлен ни Си, ни Visual Studio, ничего. Только винда стоит и все. Комп мощный, но на него обязательно нужно устанавливать лицензионное ПО, а его пока нет, и как быстро его установят, к сожалению, зависит не от меня.
Сейчас я на своем ноутбуке делаю exe-файл (компилирую с Release) и запускаю на мощном компе. Но, если использовать в проекте dll-файлы, то exe-файл просто не запускается на компе, где Си не установлен.
Можно как-то решить эту проблему или надо только ждать, пока наконец поставят ПО?
Заранее спасибо!
Можно как-то решить эту проблему или надо только ждать, пока наконец поставят ПО?
Какие dll файлы используются? Системные если - поставить на новый комп соответствующий рантайм (vcredist_x86), если свои - просто скопировать их к программе. Или линковать статически.
Каким образом я могу обращаться к элементу массива обьекта и правильно ли описал класс для этого действия?
Описание класса:
// В этом классе происходит описание информационных полей===================
char FIO[20];
char Nazv[20];
char Izd[20];
unsigned int god;
//--------------------------------------------------------------------------
// Выполнение перегрузки ввода-вывода--------------------------------------
public:
friend istream & operator>>(istream & is,info & a)
{
cout<<"*----------------------------------------------------------------*\n";
cout<<"\nPlease enter a name of the author of the book: ";
cin>>a.FIO;
a.FIO[strlen(a.FIO)]='\0';
cout<<"\nPlease enter the book name: ";
cin>>a.Nazv;
a.Nazv[strlen(a.Nazv)]='\0';
fflush(stdin);
cout<<"\nPlease enter the publishing house name: ";
cin>>a.Izd;
a.Izd[strlen(a.Izd)]='\0';
fflush(stdin);
cout<<"\nPlease enter year of the edition of the book: ";
cin>>a.god;
return is;
};
friend ostream & operator<<(ostream & os,info & a)
{
printf("є%12sє%11sє%11sє%8dє\n",a.FIO,a.Nazv,a.Izd,a.god);
return os;
};
//--------------------------------------------------------------------------
void readf(FILE *f) //чтение с файла....(1 метод)
{
fscanf(f,"%s",&FIO);
fscanf(f,"%s",&Nazv);
fscanf(f,"%s",&Izd);
fscanf(f,"%d",&god);
};
void writef(FILE *f) // запись в файл...(2 метод)
{
fprintf(f," ");
fprintf(f,"%s",FIO);
fprintf(f," ");
fprintf(f,"%s",Nazv);
fprintf(f," ");
fprintf(f,"%s",Izd);
fprintf(f," ");
fprintf(f,"%d",god);
};
//--------------------------------------------------------------------------
void obrab() //запись в информационные поля.
{
puts("Choose a field for change:");
printf("1) Book name. ==%s\n",Nazv);
printf("2) FIO. ==%s\n",FIO);
printf("3) Publishing house. ==%s\n",Izd);
printf("4) Year. ==%d\n[ ]",god);
gotoxy(2,8);
char q=getche();
switch (q) {
case '1':
printf("\nPlease enter a name of the author of the book: ");
scanf("%s",&FIO);
fflush(stdin);
break;
case '2':
printf("\nPlease enter the book name: ");
scanf("%s",&Nazv);
fflush(stdin);
break;
case '3':
printf("\nPlease enter the publishing house name: ");
scanf("%s",&Izd);
fflush(stdin);
break;
case '4':
printf("\nPlease enter year of the edition of the book ");
scanf("%d",&god);
fflush(stdin);
break;
};
};
//--------------------------------------------------------------------------
int sravnFIO(char f[20]) //4 metod
{ if(strcmp(FIO,f)==0)
return 1;
else return 0;
}
};
Для этого класса мне необходимо выполнить сортировку по обьекту god.
в функции main создан массив обьектов info litra
я пытаюсь обратится к обьекту таким образом litra.god=<какое то действие>. Компилятор выдает ошибку. В чем может быть причина? И как мне исправить эту ошибку? Спасибо.
в функции main создан массив обьектов info litra
я пытаюсь обратится к обьекту таким образом litra.god=<какое то действие>. Компилятор выдает ошибку. В чем может быть причина? И как мне исправить эту ошибку? Спасибо.
Я думаю, причина в том, что член god класса info является приватным, а непосредственный доступ к приватным данным разрешен только внутри функций класса, а также внутри функций, объявленных как дружественные (friend) данному классу.
Чтобы исправить, можно или сделать этот член класса публичным (объявить в классе в разделе public), или, дабы не нарушать принципы инкапсуляции, реализовать в классе функции для получения значения данного члена класса, и изменения его, и в функции main использовать эти функции. Что-то вроде:
// В этом классе происходит описание информационных полей===================
char FIO[20];
char Nazv[20];
char Izd[20];
unsigned int god;
public:
// ...
unsigned int get_god() { return god; }
void set_god(unsigned int g) { god = g; }
// ...
};
int main()
{
// ...
// допустим нужно получить значение god из litra и увеличить на 1:
unsigned int g;
g = litra.get_god();
++g;
litra.set_god(g);
// ...
}
Чтобы исправить, можно или сделать этот член класса публичным (объявить в классе в разделе public), или, дабы не нарушать принципы инкапсуляции, реализовать в классе функции для получения значения данного члена класса, и изменения его, и в функции main использовать эти функции. Что-то вроде:
// В этом классе происходит описание информационных полей===================
char FIO[20];
char Nazv[20];
char Izd[20];
unsigned int god;
public:
// ...
unsigned int get_god() { return god; }
void set_god(unsigned int g) { god = g; }
// ...
};
int main()
{
// ...
// допустим нужно получить значение god из litra и увеличить на 1:
unsigned int g;
g = litra.get_god();
++g;
litra.set_god(g);
// ...
}
Ого! Спасибо!! Но возник вопрос такого плана.. Каким образом лучше в моем случае реализовать функцию такого плана: Мне надо отсортировать массив обьектов по обьекту god и при этом должно иметь место перестановка полей данного элемента массива обьектов(т.е.FIO,Nazv,Izd) в соответствии с перестановкой поля god. Как это можно реализовать?
Как вариант - реализовать в классе функцию перестановки полей одного объекта с другим:
// В этом классе происходит описание информационных полей===================
char FIO[20];
char Nazv[20];
char Izd[20];
unsigned int god;
public:
// ...
// перестановка полей текущего объекта с объектом,
// задаваемым в качестве аргумента функции:
void replace(info & r) // передаем аргумент по ссылке
{
if(*this == r) // если объект совпадает с объектом - аргументом
return; // то можно ничего не делать
unsigned int i;
// перестановка FIO:
for(i = 0; i < 20; ++i)
{
char c = FIO;
FIO = r.FIO;
r.FIO = c;
}
// аналогично сделать для Nazv и Izd
// перестановка God:
i = god;
god = r.god;
r.god = i;
}
// ...
};
int main()
{
// ...
// допустим есть элементы litra и litra[j]
// и нужно переставить местами их поля, если litra.god > litra[j].god:
if(litra.get_god() > litra[j].get_god())
litra.replace(litra[j]);
// ...
}
Другой вариант - переставлять в массиве не поля объектов, а сами объекты. Для этого реализовать в классе операцию присваивания, и с помощью нее переставлять объекты:
// ...
public:
// ...
info operator=(const info& r)
{
if(*this == r) // если объект совпадает с объектом - аргументом
return *this; // то ничего делать не нужно
unsigned int i;
// присваивание FIO, Nazv, Izd:
for(i = 0; i < 20; ++i)
{
FIO = r.FIO;
Nazv = r.Nazv;
Izd = r.Izd;
}
// присваивание god:
god = r.god;
return *this;
}
// ...
};
int main()
{
// ...
if(litra.get_god() > litra[j].get_god())
{
info tmp;
tmp = info;
info = info[j];
info[j] = tmp;
}
// ...
}
P.S. Приведенный код в компиляторе не проверял, не исключены небольшие огрехи.
Update. Приведенные примеры можно упростить, если для присваивания C-строк FIO, Nazv, Izd использовать функцию strcpy из библиотеки string из C, вместо обхода элементов строк в циклах.
В первом примере
// перестановка FIO:
strcpy(buf, FIO);
strcpy(FIO, r.FIO);
strcpy(r.FIO, buf);
// аналогично для Nazv, Izd
Во втором примере
strcpy(FIO, r.FIO);
strcpy(Nazv, r.Nazv);
strcpy(Izd, r.Izd);
Так как все-таки можно сделать, чтобы диод горел не только при нажатии, но и при отпущенной кнопке (ну и выключался таким же образом)? :)
Сделать флаг-защелку (какую-нибудь переменную). Нажал - флаг установился и до следующего нажатия мы ничего не меняем. Флаг сбрасывать при отпускании кнопки.
Ну и почитать описание работы с контроллером внимательнее. И пойти на форум, где программирование контроллеров обсуждается. Здесь больше ПО для компов обсуждают.
Ну и почитать описание работы с контроллером внимательнее. И пойти на форум, где программирование контроллеров обсуждается. Здесь больше ПО для компов обсуждают.
Но вопросы то у меня не по работе контроллеров а по C, какая разница:)
else String(s);
почему-то вызывается конструктор без параметров
String()
{ str[0] = '\0'; }
Подскажите, пожалуйста, что не так:)
#include <string.h>
using namespace std;
////////////////////////////////////////////////////////////////////////////////////////////////////
class String
{
protected:
enum{SZ = 80};
char str[SZ];
public:
String()
{ str[0] = '\0'; }
String(char s[])
{ strcpy(str, s); }
void display()
{
cout << str << "\n";
}
operator char*()
{ return str; }
};
////////////////////////////////////////////////////////////////////////////////////////////////////
class PString : public String
{
public:
PString( char s[] )
{
if(strlen(s) > (SZ - 1))
{
for(int j = 0; j < SZ; j++)
str[j] = s[j];
}
else String(s);
}
};
////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
PString s1 = "12345678901234567890";
s1.display();
return 0;
}
В общем, я хочу попытаться освоить C#, но есть некоторые нюансы и вопросы. Итак..[INDENT] 1) С чего лучше всего начать? (Легко усваиваемая литература (для новичка), каким образом организовывать практикум (построение алгоритмов-> консольные приложения->..)) В общем все для полного нуба
2) Сложно ли освоить С# без знания C/C++, и имея знания и практику по программированию и алгоритмизации на 3 с минусом Может рано я берусь за это..
3) Какую среду разработки использовать для начала (сейчас осваиваю MSVC# 2008 EE)? Возможно для начала нужно что-то попроще?
4) Какое Ваше мнение об C# и .NET платформе в общем? Перспективность, сложность изучения и т.д.?
5) Кроссплатформенность, универсальность и т.п.
6) Достоинства и недостатки данного языка и платформы в целом?
7) Можно ли создавать на C# приложения работающие без .Net Framework'а?
[/INDENT]
Спасибо за внимания и ответы :) Буду рад любым комментариям
P.S. Извиняюсь, если вопросы задаю непонятно/некорректно..
В общем, я хочу попытаться освоить C#, но есть некоторые нюансы и вопросы. Итак..[INDENT] 1) С чего лучше всего начать? (Легко усваиваемая литература (для новичка), каким образом организовывать практикум (построение алгоритмов-> консольные приложения->..)) В общем все для полного нуба
2) Сложно ли освоить С# без знания C/C++, и имея знания и практику по программированию и алгоритмизации на 3 с минусом Может рано я берусь за это..
3) Какую среду разработки использовать для начала (сейчас осваиваю MSVC# 2008 EE)? Возможно для начала нужно что-то попроще?
4) Какое Ваше мнение об C# и .NET платформе в общем? Перспективность, сложность изучения и т.д.?
5) Кроссплатформенность, универсальность и т.п.
6) Достоинства и недостатки данного языка и платформы в целом?
7) Можно ли создавать на C# приложения работающие без .Net Framework'а?
[/INDENT]
Спасибо за внимания и ответы :) Буду рад любым комментариям
P.S. Извиняюсь, если вопросы задаю непонятно/некорректно..
Надеюсь, гнев коллег не заставит покраснеть убеленого сединами старпера. Отвечу по совести, пардон, по-пунктам:
1. Полный нуб != невменяемый идиот. Остальное - по-списку.
2. Не сложно. Читать внимательно литературу по C# и не оглядываться на C++. Совет, в общем-то, универсальный.
3. Удобно? С возможностями разобрался? Пользуй.
4. Использовать удобно. Причина: все придумано за вас, нефиг...
5. Адресный вопрос... Но! Важно понимать, что .Net задумка Microsoft, по сему, вопрос переносимости - открыт. Ссылок - предостаточно.
6. Вам зачем, собственно?
7. Ответ искать в ссылках с пункта №5.
Надеюсь, что сей развернутый ответ, подстегнет к дальнейшему самостоятельному обучению в виде самостоятельного поиска информации в сети Интернет.
Подскажите, пожалуйста, что не так:)
Просто потому что String() будет вызываться в любом случае перед выполнением PString(char s[]), если не указано обратное что-то другое в списке инициализаторов PString(char s[]). А вот этим
вы просто создаете временный объект, который тут же разрушается, а не вызываете конструктор базового класса.
Вообщем бегом читать про наследование в C++.
можно поподробнее...:)
<Capability>false</Capability>
<PIN>00826673</PIN>
</Tests>
Подскажите пожалуйста, как мне, используя библиотеку tinyxml, можно получить (желательно в формате char*) содержимое тэгов Capability и PIN ?
строка String(s); просто создает временный объект класса String и тут же его уничтожает.
Если хотите вызвать конструктор базового класса, делайте так:
PString( char s[] ): String(s)
{
Хотя это конечно и не впишется в вашу логику, просто потому, что она изначально неверна. Конструктор базового класса всегда вызвается до конструктора производного.
<Capability>false</Capability>
<PIN>00826673</PIN>
</Tests>
Подскажите пожалуйста, как мне, используя библиотеку tinyxml, можно получить (желательно в формате char*) содержимое тэгов Capability и PIN ?
Открываем гугл, набираем tinyxml, переходим по первой же ссылке и потом еще по одной с названием "Documentation". :)
http://www.grinninglizard.com/tinyxmldocs/index.html
Приложите код, как именно Вы пытаетесь перенаправить ссылки, чтобы было проще понять где у Вас ошибка.