Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> private member declared in class std::basic_ios<_E, при передаче файловой переменной в ф-ю 
V
    Опции темы
KasMP
Дата 21.12.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Я хочу прочитать строку из файла.

Если делать это так, как ниже, то все ок:
Код

#include ...

int main()
{
    ifstream f("C:\\in1.txt");
    char *x;    x=new char[];

    while (!f.eof()) {
    f >> x;
    printf("%s, len=%d.\n", x, strlen(x));
    }

    f.close();
    
    return(0);
}

Но если сделать то же самое (прочитать строку из файла) в процедуре:

Код

#include ...
#define path1 "C:\\in1.txt"

void Read (ifstream f, char *s)
{
    if (!f.eof()) f>>s;
}

int main()
{
    ifstream fin;
    char *s1; s1=new char[];
    
    fin.open(path1);
    Read(fin,s1);
    printf("%s",s1);

    return(0);
}

то возникает какая-то чудовищная ошибка, в которой я ничего не понимаю:
Цитата

1>K:\Visual Studio C++ 2008\VC\include\fstream(676) : error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ios(151) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        This diagnostic occurred in the compiler generated function 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream(const std::basic_ifstream<_Elem,_Traits> &)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]


Имхо по сути написано 100% одно и то же, только второй случай более общий и расширяемый. Какая ему разница, если одно и то же smile ?
Помогите, пожалуйтста!!! Я из-за этой ошибки уже полтора часа не могу заняться непосредственно той программой, которой нужно smile !!
PM MAIL   Вверх
mes
Дата 21.12.2008, 12:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



передавать поток надо по ссылке :
Код

void Read (ifstream& f, char *s)


а также смущают как минимум две вещи :
1. почему размерность не указана ?:
Цитата(KasMP @  21.12.2008,  12:23 Найти цитируемый пост)

char *s1; s1=new char[];


2.тут 
Цитата(KasMP @  21.12.2008,  12:23 Найти цитируемый пост)
 
char *s ...
..    f>>s;

 ИМХО  лучше использовать get, тогда можно контролировать размер считываемого буфера или считывать, например, в string.

да и вобще си-строки в с++ программе настораживают..

Это сообщение отредактировал(а) mes - 21.12.2008, 13:01


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  12:54 Найти цитируемый пост)
передавать поток надо по ссылке :

Спасибо большое smile .
Цитата(mes @  21.12.2008,  12:54 Найти цитируемый пост)
1. почему размерность не указана ?:

Мне это тоже не нравится (по идее, new должна знать, сколько памяти надо выделить).
Но если мы можем узнать кол-во памяти только тогда, когда прочитаем строку из файла, то что делать smile  smile ?
Цитата(mes @  21.12.2008,  12:54 Найти цитируемый пост)
 ИМХО  лучше использовать get, тогда можно контролировать размер считываемого буфера или считывать, например, в string.

Да, возможно smile . Размер буфера нельзя пускать на самотек smile .
Цитата(mes @  21.12.2008,  12:54 Найти цитируемый пост)
да и вобще си-строки в с++ программе настораживают..

Вообще у нас С (с редкими элементами С++) smile .

Цитата(mes @  21.12.2008,  12:54 Найти цитируемый пост)
а также смущают как минимум две вещи :

А как максимум  smile  smile ??
PM MAIL   Вверх
mes
Дата 21.12.2008, 13:37 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  13:17 Найти цитируемый пост)
Но если мы можем узнать кол-во памяти только тогда, когда прочитаем строку из файла, то что делать smile  smile ?

считывать часть файла размером не больше буффера, вариантов много . вот описание потока

http://www.cplusplus.com/reference/iostream/ifstream/
http://www.cplusplus.com/reference/iostrea...ator%3E%3E.html

Цитата

istream& operator>> (istream& is, char* str );
Extracts characters and stores them as a c-string (i.e. in succesive locations starting at location pointed by str and terminated by a null-character). Extraction ends when the next character is either a valid whitespace or a null character, or if the End-Of-File is reached.
The terminating null character is automatically appended after the extracted characters.
The extraction operation can be limited to a certain number of characters (thus avoiding the possibility of buffer overflow) if the field width (which can be set with ios_base::width or setw) is set to a value greater than zero. In this case, the extraction ends one character before the count of characters extracted reaches the value of field width, leaving space for the ending null character. After a call to this extraction operation the value of the field width is automatically reset to zero.


Добавлено через 3 минуты и 49 секунд
Цитата(KasMP @  21.12.2008,  13:17 Найти цитируемый пост)
А как максимум  smile  smile ?? 

лучше промолчу  smile 

Это сообщение отредактировал(а) mes - 21.12.2008, 13:38


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  13:37 Найти цитируемый пост)
лучше промолчу

Почему? Я не обижусь (разве только немного расстроюсь smile) и буду тебе очень благодарна smile  smile .
(или тебе не хочется писать много букаффф smile ?)
PM MAIL   Вверх
mes
Дата 21.12.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  13:44 Найти цитируемый пост)
Почему?

Потому как не знаю твоей задачи, а по контексту не очень понятно. 

К примеру я не вижу смысла в нужности реализации этой функции 
Цитата(KasMP @  21.12.2008,  12:23 Найти цитируемый пост)
 void Read (ifstream f, char *s)

в том исполнении в каком она представлена.
Функциональность какую пытаешься вынести в функцию уже реализована у потока.




Это сообщение отредактировал(а) mes - 21.12.2008, 13:58


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  13:37 Найти цитируемый пост)
istream& operator>> (istream& is, char* str );
...

Если я правильно поняла, то здесь написано, как ограничить размер того, что считается, чтобы буфер не переполнился.
Но мне-то это чем поможет с начальным вопросом? Начальный вопрос был такой: как я могу в
Код
char *s1; s1=new char[];
указать размерность, если пока не знаю ее? По-моему, никак smile.
PM MAIL   Вверх
mes
Дата 21.12.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  13:57 Найти цитируемый пост)
указать размерность, если пока не знаю ее? По-моему, никак smile. 

Цитата(mes @  21.12.2008,  13:37 Найти цитируемый пост)
считывать часть файла размером не больше буффера, 

то есть читать блоками, а размерность указывать для блока. 



--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  13:55 Найти цитируемый пост)
К примеру я не вижу смысла в нужности реализации этой функции 

Собственно, полностью задачка звучит так:
Цитата

Реализовать стек на основе динамических списков. С помощью него решить следующую задачу: в двух файлах записаны длинные натуральные числа (количество знаков больше 20). Найти их сумму и выписать ее в третий файл.


Добавлено @ 14:04
Цитата(mes @  21.12.2008,  13:59 Найти цитируемый пост)
то есть читать блоками, а размерность указывать для блока. 

Как читать - понятно. А как объявить (какую размерность указать "в new char[]") - непонятно smile.

Добавлено @ 14:08
Цитата(mes @  21.12.2008,  13:55 Найти цитируемый пост)
Функциональность какую пытаешься вынести в функцию уже реализована у потока.

А в самой программе я хочу написать так:
Код

char *Read (ifstream &f, char *s)
{
    if (!f.eof()) f.getline(s,MAX, ' '); else s=NULL;
    return(s);
}
Хотя, (s=NULL) будет действительно возникать там же, где (f.eof()). Видимо, функциональность правда дублируется...

Добавлено через 10 минут и 5 секунд
Вообще говоря, чтение из файла - не главный моментэтой задачки. Не надо так на нем зацикливаться.

Это сообщение отредактировал(а) KasMP - 21.12.2008, 14:09
PM MAIL   Вверх
KasMP
Дата 21.12.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



А саму задачку я (пока) хочу делать так.

Считали две строки в s1 и s2.
Потом размещаем каждую из этих строк в списке (при этом делаем это задом на перед: первые разряды в начале списка, каждый указатель ведет к бОльшему разряду - так складывать удобнее), список завершаем указателем на NULL.
Пусть в первом списке больше элементов, чем во втором (перед передачей в функцию их несложно выстроить в правильном порядке).
Потом встаем на начала списков (т.е. на самые первые разряды) и делаем два цикла:
  • пока во 2-ом списке не найдем NULL:
    складываем числа, на которые указывают указатели 1-ого и 2-ого стеков; прибавляем то, что в уме(при первом проходе =0);
    приписываем первый разряд полученного числа к строке-результату слева;
    запоминаем новый mental (то, что в уме): это 2-ой разряд полученного числа;
    сдвигаем текущие указатели;
    удаляем указатели на вершину; указателю на вершину приравниваемый текущие;
  • пока в 1-ом списке не найдем NULL:
    делаем то же самое, только без второго списка и значение mental при первом проходе уже не всегда 0.
Только стека здесь не видно smile . А надо бы, ведь в формулировке он есть smile ...
Вот, это мой скромный алгоритм smile .

Это сообщение отредактировал(а) KasMP - 21.12.2008, 14:24
PM MAIL   Вверх
mes
Дата 21.12.2008, 14:26 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  13:59 Найти цитируемый пост)
Собственно, полностью задачка звучит так:

неужто Вам задания в таком виде дают ?  smile ужас 
Цитата(KasMP @  21.12.2008,  13:59 Найти цитируемый пост)
в двух файлах записаны длинные натуральные числа..Найти их сумму и выписать ее в третий файл.

Мне например абсолютно не понятно кого надо складывать.. Предполагаю что в каждом файле одинаковое кол-во чисел и надо сложить числа с одним индексом с разных файлов.  smile 
Не понятно также, что считается раздeлителем между числами - предполагаю перевод_строки.
ну да это мелочи.

В простейшем случае выделяете массив заведомо  больше  любого числа, и считывать с помощью getline -  istream& getline (char* s, streamsize n, char delim ); 

Иначе считываете мелкими порциями с помощью get, и добавляете его (или его часть, если в блоке присутствует раздилитель) в основной буфер для числа.
Но в этом случае нужен динамически расширяемый буффер и потому намного удобнее будет использовать std::string (или vector смотря что использовано для дляинной арифметики)
тем более, что стек будете же использовать стловский ?

Добавлено через 8 минут и 30 секунд
Заводите класс для числа длинной арифметики. Перегружаете потоковые операторы для считывания/записи этого числа из файла 
Организуете стековый список и считываете числа туда. 


Это сообщение отредактировал(а) mes - 21.12.2008, 14:29


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
неужто Вам задания в таком виде дают ?  smile ужас 

Да smile .
С другой стороны, такие формулировки сразу позволяют выявить тех, кто вдумывается, а кто - нет.
Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
Мне например абсолютно не понятно кого надо складывать.. 

Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
Не понятно также, что считается раздeлителем между числами - предполагаю перевод_строки.

 smile Мне тоже непонятно. Когда есть время спросить, то я спрашиваю. Когда нет - решаю сама smile , что, например, разделяться они будут пробелами и '\n' и что кол-во чисел в файла может не совпадать.

Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
В простейшем случае выделяете массив заведомо  больше  любого числа

Это плохо. Много памяти уйдет непонятно куда. Я так не хочу.
Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
Иначе считываете мелкими порциями с помощью get

И за каждой мелкой порцией обращаемся к винчестеру. Пусть даже данные с винчестера и считываются не посимвольно, а заносятся частями в буфер, все равно так не надо делать - это нерационально.
Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
что стек будете же использовать стловский ?

Нет, конечно. Свой.
PM MAIL   Вверх
mes
Дата 21.12.2008, 14:45 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  14:38 Найти цитируемый пост)
И за каждой мелкой порцией обращаемся к винчестеру. Пусть даже данные с винчестера и считываются не посимвольно, а заносятся частями в буфер, все равно так не надо делать - это нерационально

А как Вы думаете чем считывание с потоков отличается от простого считывания с файла ?




--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  14:45 Найти цитируемый пост)
А как Вы думаете

Ой, а что это ты ко мне на "вы" smile  smile ...

Чем отличается?? Тем, что потоки буферизованы?

Добавлено через 57 секунд
Цитата(mes @  21.12.2008,  14:26 Найти цитируемый пост)
Заводите класс

У нас нет классов.
PM MAIL   Вверх
KasMP
Дата 21.12.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Вот кусочек программки, вроде бы правильно:
Код

struct stack {char c; stack *next;};

void CreationStack (stack *h, stack *present, char *s)
{
    int n=strlen(s);
    h=new stack; present=h;
    for (i=n-1; i>-1; i--) {
        present->c=*(s+i);
        present->next=new stack;
        present=present->next;
    }
    present=NULL;
}

Только странно называть самый обычный список стеком...
PM MAIL   Вверх
mes
Дата 21.12.2008, 15:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  15:05 Найти цитируемый пост)
Только странно называть самый обычный список стеком... 

стек отличается от других видов контейнера тем, что у него есть доступ только к верхним/нижним элементам.
фактически стек является адаптером над контейнером, ограничивая его для придания нужно интерфейса.

Цитата(KasMP @  21.12.2008,  14:49 Найти цитируемый пост)
У нас нет классов. 

ну тогда класс - это структура данных с набором функций для нее.

Цитата(KasMP @  21.12.2008,  14:49 Найти цитируемый пост)

Ой, а что это ты ко мне на "вы" smile  smile ...

так получилось .. сам не заметил.. привычка  smile 

Цитата(KasMP @  21.12.2008,  14:49 Найти цитируемый пост)
Чем отличается?? Тем, что потоки буферизованы?

Нет. Тем что за потоком не стоит определенного устройства, точнее сказатьи мы не знаем что там на самом деле.
То есть поток сам решает как оптимально использовать то устройство, которое он скрывает. 




--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Ну а теперь моя любимая программка при самом обычном присвоении целочисленной переменной значения выдает ошибку:

user posted image


Код
t=int(present1->c)+int(present2->c)+mental-96;
Указатели смотрят куда надо, mental инициализирована...

Я совсем не знаю, что думать (строчка с номером 10):
Код

// в первом стеке больше элементов, чем во втором
char *Addition (stack *h1, stack *h2, char *res)
{
    int mental=0, t, len=strlen(res);
    stack *present1=h1, *present2=h2;

    while (present2!=NULL) {
         t=int(present1->c)+int(present2->c)+mental-96;
         *(res+len-1)=t%10+48;
         
         len--; mental=t/10;
         present1=present1->next; delete h1; h1=present1;
         present2=present2->next; delete h2; h2=present2;
         }

    while (present1!=NULL) {
         t=int(present1->c)+mental-48;
         *(res+len-1)=t%10+48;
         
         len--; mental=t/10;
         present1=present1->next; delete h1; h1=present1;
         }

    delete h1; delete h2;
    
    if (mental==1) *res='1'; else *res=' ';

    return(res);
}

PM MAIL   Вверх
mes
Дата 21.12.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



прежде всего откуда удаление ?
Цитата(KasMP @  21.12.2008,  16:49 Найти цитируемый пост)
    delete h1; delete h2;
это этически некоректно удалять в процедуре то, что в ней не создано (за исключением случаев, когда функция явно для этого предназначена) и судя по всему явно не это ожидалось.

во вторых почему в функцию сложения передается стек ??



Это сообщение отредактировал(а) mes - 21.12.2008, 17:01


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  16:58 Найти цитируемый пост)
прежде всего откуда удаление ?

Я удаляю числа предыдущего разряда, который уже сложен и, соответственно, больше никогда не потребуется.
Цитата(mes @  21.12.2008,  16:58 Найти цитируемый пост)
это этически некоректно удалять в процедуре то, что в ней не создано (за исключением случаяв когда функция явно для этого предназначена)
Я об этом думала.
Победила такая мысль: если не удалять здесь, то тогда придется создавать еще одну процедуру для удаления и снова проходить по тем же самым ссылкам по второму кругу.
Цитата(mes @  21.12.2008,  16:58 Найти цитируемый пост)
во вторых почему в функцию сложения передается стек ??

Эмм... В смысле??
Я передаю указатели на начало списков (где самые первые разряды) и указатель на строку-результат. Потом иду по списку, складываю (и удаляю уже сложенное)...
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  16:49 Найти цитируемый пост)
int(present1->c)+int(present2->c)+mental-96;

это называется использованием магических чисел и такой подход очень плох.
лучше так:
int(present1->c-'0')+int(present2->c-'0')+mental;



--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Ошибка на 10-ой строке, до удаления даже не доходит...

Добавлено через 1 минуту и 5 секунд
Цитата(mes @  21.12.2008,  17:06 Найти цитируемый пост)
это называется использованием магических чисел и такой подход очень плох.
лучше так:
int(present1->c-'0')+int(present2->c-'0')+mental;

Спасибо большое. Так правда намного лучше и понятнее smile  smile .
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:11 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:05 Найти цитируемый пост)

Эмм... В смысле??
Я передаю указатели на начало списков (где самые первые разряды) и указатель на строку-результат. Потом иду по списку, складываю (и удаляю уже сложенное)... 

Сложение (сам механизм) не должно быть реализовано в функции работающей со стеком. Разделите функционал на смысловые части.. Именно поэтому я предлагал начать с класса
(читать: описания) "длинной" переменной.

Добавлено через 1 минуту и 12 секунд
Цитата(KasMP @  21.12.2008,  17:06 Найти цитируемый пост)
Ошибка на 10-ой строке, до удаления даже не доходит...

Пока не знаю до чего доходит.. но глаз режет.. поэтому и высказал  smile 


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Да, кстати, без этого эту функцию смотреть бесполезно:
Код

struct stack {char c; stack *next;};

PM MAIL   Вверх
mes
Дата 21.12.2008, 17:16 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  16:49 Найти цитируемый пост)
char *Addition (stack *h1, stack *h2, char *res)

1. Передаются два стека, а результат весь умещается в одну строку ?
2. а на какой длины буффер указывает res ?

Цитата(KasMP @  21.12.2008,  17:12 Найти цитируемый пост)
Да, кстати, без этого эту функцию смотреть бесполезно:

это не стек, это  список

Это сообщение отредактировал(а) mes - 21.12.2008, 17:19


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:11 Найти цитируемый пост)
Сложение (сам механизм) не должно быть реализовано в функции работающей со стеком. 

По идее, да.
Цитата(mes @  21.12.2008,  17:11 Найти цитируемый пост)
Разделите функционал на смысловые части..

Надо бы, конечно... Но там получится такая мааааааленькая функция, в которую придется много всего передавать.
Как-то странно такой маленькой функции отводить так много памяти и "передаваний".
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:18 Найти цитируемый пост)
Надо бы, конечно... Но там получится такая мааааааленькая функция, в которую придется много всего передавать.
Как-то странно такой маленькой функции отводить так много памяти и "передаваний". 

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

Это сообщение отредактировал(а) mes - 21.12.2008, 17:22


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:16 Найти цитируемый пост)
это не стек, это  список

Я знаю и говорю про это с самого начала!!!!!!
Цитата(mes @  21.12.2008,  17:16 Найти цитируемый пост)
1. Передаются два стека, а результат весь умещается в одну строку ?

Ну а почему бы и нет? Взяли число из первого "стека", взяли число из второго, сложили, получили число в res.
Цитата(mes @  21.12.2008,  17:16 Найти цитируемый пост)
2. а на какой длины буффер указывает res ?

На один символ больший, чем длиннейшее число (чтобы вошла единичка, если, например, 999+2=1001).

Добавлено через 2 минуты и 11 секунд
Цитата(mes @  21.12.2008,  17:20 Найти цитируемый пост)
неправда.  

Что именно? То, что это странно или то, что ей можно передать меньше, чем я предполагаю?
(а я предполагаю mental, один из указателей на "стек", и указатель на нужную позицию в  res)

Добавлено через 3 минуты и 7 секунд
Ну а если я поделю, то суть прораммы все равно не изменится и ошибка будет так же вылетать...

Добавлено через 6 минут и 22 секунды
А вот главная функция. Пусть будет smile :
(она пока не закончена: вывода в файл нет, файлы не закрыты и т.п.; но это не так важно...)

Код

int main()
{
    stack    *h1, *h2;
    ifstream f1(path1); ifstream f2(path2); ofstream fout(pathout);
    
    int i;
    char *s1, *s2, *res;
    
    s1=new char[]; s2=new char[];

    char *esc=new char[];

    //while ((!f1.eof()) && (!f2.eof()))
    {
        f1.getline(s1,MAX,' '); f2.getline(s2,MAX,' ');
        printf("s1=%s.\n", s1); printf("s2=%s.\n", s2);
        int len1=strlen(s1), len2=strlen(s2);
        if (len1>len2) {
            res=new char[len1+1];
            esc=Addition(h1,h2,res);
        } else {
            res=new char[len2+1];
            esc=Addition(h2,h1,res);
        }
    }

    printf("res=%s\n", esc);

    
    return(0);
}

PM MAIL   Вверх
mes
Дата 21.12.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:20 Найти цитируемый пост)
Я знаю и говорю про это с самого начала!!!!!!

ну а исправлять когда будем ?!  smile 


Цитата(KasMP @  21.12.2008,  17:20 Найти цитируемый пост)
Ну а почему бы и нет? Взяли число из первого "стека", взяли число из второго, сложили, получили число в res.

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

Цитата(KasMP @  21.12.2008,  17:20 Найти цитируемый пост)
На один символ больший, чем длиннейшее число (чтобы вошла единичка, если, например, 999+2=1001).

покажи как все это  происходит.

Цитата(KasMP @  21.12.2008,  17:20 Найти цитируемый пост)
Что именно? То, что это странно или то, что ей можно передать меньше, чем я предполагаю?
(а я предполагаю mental, один из указателей на "стек", и указатель на нужную позицию в  res) 

Цитата(mes @  21.12.2008,  17:20 Найти цитируемый пост)
для сложения требуется два аргумента, и сумма как результат

и ни о каких стеках речи нет.


Это сообщение отредактировал(а) mes - 21.12.2008, 17:31


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:20 Найти цитируемый пост)
неправда, для сложения требуется два аргумента, и сумма как результат.

Неправда smile  smile !
Во-первых, у меня аргументов не всегда 2 (можно сделать и всегда 2, конечно... но наврядли производительность от этого выиграет).
Во-вторых еще есть mental... Его тоже надо помнить и перезапоминать при сложении каждого разряда.

Добавлено через 2 минуты и 38 секунд
Цитата(mes @  21.12.2008,  17:30 Найти цитируемый пост)
покажи как все это у  происходит.

Соответствующий кусочек main():
Код

        f1.getline(s1,MAX,' '); f2.getline(s2,MAX,' ');
        int len1=strlen(s1), len2=strlen(s2);
        if (len1>len2) {
            res=new char[len1+1];
            esc=Addition(h1,h2,res);
        } else {
            res=new char[len2+1];
            esc=Addition(h2,h1,res);
        }

Цитата(mes @  21.12.2008,  17:30 Найти цитируемый пост)
и ни о каких стеках речи нет.

Ну, ты называешь аргументом символ, я называю указатель на символ smile ...
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:30 Найти цитируемый пост)
Неправда smile  smile !
Во-первых, у меня аргументов не всегда 2 (можно сделать и всегда 2, конечно... но наврядли производительность от этого выиграет).
Во-вторых еще есть mental... Его тоже надо помнить и перезапоминать при сложении каждого разряда. 

Вот тебе (не программе) сказали что надо сложить два числа. Tебе кто-то должен передавать ментал ?
Вот подумай как бы ты решила такое задание и объясни компу.  smile 


Цитата(KasMP @  21.12.2008,  17:30 Найти цитируемый пост)
у меня аргументов не всегда 2 

В смысле бывает и меньше ?? Ну ка сложи мне 1 и .. не.. не так...  сложи 1.  Логично, а ?



--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(KasMP @  21.12.2008,  17:30 Найти цитируемый пост)
Соответствующий кусочек main():

esc и res - указатели на символ

Добавлено @ 17:41
Цитата(mes @  21.12.2008,  17:35 Найти цитируемый пост)
Вот тебе (не программе) сказали что надо сложить два числа. Tебе кто-то должен передавать ментал ?

Да что-то такое smile !!
Ты складываешь поразрядно (столбиком, проще говоря; перед сложением второго разряда тебе передают mental=1):
4569
 111
4680

Если тебе не передавать mental, то ты сложишь так:
4569
 111
4670

Цитата(mes @  21.12.2008,  17:35 Найти цитируемый пост)
В смысле бывает и меньше ?? Ну ка сложи мне 1 и .. не.. не так...  сложи 1.  Логично, а ?

(женская логика?)
Ну ты складываешь, скажем, 11111111111 и 1:
Конечно, можно складывать и так:
11111111111
00000000001
11111111112

Но имхо лучше сложить 1+1, потом увидеть, что во втором числе остальных разрядов нет и приложить остальные разряды первого!!

Это сообщение отредактировал(а) KasMP - 21.12.2008, 17:47
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:30 Найти цитируемый пост)
Ну, ты называешь аргументом символ, я называю указатель на символ smile ... 

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


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:42 Найти цитируемый пост)
нет .. я аргументом называю число, а выражено оно символом, указателем на символ или чем то другим, зависит от задачи и ее исполнения. 

Ну число, какая разница smile ... Я тоже имела в виду число-символ-указатель smile ...

Добавлено через 1 минуту и 24 секунды
Цитата(mes @  21.12.2008,  17:35 Найти цитируемый пост)
Вот тебе (не программе) сказали что надо сложить два числа. Tебе кто-то должен передавать ментал ?

Ну, сначала нет... Но потом mental мне потребуется и я буду его сама себе передавать при сложении каждого разряда.
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:35 Найти цитируемый пост)
Ты складываешь поразрядно 

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

Добавлено @ 17:49
Цитата(KasMP @  21.12.2008,  17:44 Найти цитируемый пост)
Но потом mental мне потребуется и я буду его сама себе передавать при сложении каждого разряда. 

Представь я вызов (клиент), ты функция (сервер) :
я тебе даю два числа.. У тебя есть листик, карандаш (а может калькулятор я ведь не вижу)  ты считаешь и отдаешь мне результат.. ничего больше никому передоваться не должно !

Это сообщение отредактировал(а) mes - 21.12.2008, 17:50


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:47 Найти цитируемый пост)
я тебе даю два числа.. У тебя есть листик, карандаш (а может калькулятор я ведь не вижу)  ты считаешь и отдаешь мне результат.. ничего больше никому передоваться не должно ! 

Так это и делает функция Addition: ей дали два числа (указатели на начала списков), она дала указатель на res (на результат).
PM MAIL   Вверх
mes
Дата 21.12.2008, 17:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  17:50 Найти цитируемый пост)
Так это и делает функция Addition: ей дали два числа (указатели на начала списков), она дала указатель на res (на результат). 

давать надо не указатель на список! и не его элемент! а "значение" элемента списка! 

то есть вызов должен быть Add (stack->value, stack->value, res );






--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  17:58 Найти цитируемый пост)
и не его элемент! а "значение" элемента списка! 

А элемент списка и его значение  - не одно и то же??
Цитата(mes @  21.12.2008,  17:58 Найти цитируемый пост)
то есть вызов должен быть Add (stack->value, stack->value, res );

Ты, возможно, рассердишься, но ... куда девать то, что получится в уме smile ?
PM MAIL   Вверх
mes
Дата 21.12.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  18:02 Найти цитируемый пост)
Ты, возможно, рассердишься, но ... куда девать то, что получится в уме smile ? 

вот декларация функции :
void lvAdd (const char * a1, const char * a2, char * res);
реализовывай  smile

Добавлено через 4 минуты и 36 секунд
Цитата(KasMP @  21.12.2008,  18:02 Найти цитируемый пост)
А элемент списка и его значение  - не одно и то же??

для операций над числами забудь вобще что у тебя где то список , стек и вобще все остальное.

У нас есть число, оно представлено как си-строка , больше ничего нам не нужно.



--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  18:35 Найти цитируемый пост)
У нас есть число, оно представлено как си-строка

Я так же буду размещать цифры это супер-длинного числа в списке, потом складывать столбиком.

Вообще говоря, довольно интересен ответ на вопрос о том,почему не работает уже написанная программа?
Что такого необычного в 
Код
t=int(present1->c-'0')+int(present2->c-'0')+mental;

PM MAIL   Вверх
mes
Дата 21.12.2008, 20:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  19:44 Найти цитируемый пост)
Что такого необычного в 

я в принципе хотел, чтоб Вы сами ее нашли, к чему бы Вы пришли, если послушались совета. 
но раз уж так сильно хотите оставаться при своем коде - пожалуйста.. 

Цитата(KasMP @  21.12.2008,  16:49 Найти цитируемый пост)
    while (present2!=NULL) {
         t=int(present1->c)+int(present2->c)+mental-96; // сложили разряд
         *(res+len-1)=t%10+48; // добавили разряд к результату
         
         len--; mental=t/10; // 
                                                   //А где операции с другими разрядами ?! (1)

         present1=present1->next; delete h1; h1=present1; // перешли к следующему числу , a к какому? вы его разве загрузили или пометили последний указатель нулем? (2)
                                                                                         // и удалили старое
         present2=present2->next; delete h2; h2=present2;
         }


Цитата(KasMP @  21.12.2008,  17:20 Найти цитируемый пост)
int main()
{
    stack    *h1, *h2;
    ifstream f1(path1); ifstream f2(path2); ofstream fout(pathout);
    
    int i;
    char *s1, *s2, *res;
    
    s1=new char[]; s2=new char[];
    char *esc=new char[];
    //while ((!f1.eof()) && (!f2.eof()))
    {
        f1.getline(s1,MAX,' '); f2.getline(s2,MAX,' ');  // загрузили строки с файла в s1 и s2
        printf("s1=%s.\n", s1); printf("s2=%s.\n", s2); // вывод
        int len1=strlen(s1), len2=strlen(s2); // взяли длину от s1 и s2
        if (len1>len2) {                  // сравнили
            res=new char[len1+1]; // выделили место
            esc=Addition(h1,h2,res); // и вызвали передав в параметрах h1 и h2 - a где собстевенно заполнение этих структур ?? (3)
        } else {
            res=new char[len2+1];
            esc=Addition(h2,h1,res);
        }
    }

Вылетаeт из за (3), но (2) тоже могла бы явиться причиной, ну а из за (1) у вас результат сложения неправильный..

P.S. 
в этом посте обращение на "Вы" намерянное  smile  


Это сообщение отредактировал(а) mes - 21.12.2008, 20:41


--------------------
PM MAIL WWW   Вверх
mes
Дата 21.12.2008, 20:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  19:44 Найти цитируемый пост)
Я так же буду размещать цифры это супер-длинного числа в списке, потом складывать столбиком.

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


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
А где операции с другими разрядами ?! (1)

При следующем проходе цикла while smile  smile !
Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
перешли к следующему числу , a к какому?

Мы перешли не к след.числу, а к след.разряду smile !
Элемент списка - не число, а разряд smile.
Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
вы его разве загрузили или пометили последний указатель нулем? 

Разумеется smile  smile !
Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
и удалили старое

Ну, по-моему, логично как можно раньше избавиться от ненужного smile ...
Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
и вызвали передав в параметрах h1 и h2 - a где собстевенно заполнение этих структур ?? (3)

Ой!!! Я забыла вызвать CreationStack smile  smile !

Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
но раз уж так сильно хотите оставаться при своем коде - пожалуйста.. 

К сожалению, хочу, потому что время поджимает. Но в зимние каникулы с радостью сделаю все идеально smile .
Цитата(mes @  21.12.2008,  20:35 Найти цитируемый пост)
в этом посте обращение на "Вы" намерянное 

Становится все интереснее smile . Интересно, что же это "Вы" значит smile ...
Цитата(mes @  21.12.2008,  20:53 Найти цитируемый пост)
а операции над числами должны производится без участия стека! 

Я согласна с этим, но ... не сейчас smile.


Добавлено через 2 минуты и 47 секунд
Вот, я добавила в соответствующее место в main два CreationStack. Вылетает та же ошибка smile .
Попробовала сначала все-таки инициализировать h1 и h2, потом вызывать создание "стека". То же самое smile.
"Стеки" заполняются правильно, а потом после входа в Addition на этой магической строчке все вылетает... Странно. 
PM MAIL   Вверх
mes
Дата 21.12.2008, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
К сожалению, хочу, потому что время поджимает. Но в зимние каникулы с радостью сделаю все идеально smile .

Так сделать понормальному уйдет час, а Вы день потратили на переборку кода )

Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
Становится все интереснее smile . Интересно, что же это "Вы" значит smile ...

догадайся )

Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
Элемент списка - не число, а разряд smile.

То есть число представлено стеком, так еше на основе списка ?? a кто то говорил, что она экономная  smile 
а массив чисел загружаемых с файла чем является ?

Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
Ой!!! Я забыла вызвать CreationStack smile  smile !

боюсь что не только.

Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
Попробовала сначала все-таки инициализировать h1 и h2, потом вызывать создание "стека". То же самое smile.

Не вижу  smile 

Цитата(KasMP @  21.12.2008,  21:34 Найти цитируемый пост)
"Стеки" заполняются правильно,

не верю  smile 






--------------------
PM MAIL WWW   Вверх
KasMP
Дата 21.12.2008, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
Так сделать понормальному уйдет час, а Вы день потратили на переборку кода )

Было уже поздно что-то менять.
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
догадайся )

Теряюсь в догадках smile .
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
То есть число представлено стеком, так еше на основе списка ??

Ну да... smile
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
a кто то говорил, что она экономная

??
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
а массив чисел загружаемых с файла чем является ?

Прочитали в строку число. Каждый символ строки - элемент списка.
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
боюсь что не только.


Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
Не вижу 

Зачем каждый мизерный кусочек кода сюда вставлять?
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
не верю

Я дополнила CreationStack строчкой вывода:
Код
printf("%c ", *(s+i));

В итоге у меня цифры 1) выводились; 2) в правильном порядке.
Код

void CreationStack (stack *h, char *s)
{
    int i, n=strlen(s);
    stack *present;

    //h=new stack;
    present=h;
    for (i=n-1; i>-1; i--) {
        present->c=*(s+i);
        printf("%c ", *(s+i));
        present->next=new stack;
        present=present->next;
    }
    present=NULL;
}


Добавлено через 11 минут и 25 секунд
Цитата(mes @  21.12.2008,  22:16 Найти цитируемый пост)
не верю

не знаю, она работает так: получает инициализированный указатель на структуру и символ, внутри себя создает текущий указатель, для начала приравнивает его к указателю на голову списка, потом первому "c" присваивает последний символ строки, инициализирует следующий за текущим указатель, сдвигает текущий указатель и т.д. по кругу, последний текущий указаетль приравнивает у нулю
PM MAIL   Вверх
mes
Дата 22.12.2008, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  21.12.2008,  13:59 Найти цитируемый пост)
Реализовать стек на основе динамических списков. С помощью него решить следующую задачу: в двух файлах записаны длинные натуральные числа (количество знаков больше 20). Найти их сумму и выписать ее в третий файл.

и все таки стек надо реализовывать для чисел, а не для цифр.

вот длинная арифметика  :
Код

#include <iostream>

bool isDigit (char c) { return c>='0' && c<='9'; }

struct lv_value 
{
// никогда не изменяйте содержимое, кроме как в предназначенных для этого функциях с префиксом lv_
    char *begin;
    char *end;
};
void lv_create (lv_value& lv) // конструктор 1
{
    lv.begin = NULL;
    lv.end   = NULL;
}

void lv_create (lv_value& lv, const char * str) // конструктор 2
{
    const char * p = str;
    for (;isDigit(*p); ++p) ;   // ищем первый не символ,

    lv.begin = new char[p-str];  // создаем внутренний массив
    char * p1 = lv.begin;
    for (;str<p; ++str, ++p1) *p1 = *str; // копирование нужных символов
    *(p1) = 0;
    lv.end =p1;
}

void lv_create (lv_value& dst, const lv_value& src) // конструктор копий
{
    dst.begin = new char[src.end-src.begin];  // создаем внутренний массив

    char * p  = src.begin;
    char * p1 = dst.begin;

    for (;p<=src.end; ++p, ++p1) *p1 = *p; // копирование нужных символов
    dst.end =p1-1;
}

void lv_destroy (lv_value& lv)   // деструктор
{
    if (lv.begin!=NULL) delete[] lv.begin;
    lv.begin = NULL; // не обязательные строчки
    lv.end   = NULL; // но оставим их .. для красоты )
}

std::ostream& operator << (std::ostream& o, const lv_value& lv)
{
    if (lv.begin) o << lv.begin;
    else o<<"lv_empty";
    return o;
}

size_t lv_length (const lv_value& lv)
{
    return (lv.begin)? lv.end-lv.begin : 0;
}

void lv_add (const lv_value& lv1, const lv_value& lv2, lv_value& res)
{
     lv_destroy(res);

     size_t len1 = lv_length(lv1);
     size_t len2 = lv_length(lv2);

     if (len1 && !len2) { lv_create (res, lv1); return; }  // если одно из чисел пустое
     if (len2 && !len1) { lv_create (res, lv2); return; } // то результат равен другому

     if (!len1 && !len2) { lv_create(res, "0"); return; } // если оба пустые, то 0

     size_t len = (len1>len2)? len1 : len2;
     ++len; // увеличиваем про запас

     char str[len+1]; // временный буффер
     for (int i=0; i<=len; ++i) str[i] = 0; // обнуляем

     for (int i=0; i<lv1.end-lv1.begin; ++i) str[len-1-i] = *(lv1.end-1-i); // накладываем на буфер первое число

     int mental=0;
     for (int i=0; i<lv2.end-lv2.begin; ++i)
     {     // прибавляем второе :
          int t =  str[len-1-i]-'0' + *(lv1.end-1-i)-'0' + mental;
          str[len-1-i]=(t%10)+'0';
          mental = t/10;
    }

    if (!mental) lv_create(res, str+1);
    else {
             str[0]='0'+mental;
             lv_create(res, str);
         }

}

const char * lv_test_str = "5432132a4";

int main()
{
    lv_value lv1;   // не забывать после каждой инициализации новой перемнной
    lv_create(lv1); // вызывать конструктор (на cpp это делается автоматически)
    std::cout<<"test constructor : "<<lv1<<" length="<<lv_length(lv1)<< std::endl;

    lv_value lv2;
    lv_create(lv2,lv_test_str);// формирование длиного_числа из си-строки
    std::cout<<"test constructor from string : "<<lv_test_str<<" " <<lv2<<" length="<<lv_length(lv2)<< std::endl;

    lv_value lv3;
    lv_create (lv3, lv2); // формирование длиного_числа по образу другого
    std::cout<<"test copy-constructor : "<<lv3<<" length="<<lv_length(lv3)<< std::endl;

    lv_value lv4;    // после создания переменной
    lv_create (lv4); // вызываем конструктор прежде, чем
    lv_add(lv2, lv3, lv4);  // отправить lv4 как аргумент
    std::cout<<"test add : "<<lv4<<" length="<<lv_length(lv4)<< std::endl;

    lv_add(lv2, lv1, lv4);
    std::cout<<"test add : "<<lv4<<" length="<<lv_length(lv4)<< std::endl;

    lv_add(lv1, lv2, lv4);
    std::cout<<"test add : "<<lv4<<" length="<<lv_length(lv4)<< std::endl;

    lv_destroy(lv4); // а также не забывать удалять
    lv_destroy(lv3); // перед выходом за границу блока
    lv_destroy(lv2);
    lv_destroy(lv1);

    getchar();
    return(0);
}

осталось загрузить числа в стек, сложить их и отправить результат в файл.  smile 

Это сообщение отредактировал(а) mes - 22.12.2008, 17:40


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 24.12.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  22.12.2008,  01:15 Найти цитируемый пост)
вот длинная арифметика  :

Красиво получилось smile smile  , прямо эстетическое чувство радуется user posted image!
Цитата(mes @  22.12.2008,  01:15 Найти цитируемый пост)
осталось загрузить числа в стек, сложить их и отправить результат в файл. 

Да, у меня все загрузилось smile (и даже работает smile ).

P.S.. Видимо, ты в некоторых местах специально чуть-чуть ошибся, чтобы я поискала smile  smile ...

Добавлено @ 10:33
И я даже все поняла с первого раза smile , кроме двух моментов:
  • зачем вместо unsigned int использовать size_t smile
  • это о чем smile :
    (понимаю, что при попытке вывести пустую структуру надо вывести "lv_empty", но что именно и как - большой вопрос...)
    Код

    std::ostream& operator << (std::ostream& o, const lv_value& lv)
    {
        if (lv.begin) o << lv.begin;
        else o<<"lv_empty";
        return o;
    }


Это сообщение отредактировал(а) KasMP - 24.12.2008, 10:52
PM MAIL   Вверх
mes
Дата 24.12.2008, 12:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  24.12.2008,  10:29 Найти цитируемый пост)

Да, у меня все загрузилось smile (и даже работает smile )

Не прочь бы взглянуть на заключительный код .. интересно насколько разобралась с моей частью.  smile 

Цитата(KasMP @  24.12.2008,  10:29 Найти цитируемый пост)
P.S.. Видимо, ты в некоторых местах специально чуть-чуть ошибся, чтобы я поискала smile  smile ..

вполне возможно.. конкретного теста не делал.. но тоже интересно узнать где.  smile 


Цитата(KasMP @  24.12.2008,  10:29 Найти цитируемый пост)
И я даже все поняла с первого раза smile ,

Это радует  smile 

Цитата(KasMP @  24.12.2008,  10:29 Найти цитируемый пост)
зачем вместо unsigned int использовать size_t smile

не знаю ( .. не задумывался.. поставил инстинктивно, так как он по смыслу больше подходит.. это надо спросить кто лучше разбирается )

Цитата(KasMP @  24.12.2008,  10:29 Найти цитируемый пост)
(понимаю, что при попытке вывести пустую структуру надо вывести "lv_empty", но что именно и как - большой вопрос...)

Наше струиктура есть хранилище т.е ее можно расматривать как указатель.. смысл кода такой :
Код

std::ostream& operator << (std::ostream& o, const int* p)
{
    if (p) o << *p;
    else o<<"NULL";
    return o;
}

 сам текст условный.. можно ничего не выводить



--------------------
PM MAIL WWW   Вверх
xvr
Дата 24.12.2008, 19:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(KasMP @ 21.12.2008,  17:20)
Код

int main()
{
            res=new char[len1+1];
            esc=Addition(h1,h2,res);
}

Ломается из за этого
Смотрим функцию Addition 
Код

char *Addition (stack *h1, stack *h2, char *res)
{
    int mental=0, t, len=strlen(res);
         *(res+len-1)=t%10+48;
}
new char[len+1] только отводит память под строку, но НЕ инициализирует ее. Так что где strlen найдет завершающий 0 в этой 'строке' одному Гейтсу известно. Видимо где то очень далеко  smile 
Кстати, нормальные компиляторы конструкцию new char[] трактуют как ошибку:

Код

main()
{
 char* p=new char[];
}

Цитата

>g++ 1.cpp

1.cpp: In function `int main()':
1.cpp:3: error: expected primary-expression before ']' token

VC трактует ее как new char[0], почему то мне кажется, что это не то, что ожидалось  smile 

Это сообщение отредактировал(а) xvr - 24.12.2008, 19:06
PM MAIL   Вверх
mes
Дата 24.12.2008, 20:04 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  24.12.2008,  10:29 Найти цитируемый пост)
std::ostream& operator << (std::ostream& o, const lv_value& lv)
{
    if (lv.begin) o << lv.begin;
    else o<<"lv_empty";
    return o;
}

Подумав решил что так будет выглядить удачней :
Код

..
    else o<<"0";
..



--------------------
PM MAIL WWW   Вверх
KasMP
Дата 25.12.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  24.12.2008,  12:28 Найти цитируемый пост)
вполне возможно.. конкретного теста не делал.. но тоже интересно узнать где. 

Это даже не ошибки, а какие-то опечатки smile :
  • Код
    Ф-я сложения

    ...

    for (int i=0; i<lv1.end-lv1.begin; ++i) str[len-1-i] = *(lv1.end-1-i); // накладываем на буфер первое число
         int mental=0;
         for (int i=0; i<lv2.end-lv2.begin; ++i)
         {     // прибавляем второе :
              int t =  str[len-1-i]-'0' + *(lv1.end-1-i)-'0' + mental;
              str[len-1-i]=(t%10)+'0';
              mental = t/10;
        }
    ...

    Сложил первое число с самим собой (написал "1" вместо "2" в имени структуры в цикле).
  • Еще разряды как-то не с друг с другом складывались (впрочем, может сначала складывались правильно, но просто все разряды были первого числа и результат был неправильный; потом я начала что-то двигать и ... ). Но в итоге все идеально smile !
  • Неважно, где (важно, что len - не константа, известная на этапе компиляции):
    Код

    char str[len+1]; // временный буффер

    Поправила на "char *str = new char[len+1]".

Цитата(mes @  24.12.2008,  12:28 Найти цитируемый пост)
не знаю ( .. не задумывался.. поставил инстинктивно, так как он по смыслу больше подходит.. это надо спросить кто лучше разбирается )

Я поправила на unsigned int, чтобы избежать лишних вопросов (на которые я пока совсем не отвечу)...
Цитата(mes @  24.12.2008,  12:28 Найти цитируемый пост)
смысл кода такой :

Это мне тоже ни о чем не говорит.
Цитата(mes @  24.12.2008,  12:28 Найти цитируемый пост)
сам текст условный.. можно ничего не выводить

Нельзя. Без этой, извиняюсь, фигульки вылетает ошибка, из-за которой была создана тема (опять потоки smile !!)
Цитата(xvr @  24.12.2008,  19:06 Найти цитируемый пост)
new char[len+1] только отводит память под строку, но НЕ инициализирует ее.

 smile Понятно smile . Буду знать, спасибо smile smile .
Цитата(xvr @  24.12.2008,  19:06 Найти цитируемый пост)
почему то мне кажется, что это не то, что ожидалось 

 smile  smile 
Цитата(mes @  24.12.2008,  20:04 Найти цитируемый пост)
Подумав решил что так будет выглядить удачней :

Может и удачней, потому что не читавший этот код не знает, кто такой "lv", а "0" в месте, где ожидается число (пусть и длинное, представленное символами), будет понятен всем.
Цитата(mes @  24.12.2008,  12:28 Найти цитируемый пост)
Не прочь бы взглянуть на заключительный код .. интересно насколько разобралась с моей частью.  

Пожалуйста, держите прикрепленное к вашему творению smile  smile :
Код

// очевидные библиотеки и макроподстановки

int main()
{
    ifstream    f1(path1), f2(path2);
    ofstream    fout(pathout);
    char        *s1=new char[], *s2=new char[];
    lv_value    lv1, lv2, lv;


    lv_create(lv);
    
    while (!f1.eof() && !f2.eof()) {
        // чтение чисел
        f1.getline(s1,MAX,'\n'); f2.getline(s2,MAX,'\n');
        // printf("s1=%s, s2=%s.\n", s1, s2);
        lv_create(lv2,s2);
        lv_create(lv1,s1);
        // printf("lv1=%s.\n", lv1); printf("lv2=%s.\n", lv2);
        
        // подсчет суммы и запись в файл
        lv_add(lv1,lv2,lv);
        printf("lv=%s.\n", lv);
        fout << lv << '\n';

        // удаление структур
        lv_destroy(lv1); lv_destroy(lv2); lv_destroy(lv);

        printf("\n");
    }

    f1.close(); f2.close(); fout.close();

    getchar();
    return(0);
}

Ну и комментарии я написала под себя (под человека, не знающего объекты, конструкторы и т.п.; но в общих чертах я понимаю, что такое объект, его методы, конструктор и пр..).
PM MAIL   Вверх
mes
Дата 25.12.2008, 18:32 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  25.12.2008,  17:40 Найти цитируемый пост)
Сложил первое число с самим собой (написал "1" вместо "2" в имени структуры в цикле).

нда.. Вот к чему приводит копипаст ((

Цитата(KasMP @  25.12.2008,  17:40 Найти цитируемый пост)
Неважно, где (важно, что len - не константа, известная на этапе компиляции):

да это не все компиляторы поддерживают 

Цитата(KasMP @  25.12.2008,  17:40 Найти цитируемый пост)

Поправила на "char *str = new char[len+1]".

Не забудь тогда и delete[]  добавить.


Цитата(KasMP @  25.12.2008,  17:40 Найти цитируемый пост)
Нельзя. Без этой, извиняюсь, фигульки вылетает ошибка, 

Не понял о какой ошибке идет речь, но под высказыванием ничего не выводить подразумевалось такое o<<"";
хотя ничего не мешает закомментировать эту строку.

Добавлено через 5 минут и 19 секунд
Цитата(KasMP @  25.12.2008,  17:40 Найти цитируемый пост)
Пожалуйста, держите прикрепленное к вашему творению smile  smile :


Цитата

Реализовать стек на основе динамических списков. С помощью него решить следующую задачу: в двух файлах записаны длинные натуральные числа (количество знаков больше 20). Найти их сумму и выписать ее в третий файл.

Помойму все таки чего то упустили в этом задании.. Где все таки должен быть стек ?? 




--------------------
PM MAIL WWW   Вверх
mes
Дата 25.12.2008, 18:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  25.12.2008,  17:40 Найти цитируемый пост)
 lv_destroy(lv);

вынеси его за цикл.

и макросы path1, path2, pathout  замени на строки  smile 
(да и вобще макросов старайся избегать)

Цитата(KasMP @  25.12.2008,  17:40 Найти цитируемый пост)
  *s1=new char[], *s2=new char[];

а тут не забыто "MAX+1" в скобках?

Это сообщение отредактировал(а) mes - 25.12.2008, 18:58


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 25.12.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  25.12.2008,  18:32 Найти цитируемый пост)
Помойму все таки чего то упустили в этом задании.. Где все таки должен быть стек ?? 

Я думала об этом. Можно натянуть такой ответ:
стек - первым пришел, последним вышел (т.е. уходят положенные сверху элементы);
у нас своеобразный стек из одного элемента (точнее, 2 таких стека, каждый из которых будет содержать по одному элементу); этот элемент сначала загружается, оказывается на вершине, вершина выгружается, потом загружается новый, новый оказывается на вершине, вершина выгружается;
т.е. в принципе определение стека выполняется (по ходу дела здесь и дэк (как правильно пишется?), и др.очереди так же можно притянуть)
Цитата(mes @  25.12.2008,  18:49 Найти цитируемый пост)
вынеси его за цикл.

Да, правильно: у нас сложение начинается с уничтожения структуры-результата, незачем делать это дважды.
Цитата(mes @  25.12.2008,  18:49 Найти цитируемый пост)
(да и вобще макросов старайся избегать)

???
Почему???
Цитата(mes @  25.12.2008,  18:49 Найти цитируемый пост)
а тут не забыто "MAX+1" в скобках?

smile smile

Добавлено через 6 минут и 22 секунды
Цитата(mes @  25.12.2008,  18:32 Найти цитируемый пост)
хотя ничего не мешает закомментировать эту строку.

Вот-вот, в том-то и чудеса, что я ее, так сказать, /* */, и 
Код
1>.\5.cpp(134) : error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'lv_value' (or there is no acceptable conversion)
1>        K:\Visual Studio C++ 2008\VC\include\ostream(653): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(700): or       'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(738): or       'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(785): or       'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(909): or       'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const signed char *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(916): or       'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed char)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(923): or       'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const unsigned char *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(930): or       'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,unsigned char)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(170): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ostream<_Elem,_Traits> &(__cdecl *)(std::basic_ostream<_Elem,_Traits> &))'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(176): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(183): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(190): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(210): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(short)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(243): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(263): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__w64 int)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(288): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__w64 unsigned int)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(308): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(328): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__w64 unsigned long)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(349): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__int64)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(369): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(390): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(float)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(410): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(double)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(430): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long double)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(450): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(const void *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        K:\Visual Studio C++ 2008\VC\include\ostream(470): or       'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_streambuf<_Elem,_Traits> *)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        while trying to match the argument list '(std::ofstream, lv_value)'


Добавлено через 10 минут и 50 секунд
Еще после каждого выполнения lv_destroy() (тех, которые в main() ), происходит такое:

user posted image
(номера блоков при перезапуске программы не меняются, внутри одного запуска все разные)

Не вижу причин для выхода за выделенную область.
PM MAIL   Вверх
mes
Дата 25.12.2008, 20:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  25.12.2008,  20:26 Найти цитируемый пост)
Вот-вот, в том-то и чудеса, что я ее, так сказать, /* */, и 

a мы про какую строчку говорим то ?? что то подсказывает мне что про разные )
Покажи что и как комментировала.. 


Цитата(KasMP @  25.12.2008,  20:26 Найти цитируемый пост)
у нас своеобразный стек из одного элемента

но в задании сказано реализовать на основе списка.. А в коде ни слова.. и главное не понятно к ккой области его прикручивать )

Добавлено @ 20:45
Цитата(KasMP @  25.12.2008,  20:26 Найти цитируемый пост)
???
Почему???

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


Это сообщение отредактировал(а) mes - 25.12.2008, 20:46


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 25.12.2008, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  25.12.2008,  20:41 Найти цитируемый пост)
a мы про какую строчку говорим то ?? что то подсказывает мен что про разные )

Я про вот эту:
Код

std::ostream& operator << (std::ostream& o, const lv_value& lv)
{
    if (lv.begin) o << lv.begin;
    else o<<"lv_empty";
    return o;
}
С ней нельзя оставаться:
1) видимо, это уже явный С++;
2) понятно, что я сама такое не напишу...
Цитата(mes @  25.12.2008,  20:41 Найти цитируемый пост)
но в задании сказано реализовать на основе списка.. А в коде ни слова.. и главное не понятно к ккой области его прикручивать )

Поздно уже переделывать smile .

Добавлено через 1 минуту и 17 секунд
Цитата(mes @  25.12.2008,  20:41 Найти цитируемый пост)
Используй макросы только для ...

А если просто определить переменные-константы, то будет чем-то лучше smile ? Или все равно smile?
PM MAIL   Вверх
mes
Дата 25.12.2008, 20:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  25.12.2008,  20:45 Найти цитируемый пост)
Поздно уже переделывать smile . 

A когда сдавать то ?
На текущем этапе фактически ничего перелывать не надо.. Только бы вот понять куда этот стек запихать..

Добавлено @ 20:49
Цитата(KasMP @  25.12.2008,  20:45 Найти цитируемый пост)
Я про вот эту:

Т.е ты целиком закомментирова всю функцию ?? тогда писать в файл не будет..

Добавлено @ 20:51
хотя можно вместо операторa << поставить другое название функции и его использовать для вывода - ради того чтоб никто не подумал ))

Это сообщение отредактировал(а) mes - 25.12.2008, 20:55


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 25.12.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  25.12.2008,  20:48 Найти цитируемый пост)
A когда сдавать то ?

Очень желательно уложиться ... в час. Еще другие зачеты...
Цитата(mes @  25.12.2008,  20:48 Найти цитируемый пост)
На текущем этапе фактически ничего перелывать не надо.. Только бы вот понять куда пихать этот стек пихать..

Возможно, задание предполагает, что мы последовательно прочитаем все числа в 2 списка (элемент списка - структура, содержащая число (вернее, адреса начала и конц строки), закроем файлы и будем последовательно идти по спискам, выводя результаты в файл.
Но ведь очевидно, что это хуже: зачем занимать память всеми числами, когда можно оставить место для одного (для одной пары, точнее)...
Цитата(mes @  25.12.2008,  20:48 Найти цитируемый пост)
Т.е ты целиком закомментирова всю функцию ?? тогда писать в файл не будет.. 

Я уже говорила, как "хорошо" я понимаю ее.
PM MAIL   Вверх
mes
Дата 25.12.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  25.12.2008,  20:45 Найти цитируемый пост)
А если просто определить переменные-константы, то будет чем-то лучше smile ? Или все равно smile? 

будет  smile 


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 25.12.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Цитата(mes @  25.12.2008,  20:48 Найти цитируемый пост)
хотя можно вместо операторa << поставить другое название функции ...

Может быть и можно, я совсем не понимаю.
Уже только одно начало "std::ostream&" заставляет долго думать...

Добавлено через 2 минуты и 20 секунд
Цитата(mes @  25.12.2008,  20:56 Найти цитируемый пост)
будет  smile  

Цитата(mes @  25.12.2008,  20:41 Найти цитируемый пост)
Чтоб не споткнуться на труднообнаружимых и непонятных ошибках, возникших вследствии использования макросов.

Я думала так: по сути в обоих случаях мы получаем константу, которой присвоено какое-то удобное имя -> шанс ошибиться одинаков smile . Нет smile ?!

Добавлено через 3 минуты и 9 секунд
Я давно себя так плохо не чувствовала. Столько ошибок и непониманий smile ...
PM MAIL   Вверх
mes
Дата 25.12.2008, 21:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  25.12.2008,  20:55 Найти цитируемый пост)
Я уже говорила, как "хорошо" я понимаю ее. 

так вопрос надо было коректно поставить, где тебе непонятно, я или другие форумчане обяснили бы )

Код


std::ostream& 
               operator << (std::ostream& o, const lv_value& lv) // перегружаем оператор << для упомянутых в скобках аргументах
                                                              // т.е. для такой ситуации :   osteam<<lv_value
                                                              // чтоб программа знала как поступать когда подадим наш тип на вход потоку
{
    if (lv.begin)   // если наше число не пустое
                      o << lv.begin;  // то выводим его как строку используя оператор << с другой перегрузкой аргументов
                                             //   std::ostream&  operator << (std::ostream& o, const char *)
                                              // т.е ситуация  osteam<<const_char_*

    else o<<"0";      // иначе выводим строку 0
    return o; // возвращаем ссылку на поток , чтоб можно было организовать последовательность,
                 // типа такой о << lv << "\n" << lv1 << "\n"
}

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

Добавлено через 5 минут и 52 секунды
Цитата(KasMP @  25.12.2008,  20:58 Найти цитируемый пост)
Я думала так: по сути в обоих случаях мы получаем константу, которой присвоено какое-то удобное имя -> шанс ошибиться одинаков smile . Нет smile ?!

нет макрос, это просто определение , которое будет подставлено вместо всех употреблений его имени в коде в режиме предкомпиляции .. т.е фактически "удобный" копи-паст.

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



Это сообщение отредактировал(а) mes - 25.12.2008, 21:07


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 25.12.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



а самая первая строчка о чем?
и можно все-таки это как-то попроще написать?
PM MAIL   Вверх
mes
Дата 25.12.2008, 21:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  25.12.2008,  20:58 Найти цитируемый пост)
Я давно себя так плохо не чувствовала. Столько ошибок и непониманий smile ... 

Зато с каждым понимаем будет все больше свободы действий и спокойствия за код.

Добавлено @ 21:20
можно записать так 
Код

void Write (std::ostream& o, const lv_value& lv)
{
    if (lv.begin) o << lv.begin;
    else o<<"0";
}

тогда вывод в файл будет 
Write (fout, lv);
 можно так 
Код

ostream& Write (std::ostream& o, const lv_value& lv)
{
    if (lv.begin) o << lv.begin;
    else o<<"0";
   return o;
}

тогда при выводе можно использовать последовательность 
Write (fout, lv)<<"\n";


Код

void Write (std::ostream& o, const lv_value& lv)
{
    if (lv.begin) o << lv.begin;
    else o<<"0";
}
ostream& operator << (std::ostream& o, const lv_value& lv)
{
   Write (o, lv);
   return o;
}

тогда  можно : fout <<lv <<"\n";

в общем пользуй пока первый, а как будет время разбирайся с остальными )


Это сообщение отредактировал(а) mes - 25.12.2008, 21:21


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 25.12.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Код

void Write (std::ostream& o, const lv_value& lv)
{
    if (lv.begin) o << lv.begin;
    else o<<"0";
}

smile Вот это уже намного ближе smile .
Код

std::ostream& o

Мы передаем по ссылке переменную o типа выходной поток (или как правильно называется), который как-то связан с чем-то, называемым std...
(видимо, std - какой-то буфер или что-то типа этого... видимо, стандартный, а не определенный мной)

Добавлено через 2 минуты и 20 секунд
Цитата(mes @  25.12.2008,  21:06 Найти цитируемый пост)
а константа, эта сущность , у который есть и тип и адрес и все другие нужные характеристики, для того чтоб ...

действительно smile ! теперь понятно smile !

PM MAIL   Вверх
mes
Дата 25.12.2008, 21:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  25.12.2008,  21:32 Найти цитируемый пост)
    
std::

намеспейс std принадлежит стандартной библиотеке шаблонов(stl). 
так скажем специальная именнованная область, чтоб имена функций и переменной одной библиотеки не пересекались с другими..
то есть если я пишу std::cout... то означает что использую функцию cout из области (namespace) std

чтоб не писать каждый раз std:: ,   можно один раз написать после инклудов using namespace std;
на старых компиляторах std не было,  в таких случаях можно просто отбрасывать этот префикс. 





--------------------
PM MAIL WWW   Вверх
KasMP
Дата 25.12.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Код

// выводит структуру-результат (в файл, в нашем случае):
// если структура пустая, то выводит '0'
void Write (ostream &o, const lv_value &lv)
{
    if (lv.begin)
        o << lv.begin;
    else
        o << "0";
}
Код

Write(fout,lv); fout << '\n';
Вот, теперь я счастлива  smile .
Правда, коряво смотрятся 2 вывода рядом в одно и то же место разными способами... Потом откорректирую.
PM MAIL   Вверх
mes
Дата 25.12.2008, 21:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(KasMP @  25.12.2008,  21:46 Найти цитируемый пост)
Правда, коряво смотрятся 2 вывода рядом в одно и то же место разными способами... Потом откорректирую. 

используй второй вариант.
или 
Код

void Write (ostream &o, const char * sep,  const lv_value &lv)
{
    if (lv.begin)
        o << lv.begin;
    else
        o << "0";

   o<<sep;  // вывод разделителя. 
}


Это сообщение отредактировал(а) mes - 25.12.2008, 21:53


--------------------
PM MAIL WWW   Вверх
KasMP
Дата 25.12.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: нет
Всего: 30



Код
// максимальная количество цифр в числах
int MAX=100;

// адреса файлов для ввода-вывода
char path1[]="C:\\in1.txt";
char path2[]="C:\\in2.txt";
char pathout[]="C:\\out.txt";

PM MAIL   Вверх
mes
Дата 25.12.2008, 22:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



a const не забыла??



--------------------
PM MAIL WWW   Вверх
mes
Дата 25.12.2008, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



я тут подумал и нашел куда присобачить стек.. держи.. надеюсь не поздно 

Код

// char_stack.h

typedef char char_stack_value;

struct char_stack_node
{
// private:

   char_stack_value  value;
   char_stack_node * next;
};

struct char_stack
{
// private:
   char_stack_node * head;
   unsigned          size;
};

void char_stack_create(char_stack& st) // конструктор
{
    st.head = NULL;
    st.size =0;
}
bool char_stack_is_empty (char_stack& st) // пустой ли стек ?
{
    return st.head == NULL;
// или
//  return st.size == 0;

}
bool char_stack_size (char_stack& st) // рамер стека
{
    return st.size;
}
void char_stack_push (char_stack& st, char_stack_value value) // запихиваем
{
    char_stack_node * node = new char_stack_node;
    node->value = value;
    node->next = st.head;
    st.head=node;
    ++st.size;
}
char_stack_value char_stack_pop (char_stack& st) // достаем
{
    if (!st.head) return char_stack_value();
    char_stack_node * node = st.head;
    char_stack_value value = node->value;
    st.head = st.head->next;
    delete node;
    --st.size;
    return value;
}

void char_stack_destroy (char_stack& st) // деструктор
{
      while (!char_stack_is_empty(st)) char_stack_pop(st);
}



Код

//lv.h
#include <iostream>
#include "char_stack.h"

struct lv_value
{
// private: 
    char *data;
};

size_t lv_length (const lv_value& lv)
{
    unsigned sz=0; for (char * p = lv.data; *p; ++p) ++sz;
    return sz;
}
void lv_create (lv_value& lv) // конструктор 1
{
     lv.data = new char[2];
    *lv.data = '0';
    *(lv.data+1) = '\0';
}

void lv_create (lv_value& lv, const char * str) // конструктор 2
{
    const char * p = str;
    for (;isdigit(*p); ++p) ;   // ищем первый не символ,

    lv.data = new char[p-str];  // создаем внутренний массив
    char * p1 = lv.data;
    for (;str<p; ++str, ++p1) *p1 = *str; // копирование нужных символов
    *p1= '\0';
}

void lv_create (lv_value& lv, char_stack st) // конструктор по стеку(число в стеке в "нормальном" порядке
{
     const unsigned size = st.size;
     lv.data = new char[size+1];
     for (char * p = lv.data; !char_stack_is_empty(st); ++p) *p = char_stack_pop(st);
     *(lv.data+size) = '\0';
}

void lv_create (lv_value& dst, const lv_value& src) // конструктор копий
{
    const unsigned size = lv_length(src);
    dst.data = new char[size+1];  // создаем внутренний массив

    char * p  = src.data;
    char * p1 = dst.data;

    for (int i=0; i<size; ++p, ++p1) *p1 = *p; // копирование нужных символов
    *p1= '\0';
}

void lv_destroy (lv_value& lv)   // деструктор
{
    if (lv.data!=NULL) delete[] lv.data;
    lv.data = NULL;
}

std::ostream& operator << (std::ostream& o, const lv_value& lv)
{
    if (lv.data) o << lv.data;
    return o;
}

void lv_add (const lv_value& lv1, const lv_value& lv2, lv_value& res)
{
     lv_destroy(res);

     char_stack st1, st2, st;
     char_stack_create (st1);
     char_stack_create (st2);
     char_stack_create (st);

     for  (char *p = lv1.data; *p; ++p)  char_stack_push(st1, *p); // заполняем первый стек
     for  (char *p = lv2.data; *p; ++p)  char_stack_push(st2, *p); // заполняем второй стек

     int mental = 0;

     while (!char_stack_is_empty(st1) || !char_stack_is_empty(st2))
     {
        int value = mental;
        if (!char_stack_is_empty(st1)) value += char_stack_pop(st1)-'0';
        if (!char_stack_is_empty(st2)) value += char_stack_pop(st2)-'0';

        char_stack_push (st, value%10+'0');

        mental = value/10;
     }
     if (mental) char_stack_push (st, mental+'0');
     lv_create (res, st);

     char_stack_destroy (st);
     char_stack_destroy (st1);
     char_stack_destroy (st2);
}


ну а main должен подойти без изменений. 
P.S private: означает что доступ к этой секции, только из "своих" функций. 



Это сообщение отредактировал(а) mes - 26.12.2008, 22:11


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2116 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.